/*
* 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, see <http://www.gnu.org/licenses/>.
* (C)opyright 2002-2010 Dr. Lars H. Hahn
*/
package haushalt.daten;
import haushalt.daten.zeitraum.AbstractZeitraum;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.logging.Logger;
/**
* Die StandardBuchung ist die "normale" Buchung. Sie besteht aus Datum, Name,
* IKategorie und Betrag.
*
* @author Dr. Lars H. Hahn
* @version 2.6/2010.02.03
*/
/*
* 2010.02.03 Funktion clone() korrigiert: new String() verwendet
* 2006.02.10 Ergänzung der Methode isInKategorie
* 2004.08.22 Erste Version
*/
public class StandardBuchung extends AbstractBuchung {
private static final Logger LOGGER = Logger.getLogger(StandardBuchung.class.getName());
private EinzelKategorie kategorie = null;
private Euro betrag;
public StandardBuchung() {
setKategorie(EinzelKategorie.SONSTIGES);
this.betrag = new Euro();
}
public StandardBuchung(final Datum datum, final String text, final EinzelKategorie kategorie, final Euro betrag) {
setDatum(datum);
setText(text);
setKategorie(kategorie);
this.betrag = betrag;
}
// -- IKategorie
// --------------------------------------------------------------
@Override
public IKategorie getKategorie() {
return this.kategorie;
}
@Override
public void setKategorie(final IKategorie neueKategorie) {
this.kategorie = (EinzelKategorie) neueKategorie;
}
@Override
public int ersetzeKategorie(final EinzelKategorie alteKategorie, final EinzelKategorie neueKategorie) {
if ((this.kategorie == alteKategorie) || (alteKategorie == null)) {
this.kategorie = neueKategorie;
return 1;
}
return 0;
}
@Override
public boolean istInKategorie(final EinzelKategorie kategorie, final boolean unterkategorienVerwenden) {
return this.kategorie.istInKategorie(kategorie, unterkategorienVerwenden);
}
// -- Buchungswert
// -----------------------------------------------------------
@Override
public Euro getWert() {
return this.betrag;
}
@Override
public void setWert(final Euro wert) {
this.betrag = wert;
}
// -- Auswertung
// -------------------------------------------------------------
@Override
public void bildeKategorieSumme(final AbstractZeitraum zeitraum, final boolean unterkat) {
if ((zeitraum == null) || getDatum().istImZeitraum(zeitraum)) {
this.kategorie.addiereWert(this.betrag, unterkat);
}
}
@Override
public Euro getKategorieWert(final EinzelKategorie namekat, final boolean unterkat) {
if (this.kategorie.istInKategorie(namekat, unterkat)) {
return this.betrag;
}
return Euro.NULL_EURO;
}
// -- E/A-Funktionen
// ---------------------------------------------------------
public void laden(final DataInputStream in, final Datenbasis db)
throws IOException {
getDatum().laden(in);
setText(in.readUTF());
setKategorie(db.findeOderErzeugeKategorie(in.readUTF()));
this.betrag.laden(in);
}
@Override
public void speichern(final DataOutputStream out)
throws IOException {
// Bis zur Version 1.2 gab es keine Unterscheidung zwischen
// StandardBuchung
// und SplitBuchung. Damit Daten von alten Versionen gelesen werden
// können,
// muss die neue StandardBuchung mit einem anderen Namen gespeichert
// werden.
out.writeUTF("StandardBuchung2");
getDatum().speichern(out);
out.writeUTF(getText());
out.writeUTF("" + this.kategorie);
this.betrag.speichern(out);
}
// -- Methode des Interface 'Cloneable'
// --------------------------------------
@Override
public final Object clone() {
final Datum clonedDatum = (Datum) getDatum().clone();
final String text = new String(getText());
final Euro clonedBetrag = (Euro) this.betrag.clone();
StandardBuchung standardBuchung = new StandardBuchung();
try {
standardBuchung = (StandardBuchung) super.clone();
} catch (final CloneNotSupportedException e) {
LOGGER.warning("Cloning error. This should never happen.");
}
setDatum(clonedDatum);
setText(text);
setKategorie(this.kategorie);
standardBuchung.betrag = clonedBetrag;
return standardBuchung;
}
}