package com.lake.tahoe.models; import com.google.android.gms.maps.model.LatLng; import com.lake.tahoe.callbacks.ModelCallback; import com.lake.tahoe.callbacks.ModelFindCallback; import com.lake.tahoe.callbacks.ModelGetCallback; import com.lake.tahoe.utils.Currency; import com.lake.tahoe.utils.PushUtil; import com.parse.ParseClassName; import com.parse.ParseObject; import com.parse.ParseQuery; import com.paypal.android.sdk.payments.PayPalPayment; import java.math.BigDecimal; import java.text.NumberFormat; @ParseClassName("Request") public class Request extends ParseObject { public enum State { /** * Client creates a new Request */ OPEN, /** * Vendor accepts Request */ ACTIVE, /** * Vendor completes Request */ PENDING, /** * Vendor receives Payment */ FULFILLED, /** * Vendor cancels Payment */ CANCELLED } public Request() { super(); } public Request(State state) { super(); setState(state); } public User getClient() { return (User) getParseObject("client"); } public void setClient(User client) { put("client", client); } public User getVendor() { return (User) getParseObject("vendor"); } public void setVendor(User vendor) { if (vendor == null) remove("vendor"); else put("vendor", vendor); } public String getTitle() { return getString("title"); } public void setTitle(String title) { put("title", title); } public String getDescription() { return getString("description"); } public void setDescription(String description) { put("description", description); } public int getCents() { return getInt("cents"); } public String getDisplayDollars() { return Currency.getDisplayDollars(getCents()); } public BigDecimal getDollars() { BigDecimal dollars = new BigDecimal(getCents() / 100.0); return dollars.setScale(2, BigDecimal.ROUND_HALF_UP); } public PayPalPayment getPaypalPayment() { String currency = NumberFormat.getCurrencyInstance().getCurrency().getCurrencyCode(); return new PayPalPayment(getDollars(), currency, getTitle()); } public void setCents(Integer cents) { put("cents", cents); } public State getState() { return State.valueOf(getString("state")); } public void setState(State state) { put("state", state.toString()); } public LatLng getGoogleMapsLocation() { return getClient().getGoogleMapsLocation(); } public static ParseQuery<Request> getRequestQuery() { return ParseQuery.getQuery(Request.class); } public static void findNearbyRequests(Request.State requestState, User user, ModelCallback<Request> callback) { ParseQuery<Request> query = Request.getRequestQuery(); // FIXME -- join on user location for proximity querying too query.whereContains("state", requestState.toString()); query.whereExists("client"); query.include("client"); if (user != null) query.whereNotEqualTo("client", user); // exclude self requests // Exclude vendors -- see caveats about this query. // https://www.parse.com/docs/android_guide#queries ParseQuery<User> queryUser = User.getUserQuery(); queryUser.whereEqualTo("type", User.Type.CLIENT.toString()); query.whereMatchesQuery("client", queryUser); query.findInBackground(new ModelFindCallback<Request>(callback)); } public static void getByObjectId(String requestId, ModelCallback<Request> callback) { ParseQuery<Request> query = Request.getRequestQuery(); query.whereEqualTo("objectId", requestId); query.include("client"); query.getFirstInBackground(new ModelGetCallback<Request>(callback)); } public void saveAndPublish(PushUtil.HandlesPublish handler) { PushUtil.saveAndPublish(this, handler); } public void saveAndPublish() { PushUtil.saveAndPublish(this); } }