/* 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.setup; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.ResourceBundle; import java.util.Set; import nl.strohalm.cyclos.access.MemberPermission; import nl.strohalm.cyclos.entities.access.Channel; import nl.strohalm.cyclos.entities.access.Channel.Credentials; import nl.strohalm.cyclos.entities.access.Channel.Principal; import nl.strohalm.cyclos.entities.access.ChannelPrincipal; import nl.strohalm.cyclos.entities.accounts.MemberAccountType; import nl.strohalm.cyclos.entities.accounts.SystemAccountType; import nl.strohalm.cyclos.entities.accounts.transactions.PaymentFilter; import nl.strohalm.cyclos.entities.accounts.transactions.TransferType; import nl.strohalm.cyclos.entities.customization.fields.MemberCustomField; import nl.strohalm.cyclos.entities.groups.BrokerGroup; import nl.strohalm.cyclos.entities.groups.Group; import nl.strohalm.cyclos.entities.groups.MemberGroup; import nl.strohalm.cyclos.entities.groups.MemberGroupSettings; import nl.strohalm.cyclos.entities.infotexts.InfoText; import nl.strohalm.cyclos.entities.members.messages.Message; import nl.strohalm.cyclos.entities.members.messages.Message.Type; import nl.strohalm.cyclos.entities.services.ServiceClient; import nl.strohalm.cyclos.entities.services.ServiceOperation; import nl.strohalm.cyclos.entities.settings.Setting; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.Predicate; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; public class CreateSmsData implements Runnable { private final ResourceBundle bundle; private final Session session; private MemberGroup fullMembers; private MemberGroup inactiveMembers; private BrokerGroup fullBrokers; private Channel smsChannel; private TransferType smsTradeTT; private TransferType smsChargeTT; private MemberCustomField mobileCustomField; private MemberAccountType memberAccType; private SystemAccountType organizationAccType; private Collection<MemberGroup> enabledMemberGroups; public CreateSmsData(final Setup setup) { session = setup.getSession(); bundle = setup.getBundle(); } @Override public void run() { Setup.out.println(bundle.getString("sms-data.start")); fullMembers = (MemberGroup) session.createCriteria(MemberGroup.class).add(Restrictions.eq("name", bundle.getString("group.full-members.name"))).uniqueResult(); inactiveMembers = (MemberGroup) session.createCriteria(MemberGroup.class).add(Restrictions.eq("name", bundle.getString("group.inactive-members.name"))).uniqueResult(); fullBrokers = (BrokerGroup) session.createCriteria(BrokerGroup.class).add(Restrictions.eq("name", bundle.getString("group.full-brokers.name"))).uniqueResult(); enabledMemberGroups = Arrays.asList(fullMembers, fullBrokers); mobileCustomField = (MemberCustomField) session.createCriteria(MemberCustomField.class).add(Restrictions.eq("internalName", "mobilePhone")).uniqueResult(); memberAccType = (MemberAccountType) session.createCriteria(MemberAccountType.class).add(Restrictions.eq("name", bundle.getString("account.member.name"))).uniqueResult(); organizationAccType = (SystemAccountType) session.createCriteria(SystemAccountType.class).add(Restrictions.eq("name", bundle.getString("account.organization.name"))).uniqueResult(); createChannel(); createTransfers(); createServiceClient(); createLocalSettings(); creatInfoText(); updateMemberGroup(); updatePaymentFilter(); customizeFullMembersGroup(); customizeInactiveMembersGroup(); session.flush(); Setup.out.println(bundle.getString("sms-data.end")); } private void createChannel() { List<ChannelPrincipal> principals = new ArrayList<ChannelPrincipal>(); smsChannel = new Channel(); smsChannel.setDisplayName("SMS"); smsChannel.setInternalName("sms"); smsChannel.setCredentials(Credentials.PIN); smsChannel.setPaymentRequestWebServiceUrl("http://localhost:8080/sms/services/paymentRequest"); smsChannel.setPrincipals(principals); final ChannelPrincipal userPrincipal = new ChannelPrincipal(); userPrincipal.setChannel(smsChannel); userPrincipal.setPrincipal(Principal.USER); userPrincipal.setDefault(true); principals.add(userPrincipal); final ChannelPrincipal mobilePrincipal = new ChannelPrincipal(); mobilePrincipal.setChannel(smsChannel); mobilePrincipal.setPrincipal(Principal.CUSTOM_FIELD); mobilePrincipal.setCustomField(mobileCustomField); principals.add(mobilePrincipal); session.save(smsChannel); session.save(userPrincipal); session.save(mobilePrincipal); } private void createLocalSettings() { CreateBasicData.createSetting(session, Setting.Type.LOCAL, "cyclosId", "cyclos"); CreateBasicData.createSetting(session, Setting.Type.LOCAL, "smsEnabled", "true"); CreateBasicData.createSetting(session, Setting.Type.LOCAL, "smsCustomFieldId", mobileCustomField.getId().toString()); CreateBasicData.createSetting(session, Setting.Type.LOCAL, "smsChannelName", smsChannel.getInternalName()); CreateBasicData.createSetting(session, Setting.Type.LOCAL, "sendSmsWebServiceUrl", "http://localhost:8080/sms/services/smsSender"); } private void createServiceClient() { ServiceClient client = new ServiceClient(); client.setName(bundle.getString("service-client.controller.name")); client.setHostname("127.0.0.1"); client.setAddressBegin("127.000.000.001"); client.setAddressEnd("127.000.000.001"); client.setChannel(smsChannel); client.setCredentialsRequired(true); client.setIgnoreRegistrationValidations(true); client.setDoPaymentTypes(Collections.singleton(smsTradeTT)); client.setChargebackPaymentTypes(Collections.singleton(smsTradeTT)); client.setManageGroups(new HashSet<MemberGroup>(enabledMemberGroups)); Set<ServiceOperation> permissions = new HashSet<ServiceOperation>(); permissions.add(ServiceOperation.DO_PAYMENT); permissions.add(ServiceOperation.CHARGEBACK); permissions.add(ServiceOperation.MEMBERS); permissions.add(ServiceOperation.MANAGE_MEMBERS); permissions.add(ServiceOperation.ACCOUNT_DETAILS); permissions.add(ServiceOperation.ACCESS); permissions.add(ServiceOperation.SMS); permissions.add(ServiceOperation.INFO_TEXTS); client.setPermissions(permissions); session.save(client); } private void createTransfers() { // Add the sms trade transfer smsTradeTT = new TransferType(); smsTradeTT.setName(bundle.getString("transfer-type.sms-trade.name")); smsTradeTT.setDescription(bundle.getString("transfer-type.sms-trade.description")); smsTradeTT.setFrom(memberAccType); smsTradeTT.setTo(memberAccType); smsTradeTT.getContext().setPayment(true); smsTradeTT.setChannels(Collections.singleton(smsChannel)); // smsTradeTT.setMaxAmountPerDay(new BigDecimal(500)); smsTradeTT.setAllowSmsNotification(true); smsTradeTT.setGroups(new HashSet<Group>(enabledMemberGroups)); session.save(smsTradeTT); // Add the sms charging transfer smsChargeTT = new TransferType(); smsChargeTT.setName(bundle.getString("transfer-type.sms-charge.name")); smsChargeTT.setDescription(bundle.getString("transfer-type.sms-charge.description")); smsChargeTT.setFrom(memberAccType); smsChargeTT.setTo(organizationAccType); session.save(smsChargeTT); } private void creatInfoText() { InfoText info = new InfoText(); info.setAliases(Collections.singleton("info")); info.setBody(bundle.getString("info-text.sample.body")); info.setSubject(bundle.getString("info-text.sample.subject")); info.setEnabled(true); session.save(info); } private void customizeFullMembersGroup() { fullMembers.setInitialGroup(true); fullMembers.getPermissions().add(MemberPermission.SMS_VIEW); } private void customizeInactiveMembersGroup() { inactiveMembers.setInitialGroup(false); } private void updateMemberGroup() { for (MemberGroup mGrp : enabledMemberGroups) { CreateBasicData.associateGroupToChannel(smsChannel, mGrp); // Default messages sent by SMS Collection<Message.Type> smsMessages = mGrp.getDefaultSmsMessages(); if (smsMessages == null) { smsMessages = new ArrayList<Message.Type>(); mGrp.setDefaultSmsMessages(smsMessages); } smsMessages.add(Message.Type.PAYMENT); // SMS allowed messages final List<Type> smsMessageTypes = new ArrayList<Type>(Arrays.asList(Message.Type.values())); CollectionUtils.filter(smsMessageTypes, new Predicate() { @Override public boolean evaluate(final Object object) { final Message.Type type = (Message.Type) object; switch (type) { case FROM_MEMBER: case FROM_ADMIN_TO_MEMBER: case FROM_ADMIN_TO_GROUP: return false; default: return true; } } }); mGrp.setSmsMessages(smsMessageTypes); mGrp.setDefaultAllowChargingSms(true); mGrp.setDefaultAcceptFreeMailing(true); mGrp.setDefaultAcceptPaidMailing(true); MemberGroupSettings mSettings = mGrp.getMemberSettings(); mSettings.setSmsChargeTransferType(smsChargeTT); mSettings.setSmsChargeAmount(new BigDecimal(1)); // Add the sms trade transfer to the member-to-member permission collection mGrp.getTransferTypes().add(smsTradeTT); session.save(mGrp); } } private void updatePaymentFilter() { PaymentFilter filter = (PaymentFilter) session.createCriteria(PaymentFilter.class). add(Restrictions.eq("name", bundle.getString("payment-filter.member-payments"))). add(Restrictions.eq("accountType", memberAccType)) .uniqueResult(); filter.getTransferTypes().add(smsTradeTT); filter = (PaymentFilter) session.createCriteria(PaymentFilter.class). add(Restrictions.eq("name", bundle.getString("payment-filter.member-payments"))). add(Restrictions.eq("accountType", organizationAccType)) .uniqueResult(); filter.getTransferTypes().add(smsChargeTT); session.save(filter); } }