/* This file is part of Cyclos (www.cyclos.org). A project of the Social Trade Organisation (www.socialtrade.org). Cyclos is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Cyclos is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Cyclos; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package nl.strohalm.cyclos.utils.notifications; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import nl.strohalm.cyclos.entities.access.Channel; import nl.strohalm.cyclos.entities.access.Channel.Credentials; import nl.strohalm.cyclos.entities.access.MemberUser; import nl.strohalm.cyclos.entities.access.User; import nl.strohalm.cyclos.entities.accounts.Account; import nl.strohalm.cyclos.entities.accounts.AccountOwner; import nl.strohalm.cyclos.entities.accounts.AccountStatus; import nl.strohalm.cyclos.entities.accounts.AccountType; import nl.strohalm.cyclos.entities.accounts.MemberAccount; import nl.strohalm.cyclos.entities.accounts.MemberAccountType; import nl.strohalm.cyclos.entities.accounts.MemberGroupAccountSettings; import nl.strohalm.cyclos.entities.accounts.SystemAccountOwner; import nl.strohalm.cyclos.entities.accounts.guarantees.Certification; import nl.strohalm.cyclos.entities.accounts.guarantees.Guarantee; import nl.strohalm.cyclos.entities.accounts.guarantees.GuaranteeType; import nl.strohalm.cyclos.entities.accounts.guarantees.PaymentObligation; import nl.strohalm.cyclos.entities.accounts.loans.Loan; import nl.strohalm.cyclos.entities.accounts.loans.LoanPayment; import nl.strohalm.cyclos.entities.accounts.pos.MemberPos; import nl.strohalm.cyclos.entities.accounts.pos.Pos; import nl.strohalm.cyclos.entities.accounts.transactions.AuthorizationLevel; import nl.strohalm.cyclos.entities.accounts.transactions.AuthorizationLevel.Authorizer; import nl.strohalm.cyclos.entities.accounts.transactions.Invoice; import nl.strohalm.cyclos.entities.accounts.transactions.Payment; import nl.strohalm.cyclos.entities.accounts.transactions.PaymentRequestTicket; import nl.strohalm.cyclos.entities.accounts.transactions.ScheduledPayment; import nl.strohalm.cyclos.entities.accounts.transactions.Transfer; import nl.strohalm.cyclos.entities.ads.Ad; import nl.strohalm.cyclos.entities.exceptions.EntityNotFoundException; import nl.strohalm.cyclos.entities.groups.Group; import nl.strohalm.cyclos.entities.members.Element; import nl.strohalm.cyclos.entities.members.Member; import nl.strohalm.cyclos.entities.members.Reference; import nl.strohalm.cyclos.entities.members.TransactionFeedback; import nl.strohalm.cyclos.entities.members.TransactionFeedbackRequest; import nl.strohalm.cyclos.entities.members.brokerings.BrokerCommissionContract; import nl.strohalm.cyclos.entities.members.brokerings.Brokering; import nl.strohalm.cyclos.entities.members.messages.Message; import nl.strohalm.cyclos.entities.settings.LocalSettings; import nl.strohalm.cyclos.entities.settings.MessageSettings; import nl.strohalm.cyclos.services.access.ChannelServiceLocal; import nl.strohalm.cyclos.services.accounts.AccountDTO; import nl.strohalm.cyclos.services.accounts.AccountServiceLocal; import nl.strohalm.cyclos.services.accounts.GetTransactionsDTO; import nl.strohalm.cyclos.services.accounts.guarantees.CertificationServiceLocal; import nl.strohalm.cyclos.services.elements.BrokeringServiceLocal; import nl.strohalm.cyclos.services.elements.ChangeBrokerDTO; import nl.strohalm.cyclos.services.elements.MessageServiceLocal; import nl.strohalm.cyclos.services.elements.SendMessageFromSystemDTO; import nl.strohalm.cyclos.services.fetch.FetchServiceLocal; import nl.strohalm.cyclos.services.groups.GroupServiceLocal; import nl.strohalm.cyclos.services.preferences.MessageChannel; import nl.strohalm.cyclos.services.preferences.PreferenceServiceLocal; import nl.strohalm.cyclos.services.settings.SettingsServiceLocal; import nl.strohalm.cyclos.services.transactions.DoPaymentDTO; import nl.strohalm.cyclos.services.transactions.InvoiceServiceLocal; import nl.strohalm.cyclos.services.transactions.TransferDTO; import nl.strohalm.cyclos.utils.DateHelper; import nl.strohalm.cyclos.utils.MessageProcessingHelper; import nl.strohalm.cyclos.utils.MessageResolver; import nl.strohalm.cyclos.utils.RelationshipHelper; import nl.strohalm.cyclos.utils.access.LoggedUser; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; /** * Implementation for {@link MemberNotificationHandler} * @author luis */ public class MemberNotificationHandlerImpl implements MemberNotificationHandler { private static final float PRECISION_DELTA = 0.0001F; private AccountServiceLocal accountService; private BrokeringServiceLocal brokeringService; private CertificationServiceLocal certificationService; private ChannelServiceLocal channelService; private FetchServiceLocal fetchService; private GroupServiceLocal groupService; private InvoiceServiceLocal invoiceService; private MessageServiceLocal messageService; private SettingsServiceLocal settingsService; private MessageResolver messageResolver; private PreferenceServiceLocal preferenceService; private AdminNotificationHandler adminNotificationHandler; @Override public void acceptedInvoiceNotification(final Invoice invoice) { // Get the destination final Member destinationMember = invoice.getFromMember(); if (destinationMember == null) { // The invoice was sent from system return; } // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getInvoiceAcceptedSubject(); final String body = messageSettings.getInvoiceAcceptedMessage(); final String sms = messageSettings.getInvoiceAcceptedSms(); // Process message body final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, invoice.getTo(), invoice); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, invoice.getTo(), invoice); final String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, invoice.getTo(), invoice); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.INVOICE); message.setEntity(invoice); message.setToMember(destinationMember); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); notifyTransactionFeedbackRequest(invoice.getTransfer()); } @Override public void automaticPaymentReceivedNotification(Transfer transfer, final TransferDTO dto) { transfer = fetchService.fetch(transfer, RelationshipHelper.nested(Payment.Relationships.TO, MemberAccount.Relationships.MEMBER), Payment.Relationships.TYPE); if (transfer.isRoot() && !transfer.isToSystem()) { // Get the destination final Member destinationMember = (Member) transfer.getTo().getOwner(); final Set<MessageChannel> channels = preferenceService.receivedChannels(destinationMember, Message.Type.PAYMENT); if (!channels.isEmpty()) { AccountStatus status = null; final boolean sendSmsNotification = transfer.getType().isAllowSmsNotification() && channels.contains(MessageChannel.SMS); if (sendSmsNotification) { status = accountService.getCurrentStatus(new AccountDTO(transfer.getTo())); } // Get the message settings final LocalSettings localSettings = settingsService.getLocalSettings(); final MessageSettings messageSettings = settingsService.getMessageSettings(); String subject = null; String body = null; String sms = null; if (transfer.getAccountFeeLog() != null) { subject = messageSettings.getAccountFeeReceivedSubject(); body = messageSettings.getAccountFeeReceivedMessage(); if (sendSmsNotification) { sms = messageSettings.getAccountFeeReceivedSms(); } // Process message content subject = MessageProcessingHelper.processVariables(subject, localSettings, destinationMember, transfer, transfer.getAccountFeeLog().getAccountFee()); body = MessageProcessingHelper.processVariables(body, localSettings, destinationMember, transfer, transfer.getAccountFeeLog().getAccountFee()); if (sendSmsNotification) { sms = MessageProcessingHelper.processVariables(sms, localSettings, destinationMember, status, transfer, transfer.getAccountFeeLog().getAccountFee()); } } else { // Check if the transfer has been processed or awaits authorization if (transfer.getProcessDate() == null) { subject = messageSettings.getPendingPaymentReceivedSubject(); body = messageSettings.getPendingPaymentReceivedMessage(); if (sendSmsNotification) { sms = messageSettings.getPendingPaymentReceivedSms(); } } else { subject = messageSettings.getPaymentReceivedSubject(); body = messageSettings.getPaymentReceivedMessage(); if (sendSmsNotification) { sms = messageSettings.getPaymentReceivedSms(); } } // Process message content subject = MessageProcessingHelper.processVariables(subject, localSettings, transfer.getFrom().getOwner(), transfer); body = MessageProcessingHelper.processVariables(body, localSettings, transfer.getFrom().getOwner(), transfer); if (sendSmsNotification) { sms = MessageProcessingHelper.processVariables(sms, localSettings, transfer.getFrom().getOwner(), status, transfer); } } // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.PAYMENT); message.setEntity(transfer); message.setToMember(destinationMember); message.setSubject(subject); message.setBody(body); message.setSms(sms); // Send the message messageService.sendFromSystem(message); } } } @Override public void blockedCredentialsNotification(final User user, final Credentials credentialsType) { if (user instanceof MemberUser) { boolean skipSms = false; try { // FIXME we will add the ServiceClient to LoggedUser. This hack shouldn't be needed anymore // Try to get the current channel from the web services context, which will only return something when running on web services final Channel currentChannel = (Channel) Class.forName("nl.strohalm.cyclos.webservices.WebServiceContext").getMethod("getChannel").invoke(null); if (currentChannel != null) { // Ok, we are running on a web service. skip if this is the SMS channel, as it has it's own notification final Channel smsChannel = channelService.getSmsChannel(); if (currentChannel.equals(smsChannel)) { // Do not notify by SMS skipSms = true; } } } catch (final Exception ex) { // SMS won't be skipped } final Member member = (Member) user.getElement(); // Get message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); String subject; String body; String sms; switch (credentialsType) { case LOGIN_PASSWORD: subject = messageSettings.getLoginBlockedSubject(); body = messageSettings.getLoginBlockedMessage(); sms = skipSms ? null : messageSettings.getLoginBlockedSms(); break; case TRANSACTION_PASSWORD: subject = messageSettings.getMaxTransactionPasswordTriesSubject(); body = messageSettings.getMaxTransactionPasswordTriesMessage(); sms = skipSms ? null : messageSettings.getMaxTransactionPasswordTriesSms(); break; case PIN: subject = messageSettings.getPinBlockedSubject(); body = messageSettings.getPinBlockedMessage(); sms = skipSms ? null : messageSettings.getPinBlockedSms(); break; case CARD_SECURITY_CODE: subject = messageSettings.getCardSecurityCodeBlockedSubject(); body = messageSettings.getCardSecurityCodeBlockedMessage(); sms = skipSms ? null : messageSettings.getCardSecurityCodeBlockedSms(); break; default: return; } // Process message content final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, member, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, member, localSettings); final String processedSms = sms == null ? null : MessageProcessingHelper.processVariables(sms, member, localSettings); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.ACCESS); message.setToMember(member); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } } @Override public void cancelledInvoiceNotification(final Invoice invoice) { if (!invoice.isToSystem()) { // Get the destination final Member destinationMember = invoice.getToMember(); // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getInvoiceCancelledSubject(); final String body = messageSettings.getInvoiceCancelledMessage(); final String sms = messageSettings.getInvoiceCancelledSms(); // Process message body final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, invoice.getFrom(), invoice); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, invoice.getFrom(), invoice); final String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, invoice.getFrom(), invoice); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.INVOICE); message.setEntity(invoice); message.setToMember(destinationMember); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } } @Override public void certificationCanceledNotification(final Long certificationId) { // Load the certification final Certification certification = certificationService.load(certificationId, Certification.Relationships.BUYER, Certification.Relationships.ISSUER); certificationStatusChangedNotification(certification); } @Override public void certificationIssuedNotification(final Certification certification) { // If the certification has been registered and is active, notify buyer if (certification.getStatus() == Certification.Status.ACTIVE) { // Get local and message settings final LocalSettings localSettings = settingsService.getLocalSettings(); final MessageSettings messageSettings = settingsService.getMessageSettings(); // Get the destination final Member buyer = certification.getBuyer(); // Get the message settings final String subjectBuyer = messageSettings.getCertificationIssuedSubject(); final String bodyBuyer = messageSettings.getCertificationIssuedMessage(); final String smsBuyer = messageSettings.getCertificationIssuedSms(); // Process message content final String processedSubjectBuyer = MessageProcessingHelper.processVariables(subjectBuyer, certification, localSettings); final String processedBodyBuyer = MessageProcessingHelper.processVariables(bodyBuyer, certification, localSettings); final String processedSmsBuyer = MessageProcessingHelper.processVariables(smsBuyer, certification, localSettings); // Create the DTO final SendMessageFromSystemDTO messageToBuyer = new SendMessageFromSystemDTO(); messageToBuyer.setEntity(certification); messageToBuyer.setType(Message.Type.CERTIFICATION); messageToBuyer.setToMember(buyer); messageToBuyer.setSubject(processedSubjectBuyer); messageToBuyer.setBody(processedBodyBuyer); messageToBuyer.setSms(processedSmsBuyer); // Send the message messageService.sendFromSystem(messageToBuyer); } } @Override public void certificationStatusChangedNotification(final Certification certification) { // Only notify if it's an activation or suspension, SHCEDULED is none of these if (certification.getStatus() == Certification.Status.SCHEDULED) { return; } // Get local and message settings final LocalSettings localSettings = settingsService.getLocalSettings(); final MessageSettings messageSettings = settingsService.getMessageSettings(); // Process new status string final String statusString = messageResolver.message("certification.status." + certification.getStatus().toString()); final Map<String, Object> variables = certification.getVariableValues(localSettings); variables.put("status", statusString); // Get the destination (buyer) final Member buyer = certification.getBuyer(); // Get the message settings (buyer) final String subjectBuyer = messageSettings.getCertificationStatusChangedSubject(); final String bodyBuyer = messageSettings.getCertificationStatusChangedMessage(); final String smsBuyer = messageSettings.getCertificationStatusChangedSms(); // Process message content (buyer) final String processedSubjectBuyer = MessageProcessingHelper.processVariables(subjectBuyer, variables); final String processedBodyBuyer = MessageProcessingHelper.processVariables(bodyBuyer, variables); final String processedSmsBuyer = MessageProcessingHelper.processVariables(smsBuyer, variables); // Create the DTO (buyer) final SendMessageFromSystemDTO messageToBuyer = new SendMessageFromSystemDTO(); messageToBuyer.setEntity(certification); messageToBuyer.setType(Message.Type.CERTIFICATION); messageToBuyer.setToMember(buyer); messageToBuyer.setSubject(processedSubjectBuyer); messageToBuyer.setBody(processedBodyBuyer); messageToBuyer.setSms(processedSmsBuyer); // Send the message (to buyer) messageService.sendFromSystem(messageToBuyer); // If the new status is "EXPIRED" notify the issuer too if (certification.getStatus() == Certification.Status.EXPIRED) { // Get the destination (issuer) final Member issuer = certification.getIssuer(); // Get the message settings (issuer) final String subjectIssuer = messageSettings.getExpiredCertificationSubject(); final String bodyIssuer = messageSettings.getExpiredCertificationMessage(); final String smsIssuer = messageSettings.getExpiredCertificationSms(); // Process message content (issuer) final String processedSubjectIssuer = MessageProcessingHelper.processVariables(subjectIssuer, certification, localSettings); final String processedBodyIssuer = MessageProcessingHelper.processVariables(bodyIssuer, certification, localSettings); final String processedSmsIssuer = MessageProcessingHelper.processVariables(smsIssuer, certification, localSettings); // Create the DTO (issuer) final SendMessageFromSystemDTO messageToIssuer = new SendMessageFromSystemDTO(); messageToIssuer.setEntity(certification); messageToIssuer.setType(Message.Type.CERTIFICATION); messageToIssuer.setToMember(issuer); messageToIssuer.setSubject(processedSubjectIssuer); messageToIssuer.setBody(processedBodyIssuer); messageToIssuer.setSms(processedSmsIssuer); // Send the message (to buyer) messageService.sendFromSystem(messageToIssuer); } } @Override public void commissionContractAcceptedNotification(final BrokerCommissionContract brokerCommissionContract) { // Get the destination final Member destinationMember = brokerCommissionContract.getBrokering().getBroker(); // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getCommissionContractAcceptedSubject(); final String body = messageSettings.getCommissionContractAcceptedMessage(); final String sms = messageSettings.getCommissionContractAcceptedSms(); // Process message content final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, brokerCommissionContract, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, brokerCommissionContract, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, brokerCommissionContract, localSettings); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setEntity(brokerCommissionContract); message.setType(Message.Type.BROKERING); message.setToMember(destinationMember); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } @Override public void commissionContractCancelledNotification(final BrokerCommissionContract brokerCommissionContract) { // Get the destination final Member destinationMember = brokerCommissionContract.getBrokering().getBrokered(); // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getCommissionContractCancelledSubject(); final String body = messageSettings.getCommissionContractCancelledMessage(); final String sms = messageSettings.getCommissionContractCancelledSms(); // Process message content final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, brokerCommissionContract, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, brokerCommissionContract, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, brokerCommissionContract, localSettings); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setEntity(brokerCommissionContract); message.setType(Message.Type.BROKERING); message.setToMember(destinationMember); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } @Override public void commissionContractDeniedNotification(final BrokerCommissionContract brokerCommissionContract) { // Get the destination final Member destinationMember = brokerCommissionContract.getBrokering().getBroker(); // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getCommissionContractDeniedSubject(); final String body = messageSettings.getCommissionContractDeniedMessage(); final String sms = messageSettings.getCommissionContractDeniedSms(); // Process message content final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, brokerCommissionContract, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, brokerCommissionContract, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, brokerCommissionContract, localSettings); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setEntity(brokerCommissionContract); message.setType(Message.Type.BROKERING); message.setToMember(destinationMember); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } @Override public void deniedInvoiceNotification(final Invoice invoice) { if (!invoice.isFromSystem()) { // Get the destination final Member destinationMember = invoice.getFromMember(); // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getInvoiceDeniedSubject(); final String body = messageSettings.getInvoiceDeniedMessage(); final String sms = messageSettings.getInvoiceDeniedSms(); // Process message content final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, invoice.getTo(), invoice); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, invoice.getTo(), invoice); final String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, invoice.getTo(), invoice); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.INVOICE); message.setEntity(invoice); message.setToMember(destinationMember); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } } @Override public void expiredAdNotification(final Ad ad) { final LocalSettings localSettings = settingsService.getLocalSettings(); // Get message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getAdExpirationSubject(); final String body = messageSettings.getAdExpirationMessage(); final String sms = messageSettings.getAdExpirationSms(); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.AD_EXPIRATION); // Get the destination final Member owner = ad.getOwner(); message.setToMember(owner); // Process message content final String processedSubject = MessageProcessingHelper.processVariables(subject, ad, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, ad, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, ad, localSettings); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Process link and send message message.setEntity(ad); messageService.sendFromSystem(message); } @Override public void expiredBrokeringNotification(final Brokering brokering) { final LocalSettings localSettings = settingsService.getLocalSettings(); // Get message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getBrokeringExpirationSubject(); final String body = messageSettings.getBrokeringExpirationMessage(); final String sms = messageSettings.getBrokeringExpirationSms(); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.BROKERING); // Get the destination final Member broker = brokering.getBroker(); message.setToMember(broker); Member member = brokering.getBrokered(); // Process message content final String processedSubject = MessageProcessingHelper.processVariables(subject, member, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, member, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, member, localSettings); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send message messageService.sendFromSystem(message); } @Override public void expiredInvoiceNotification(final Invoice invoice) { // Get the settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final LocalSettings localSettings = settingsService.getLocalSettings(); // Send message to the sender of the invoice if (!invoice.isFromSystem()) { final String subjectSender = messageSettings.getSentInvoiceExpiredSubject(); final String bodySender = messageSettings.getSentInvoiceExpiredMessage(); final String smsSender = messageSettings.getSentInvoiceExpiredSms(); final String processedSubjectSender = MessageProcessingHelper.processVariables(subjectSender, localSettings, invoice.getTo(), invoice); final String processedBodySender = MessageProcessingHelper.processVariables(bodySender, localSettings, invoice.getTo(), invoice); final String processedSmsSender = MessageProcessingHelper.processVariables(smsSender, localSettings, invoice.getTo(), invoice); final SendMessageFromSystemDTO messageSender = new SendMessageFromSystemDTO(); messageSender.setType(Message.Type.INVOICE); messageSender.setEntity(invoice); messageSender.setToMember(invoice.getFromMember()); messageSender.setSubject(processedSubjectSender); messageSender.setBody(processedBodySender); messageSender.setSms(processedSmsSender); messageService.sendFromSystem(messageSender); } // Send message to the receiver of the invoice if (!invoice.isToSystem()) { final String subjectReceiver = messageSettings.getReceivedInvoiceExpiredSubject(); final String bodyReceiver = messageSettings.getReceivedInvoiceExpiredMessage(); final String smsReceiver = messageSettings.getReceivedInvoiceExpiredSms(); final String processedSubjectReceiver = MessageProcessingHelper.processVariables(subjectReceiver, localSettings, invoice.getFrom(), invoice); final String processedBodyReceiver = MessageProcessingHelper.processVariables(bodyReceiver, localSettings, invoice.getFrom(), invoice); final String processedSmsReceiver = MessageProcessingHelper.processVariables(smsReceiver, localSettings, invoice.getFrom(), invoice); final SendMessageFromSystemDTO messageReceiver = new SendMessageFromSystemDTO(); messageReceiver.setType(Message.Type.INVOICE); messageReceiver.setEntity(invoice); messageReceiver.setToMember(invoice.getToMember()); messageReceiver.setSubject(processedSubjectReceiver); messageReceiver.setBody(processedBodyReceiver); messageReceiver.setSms(processedSmsReceiver); messageService.sendFromSystem(messageReceiver); } } @Override public void expiredLoanNotification(final LoanPayment payment) { final LocalSettings localSettings = settingsService.getLocalSettings(); // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getLoanExpirationSubject(); final String body = messageSettings.getLoanExpirationMessage(); final String sms = messageSettings.getLoanExpirationSms(); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.LOAN); // Set entity for link processing final Loan loan = payment.getLoan(); message.setEntity(loan); // Get the destination final Member member = (Member) loan.getTransfer().getTo().getOwner(); message.setToMember(member); // Process message content final String processedSubject = MessageProcessingHelper.processVariables(subject, loan, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, loan, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, loan, localSettings); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } @Override public void externalChannelPaymentConfirmed(final PaymentRequestTicket ticket) { externalChannelPaymentNotification(ticket.getTransfer(), ticket.getFromChannel(), ticket.getToChannel()); } @Override public void externalChannelPaymentPerformed(final DoPaymentDTO dto, final Payment payment) { final String channelInternalName = dto.getChannel(); final Channel channel = channelService.loadByInternalName(channelInternalName); externalChannelPaymentNotification(payment, channel, null); } @Override public void externalChannelPaymentRequestExpired(final PaymentRequestTicket ticket) { // Get local and message settings final LocalSettings localSettings = settingsService.getLocalSettings(); final MessageSettings messageSettings = settingsService.getMessageSettings(); final Channel smsChannel = channelService.getSmsChannel(); // Only notify the payer if not on SMS channel final Channel toChannel = ticket.getToChannel(); final boolean skipToSms = toChannel.equals(smsChannel); final Map<String, Object> toVariables = ticket.getVariableValues(localSettings); toVariables.put("channel", toChannel.getDisplayName()); // Get payer message final Member payer = ticket.getFrom(); final String subjectPayer = messageSettings.getExternalChannelPaymentRequestExpiredPayerSubject(); final String bodyPayer = messageSettings.getExternalChannelPaymentRequestExpiredPayerMessage(); final String smsPayer = skipToSms ? null : messageSettings.getExternalChannelPaymentRequestExpiredPayerSms(); // Process payer message content final String processedSubjectPayer = MessageProcessingHelper.processVariables(subjectPayer, toVariables); final String processedBodyPayer = MessageProcessingHelper.processVariables(bodyPayer, toVariables); final String processedSmsPayer = smsPayer == null ? null : MessageProcessingHelper.processVariables(smsPayer, toVariables); // Create the payer DTO final SendMessageFromSystemDTO messageToPayer = new SendMessageFromSystemDTO(); messageToPayer.setToMember(payer); messageToPayer.setType(Message.Type.EXTERNAL_PAYMENT); messageToPayer.setSubject(processedSubjectPayer); messageToPayer.setBody(processedBodyPayer); messageToPayer.setSms(processedSmsPayer); // Send message to payer messageService.sendFromSystem(messageToPayer); // Only notify the payee if not on SMS channel final Channel fromChannel = ticket.getFromChannel(); final boolean skipFromSms = fromChannel.equals(smsChannel); final Map<String, Object> variableValues = ticket.getVariableValues(localSettings); variableValues.put("channel", fromChannel.getDisplayName()); // Get receiver message final Member receiver = ticket.getTo(); final String subjectReceiver = messageSettings.getExternalChannelPaymentRequestExpiredReceiverSubject(); final String bodyReceiver = messageSettings.getExternalChannelPaymentRequestExpiredReceiverMessage(); final String smsReceiver = skipFromSms ? null : messageSettings.getExternalChannelPaymentRequestExpiredReceiverSms(); // Process receiver message content final String processedSubjectReceiver = MessageProcessingHelper.processVariables(subjectReceiver, variableValues); final String processedBodyReceiver = MessageProcessingHelper.processVariables(bodyReceiver, variableValues); final String processedSmsReceiver = smsReceiver == null ? null : MessageProcessingHelper.processVariables(smsReceiver, variableValues); // Create the receiver DTO final SendMessageFromSystemDTO messageToReceiver = new SendMessageFromSystemDTO(); messageToReceiver.setToMember(receiver); messageToReceiver.setType(Message.Type.PAYMENT); messageToReceiver.setSubject(processedSubjectReceiver); messageToReceiver.setBody(processedBodyReceiver); messageToReceiver.setSms(processedSmsReceiver); // Send message to receiver messageService.sendFromSystem(messageToReceiver); } @Override public void grantedLoanNotification(final Loan loan) { // Return when the loan is pending if (loan.getTransfer().getProcessDate() == null) { return; } // Get the destination final Member destinationMember = loan.getMember(); // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getLoanGrantedSubject(); final String body = messageSettings.getLoanGrantedMessage(); final String sms = messageSettings.getLoanGrantedSms(); // Process message contents final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, destinationMember, loan); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, destinationMember, loan); final String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, destinationMember, loan); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.LOAN); message.setEntity(loan); message.setToMember(destinationMember); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } @Override public void guaranteeAcceptedNotification(final Guarantee guarantee) { doGuaranteeStatusChangedNotification(guarantee, null); } @Override public void guaranteeCancelledNotification(final Guarantee guarantee) { doGuaranteeStatusChangedNotification(guarantee, null); } @Override public void guaranteeDeniedNotification(final Guarantee guarantee) { doGuaranteeStatusChangedNotification(guarantee, null); } @Override public void guaranteePendingIssuerNotification(final Guarantee guarantee) { if (guarantee.getStatus() == Guarantee.Status.PENDING_ISSUER) { // only send notification if the status is PENDING_ISSUER // Get local and message settings final LocalSettings localSettings = settingsService.getLocalSettings(); final MessageSettings messageSettings = settingsService.getMessageSettings(); // Get the destination final Member toMember = guarantee.getIssuer(); // Get the message settings String subject = null; String body = null; String sms = null; if (guarantee.getGuaranteeType().getModel() == GuaranteeType.Model.WITH_BUYER_ONLY) { subject = messageSettings.getPendingBuyerOnlyGuaranteeIssuerSubject(); body = messageSettings.getPendingBuyerOnlyGuaranteeIssuerMessage(); sms = messageSettings.getPendingBuyerOnlyGuaranteeIssuerSms(); } else { subject = messageSettings.getPendingGuaranteeIssuerSubject(); body = messageSettings.getPendingGuaranteeIssuerMessage(); sms = messageSettings.getPendingGuaranteeIssuerSms(); } // Process message content final String processedSubject = MessageProcessingHelper.processVariables(subject, guarantee, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, guarantee, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, guarantee, localSettings); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setEntity(guarantee); message.setType(Message.Type.GUARANTEE); message.setToMember(toMember); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } } @Override public void guaranteeStatusChangedNotification(final Guarantee guarantee, final Guarantee.Status prevStatus) { doGuaranteeStatusChangedNotification(guarantee, prevStatus); } @Override public void newCommissionContractNotification(final BrokerCommissionContract brokerCommissionContract) { // Get message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getNewCommissionContractSubject(); final String body = messageSettings.getNewCommissionContractMessage(); final String sms = messageSettings.getNewCommissionContractSms(); // Process message content final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, brokerCommissionContract, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, brokerCommissionContract, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, brokerCommissionContract, localSettings); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setEntity(brokerCommissionContract); message.setType(Message.Type.BROKERING); message.setToMember(brokerCommissionContract.getBrokering().getBrokered()); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } @Override public void paymentAuthorizedOrDeniedNotification(Transfer transfer, final boolean notifyTransactionFeedbackRequest) { transfer = fetchService.reload(transfer, Transfer.Relationships.AUTHORIZATIONS); if (CollectionUtils.isEmpty(transfer.getAuthorizations())) { return; } final AccountOwner fromOwner = transfer.getFromOwner(); final AccountOwner toOwner = transfer.getToOwner(); final List<Member> sendMessageTo = new ArrayList<Member>(); final boolean loggedAsPayer = LoggedUser.hasUser() && LoggedUser.isMember() && LoggedUser.accountOwner().equals(fromOwner); if (!loggedAsPayer && (fromOwner instanceof Member)) { sendMessageTo.add((Member) fromOwner); } final boolean loggedAsReceiver = LoggedUser.hasUser() && LoggedUser.isMember() && LoggedUser.accountOwner().equals(toOwner); if (!loggedAsReceiver && (toOwner instanceof Member)) { sendMessageTo.add((Member) toOwner); } if (!sendMessageTo.isEmpty()) { // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); String subject; String body; String sms; switch (transfer.getStatus()) { case PROCESSED: // Was authorized and processed subject = messageSettings.getPendingPaymentAuthorizedSubject(); body = messageSettings.getPendingPaymentAuthorizedMessage(); sms = messageSettings.getPendingPaymentAuthorizedSms(); break; case PENDING: // Was authorized but needs higher level if (fromOwner instanceof Member) { final Authorizer authorizer = transfer.getNextAuthorizationLevel().getAuthorizer(); final LocalSettings localSettings = settingsService.getLocalSettings(); final Member fromMember; switch (authorizer) { case ADMIN: adminNotificationHandler.notifyNewPendingPayment(transfer); break; case BROKER: // Notify the broker if he currently has to authorize fromMember = fetchService.fetch((Member) fromOwner, Member.Relationships.BROKER); final Member broker = fromMember.getBroker(); if (broker != null) { subject = messageSettings.getNewPendingPaymentByBrokerSubject(); body = messageSettings.getNewPendingPaymentByBrokerMessage(); sms = messageSettings.getNewPendingPaymentByBrokerSms(); final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, fromMember, transfer); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, fromMember, transfer); final String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, fromMember, transfer); // Send the message final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.BROKERING); message.setEntity(transfer); message.setToMember(broker); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); messageService.sendFromSystem(message); } break; case PAYER: // Notify the payer if he currently has to authorize fromMember = (Member) fromOwner; final Member toMember = (Member) toOwner; subject = messageSettings.getNewPendingPaymentByPayerSubject(); body = messageSettings.getNewPendingPaymentByPayerMessage(); sms = messageSettings.getNewPendingPaymentByPayerSms(); final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, toMember, transfer); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, toMember, transfer); final String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, toMember, transfer); // Send the message final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.PAYMENT); message.setEntity(transfer); message.setToMember(fromMember); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); messageService.sendFromSystem(message); break; case RECEIVER: // nothing to do because this level could be only the first // and this method is called after the first authorization break; } } // If necessary, the message was already sent or the payment needs another authorization level return; case DENIED: // Was denied subject = messageSettings.getPendingPaymentDeniedSubject(); body = messageSettings.getPendingPaymentDeniedMessage(); sms = messageSettings.getPendingPaymentDeniedSms(); break; default: // Unknown status. return; } // Send the messages sendPaymentMessages(transfer, sendMessageTo, subject, body, sms); } // Send the transaction feedback request message if (notifyTransactionFeedbackRequest) { notifyTransactionFeedbackRequest(transfer); } } @Override public void paymentCancelledNotification(final Transfer transfer) { final AccountOwner fromOwner = transfer.getFromOwner(); final AccountOwner toOwner = transfer.getToOwner(); final boolean loggedAsSender = LoggedUser.hasUser() && LoggedUser.isMember() && LoggedUser.accountOwner().equals(fromOwner); final List<Member> sendMessageTo = new ArrayList<Member>(); if (!loggedAsSender && (fromOwner instanceof Member)) { sendMessageTo.add((Member) fromOwner); } if (toOwner instanceof Member) { sendMessageTo.add((Member) toOwner); } // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getPendingPaymentCanceledSubject(); final String body = messageSettings.getPendingPaymentCanceledMessage(); final String sms = messageSettings.getPendingPaymentCanceledSms(); // Send the messages sendPaymentMessages(transfer, sendMessageTo, subject, body, sms); } @Override public void paymentObligationPublishedNotification(final PaymentObligation paymentObligation) { // Get local and message settings final LocalSettings localSettings = settingsService.getLocalSettings(); final MessageSettings messageSettings = settingsService.getMessageSettings(); // Notify the seller final Member toMember = paymentObligation.getSeller(); final String subject = messageSettings.getPaymentObligationRegisteredSubject(); final String body = messageSettings.getPaymentObligationRegisteredMessage(); final String sms = messageSettings.getPaymentObligationRegisteredSms(); // Process message content final String processedSubject = MessageProcessingHelper.processVariables(subject, paymentObligation, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, paymentObligation, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, paymentObligation, localSettings); // Create the message DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setEntity(paymentObligation); message.setType(Message.Type.PAYMENT_OBLIGATION); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); message.setToMember(toMember); messageService.sendFromSystem(message); } @Override public void paymentObligationRejectedNotification(final PaymentObligation paymentObligation) { // Get local and message settings final LocalSettings localSettings = settingsService.getLocalSettings(); final MessageSettings messageSettings = settingsService.getMessageSettings(); // Notify the buyer final Member toMember = paymentObligation.getBuyer(); final String subject = messageSettings.getPaymentObligationRejectedSubject(); final String body = messageSettings.getPaymentObligationRejectedMessage(); final String sms = messageSettings.getPaymentObligationRejectedSms(); // Process message content final String processedSubject = MessageProcessingHelper.processVariables(subject, paymentObligation, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, paymentObligation, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, paymentObligation, localSettings); // Create the message DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setEntity(paymentObligation); message.setType(Message.Type.PAYMENT_OBLIGATION); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); message.setToMember(toMember); messageService.sendFromSystem(message); } @Override public void paymentReceivedNotification(final Payment payment) { // A message is sent only when the payment is a transfer and the destination is a member (not system) if (payment instanceof Transfer && payment.getToOwner() instanceof Member) { final Transfer transfer = (Transfer) payment; // Only send notifications for root transfers if (!transfer.isRoot()) { return; } final MessageSettings messageSettings = settingsService.getMessageSettings(); final LocalSettings localSettings = settingsService.getLocalSettings(); // Get the transfer authorizer, if any final AuthorizationLevel nextAuthorizationLevel = transfer.getNextAuthorizationLevel(); final Authorizer authorizer = nextAuthorizationLevel == null ? null : nextAuthorizationLevel.getAuthorizer(); // Get the destination final Member destinationMember = (Member) payment.getToOwner(); final Set<MessageChannel> channels = preferenceService.receivedChannels(destinationMember, Message.Type.PAYMENT); if (!channels.isEmpty()) { // The account status is only used in messages via SMS final boolean sendSmsNotification = transfer.getType().isAllowSmsNotification() && channels.contains(MessageChannel.SMS); AccountStatus status = null; if (sendSmsNotification) { status = accountService.getCurrentStatus(new AccountDTO(transfer.getTo())); } // Get the message settings String subject = null; String body = null; String sms = null; // Check if the transfer has been processed or awaits authorization if (transfer.getProcessDate() == null) { if (authorizer == Authorizer.RECEIVER) { subject = messageSettings.getNewPendingPaymentByReceiverSubject(); body = messageSettings.getNewPendingPaymentByReceiverMessage(); if (sendSmsNotification) { sms = messageSettings.getNewPendingPaymentByReceiverSms(); } } else { subject = messageSettings.getPendingPaymentReceivedSubject(); body = messageSettings.getPendingPaymentReceivedMessage(); if (sendSmsNotification) { sms = messageSettings.getPendingPaymentReceivedSms(); } } } else { subject = messageSettings.getPaymentReceivedSubject(); body = messageSettings.getPaymentReceivedMessage(); if (sendSmsNotification) { sms = messageSettings.getPaymentReceivedSms(); } } // Process message contents final AccountOwner fromAccountOwner = payment.getFromOwner(); final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, fromAccountOwner, payment); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, fromAccountOwner, payment); final String processedSms = sendSmsNotification ? MessageProcessingHelper.processVariables(sms, localSettings, fromAccountOwner, status, payment) : null; // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.PAYMENT); message.setEntity(payment); message.setToMember(destinationMember); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); message.setSmsTraceData(transfer.getTraceData()); // Send the message messageService.sendFromSystem(message); } // Notify the broker final Member fromMember = fetchService.fetch(payment.isFromSystem() ? null : (Member) payment.getFromOwner(), Member.Relationships.BROKER); final Member broker = fromMember == null ? null : fromMember.getBroker(); if (authorizer == Authorizer.BROKER && broker != null) { final String subject = messageSettings.getNewPendingPaymentByBrokerSubject(); final String body = messageSettings.getNewPendingPaymentByBrokerMessage(); final String sms = messageSettings.getNewPendingPaymentByBrokerSms(); final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, fromMember, payment); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, fromMember, payment); final String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, fromMember, payment); final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.BROKERING); message.setEntity(payment); message.setToMember(broker); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } } // Request a transaction feedback for the payment source notifyTransactionFeedbackRequest(payment); // Perform the low units notification, if needed notifyLowUnits(payment); } @Override public void posPinBlockedNotification(final MemberPos memberPos) { Member member = memberPos.getMember(); Pos pos = memberPos.getPos(); // Get message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getPosPinBlockedSubject(); final String body = messageSettings.getPosPinBlockedMessage(); final String sms = messageSettings.getPosPinBlockedSms(); final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, pos, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, pos, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, pos, localSettings); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.ACCESS); message.setToMember(member); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } @Override public void receivedInvoiceNotification(final Invoice invoice) { // Get the destination final Member destinationMember = invoice.getToMember(); // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getInvoiceReceivedSubject(); final String body = messageSettings.getInvoiceReceivedMessage(); final String sms = messageSettings.getInvoiceReceivedSms(); // Process message content final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, invoice.getFrom(), invoice); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, invoice.getFrom(), invoice); final String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, invoice.getFrom(), invoice); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.INVOICE); message.setEntity(invoice); message.setToMember(destinationMember); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } @Override public void receivedReferenceNotification(final Reference reference) { // Get the destination final Member destinationMember = reference.getTo(); // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getReferenceReceivedSubject(); final String body = messageSettings.getReferenceReceivedMessage(); final String sms = messageSettings.getReferenceReceivedSms(); // Process message contents final LocalSettings localSettings = settingsService.getLocalSettings(); final Member fromMember = reference.getFrom(); final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, fromMember, reference); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, fromMember, reference); final String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, fromMember, reference); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.REFERENCE); message.setEntity(reference); message.setToMember(destinationMember); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } @Override public void removedBrokeringNotification(final ChangeBrokerDTO dto) { final Member member = fetchService.fetch(dto.getMember()); final Brokering oldBrokering = brokeringService.getActiveBrokering(member); final Member oldBroker = (oldBrokering == null) ? null : oldBrokering.getBroker(); final Member newBroker = dto.getNewBroker(); final boolean justSuspendCommission = (oldBroker != null && oldBroker.equals(newBroker) && dto.isSuspendCommission()); if (!justSuspendCommission && oldBroker != null) { // Get message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getBrokeringRemovedSubject(); final String body = messageSettings.getBrokeringRemovedMessage(); final String sms = messageSettings.getBrokeringRemovedSms(); // Process message body final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, member, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, member, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, member, localSettings); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.BROKERING); message.setToMember(oldBroker); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } } @Override public void removedFromBrokerGroupNotification(final Member member) { Group group = member.getGroup(); // Get message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getRemovedFromBrokerGroupSubject(); final String body = messageSettings.getRemovedFromBrokerGroupMessage(); final String sms = messageSettings.getRemovedFromBrokerGroupSms(); // Process message content final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, group, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, group, localSettings); final String processedSms = MessageProcessingHelper.processVariables(sms, group, localSettings); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.BROKERING); message.setToMember(member); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } @Override public void scheduledPaymentProcessingNotification(final Transfer transfer, final boolean notifyPayer, final boolean notifyReceiver) { notifyScheduledPaymentProcessing(transfer, notifyPayer, notifyReceiver); } @Override public void scheduledPaymentsCancelledNotification(final Member member, final boolean notifyMember, final Set<Member> membersToNotify, final Set<MemberAccountType> removedAccounts) { final MessageSettings messageSettings = settingsService.getMessageSettings(); final LocalSettings localSettings = settingsService.getLocalSettings(); Map<String, Object> context = new HashMap<String, Object>(); context.putAll(member.getVariableValues(localSettings)); String processedSubject = MessageProcessingHelper.processVariables(messageSettings.getScheduledPaymentsCancelledToOtherSubject(), context); String processedBody = MessageProcessingHelper.processVariables(messageSettings.getScheduledPaymentsCancelledToOtherMessage(), context); String processedSms = MessageProcessingHelper.processVariables(messageSettings.getScheduledPaymentsCancelledToOtherSms(), context); for (Member m : membersToNotify) { // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.PAYMENT); message.setToMember(m); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } if (notifyMember) { context.put("accounts", getAccountNames(removedAccounts)); processedSubject = MessageProcessingHelper.processVariables(messageSettings.getScheduledPaymentsCancelledSubject(), context); processedBody = MessageProcessingHelper.processVariables(messageSettings.getScheduledPaymentsCancelledMessage(), context); processedSms = MessageProcessingHelper.processVariables(messageSettings.getScheduledPaymentsCancelledSms(), context); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.PAYMENT); message.setToMember(member); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } } public void setAccountServiceLocal(final AccountServiceLocal accountService) { this.accountService = accountService; } public void setAdminNotificationHandler(final AdminNotificationHandler adminNotificationHandler) { this.adminNotificationHandler = adminNotificationHandler; } public void setBrokeringServiceLocal(final BrokeringServiceLocal brokeringService) { this.brokeringService = brokeringService; } public void setCertificationServiceLocal(final CertificationServiceLocal certificationService) { this.certificationService = certificationService; } public void setChannelServiceLocal(final ChannelServiceLocal channelService) { this.channelService = channelService; } public void setFetchServiceLocal(final FetchServiceLocal fetchService) { this.fetchService = fetchService; } public void setGroupServiceLocal(final GroupServiceLocal groupService) { this.groupService = groupService; } public void setInvoiceServiceLocal(final InvoiceServiceLocal invoiceService) { this.invoiceService = invoiceService; } public void setMessageResolver(final MessageResolver messageResolver) { this.messageResolver = messageResolver; } public void setMessageServiceLocal(final MessageServiceLocal messageService) { this.messageService = messageService; } public void setPreferenceServiceLocal(final PreferenceServiceLocal preferenceService) { this.preferenceService = preferenceService; } public void setSettingsServiceLocal(final SettingsServiceLocal settingsService) { this.settingsService = settingsService; } @Override public void transactionFeedBackAdminCommentsNotification(final TransactionFeedback transactionFeedback) { // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getTransactionFeedbackAdminCommentsSubject(); final String body = messageSettings.getTransactionFeedbackAdminCommentsMessage(); final String sms = messageSettings.getTransactionFeedbackAdminCommentsSms(); // Process message body final LocalSettings localSettings = settingsService.getLocalSettings(); // Send the notification to the feedback writer { final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, transactionFeedback.getTo(), transactionFeedback.getTransfer()); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, transactionFeedback.getTo(), transactionFeedback.getTransfer()); final String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, transactionFeedback.getTo(), transactionFeedback.getTransfer()); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.TRANSACTION_FEEDBACK); message.setEntity(transactionFeedback); message.setToMember(transactionFeedback.getFrom()); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } // Send the notification to the feedback receiver { final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, transactionFeedback.getFrom(), transactionFeedback.getTransfer()); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, transactionFeedback.getFrom(), transactionFeedback.getTransfer()); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.TRANSACTION_FEEDBACK); message.setEntity(transactionFeedback); message.setToMember(transactionFeedback.getTo()); message.setSubject(processedSubject); message.setBody(processedBody); // Send the message messageService.sendFromSystem(message); } } @Override public void transactionFeedBackReceivedNotification(final TransactionFeedback transactionFeedback) { // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getTransactionFeedbackReceivedSubject(); final String body = messageSettings.getTransactionFeedbackReceivedMessage(); final String sms = messageSettings.getTransactionFeedbackReceivedSms(); final LocalSettings localSettings = settingsService.getLocalSettings(); final Map<String, Object> extraVariables = new HashMap<String, Object>(); final Payment payment = transactionFeedback.getPayment(); final Calendar limit = payment.getType().getFeedbackReplyExpirationTime().add(Calendar.getInstance()); extraVariables.put("limit", localSettings.getDateConverter().toString(limit)); // Process the message String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, transactionFeedback.getFrom(), payment); processedSubject = MessageProcessingHelper.processVariables(processedSubject, extraVariables); String processedBody = MessageProcessingHelper.processVariables(body, localSettings, transactionFeedback.getFrom(), payment); processedBody = MessageProcessingHelper.processVariables(processedBody, extraVariables); String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, transactionFeedback.getFrom(), payment); processedSms = MessageProcessingHelper.processVariables(processedSms, extraVariables); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.TRANSACTION_FEEDBACK); message.setEntity(transactionFeedback); message.setToMember(transactionFeedback.getTo()); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } @Override public void transactionFeedBackReplyNotification(final TransactionFeedback transactionFeedback) { // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getTransactionFeedbackReplySubject(); final String body = messageSettings.getTransactionFeedbackReplyMessage(); final String sms = messageSettings.getTransactionFeedbackReplySms(); // Process message body final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, transactionFeedback.getTo(), transactionFeedback.getTransfer()); final String processedBody = MessageProcessingHelper.processVariables(body, localSettings, transactionFeedback.getTo(), transactionFeedback.getTransfer()); final String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, transactionFeedback.getTo(), transactionFeedback.getTransfer()); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.TRANSACTION_FEEDBACK); message.setEntity(transactionFeedback); message.setToMember(transactionFeedback.getFrom()); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } private void doGuaranteeStatusChangedNotification(final Guarantee guarantee, final Guarantee.Status prevStatus) { // Get local and message settings final LocalSettings localSettings = settingsService.getLocalSettings(); final MessageSettings messageSettings = settingsService.getMessageSettings(); // Process new status string final String statusString = messageResolver.message("guarantee.status." + guarantee.getStatus().toString()); final Map<String, Object> variables = guarantee.getVariableValues(localSettings); variables.put("status", statusString); final Guarantee.Status newStatus = guarantee.getStatus(); // If the guarantee was accepted, denied or cancelled, notify members if (newStatus == Guarantee.Status.ACCEPTED || newStatus == Guarantee.Status.REJECTED || newStatus == Guarantee.Status.CANCELLED) { // Check if the model of the guarantee is "buyer only" final boolean buyerOnly = guarantee.getGuaranteeType().getModel() == GuaranteeType.Model.WITH_BUYER_ONLY; // Get the destination final Member buyer = guarantee.getBuyer(); final Member seller = guarantee.getSeller(); final Member issuer = guarantee.getIssuer(); // Get the message settings String subject = null; String body = null; String sms = null; if (buyerOnly) { subject = messageSettings.getBuyerOnlyGuaranteeStatusChangedSubject(); body = messageSettings.getBuyerOnlyGuaranteeStatusChangedMessage(); sms = messageSettings.getBuyerOnlyGuaranteeStatusChangedSms(); } else { subject = messageSettings.getGuaranteeStatusChangedSubject(); body = messageSettings.getGuaranteeStatusChangedMessage(); sms = messageSettings.getGuaranteeStatusChangedSms(); } // Process message content final String processedSubject = MessageProcessingHelper.processVariables(subject, variables); final String processedBody = MessageProcessingHelper.processVariables(body, variables); final String processedSms = MessageProcessingHelper.processVariables(sms, variables); // Create the message DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setEntity(guarantee); message.setType(Message.Type.GUARANTEE); // Send the message to the buyer message.setToMember(buyer); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); messageService.sendFromSystem(message); // If the guarantee was cancelled, notify the issuer too if (newStatus == Guarantee.Status.CANCELLED) { message.setToMember(issuer); message.setSubject(processedSubject); message.setBody(processedBody); messageService.sendFromSystem(message); } // If the model is not "buyer only", notify the seller too if (!buyerOnly) { message.setToMember(seller); message.setSubject(processedSubject); message.setBody(processedBody); messageService.sendFromSystem(message); } } else if (newStatus == Guarantee.Status.WITHOUT_ACTION && prevStatus == Guarantee.Status.PENDING_ISSUER) { // If the guarantee has expired, // Notify the issuer // Get the destination final Member issuer = guarantee.getIssuer(); // Get the message settings final String subject = messageSettings.getExpiredGuaranteeSubject(); final String body = messageSettings.getExpiredGuaranteeMessage(); final String sms = messageSettings.getExpiredGuaranteeSms(); // Process message content final String processedSubject = MessageProcessingHelper.processVariables(subject, variables); final String processedBody = MessageProcessingHelper.processVariables(body, variables); final String processedSms = MessageProcessingHelper.processVariables(sms, variables); // Create the message DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setEntity(guarantee); message.setType(Message.Type.GUARANTEE); message.setSubject(processedSubject); message.setBody(processedBody); message.setToMember(issuer); message.setSms(processedSms); // Send the message to the issuer messageService.sendFromSystem(message); } } /** * Notify the owner of the given account if it is getting low units. In a separated method as it need to be synchronized */ private synchronized void doSendLowUnitsNotification(final MemberAccount account, final MemberGroupAccountSettings mgas) { final Member fromOwner = account.getOwner(); // We could send the message. Check the last date it was sent Calendar lastLowUnitsSent = account.getLastLowUnitsSent(); if (lastLowUnitsSent != null && DateHelper.decimalDaysBetween(lastLowUnitsSent, Calendar.getInstance()).doubleValue() < 1) { // Already sent a low units notification in less than 1 day. Skip. return; } AccountStatus status = accountService.getCurrentStatus(new AccountDTO(account)); if (status.getAvailableBalance().compareTo(mgas.getLowUnits()) > 0) { // The balance is greater than the low units return; } // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getLowUnitsSubject(); String body = mgas.getLowUnitsMessage(); // The message in the account settings overrides the message setting if (StringUtils.isEmpty(body)) { body = messageSettings.getLowUnitsMessage(); } final String sms = messageSettings.getLowUnitsSms(); // Process message content final LocalSettings localSettings = settingsService.getLocalSettings(); final Map<String, Object> variables = new HashMap<String, Object>(); variables.putAll(fromOwner.getVariableValues(localSettings)); variables.putAll(account.getVariableValues(localSettings)); variables.putAll(status.getVariableValues(localSettings)); final String processedSubject = MessageProcessingHelper.processVariables(subject, variables); final String processedBody = MessageProcessingHelper.processVariables(body, variables); final String processedSms = MessageProcessingHelper.processVariables(sms, variables); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.ACCOUNT); message.setToMember(fromOwner); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); // Update the last low units sent, so we won't send another message in the same day account.setLastLowUnitsSent(Calendar.getInstance()); } private void externalChannelPaymentNotification(final Payment payment, final Channel fromChannel, final Channel toChannel) { // Get local and message settings final LocalSettings localSettings = settingsService.getLocalSettings(); final MessageSettings messageSettings = settingsService.getMessageSettings(); final boolean isPaymentConfirmation = toChannel != null; final Channel smsChannel = channelService.getSmsChannel(); // if it isn't then is a payment from System if (payment.getFromOwner() instanceof Member) { final Channel channelToCheckForPayer = isPaymentConfirmation ? toChannel : fromChannel; final boolean skipSms = channelToCheckForPayer != null && channelToCheckForPayer.equals(smsChannel); // Get the origin final Member fromMember = (Member) payment.getFromOwner(); // Get the message settings final String subject = messageSettings.getExternalChannelPaymentPerformedSubject(); final String body = messageSettings.getExternalChannelPaymentPerformedMessage(); final String sms = skipSms ? null : messageSettings.getExternalChannelPaymentPerformedSms(); // Process message content final Map<String, Object> variableValues = payment.getVariableValues(localSettings); variableValues.put("channel", channelToCheckForPayer.getDisplayName()); final AccountOwner toOwner = payment.getToOwner(); String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, toOwner, payment); processedSubject = MessageProcessingHelper.processVariables(processedSubject, variableValues); String processedBody = MessageProcessingHelper.processVariables(body, localSettings, toOwner, payment); processedBody = MessageProcessingHelper.processVariables(processedBody, variableValues); String processedSms = null; if (sms != null) { processedSms = MessageProcessingHelper.processVariables(sms, localSettings, toOwner, payment); processedSms = MessageProcessingHelper.processVariables(processedSms, variableValues); } // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setToMember(fromMember); message.setType(Message.Type.EXTERNAL_PAYMENT); message.setEntity(payment); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } // Now, notify the member that received the payment, only if not to channel is SMS final Channel channelToCheckForReceiver = isPaymentConfirmation ? fromChannel : toChannel; if (channelToCheckForReceiver == null || !channelToCheckForReceiver.equals(smsChannel)) { paymentReceivedNotification(payment); } } private String getAccountNames(final Set<MemberAccountType> removedAccounts) { StringBuilder str = new StringBuilder(); for (MemberAccountType type : removedAccounts) { if (str.length() > 0) { str.append(", "); } str.append(type.getName()); } return str.toString(); } /** * Send the low units notification if needed */ private void notifyLowUnits(final Payment payment) { if (!(payment instanceof Transfer)) { return; } final Account account = fetchService.fetch(payment.getFrom(), RelationshipHelper.nested(Account.Relationships.TYPE, AccountType.Relationships.CURRENCY), RelationshipHelper.nested(Payment.Relationships.FROM, MemberAccount.Relationships.MEMBER, Element.Relationships.GROUP)); if (!(account instanceof MemberAccount)) { return; } final MemberAccount memberAccount = (MemberAccount) account; final Group group = memberAccount.getMember().getGroup(); final AccountType accountType = account.getType(); final MemberGroupAccountSettings mgas = groupService.loadAccountSettings(group.getId(), accountType.getId()); final BigDecimal lowUnits = mgas.getLowUnits() == null ? BigDecimal.ZERO : mgas.getLowUnits(); // If low units message is used... if (lowUnits.floatValue() > PRECISION_DELTA && StringUtils.isNotEmpty(mgas.getLowUnitsMessage())) { doSendLowUnitsNotification(memberAccount, mgas); } } private void notifyScheduledPaymentProcessing(final Transfer transfer, final boolean notifyPayer, final boolean notifyReceiver) { // Get the required data final Member payer = transfer.isFromSystem() ? null : (Member) transfer.getFrom().getOwner(); final Member payee = transfer.isToSystem() ? null : (Member) transfer.getTo().getOwner(); final AuthorizationLevel nextAuthorizationLevel = transfer.getNextAuthorizationLevel(); final Authorizer authorizer = nextAuthorizationLevel == null ? null : nextAuthorizationLevel.getAuthorizer(); final MessageSettings messageSettings = settingsService.getMessageSettings(); // Resolve the message String payerSubject; String payerBody; String payerSms; String payeeSubject; String payeeBody; String payeeSms; switch (transfer.getStatus()) { case PROCESSED: if (notifyPayer) { payerSubject = messageSettings.getScheduledPaymentProcessedSubject(); payerBody = messageSettings.getScheduledPaymentProcessedMessage(); payerSms = messageSettings.getScheduledPaymentProcessedSms(); } else { payerSubject = null; payerBody = null; payerSms = null; } if (notifyReceiver) { payeeSubject = messageSettings.getPaymentReceivedSubject(); payeeBody = messageSettings.getPaymentReceivedMessage(); payeeSms = messageSettings.getPaymentReceivedSms(); } else { payeeSubject = null; payeeBody = null; payeeSms = null; } break; case PENDING: // Payer don't get notified payerSubject = null; payerBody = null; payerSms = null; // Check whether the payee should authorize if (authorizer == Authorizer.RECEIVER) { payeeSubject = messageSettings.getNewPendingPaymentByReceiverSubject(); payeeBody = messageSettings.getNewPendingPaymentByReceiverMessage(); payeeSms = messageSettings.getNewPendingPaymentByReceiverSms(); } else { payeeSubject = messageSettings.getPendingPaymentReceivedSubject(); payeeBody = messageSettings.getPendingPaymentReceivedMessage(); payeeSms = messageSettings.getPendingPaymentReceivedSms(); } break; case FAILED: payerSubject = messageSettings.getScheduledPaymentFailedToPayerSubject(); payerBody = messageSettings.getScheduledPaymentFailedToPayerMessage(); payerSms = messageSettings.getScheduledPaymentFailedToPayerSms(); try { final ScheduledPayment scheduledPayment = transfer.getScheduledPayment(); boolean notify = scheduledPayment != null && scheduledPayment.isShowToReceiver(); if (!notify) { // try by invoice invoiceService.loadByPayment(scheduledPayment == null ? transfer : scheduledPayment); notify = true; } if (notify) { payeeSubject = messageSettings.getScheduledPaymentFailedToPayeeSubject(); payeeBody = messageSettings.getScheduledPaymentFailedToPayeeMessage(); payeeSms = messageSettings.getScheduledPaymentFailedToPayeeSms(); } else { payeeSubject = null; payeeBody = null; payeeSms = null; } } catch (final EntityNotFoundException e) { // Don't send message to payee when there's no associated invoice payeeSubject = null; payeeBody = null; payeeSms = null; } break; default: // Unknown status here!!! return; } // Prepare the message final LocalSettings localSettings = settingsService.getLocalSettings(); SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.PAYMENT); message.setEntity(transfer); // Send the message to the payer final Set<MessageChannel> payerChannels = payer == null || payerSubject == null ? null : preferenceService.receivedChannels(payer, Message.Type.PAYMENT); if (CollectionUtils.isNotEmpty(payerChannels)) { AccountStatus statusPayer = null; final boolean sendSmsNotification = transfer.getType().isAllowSmsNotification() && payerChannels.contains(MessageChannel.SMS); if (sendSmsNotification) { statusPayer = accountService.getCurrentStatus(new AccountDTO(transfer.getFrom())); } final AccountOwner payeeOwner = payee == null ? SystemAccountOwner.instance() : payee; message.setToMember(payer); message.setSubject(MessageProcessingHelper.processVariables(payerSubject, localSettings, payeeOwner, transfer)); message.setBody(MessageProcessingHelper.processVariables(payerBody, localSettings, payeeOwner, transfer)); if (sendSmsNotification) { message.setSms(MessageProcessingHelper.processVariables(payerSms, localSettings, payeeOwner, statusPayer, transfer)); } messageService.sendFromSystem(message); } // Send the message to the payee final Set<MessageChannel> payeeChannels = payee == null || payeeSubject == null ? null : preferenceService.receivedChannels(payee, Message.Type.PAYMENT); if (CollectionUtils.isNotEmpty(payeeChannels)) { AccountStatus statusPayee = null; final boolean sendSmsNotification = transfer.getType().isAllowSmsNotification() && payeeChannels.contains(MessageChannel.SMS); if (sendSmsNotification) { statusPayee = accountService.getCurrentStatus(new GetTransactionsDTO(transfer.getTo())); } final AccountOwner payerOwner = payer == null ? SystemAccountOwner.instance() : payer; message.setToMember(payee); message.setSubject(MessageProcessingHelper.processVariables(payeeSubject, localSettings, payerOwner, transfer)); message.setBody(MessageProcessingHelper.processVariables(payeeBody, localSettings, payerOwner, transfer)); if (sendSmsNotification) { message.setSms(MessageProcessingHelper.processVariables(payeeSms, localSettings, payerOwner, statusPayee, transfer)); } messageService.sendFromSystem(message); } // Notify the broker final Member broker = payer == null ? null : payer.getBroker(); if (authorizer == Authorizer.BROKER && broker != null) { final String subject = messageSettings.getNewPendingPaymentByBrokerSubject(); final String body = messageSettings.getNewPendingPaymentByBrokerMessage(); final String sms = messageSettings.getNewPendingPaymentByBrokerSms(); // Send the message message = new SendMessageFromSystemDTO(); message.setType(Message.Type.BROKERING); message.setEntity(transfer); message.setToMember(broker); message.setSubject(MessageProcessingHelper.processVariables(subject, localSettings, payer, transfer)); message.setBody(MessageProcessingHelper.processVariables(body, localSettings, payer, transfer)); message.setSms(MessageProcessingHelper.processVariables(sms, localSettings, payer, transfer)); messageService.sendFromSystem(message); } // Send a low units notification, if needed notifyLowUnits(transfer); } private void notifyTransactionFeedbackRequest(Payment payment) { // Payments from/to system, that hasn't been authorized yet or that don't use feedbacks are not notified payment = fetchService.fetch(payment, Payment.Relationships.FROM, Payment.Relationships.TO, Payment.Relationships.TYPE); if (payment == null || payment.isFromSystem() || payment.isToSystem() || !payment.getType().isRequiresFeedback()) { return; } // Transfers without process dates are skipped too if (payment instanceof Transfer) { final Transfer transfer = (Transfer) payment; if (transfer.getProcessDate() == null) { return; } } final Member from = (Member) payment.getFromOwner(); final Member to = (Member) payment.getToOwner(); // Get the message settings final MessageSettings messageSettings = settingsService.getMessageSettings(); final String subject = messageSettings.getTransactionFeedbackRequestSubject(); final String body = messageSettings.getTransactionFeedbackRequestMessage(); final String sms = messageSettings.getTransactionFeedbackRequestSms(); // Process message body final LocalSettings localSettings = settingsService.getLocalSettings(); final Map<String, Object> extraVariables = new HashMap<String, Object>(); final Calendar limit = payment.getType().getFeedbackExpirationTime().add(Calendar.getInstance()); extraVariables.put("limit", localSettings.getDateConverter().toString(limit)); String processedSubject = MessageProcessingHelper.processVariables(subject, localSettings, to, payment); String processedBody = MessageProcessingHelper.processVariables(body, localSettings, to, payment); String processedSms = MessageProcessingHelper.processVariables(sms, localSettings, to, payment); processedSubject = MessageProcessingHelper.processVariables(processedSubject, extraVariables); processedBody = MessageProcessingHelper.processVariables(processedBody, extraVariables); processedSms = MessageProcessingHelper.processVariables(processedSms, extraVariables); // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.TRANSACTION_FEEDBACK); message.setEntity(new TransactionFeedbackRequest(payment)); message.setToMember(from); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } private void sendPaymentMessages(final Transfer transfer, final List<Member> sendMessageTo, final String subject, final String body, final String sms) { // Process message contents final LocalSettings localSettings = settingsService.getLocalSettings(); final String processedSubject = MessageProcessingHelper.processVariables(subject, transfer, localSettings); final String processedBody = MessageProcessingHelper.processVariables(body, transfer, localSettings); final String processedSms = transfer.getType().isAllowSmsNotification() ? MessageProcessingHelper.processVariables(sms, transfer, localSettings) : null; // Send each message for (final Member member : sendMessageTo) { // Create the DTO final SendMessageFromSystemDTO message = new SendMessageFromSystemDTO(); message.setType(Message.Type.PAYMENT); message.setEntity(transfer); message.setToMember(member); message.setSubject(processedSubject); message.setBody(processedBody); message.setSms(processedSms); // Send the message messageService.sendFromSystem(message); } } }