/* 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.webservices.utils; import java.util.Collection; import java.util.List; import nl.strohalm.cyclos.entities.access.MemberUser; import nl.strohalm.cyclos.entities.access.User; import nl.strohalm.cyclos.entities.accounts.Currency; import nl.strohalm.cyclos.entities.accounts.transactions.Payment; import nl.strohalm.cyclos.entities.accounts.transactions.PaymentRequestTicket; import nl.strohalm.cyclos.entities.accounts.transactions.Ticket; import nl.strohalm.cyclos.entities.accounts.transactions.Transfer; import nl.strohalm.cyclos.entities.accounts.transactions.WebShopTicket; import nl.strohalm.cyclos.entities.customization.fields.MemberCustomField; import nl.strohalm.cyclos.entities.members.Element; import nl.strohalm.cyclos.entities.members.Member; import nl.strohalm.cyclos.entities.settings.LocalSettings; import nl.strohalm.cyclos.services.customization.MemberCustomFieldServiceLocal; import nl.strohalm.cyclos.services.elements.ElementServiceLocal; import nl.strohalm.cyclos.services.settings.SettingsServiceLocal; import nl.strohalm.cyclos.utils.CustomFieldHelper; import nl.strohalm.cyclos.webservices.WebServiceContext; import nl.strohalm.cyclos.webservices.model.PaymentRequestTicketVO; import nl.strohalm.cyclos.webservices.model.TicketVO; import nl.strohalm.cyclos.webservices.model.WebShopTicketVO; import nl.strohalm.cyclos.webservices.webshop.GenerateWebShopTicketParams; /** * Utility class for tickets<br> * <b>WARN</b>: Be aware that this helper <b>doesn't</b> access the services through the security layer. They are all local services. * @author luis */ public class TicketHelper { private MemberCustomFieldServiceLocal memberCustomFieldServiceLocal; private SettingsServiceLocal settingsServiceLocal; private ElementServiceLocal elementServiceLocal; private CurrencyHelper currencyHelper; private MemberHelper memberHelper; private CustomFieldHelper customFieldHelper; public void setCurrencyHelper(final CurrencyHelper currencyHelper) { this.currencyHelper = currencyHelper; } public void setCustomFieldHelper(final CustomFieldHelper customFieldHelper) { this.customFieldHelper = customFieldHelper; } public void setElementServiceLocal(final ElementServiceLocal elementService) { elementServiceLocal = elementService; } public void setMemberCustomFieldServiceLocal(final MemberCustomFieldServiceLocal memberCustomFieldService) { memberCustomFieldServiceLocal = memberCustomFieldService; } public void setMemberHelper(final MemberHelper memberHelper) { this.memberHelper = memberHelper; } public void setSettingsServiceLocal(final SettingsServiceLocal settingsService) { settingsServiceLocal = settingsService; } /** * Convert a params object into a ticket */ public WebShopTicket toTicket(final GenerateWebShopTicketParams params) { if (params == null) { return null; } final WebShopTicket ticket = new WebShopTicket(); ticket.setAmount(params.getAmount()); ticket.setCurrency(currencyHelper.resolve(params.getCurrency())); ticket.setClientAddress(params.getClientAddress()); ticket.setDescription(params.getDescription()); ticket.setReturnUrl(params.getReturnUrl()); // Check the member restriction final Member restricted = WebServiceContext.getMember(); if (restricted != null) { ticket.setTo(restricted); } else { try { final User user = elementServiceLocal.loadUser(params.getToUsername(), User.Relationships.ELEMENT); if (user instanceof MemberUser) { ticket.setTo(((MemberUser) user).getMember()); } else { throw new IllegalArgumentException("Invalid username: " + params.getToUsername() + ". It isn't an instance of MemberUser"); } } catch (final Exception e) { throw new IllegalArgumentException("Invalid member: " + params.getToUsername()); } } return ticket; } public PaymentRequestTicketVO toVO(final PaymentRequestTicket ticket, final Collection<MemberCustomField> requiredCustomFields) { if (ticket == null) { return null; } final PaymentRequestTicketVO vo = new PaymentRequestTicketVO(); fill(ticket, vo, true, requiredCustomFields); vo.setFromChannel(ticket.getFromChannel().getInternalName()); vo.setToChannel(ticket.getToChannel().getInternalName()); vo.setTraceData(ticket.getTraceData()); return vo; } public WebShopTicketVO toVO(final WebShopTicket ticket, final Collection<MemberCustomField> requiredCustomFields) { if (ticket == null) { return null; } final WebShopTicketVO vo = new WebShopTicketVO(); fill(ticket, vo, false, requiredCustomFields); vo.setMemberAddress(ticket.getMemberAddress()); vo.setClientAddress(ticket.getClientAddress()); vo.setReturnUrl(ticket.getReturnUrl()); return vo; } private void fill(final Ticket ticket, final TicketVO vo, final boolean onlyBasicCustomFields, final Collection<MemberCustomField> requiredCustomFields) { final Transfer transfer = ticket.getTransfer(); Currency currency = ticket.getCurrency(); if (currency == null && ticket.getTransferType() != null) { currency = ticket.getTransferType().getFrom().getCurrency(); } final LocalSettings localSettings = settingsServiceLocal.getLocalSettings(); vo.setId(ticket.getId()); vo.setTicket(ticket.getTicket()); vo.setAwaitingAuthorization(transfer != null && transfer.getStatus() == Payment.Status.PENDING); boolean isAwaitingAuthorization = vo.getAwaitingAuthorization(); vo.setOk(!isAwaitingAuthorization && ticket.getStatus() == Ticket.Status.OK); vo.setCancelled(ticket.getStatus() == Ticket.Status.CANCELLED); vo.setExpired(ticket.getStatus() == Ticket.Status.EXPIRED); vo.setPending(ticket.getStatus() == Ticket.Status.PENDING); final List<MemberCustomField> customFields = memberCustomFieldServiceLocal.list(); if (ticket.getFrom() != null) { final Member from = elementServiceLocal.load(ticket.getFrom().getId(), Element.Relationships.GROUP); List<MemberCustomField> fields = customFieldHelper.onlyForGroup(customFields, from.getMemberGroup()); if (onlyBasicCustomFields) { fields = customFieldHelper.onlyBasic(fields); } vo.setFromMember(memberHelper.toVO(from, fields, requiredCustomFields, false)); } if (ticket.getTo() != null) { final Member to = (Member) elementServiceLocal.load(ticket.getTo().getId(), Element.Relationships.GROUP); List<MemberCustomField> fields = customFieldHelper.onlyForGroup(customFields, to.getMemberGroup()); if (onlyBasicCustomFields) { fields = customFieldHelper.onlyBasic(fields); } vo.setToMember(memberHelper.toVO(to, fields, requiredCustomFields, false)); } vo.setAmount(ticket.getAmount()); if (currency == null) { vo.setFormattedAmount(localSettings.getNumberConverter().toString(ticket.getAmount())); } else { vo.setFormattedAmount(localSettings.getUnitsConverter(currency.getPattern()).toString(ticket.getAmount())); } vo.setDescription(ticket.getDescription()); vo.setCreationDate(ticket.getCreationDate()); vo.setFormattedCreationDate(localSettings.getDateTimeConverter().toString(ticket.getCreationDate())); } }