package de.open4me.depot.gui.control;
import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import de.open4me.depot.Settings;
import de.open4me.depot.abruf.utils.Utils;
import de.open4me.depot.datenobj.DepotAktion;
import de.open4me.depot.datenobj.rmi.Umsatz;
import de.open4me.depot.sql.GenericObjectHashMap;
import de.open4me.depot.sql.GenericObjectSQL;
import de.open4me.depot.sql.SQLQueries;
import de.open4me.depot.sql.SQLUtils;
import de.open4me.depot.tools.VarDecimalFormat;
import de.willuhn.jameica.gui.AbstractControl;
import de.willuhn.jameica.gui.AbstractView;
import de.willuhn.jameica.gui.Part;
import de.willuhn.jameica.gui.input.AbstractInput;
import de.willuhn.jameica.gui.input.CheckboxInput;
import de.willuhn.jameica.gui.input.DateInput;
import de.willuhn.jameica.gui.input.DecimalInput;
import de.willuhn.jameica.gui.input.Input;
import de.willuhn.jameica.gui.input.SelectInput;
import de.willuhn.jameica.gui.parts.TablePart;
import de.willuhn.jameica.hbci.rmi.Konto;
import de.willuhn.util.ApplicationException;
public class UmsatzEditorControl extends AbstractControl
{
private Input betrag = null;
private SelectInput aktion;
private SelectInput wp;
private DateInput datum;
private SelectInput konto;
private DecimalInput einzelkurs;
private TablePart umsatzList;
private DecimalInput gesamt;
private DecimalInput kurswert;
private CheckboxInput kurswertberechnen;
private AbstractInput transaktionskosten;
private DecimalInput steuern;
private Umsatz umsatz = null;
public UmsatzEditorControl(AbstractView view) throws Exception {
super(view);
if (view.getCurrentObject() == null) {
getCBKurswertBerechnen().setValue(true);
calc();
return;
}
umsatz = Utils.getUmsatzByID(((GenericObjectSQL) view.getCurrentObject()).getID());
getCBKurswertBerechnen().setValue(false);
getAnzahl().setValue(umsatz.getAnzahl());
getEinzelkurs().setValue(umsatz.getKurs());
getDate().setValue(umsatz.getBuchungsdatum());
getSteuern().setValue((umsatz.getSteuern() != null) ? umsatz.getSteuern() : 0.0d);
getTransaktionskosten().setValue((umsatz.getTransaktionsgebuehren() != null) ? umsatz.getTransaktionsgebuehren() : 0.0d);
getKurswert().setValue(Math.abs(umsatz.getKosten().doubleValue()));
String id = umsatz.getWPid().toString();
boolean found = false;
for (Object o : getWertpapiere().getList()) {
GenericObjectSQL obj = (GenericObjectSQL) o;
if (obj.getID().equals(id)) {
getWertpapiere().setValue(obj);
found = true;
}
}
if (!found) {
throw new ApplicationException("Keine Änderungen möglich.\nZugehöriges Wertpapier nicht gefunden!");
}
found = false;
Integer kontoid = umsatz.getKontoid();
for (Object o : getKonto().getList()) {
Konto k = (Konto) ((GenericObjectHashMap) o).getAttribute("kontoobj");
if (kontoid.toString().equals(k.getID())) {
getKonto().setValue(o);
found = true;
}
}
if (!found) {
throw new ApplicationException("Keine Änderungen möglich.\nZugehöriges Konto nicht gefunden!");
}
getAktionAuswahl().setValue(umsatz.getAktion());
calc();
}
/**
* Liefert das Eingabe-Feld fuer den Betrag.
* @return Eingabe-Feld.
* @throws RemoteException
*/
public Input getAnzahl() throws RemoteException
{
if (betrag != null)
return betrag;
double d = Double.NaN;
betrag = new DecimalInput(d, new VarDecimalFormat(5));
betrag.setMandatory(true);
betrag.addListener(new Listener() {
@Override
public void handleEvent(org.eclipse.swt.widgets.Event event) {
calc();
}
});
return betrag;
}
protected void calc() {
try {
if ((Boolean) getCBKurswertBerechnen().getValue()) {
getKurswert().setValue(null);
getKurswert().setEnabled(false);
} else {
getKurswert().setEnabled(true);
}
getGesamtSumme().setValue(Double.NaN);
if (getEinzelkurs().getValue() == null || getAnzahl().getValue() == null) {
return;
}
if ((Double) getAnzahl().getValue() <=0 || ((Double) getEinzelkurs().getValue() < 0)) {
return;
}
if ((Boolean) getCBKurswertBerechnen().getValue()) {
Double d = (Double) getAnzahl().getValue() * (Double) getEinzelkurs().getValue();
getKurswert().setValue(d);
} else {
}
int faktor = -1;
if (getAktionAuswahl().getValue().equals(DepotAktion.VERKAUF)) {
faktor = 1;
}
Double d = faktor * (Double) getKurswert().getValue();
if (getTransaktionskosten().getValue() != null) {
d = d - (Double) getTransaktionskosten().getValue();
}
if (getSteuern().getValue() != null) {
d = d - (Double) getSteuern().getValue();
}
getGesamtSumme().setValue(d);
} catch (RemoteException re) {
}
}
/**
* Liefert das Eingabe-Feld fuer den Betrag.
* @return Eingabe-Feld.
* @throws RemoteException
*/
public Input getEinzelkurs() throws RemoteException
{
if (einzelkurs != null)
return einzelkurs;
double d = Double.NaN;
einzelkurs = new DecimalInput(d, new VarDecimalFormat(5));
einzelkurs.setMandatory(true);
einzelkurs.addListener(new Listener() {
@Override
public void handleEvent(org.eclipse.swt.widgets.Event event) {
calc();
}
});
return einzelkurs;
}
public SelectInput getKonto() throws RemoteException, ApplicationException
{
if (konto != null) {
return konto;
}
konto = new SelectInput(Utils.getDepotKonten(), null);
konto.setAttribute("bezeichnung");
return konto;
}
public Input getAktionAuswahl() throws RemoteException
{
if (aktion != null) {
return aktion;
}
List<DepotAktion> liste = new ArrayList<DepotAktion>();
liste.add(DepotAktion.KAUF);
liste.add(DepotAktion.VERKAUF);
liste.add(DepotAktion.EINBUCHUNG);
liste.add(DepotAktion.AUSBUCHUNG);
aktion = new SelectInput(liste, null);
aktion.setMandatory(true);
return aktion;
}
public DateInput getDate() throws RemoteException {
if (datum != null)
return datum;
datum = new DateInput();
datum.setMandatory(true);
return datum;
}
public SelectInput getWertpapiere() throws RemoteException
{
if (wp != null) {
return wp;
}
List<GenericObjectSQL> list = SQLQueries.getWertpapiere();
wp = new SelectInput(list, null);
wp.setMandatory(true);
return wp;
}
public void handleStore() throws RemoteException, ApplicationException {
int faktor = -1;
if (getAktionAuswahl().getValue().equals(DepotAktion.VERKAUF)) {
faktor = 1;
}
if (getEinzelkurs().getValue() == null || getAnzahl().getValue() == null || getDate().getValue() ==null) {
throw new ApplicationException("Bitte vervollständigen sie die Eingabe.");
}
if ((Double) getAnzahl().getValue() <=0 || ((Double) getEinzelkurs().getValue() < 0)) {
throw new ApplicationException("Die Anzahl und der Kurs mmüssen positiv sein.");
}
if (umsatz == null) {
umsatz = (Umsatz) Settings.getDBService().createObject(Umsatz.class,null);
umsatz.setKommentar("");
umsatz.setBuchungsinformationen("");
umsatz.setOrderid("" + (((GenericObjectSQL) getWertpapiere().getValue()).getID() + getAktionAuswahl().getValue().toString() +
getAnzahl().getValue().toString() + getEinzelkurs().getValue().toString() + "EUR" + getDate().getValue()
).hashCode());
umsatz.setKurzW("EUR");
umsatz.setKostenW("EUR");
umsatz.setSteuernW("EUR");
umsatz.setTransaktionsgebuehrenW("EUR");
}
Konto k = (Konto) ((GenericObjectHashMap) getKonto().getValue()).getAttribute("kontoobj");
umsatz.setKontoid(Integer.parseInt(k.getID()));
umsatz.setWPid(((GenericObjectSQL) getWertpapiere().getValue()).getID());
umsatz.setAktion((DepotAktion) getAktionAuswahl().getValue());
umsatz.setAnzahl(new BigDecimal((Double) getAnzahl().getValue()));
umsatz.setKurs(new BigDecimal((Double) getEinzelkurs().getValue()));
umsatz.setKosten(new BigDecimal(faktor * (Double) getKurswert().getValue()));
umsatz.setBuchungsdatum((Date) getDate().getValue());
umsatz.setSteuern(new BigDecimal((Double) getSteuern().getValue()));
umsatz.setTransaktionsgebuehren(new BigDecimal((Double) getTransaktionskosten().getValue()));
umsatz.store();
}
public Part getBuchungen() throws RemoteException {
if (umsatzList != null) {
return umsatzList;
}
List<GenericObjectSQL> list = SQLUtils.getResultSet("select *, concat(zweck, ' ', zweck2, ' ', zweck3) as zweckconcat from umsatz"
, "umsatz", "id");
umsatzList = new TablePart(list, null);
umsatzList.addColumn(Settings.i18n().tr("Art"), "art");
umsatzList.addColumn(Settings.i18n().tr("Datum"), "datum");
umsatzList.addColumn(Settings.i18n().tr("Betrag"),"betrag");
umsatzList.addColumn(Settings.i18n().tr("Zweck"),"zweckconcat");
//umsatzList.setContextMenu(new umsatzListMenu(orderList));
return umsatzList;
}
public DecimalInput getGesamtSumme() {
if (gesamt != null)
return gesamt;
double d = Double.NaN;
gesamt = new DecimalInput(d, new VarDecimalFormat(5));
gesamt.setMandatory(true);
gesamt.setEnabled(false);
return gesamt;
}
public Input getKurswert() {
if (kurswert != null)
return kurswert;
double d = Double.NaN;
kurswert = new DecimalInput(d, new VarDecimalFormat(5));
kurswert.setMandatory(true);
return kurswert;
}
public Input getTransaktionskosten() {
if (transaktionskosten != null)
return transaktionskosten;
double d = Double.valueOf("0");
transaktionskosten = new DecimalInput(d, new VarDecimalFormat(5));
transaktionskosten.setMandatory(true);
transaktionskosten.addListener(new Listener() {
@Override
public void handleEvent(org.eclipse.swt.widgets.Event event) {
calc();
}
});
return transaktionskosten;
}
public CheckboxInput getCBKurswertBerechnen() {
if (kurswertberechnen != null)
return kurswertberechnen;
kurswertberechnen = new CheckboxInput(false);
kurswertberechnen.addListener(new Listener() {
@Override
public void handleEvent(Event event) {
calc();
}
});
return kurswertberechnen;
}
public Input getSteuern() {
if (steuern != null)
return steuern;
double d = Double.valueOf("0");
steuern = new DecimalInput(d, new VarDecimalFormat(5));
steuern.setMandatory(true);
steuern.addListener(new Listener() {
@Override
public void handleEvent(org.eclipse.swt.widgets.Event event) {
calc();
}
});
return steuern;
}
}