package de.onyxbits.tradetrax.pages.edit;
import java.text.ParseException;
import java.util.Date;
import org.apache.tapestry5.alerts.AlertManager;
import org.apache.tapestry5.alerts.Duration;
import org.apache.tapestry5.alerts.Severity;
import org.apache.tapestry5.annotations.Component;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.SessionAttribute;
import org.apache.tapestry5.beaneditor.Validate;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
import org.hibernate.Session;
import de.onyxbits.tradetrax.components.Layout;
import de.onyxbits.tradetrax.entities.Stock;
import de.onyxbits.tradetrax.pages.Index;
import de.onyxbits.tradetrax.remix.Payment;
import de.onyxbits.tradetrax.services.EventLogger;
import de.onyxbits.tradetrax.services.MoneyRepresentation;
import de.onyxbits.tradetrax.services.SettingsStore;
@Import(library = "context:js/mousetrap.min.js")
public class LiquidateEditor {
@SessionAttribute(Layout.FOCUSID)
private long focusedStockId;
@Validate("required")
@Property
private Payment method;
@Property
private String sellPrice;
@Property
private long stockId;
@Property
private Stock stock;
@Property
private String status;
@Component(id = "sellForm")
private Form sellForm;
@Inject
private Session session;
@Inject
private EventLogger eventLogger;
@Inject
private MoneyRepresentation moneyRepresentation;
@Inject
private SettingsStore settingsStore;
@Inject
private AlertManager alertManager;
@Inject
private Messages messages;
@Property
@Persist
@Validate("required")
private Payment methods;
@Property
private boolean splitable;
@Inject
private JavaScriptSupport javaScriptSupport;
protected void onActivate(Long stockId) {
this.stockId = stockId;
}
protected void setupRender() {
stock = (Stock) session.get(Stock.class, stockId);
if (stock != null) {
sellPrice = moneyRepresentation.databaseToUser(stock.getSellPrice() * stock.getUnitCount(), false, false);
splitable = stock.getUnitCount() > 1;
}
}
protected Long onPassivate() {
return stockId;
}
public void onValidateFromSellForm() {
try {
moneyRepresentation.userToDatabase(sellPrice, 1);
}
catch (ParseException e) {
sellForm.recordError(messages.get("nan"));
}
}
@CommitAfter
protected Object onSuccessFromSellForm() {
try {
Stock s = (Stock) session.load(Stock.class, stockId);
long sp = 0;
if (methods == Payment.PERUNIT) {
sp = moneyRepresentation.userToDatabase(sellPrice, 1);
}
else {
sp = moneyRepresentation.userToDatabase(sellPrice, s.getUnitCount());
}
s.setLiquidated(new Date());
s.setSellPrice(sp);
focusedStockId = s.getId();
String profit = moneyRepresentation.databaseToUser((s.getSellPrice() - s.getBuyPrice()) * s.getUnitCount(),
false, true);
alertManager.alert(Duration.SINGLE, Severity.SUCCESS,
messages.format("liquidate-success", stockId, profit));
eventLogger.liquidated(s);
}
catch (Exception e) {
// TODO: Figure out how we got here and give the user better feedback
e.printStackTrace();
alertManager.alert(Duration.SINGLE, Severity.WARN, messages.format("internal error"));
return null;
}
return Index.class;
}
public void afterRender() {
javaScriptSupport
.addScript("Mousetrap.prototype.stopCallback = function(e, element) {return false;};");
javaScriptSupport.addScript("Mousetrap.bind('esc', function() {window.history.back(); return false;});");
}
}