Package de.willuhn.jameica.hbci.server

Source Code of de.willuhn.jameica.hbci.server.TurnusHelper

/**********************************************************************
* $Source: /cvsroot/hibiscus/hibiscus/src/de/willuhn/jameica/hbci/server/TurnusHelper.java,v $
* $Revision: 1.17 $
* $Date: 2011/06/24 13:29:20 $
* $Author: willuhn $
* $Locker:  $
* $State: Exp $
*
* Copyright (c) by willuhn.webdesign
* All rights reserved
*
**********************************************************************/
package de.willuhn.jameica.hbci.server;

import java.rmi.RemoteException;
import java.util.Calendar;
import java.util.Date;

import org.kapott.hbci.GV_Result.GVRDauerList;

import de.willuhn.datasource.rmi.DBIterator;
import de.willuhn.jameica.hbci.HBCI;
import de.willuhn.jameica.hbci.HBCIProperties;
import de.willuhn.jameica.hbci.Settings;
import de.willuhn.jameica.hbci.rmi.Turnus;
import de.willuhn.jameica.system.Application;
import de.willuhn.util.ApplicationException;
import de.willuhn.util.I18N;

/**
* Hilfsklasse fuer das Finden oder Erstellen von Zahlungs-Turnus(sen) ;).
*/
public class TurnusHelper
{

  private static String[] wochentage = null;

  // Hilfsmapping, um die Tages-Konstanten aus java.util.Calendar in
  // integer von 1 (montag) - 7 (sonntag) umrechnen zu koennen
  private final static int[] DAYMAP = new int[]
    {
      Calendar.MONDAY,
      Calendar.TUESDAY,
      Calendar.WEDNESDAY,
      Calendar.THURSDAY,
      Calendar.FRIDAY,
      Calendar.SATURDAY,
      Calendar.SUNDAY
    };
 
 
  /**
   * Liefert ein String-Array mit den Bezeichnungen der Wochentage.
   * Hinweis: Da es sich um ein Array handelt, zaehlt der Index
   * natuerlich nicht von 1-7 sondern von 0-6.
   * @return Bezeichnungen der Wochentage.
   */
  public static String[] getWochentage()
  {
    if (wochentage != null)
      return wochentage;

    I18N i18n = Application.getPluginLoader().getPlugin(HBCI.class).getResources().getI18N();

    wochentage = new String[]
    {
      i18n.tr("Montag"),
      i18n.tr("Dienstag"),
      i18n.tr("Mittwoch"),
      i18n.tr("Donnerstag"),
      i18n.tr("Freitag"),
      i18n.tr("Samstag"),
      i18n.tr("Sonntag")
    };
   
    return wochentage;
  }

  /**
   * Liefert die Bezeichnung des Werktages mit dem genannten Index.
   * Den zum Zahltag des Turnus gehoerenden kann man dann wie folgt ermitteln:<br>
   * <code>String tag = TurnusHelper.getWochentag(turnus.getTag())</code>.
   * @param index Index des Wochentages von 1 - 7.
   * @return Bezeichnung des Wochentages, oder <code>null</code> wenn der Index
   * ausserhalb des definierten Bereichs liegt.
   */
  public static String getWochentag(int index)
  {
    if (index < 1 || index > 7)
      return null;
    return getWochentage()[index - 1];
  }


