}
public OrderDataBean completeOrder(Integer orderID, boolean twoPhase)
throws Exception {
EntityManager entityManager = emf.createEntityManager();
OrderDataBeanImpl order = null;
if (Log.doTrace())
Log.trace("TradeJpaAm:completeOrder", orderID + " twoPhase=" + twoPhase);
order = entityManager.find(OrderDataBeanImpl.class, orderID);
order.getQuote();
if (order == null) {
Log.error("TradeJpaAm:completeOrder -- Unable to find Order " + orderID + " FBPK returned " + order);
return null;
}
if (order.isCompleted()) {
throw new RuntimeException("Error: attempt to complete Order that is already completed\n" + order);
}
AccountDataBean account = order.getAccount();
QuoteDataBean quote = order.getQuote();
HoldingDataBean holding = order.getHolding();
BigDecimal price = order.getPrice();
double quantity = order.getQuantity();
if (Log.doTrace())
Log.trace("TradeJpaAm:completeOrder--> Completing Order "
+ order.getOrderID() + "\n\t Order info: " + order
+ "\n\t Account info: " + account + "\n\t Quote info: "
+ quote + "\n\t Holding info: " + holding);
HoldingDataBean newHolding = null;
if (order.isBuy()) {
/*
* Complete a Buy operation - create a new Holding for the Account -
* deduct the Order cost from the Account balance
*/
newHolding = createHolding(account, quote, quantity, price, entityManager);
}
try {
entityManager.getTransaction().begin();
if (newHolding != null) {
order.setHolding(newHolding);
}
if (order.isSell()) {
/*
* Complete a Sell operation - remove the Holding from the Account -
* deposit the Order proceeds to the Account balance
*/
if (holding == null) {
Log.error("TradeJpaAm:completeOrder -- Unable to sell order " + order.getOrderID() + " holding already sold");
order.cancel();
entityManager.getTransaction().commit();
return order;
}
else {
entityManager.remove(holding);
order.setHolding(null);
}
}
order.setOrderStatus("closed");
order.setCompletionDate(new java.sql.Timestamp(System.currentTimeMillis()));
if (Log.doTrace())
Log.trace("TradeJpaAm:completeOrder--> Completed Order "
+ order.getOrderID() + "\n\t Order info: " + order
+ "\n\t Account info: " + account + "\n\t Quote info: "
+ quote + "\n\t Holding info: " + holding);
entityManager.getTransaction().commit();
}