package crmdna.registration; import com.googlecode.objectify.annotation.Cache; import com.googlecode.objectify.annotation.Entity; import com.googlecode.objectify.annotation.Id; import com.googlecode.objectify.annotation.Index; import crmdna.common.Utils.PaypalErrorType; import crmdna.common.contact.Contact.Gender; import crmdna.registration.Registration.RegistrationStatus; import java.util.*; @Entity @Cache public class RegistrationEntity { @Id long registrationId; String firstName; String lastName; String nickName; String email; Gender gender; String mobilePhone; String homePhone; String officePhone; String homeAddress; String officeAddress; @Index long memberId; @Index long programId; String paymentUrl; String redirectUrl; String marketingChannel; String successCallbackUrl; String errorCallbackUrl; // pay pal fields String amount; String ccy; boolean isPaymentPending; String pendingReason; PaypalErrorType paypalErrorType; String L_SEVERITYCODE0; String L_ERRORCODE0; String L_SHORTMESSAGE0; String L_LONGMESSAGE0; @Index String transactionId; @Index Set<String> qsTags = new HashSet<>(); @Index private RegistrationStatus status; // track different states private List<Date> stateChangeTimestamps = new ArrayList<>(); private List<RegistrationStatus> statuses = new ArrayList<>(); RegistrationStatus getStatus() { return status; } Date getStatusTimestamp() { if (stateChangeTimestamps.size() == 0) return null; int size = stateChangeTimestamps.size(); return stateChangeTimestamps.get(size - 1); } void recordStateChange(RegistrationStatus rs) { status = rs; stateChangeTimestamps.add(new Date()); statuses.add(rs); } public RegistrationProp toProp() { RegistrationProp prop = new RegistrationProp(); prop.registrationId = registrationId; prop.firstName = firstName; prop.lastName = lastName; prop.nickName = nickName; prop.email = email; prop.mobilePhone = mobilePhone; prop.homePhone = homePhone; prop.officePhone = officePhone; prop.homeAddress = homeAddress; prop.officeAddress = officeAddress; prop.memberId = memberId; prop.programId = programId; prop.paymentUrl = paymentUrl; prop.redirectUrl = redirectUrl; prop.successCallbackUrl = successCallbackUrl; prop.errorCallbackUrl = errorCallbackUrl; prop.amount = amount; prop.ccy = ccy; prop.transactionId = transactionId; prop.isPaymentPending = isPaymentPending; prop.pendingReason = pendingReason; prop.paypalErrorType = paypalErrorType; prop.L_SEVERITYCODE0 = L_SEVERITYCODE0; prop.L_ERRORCODE0 = L_ERRORCODE0; prop.L_SHORTMESSAGE0 = L_SHORTMESSAGE0; prop.L_LONGMESSAGE0 = L_LONGMESSAGE0; for (int i = 0; i < statuses.size(); i++) { RegistrationStatusChange rsc = new RegistrationStatusChange(); rsc.newStatus = statuses.get(i); rsc.timestamp = stateChangeTimestamps.get(i); prop.changes.add(rsc); } prop.status = status; return prop; } }