  /**
   * Berechnet das naechste Ausfuehrungsdatum fuer einen Turnus.
   * @param ersteZahlung Datum der ersten Zahlung.
   * @param letzteZahlung Datum der letzten Zahlung.
   * @param turnus Turnus.
   * @param valuta Stichtag, zu dem die Berechnung erfolgen soll.
   * Ist kein Datum angegeben, wird das aktuelle verwendet.
   * @return das ermittelte Datum oder <code>null</code>, wenn keines mehr existiert.
   * @throws RemoteException
   */
  public static Date getNaechsteZahlung(Date ersteZahlung, Date letzteZahlung, Turnus turnus, Date valuta) throws RemoteException
  {
    // Keine erste Zahlung angegeben und kein Turnus. Nichts ermittelbar
    if (ersteZahlung == null || turnus == null)
      return null;
   
    if (valuta == null)
      valuta = new Date();
   
    // Auftrag bereits abgelaufen, da sich das Valuta-Datum hinter
    // der letzten Ausfuehrung befindet
    if (letzteZahlung != null && letzteZahlung.before(valuta))
      return null;

    // OK, wenn wir hier angekommen sind, muessen wir rechnen ;)
    Calendar cal = Calendar.getInstance();
    cal.setTime(ersteZahlung);
    cal.setFirstDayOfWeek(Calendar.MONDAY);
   
    int ze  = turnus.getZeiteinheit();
    int tag = turnus.getTag();
    int iv  = turnus.getIntervall();

    Date test = null;
   
    // eigentlich gehoert hier ein "while true" hin, ich will aber eine
    // Abbruchbedingung, damit das Teil keine 1000 Jahre in die Zukunft
    // rechnet ;)
    for (int i=0;i<1000;++i)
    {
      // Woechentlich
      if (ze == Turnus.ZEITEINHEIT_WOECHENTLICH)
      {
        // Wochentag festlegen
        int calTag = DAYMAP[tag-1]; // "-1" weil das Array bei 0 anfaengt
        cal.set(Calendar.DAY_OF_WEEK,calTag);

        test = cal.getTime();
       
        // Schon vorbei
        if (letzteZahlung != null && test.after(letzteZahlung))
          return null;
       
        if (test.after(valuta) || test.equals(valuta))
          return test; // Datum gefunden

        // Ne, dann Anzahl der Wochen drauf rechnen
        cal.add(Calendar.WEEK_OF_YEAR,iv);
      }
      // Monatlich
      else
      {
        // Tag im Monat festlegen
        if (tag == HBCIProperties.HBCI_LAST_OF_MONTH)
          cal.set(Calendar.DAY_OF_MONTH,cal.getActualMaximum(Calendar.DAY_OF_MONTH));
        else
          cal.set(Calendar.DAY_OF_MONTH,tag);

        test = cal.getTime();

        // Schon vorbei
        if (letzteZahlung != null && test.after(letzteZahlung))
          return null;

        if (test.after(valuta) || test.equals(valuta))
          return test; // Datum gefunden

        // Ne, dann Anzahl der Monate drauf rechnen
        cal.add(Calendar.MONTH,iv);
      }
    }
    return null; // kein Datum ermittelbar
  }

  /**
   * Prueft, ob es in der lokalen Datenbank einen Zahlungsturnus gibt,
   * der den Eigenschaften des uebergebenen Dauerauftrags aus HBCI4Java
   * entspricht.
   * @param d der zu pruefende Dauerauftrag.
   * @return das Turnus-Objekt, wenn eines gefunden wurde oder <code>null</code>.
   * @throws RemoteException
   */
  public static Turnus findByDauerAuftrag(GVRDauerList.Dauer d) throws RemoteException
  {
    int ze = Turnus.ZEITEINHEIT_MONATLICH;
    if ("W".equalsIgnoreCase(d.timeunit)) ze = Turnus.ZEITEINHEIT_WOECHENTLICH;

    DBIterator list = Settings.getDBService().createList(Turnus.class);
    list.addFilter("zeiteinheit = " + ze);
    list.addFilter("intervall = " + d.turnus);
    list.addFilter("tag = " + d.execday);
    if (list.hasNext())
      return (Turnus) list.next();

    return null;
  }

  /**
   * Erstellt einen neuen Turnus mit den Eigenschaften des uebergebenen
   * Dauerauftrags aus HBCI4Java und speichert ihn auch gleich in der Datenbank.
   * <b>Wichtig:</b> Die Funktion checkt bereits intern mittels
   * <code>findByDauerAuftrag</code> ob bereits einer existiert und
   * liefert ggf diesen zurueck. Der Aufrufer muss also nicht selbst pruefen,
   * ob einer existiert.
   * @param d der zu pruefende Dauerauftrag.
   * @return das Turnus-Objekt. Es wird in jedem Fall ein solches zurueckgegeben.
   * Das ist entweder ein neues oder ein existierendes.
   * @throws RemoteException
   * @throws ApplicationException
   */
  public static Turnus createByDauerAuftrag(GVRDauerList.Dauer d) throws RemoteException, ApplicationException
  {
    Turnus turnus = findByDauerAuftrag(d);
    if (turnus != null)
      return turnus; // wir haben schon einen, den nehmen wir.

    int ze = Turnus.ZEITEINHEIT_MONATLICH;
    if ("W".equalsIgnoreCase(d.timeunit)) ze = Turnus.ZEITEINHEIT_WOECHENTLICH;
   
    // Keiner da, dann erstellen wir ihn.
    turnus = (Turnus) Settings.getDBService().createObject(Turnus.class,null);
    turnus.setIntervall(d.turnus);
    turnus.setTag(d.execday);
    turnus.setZeiteinheit(ze);
    turnus.store();
    return turnus;
  }

