/*
* This file is part of jHaushalt.
* jHaushalt is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* jHaushalt is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with jHaushalt; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* (C)opyright 2002-2010 Dr. Lars H. Hahn
*/
package haushalt.daten;
import haushalt.daten.zeitraum.AbstractZeitraum;
import java.io.DataOutputStream;
import java.io.IOException;
/**
* Basisklasse für die Buchungsarten Umbuchung, SplitBuchung und
* StandardBuchung. Jede Buchung wird in einem Register abgelegt.
*
* @author Dr. Lars H. Hahn
* @version 2.1/2006.02.10
*/
/*
* 2006.02.10 Ergänzung der Methode isInKategorie
* 2004.08.22 Erste Version
*/
public abstract class AbstractBuchung implements Cloneable, Comparable<Object> {
private Datum datum = new Datum();
// -- Buchungstext
// -----------------------------------------------------------
private String text = "";
/**
* Setzt das Buchungsdatum
*
* @param datum
* Buchungsdatum
*/
public void setDatum(final Datum datum) {
this.datum = datum;
}
/**
* Liefert das Buchungsdatum
*
* @return Buchungsdatum
*/
public Datum getDatum() {
return this.datum;
}
/**
* Setzt den Buchungstext
*
* @param text
* Buchungstext
*/
public void setText(final String text) {
this.text = text;
}
/**
* Liefert den Buchungstext
*
* @return Buchungstext
*/
public String getText() {
return this.text;
}
/**
* Sucht nach Text innerhalb des Buchungstextes.
*
* @param suchText
* gesuchter Text
* @return <code>true</code> falls Text gefunden wurde
*/
public boolean sucheText(final String suchText, final boolean grossUndKlein) {
if (grossUndKlein) {
return (this.text.indexOf(suchText) > -1);
}
return (this.text.toLowerCase().indexOf(suchText.toLowerCase()) > -1);
}
/**
* Ersetzt Text innerhalb des Buchungstextes.
*
* @param alt
* alter Text
* @param neu
* neuer Text
* @return <code>true</code> falls das Ersetzten erfolgreich war
*/
public boolean ersetzeText(final String alt, final String neu) {
final int idx = this.text.indexOf(alt);
if (idx != -1) {
setText(this.text.substring(0, idx) + neu + this.text.substring(idx + alt.length()));
return true;
}
return false;
}
// -- IKategorie
// --------------------------------------------------------------
/**
* Setzt die IKategorie der Buchung.
* Im Fall einer gesplitteten Buchung ist die IKategorie ein ListArray der
* einzelnen Kategorien. Bei einer Umbuchung ist die IKategorie das
* "Partner"-Register.
*
* @param kategorie
* neue IKategorie der Buchung
*/
public abstract void setKategorie(IKategorie kategorie);
/**
* Liefert die IKategorie der Buchung.
* Im Fall einer gesplitteten Buchung ist die IKategorie ein ListArray der
* einzelnen Kategorien. Bei einer Umbuchung ist die IKategorie das
* "Partner"-Register.
*
* @return IKategorie der Buchung
*/
public abstract IKategorie getKategorie();
/**
* Ersetzt eine alte IKategorie durch eine neue.
* Bei einer gesplitteten Buchung werden alle Einzel-Kategorien überprüft
* und
* ggf. ersetzt. Bei einer Umbuchung erfolgt keine Ersetzung.<br>
* Wenn die alte IKategorie <b>null</b> ist, wird jede
* beliebige IKategorie ersetzt.
*
* @param alteKategorie
* IKategorie die ersetzt werden soll
* @param neueKategorie
* neue IKategorie
* @return Anzahl ersetzter Kategorien
*/
public abstract int ersetzeKategorie(EinzelKategorie alteKategorie, EinzelKategorie neueKategorie);
/**
* Überprüft ob die Buchung teil einer IKategorie ist
*
* @param kategorie
* IKategorie auf die überprüft wird
* @param unterkategorienVerwenden
* false, wenn nur Hauptkategorien betrachtet werden
* @return true, wenn die Buchung (oder Teile der Buchung) zu der angegeben
* IKategorie gehören
*/
public abstract boolean istInKategorie(EinzelKategorie kategorie, boolean unterkategorienVerwenden);
// -- Buchungswert
// -----------------------------------------------------------
/**
* Setzt den Buchungswert.
* Bei einer gesplitteten Buchung werden alle Einzel-Werte proportional
* angepasst.
*
* @param wert
* Buchungswert
*/
public abstract void setWert(Euro wert);
/**
* Liefert den Buchungswert.
*
* @return Buchungswert
*/
public abstract Euro getWert();
// -- Auswertung
// -------------------------------------------------------------
/**
* Addiert zur der IKategorie / zu den Kategorien der Buchung der Wert der
* Buchung hinzu.
*/
public abstract void bildeKategorieSumme(AbstractZeitraum zeitraum, boolean unterkat);
/**
* Liefert den Wert der Buchung, wenn die Buchung die passende IKategorie
* besitzt.
*
* @param kategorie
* gesuchte IKategorie
* @param unterkat
* Unterkategorien werden verwendet
* @return Wert der Buchung, wenn die Parameter passen
*/
public abstract Euro getKategorieWert(EinzelKategorie kategorie, boolean unterkat);
// -- E/A-Funktionen
// ---------------------------------------------------------
/**
* Liest die Buchung vom angegeben Stream.
* Die Datenbasis wird benötigt, um die Kategorien und Register aufzulösen.
*
* @param in
* Eingabe-Stream
* @param db
* Datenbasis
*/
// abstract public void laden(DataInputStream in, Datenbasis db) throws
// IOException;
/**
* Schreibt die Buchung in den angegeben Stream.
*
* @param out
* Ausgabe-Stream
*/
public abstract void speichern(DataOutputStream out) throws IOException;
// -- Methode des Interface 'Comparable'
// -------------------------------------
public int compareTo(final Object obj) {
if (obj.getClass() == Datum.class) {
return this.datum.compareTo((Datum) obj);
}
final AbstractBuchung buchung = (AbstractBuchung) obj;
int vergleich = this.datum.compareTo(buchung.datum);
if (vergleich == 0) {
vergleich = buchung.getWert().compareTo(getWert()); // absteigend!
}
return vergleich;
}
// -- Methode des Interface 'Cloneable'
// --------------------------------------
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
};
}