package crmdna.api.endpoint;
import com.google.api.server.spi.config.Api;
import com.google.api.server.spi.config.ApiMethod;
import com.google.api.server.spi.config.ApiMethod.HttpMethod;
import com.google.appengine.api.users.User;
import crmdna.api.endpoint.ClientApi.ClientEnum;
import crmdna.client.Client;
import crmdna.common.DateUtils;
import crmdna.common.DateUtils.DateRange;
import crmdna.common.Utils;
import crmdna.common.Utils.Currency;
import crmdna.common.api.APIResponse;
import crmdna.common.api.APIResponse.Status;
import crmdna.common.api.APIUtils;
import crmdna.common.api.RequestInfo;
import crmdna.payment2.Payment;
import crmdna.payment2.Payment.PaymentType;
import crmdna.payment2.PaymentEntity;
import crmdna.payment2.PaymentProp;
import crmdna.payment2.PaymentQueryCondition;
import javax.annotation.Nullable;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
@Api(name = "payment")
public class PaymentApi {
@ApiMethod(path = "recordCashOrChequePayment", httpMethod = HttpMethod.POST)
public APIResponse recordCashOrChequePayment(@Named("client") ClientEnum clientEnum,
@Named("amount") double amount, @Nullable @Named("currencyDefaultSGD") Currency currency,
@Nullable @Named("paymentTypeDefaultCash") PaymentType paymentType,
@Nullable @Named("collectedByDefaultLoggedInUser") String collectedBy,
@Nullable @Named("chequeNo") String chequeNo, @Nullable @Named("bank") String bank,
@Nullable @Named("tags") Set<String> tags,
@Nullable @Named("showStackTrace") Boolean showStackTrace, HttpServletRequest req, User user) {
String client =
Utils.removeSpaceUnderscoreBracketAndHyphen(clientEnum.toString().toLowerCase());
if (currency == null)
currency = Currency.SGD;
if (paymentType == null)
paymentType = PaymentType.CASH;
String login = null;
try {
Client.ensureValid(client);
login = Utils.getLoginEmail(user);
if (collectedBy == null)
collectedBy = login;
PaymentProp paymentProp = new PaymentProp();
paymentProp.amount = amount;
paymentProp.currency = currency;
paymentProp.bank = bank;
paymentProp.paymentType = paymentType;
paymentProp.collectedBy = collectedBy;
paymentProp.chequeNo = chequeNo;
paymentProp.bank = bank;
paymentProp.date = new Date();
paymentProp.transactionId = "MANUAL";
paymentProp.tags = tags;
PaymentProp prop = Payment.recordPayment(client, paymentProp, null, login);
return new APIResponse().status(Status.SUCCESS).object(prop);
} catch (Exception ex) {
return APIUtils.toAPIResponse(ex, showStackTrace, new RequestInfo().client(client).req(req)
.login(login));
}
}
@ApiMethod(path = "query", httpMethod = HttpMethod.POST)
public APIResponse query(@Named("client") ClientEnum clientEnum,
@Nullable @Named("currency") Currency currency,
@Nullable @Named("paymentType") PaymentType paymentType,
@Nullable @Named("collectedByEmail") String collectedBy,
@Nullable @Named("chequeNo") String chequeNo,
@Nullable @Named("dateRange") DateRange dateRange, @Nullable @Named("tags") Set<String> tags,
@Nullable @Named("showStackTrace") Boolean showStackTrace, HttpServletRequest req, User user) {
String client =
Utils.removeSpaceUnderscoreBracketAndHyphen(clientEnum.toString().toLowerCase());
String login = null;
try {
Client.ensureValid(client);
login = Utils.getLoginEmail(user);
PaymentQueryCondition qc = new PaymentQueryCondition();
qc.chequeNo = chequeNo;
qc.collectedBy = collectedBy;
qc.currency = currency;
qc.paymentType = paymentType;
if (dateRange != null) {
qc.endDate = new Date();
long startDateMS = qc.endDate.getTime() - DateUtils.getMilliSecondsFromDateRange(dateRange);
qc.startDate = new Date(startDateMS);
}
qc.tags = tags;
List<PaymentEntity> entities = Payment.query(client, qc, login);
List<PaymentProp> props = new ArrayList<>();
for (PaymentEntity entity : entities) {
props.add(entity.toProp());
}
return new APIResponse().status(Status.SUCCESS).object(props);
} catch (Exception ex) {
return APIUtils.toAPIResponse(ex, showStackTrace, new RequestInfo().client(client).req(req)
.login(login));
}
}
}