  /**
   * Kleine Hilfs-Funktion, die sich eine passende Bezeichnung fuer einen Turnus selbst ausdenkt ;).
   * @param turnus der Turnus, fuer den eine Bezeichnung erstellt werden soll.
   * @return die Bezeichnung.
   * @throws RemoteException
   */
  public static String createBezeichnung(Turnus turnus) throws RemoteException
  {
    I18N i18n = Application.getPluginLoader().getPlugin(HBCI.class).getResources().getI18N();

    int iv = turnus.getIntervall();
    int ze = turnus.getZeiteinheit();
    int ta = turnus.getTag();

    String s = null;

    // Einfacher Zahlungsplan
    if (iv == 1 && ze == Turnus.ZEITEINHEIT_MONATLICH)
      s = i18n.tr("Monatlich");
    else if (iv == 1 && ze == Turnus.ZEITEINHEIT_WOECHENTLICH)
      s = i18n.tr("W�chentlich");

    // komplexer Zahlungsplan
    if (iv > 1 && ze == Turnus.ZEITEINHEIT_MONATLICH)
      s = i18n.tr("Alle {0} Monate","" + iv);
    else if (iv > 1 && ze == Turnus.ZEITEINHEIT_WOECHENTLICH)
      s = i18n.tr("Alle {0} Wochen","" + iv);

    // Standardfaelle
    if (iv == 3 && ze == Turnus.ZEITEINHEIT_MONATLICH)
      s = i18n.tr("Viertelj�hrlich");
    if (iv == 6 && ze == Turnus.ZEITEINHEIT_MONATLICH)
      s = i18n.tr("Halbj�hrlich");
    if (iv == 12 && ze == Turnus.ZEITEINHEIT_MONATLICH)
      s = i18n.tr("J�hrlich");


    // Zahltag anhaengen
    if (ze == Turnus.ZEITEINHEIT_WOECHENTLICH)
      s+= ", " + getWochentag(ta);
    else if (ze == Turnus.ZEITEINHEIT_MONATLICH)
    {
      // BUGZILLA #49 http://www.willuhn.de/bugzilla/show_bug.cgi?id=49
      if (ta == HBCIProperties.HBCI_LAST_OF_MONTH)
        s+= ", " + i18n.tr("zum Monatsletzten");
      else
        s+= ", " + i18n.tr("am {0}. des Monats","" + ta);
    }

    return s;
  }
}


/**********************************************************************
* $Log: TurnusHelper.java,v $
* Revision 1.17  2011/06/24 13:29:20  willuhn
* @B siehe http://www.onlinebanking-forum.de/phpBB2/viewtopic.php?p=76102#76102
*
* Revision 1.16  2010-11-23 11:39:43  willuhn
* @B Das Datum der ersten Zahlung darf nicht ohne Beruecksichtigung des Turnus verwendet werden. Beispiel: Erste Zahlung 22.11, Valuta 23.11, Turnus monatlich am 1., dann ist die erste Zahlung der 01.12. und nicht der 23.11.
*
* Revision 1.15  2009/08/26 21:23:46  willuhn
* @C "aller x Wochen/Monate" sagt man wohl nur im Saechsischen ;) Habs geaendert auf "alle x Wochen/Monate". Google liefert mit dieser Schreibweise auch erheblich mehr Treffer
*
* Revision 1.14  2008/09/04 23:42:33  willuhn
* @N Searchprovider fuer Sammel- und Dauerauftraege
* @N Sortierung von Ueberweisungen und Lastschriften in Suchergebnissen
* @C "getNaechsteZahlung" von DauerauftragUtil nach TurnusHelper verschoben
*
* Revision 1.13  2006/08/25 10:13:43  willuhn
* @B Fremdschluessel NICHT mittels PreparedStatement, da die sonst gequotet und von McKoi nicht gefunden werden. BUGZILLA 278
*
* Revision 1.12  2006/08/23 09:45:13  willuhn
* @N Restliche DBIteratoren auf PreparedStatements umgestellt
*
* Revision 1.11  2005/06/07 22:19:57  web0
* @B bug 49
*
* Revision 1.10  2005/03/09 01:07:02  web0
* @D javadoc fixes
*
* Revision 1.9  2004/10/25 17:58:56  willuhn
* @N Haufen Dauerauftrags-Code
*
* Revision 1.8  2004/10/23 17:34:31  willuhn
* *** empty log message ***
*
* Revision 1.1  2004/10/18 23:38:17  willuhn
* @C Refactoring
* @C Aufloesung der Listener und Ersatz gegen Actions
*
* Revision 1.6  2004/10/17 16:28:46  willuhn
* @N Die ersten Dauerauftraege abgerufen ;)
*
* Revision 1.5  2004/07/25 17:15:06  willuhn
* @C PluginLoader is no longer static
*
* Revision 1.4  2004/07/23 15:51:44  willuhn
* @C Rest des Refactorings
*
* Revision 1.3  2004/07/21 23:54:30  willuhn
* *** empty log message ***
*
* Revision 1.2  2004/07/15 23:39:22  willuhn
* @N TurnusImpl
*
* Revision 1.1  2004/07/14 23:48:31  willuhn
* @N mehr Code fuer Dauerauftraege
*
**********************************************************************/
TOP

Related Classes of de.willuhn.jameica.hbci.server.TurnusHelper

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.