UmsatzRewriter rewriter = RewriterRegistry.getRewriter(konto.getBLZ(),konto.getKontonummer());
for (int i=0;i<booked.size();++i)
{
final Umsatz umsatz = Converter.HBCIUmsatz2HibiscusUmsatz((GVRKUms.UmsLine)booked.get(i));
umsatz.setKonto(konto); // muessen wir noch machen, weil der Converter das Konto nicht kennt
if (rewriter != null)
{
try
{
rewriter.rewrite(umsatz);
}
catch (Exception e) {
Logger.error("error while rewriting umsatz",e);
}
}
Umsatz fromDB = null;
// Anzahl der vorhandenen Umsaetze in der DB zaehlen
int counter = 0;
existing.begin();
for (int j = 0; j<existing.size(); j++)
{
GenericObject dbObject = existing.next();
if (dbObject.equals(umsatz)) {
counter++;
fromDB = (Umsatz) dbObject; //wir merken uns immer den letzten Umsatz
}
}
if (fromDB != null)
{
// Wir duerfen den Umsatz nur dann ueberspringen, wenn er bereits
// OFT GENUG in der Datenbank ist. Andernfalls ist er tatsaechlich
// neu. Dazu zaehlen wir mit, wie oft wir gerade einen "gleichen"
// Umsatz empfangen haben.
Integer countInCurrentJobResult = duplicates.get(fromDB);
if (countInCurrentJobResult == null) {
duplicates.put(fromDB, 1);
skipped++;
continue;
}
else if (countInCurrentJobResult <= counter)
{
// In der Datenbank sind mehr als bislang abgerufen -> Ueberspringen
duplicates.put(fromDB, countInCurrentJobResult+1);
skipped++;
continue;
}
}
// Umsatz neu anlegen
try
{
umsatz.store(); // den Umsatz haben wir noch nicht, speichern!
Application.getMessagingFactory().sendMessage(new ImportMessage(umsatz));
created++;
}
catch (Exception e2)
{
Application.getMessagingFactory().sendMessage(new StatusBarMessage(i18n.tr("Nicht alle empfangenen Ums�tze konnten gespeichert werden. Bitte pr�fen Sie das System-Protokoll"),StatusBarMessage.TYPE_ERROR));
Logger.error("error while adding umsatz, skipping this one",e2);
}
}
Logger.info("done. new entries: " + created + ", skipped entries (already in database): " + skipped);
}
else
{
Logger.info("got no new booked entries");
}
//
////////////////////////////////////////////////////////////////////////////
duplicates.clear();
////////////////////////////////////////////////////////////////////////////
// Vorgemerkte Umsaetze
if (fetchUnbooked)
{
// Den Abgleich gegen die Vormerkbuchungen machen wir gegen alle
// vorhandenen Vormerkbuchungen, nicht nur gegen die aus dem Zeitraum
// der aktuellen Lieferung. Denn hier wollen wir nicht nur Doppler
// vermeiden sondern ausserdem auch die loeschen, die von der Bank nicht
// mehr geliefert werden. Die sind zwischenzeitlich valutiert worden
// und muessen in Hibiscus geloescht werden.
DBIterator existingUnbooked = konto.getUmsaetze(null,null);
existingUnbooked.addFilter("flags = " + Umsatz.FLAG_NOTBOOKED);
if (unbooked != null && unbooked.size() > 0)
{
List<Umsatz> fetched = new ArrayList<Umsatz>();
int created = 0;
int skipped = 0;
Logger.info("applying not-booked (vorgemerkte) entries");
for (int i=0;i<unbooked.size();++i)
{
final Umsatz umsatz = Converter.HBCIUmsatz2HibiscusUmsatz((GVRKUms.UmsLine)unbooked.get(i));
umsatz.setFlags(Umsatz.FLAG_NOTBOOKED);
umsatz.setSaldo(0d); // Muss gemacht werden, weil der Saldo beim naechsten Mal anders lauten koennte
umsatz.setKonto(konto);
fetched.add(umsatz);
Umsatz fromDB = null;
// Anzahl der vorhandenen Umsaetze in der DB zaehlen
int counter = 0;
existingUnbooked.begin();
for (int j = 0; j<existingUnbooked.size(); j++)
{
GenericObject dbObject = existingUnbooked.next();
if (dbObject.equals(umsatz))
{
counter++;
fromDB = (Umsatz) dbObject; //wir merken uns immer den letzten Umsatz
}
}
if (fromDB != null)
{
// Wir duerfen den Umsatz nur dann ueberspringen, wenn er bereits
// OFT GENUG in der Datenbank ist. Andernfalls ist er tatsaechlich
// neu. Dazu zaehlen wir mit, wie oft wir gerade einen "gleichen"
// Umsatz empfangen haben.
Integer countInCurrentJobResult = duplicates.get(fromDB);
if (countInCurrentJobResult == null)
{
duplicates.put(fromDB, 1);
skipped++;
continue;
}
else if (countInCurrentJobResult <= counter)
{
// In der Datenbank sind mehr als bislang abgerufen -> Ueberspringen
duplicates.put(fromDB, countInCurrentJobResult+1);
skipped++;
continue;
}
}
// Vormerkposten neu anlegen
try
{
umsatz.store();
Application.getMessagingFactory().sendMessage(new ImportMessage(umsatz));
created++;
}
catch (Exception e2)
{
Application.getMessagingFactory().sendMessage(new StatusBarMessage(i18n.tr("Nicht alle empfangenen Ums�tze konnten gespeichert werden. Bitte pr�fen Sie das System-Protokoll"),StatusBarMessage.TYPE_ERROR));
Logger.error("error while adding umsatz, skipping this one",e2);
}
}
// Jetzt loeschen wir all die vorgemerkten Umsaetze des
// Kontos, die noch in der Datenbank sind, aber im
// aktuellen Durchlauf nicht mehr uebertragen wurden.
// Das muessen dann die vom Vortag sein
Logger.info("clean obsolete notbooked entries");
GenericIterator newList = PseudoIterator.fromArray((Umsatz[]) fetched.toArray(new Umsatz[fetched.size()]));
int deleted = 0;
existingUnbooked.begin();
while (existingUnbooked.hasNext())
{
Umsatz u = (Umsatz) existingUnbooked.next();
if (!u.hasFlag(Umsatz.FLAG_NOTBOOKED))
continue; // nur zur Sicherheit, dass wir nicht versehentlich welche loeschen, die keine Vormerkbuchungen sind
// Mal schauen, ob der im aktuellen Durchlauf enthalten war:
if (newList.contains(u) == null)
{
// Wurde nicht mehr von der Bank uebertragen, kann daher raus
u.delete();
deleted++;
}
}
Logger.info("removed entries: " + deleted);
Logger.info("done. new entries: " + created + ", skipped entries (already in database): " + skipped);
}
else
{
Logger.info("got no new not-booked (vorgemerkte) entries");
// Keine neuen vorgemerkten Umsaetze
// Dann loeschen wir pauschal alle, die in der Vergangenheit liegen
// (mindestens gestern).
Logger.info("clean obsolete not-booked entries");
Date current = DateUtil.startOfDay(new Date());
int count = 0;
existingUnbooked.begin();
while (existingUnbooked.hasNext())
{
Umsatz u = (Umsatz) existingUnbooked.next();
if (!u.hasFlag(Umsatz.FLAG_NOTBOOKED))
continue; // nur zur Sicherheit, dass wir nicht versehentlich welche loeschen, die keine Vormerkbuchungen sind
Date test = u.getDatum();
if (test == null)
test = u.getValuta();
if (test == null)
{
Logger.warn("notbooked entry contains no date, skipping");
continue; // Das darf eigentlich nicht passieren
}
// Wenn die Vormerkbuchung nicht von heute ist, loeschen wir sie
if (test.before(current))
{
u.delete();
count++;
}
}
Logger.info("removed entries: " + count);
}