Package de.willuhn.jameica.hbci.gui.controller

Source Code of de.willuhn.jameica.hbci.gui.controller.AbstractTransferControl$KontoListener

/**********************************************************************
* $Source: /cvsroot/hibiscus/hibiscus/src/de/willuhn/jameica/hbci/gui/controller/AbstractTransferControl.java,v $
* $Revision: 1.62 $
* $Date: 2012/05/03 20:51:37 $
* $Author: willuhn $
* $Locker:  $
* $State: Exp $
*
* Copyright (c) by willuhn.webdesign
* All rights reserved
*
**********************************************************************/
package de.willuhn.jameica.hbci.gui.controller;

import java.rmi.RemoteException;

import org.apache.commons.lang.StringUtils;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;

import de.willuhn.datasource.rmi.DBIterator;
import de.willuhn.jameica.gui.AbstractControl;
import de.willuhn.jameica.gui.AbstractView;
import de.willuhn.jameica.gui.GUI;
import de.willuhn.jameica.gui.input.CheckboxInput;
import de.willuhn.jameica.gui.input.DecimalInput;
import de.willuhn.jameica.gui.input.DialogInput;
import de.willuhn.jameica.gui.input.Input;
import de.willuhn.jameica.gui.input.TextInput;
import de.willuhn.jameica.hbci.HBCI;
import de.willuhn.jameica.hbci.HBCIProperties;
import de.willuhn.jameica.hbci.Settings;
import de.willuhn.jameica.hbci.gui.action.EmpfaengerAdd;
import de.willuhn.jameica.hbci.gui.dialogs.VerwendungszweckDialog;
import de.willuhn.jameica.hbci.gui.filter.AddressFilter;
import de.willuhn.jameica.hbci.gui.filter.KontoFilter;
import de.willuhn.jameica.hbci.gui.input.AccountInput;
import de.willuhn.jameica.hbci.gui.input.AddressInput;
import de.willuhn.jameica.hbci.gui.input.BLZInput;
import de.willuhn.jameica.hbci.gui.input.KontoInput;
import de.willuhn.jameica.hbci.rmi.Address;
import de.willuhn.jameica.hbci.rmi.HibiscusAddress;
import de.willuhn.jameica.hbci.rmi.HibiscusTransfer;
import de.willuhn.jameica.hbci.rmi.Konto;
import de.willuhn.jameica.messaging.StatusBarMessage;
import de.willuhn.jameica.system.Application;
import de.willuhn.logging.Logger;
import de.willuhn.util.ApplicationException;
import de.willuhn.util.I18N;

/**
* Abstrakter Basis-Controler fuer die Zahlungen.
*/
public abstract class AbstractTransferControl extends AbstractControl
{

  // Fach-Objekte
  private Address gegenkonto                  = null;
  private Konto konto                         = null;
 
  // Eingabe-Felder
  private KontoInput kontoAuswahl             = null;
  private Input betrag                       = null;
  private TextInput zweck                     = null;
  private DialogInput zweck2                 = null;
  private VerwendungszweckDialog zweckDialog = null;

  private AddressInput empfName              = null;
  private TextInput empfkto                  = null;
  private TextInput empfblz                   = null;

  private CheckboxInput storeEmpfaenger      = null;
 
  final static I18N i18n = Application.getPluginLoader().getPlugin(HBCI.class).getResources().getI18N();

  /**
   * ct.
   * @param view
   */
  public AbstractTransferControl(AbstractView view)
  {
    super(view);
  }

  /**
   * Liefert den Transfer.
   * @return der Transfer oder <code>null</code> wenn keiner existiert.
   * @throws RemoteException
   */
  public abstract HibiscusTransfer getTransfer() throws RemoteException;

  /**
   * Liefert das Konto der Ueberweisung.
   * @return das Konto.
   * @throws RemoteException
   */
  public Konto getKonto() throws RemoteException
  {
    if (konto != null)
      return konto;

    konto = getTransfer().getKonto();
    return konto;
  }

  /**
   * Liefert ein Auswahlfeld fuer das Konto.
   * @return Auswahl-Feld.
   * @throws RemoteException
   */
  public KontoInput getKontoAuswahl() throws RemoteException
  {
    if (this.kontoAuswahl != null)
      return this.kontoAuswahl;
   
    Konto k = getKonto();
    KontoListener kl = new KontoListener();
    this.kontoAuswahl = new KontoInput(k,getTransfer().isNewObject() ? KontoFilter.ONLINE : KontoFilter.ALL); // Falls nachtraeglich das Konto deaktiviert wurde
    this.kontoAuswahl.setRememberSelection("auftraege",false); // BUGZILLA 1362 - zuletzt ausgewaehltes Konto gleich uebernehmen
    this.kontoAuswahl.setName(i18n.tr("Pers�nliches Konto"));
    this.kontoAuswahl.setMandatory(true);
    this.kontoAuswahl.addListener(kl);
   
    // einmal ausloesen
    kl.handleEvent(null);

    return this.kontoAuswahl;
  }
 
  /**
   * Liefert das Eingabe-Feld fuer den Empfaenger-Namen.
   * @return Eingabe-Feld.
   * @throws RemoteException
   */
  public AddressInput getEmpfaengerName() throws RemoteException
  {
    if (empfName != null)
      return empfName;
    empfName = new AddressInput(getTransfer().getGegenkontoName(), AddressFilter.INLAND);
    empfName.setName(i18n.tr("Name"));
    empfName.setMandatory(true);
    empfName.addListener(new EmpfaengerListener());
    return empfName;
  }

 
  /**
   * Liefert das Eingabe-Feld fuer den Empfaenger.
   * @return Eingabe-Feld.
   * @throws RemoteException
   */
  public TextInput getEmpfaengerKonto() throws RemoteException
  {
    if (empfkto != null)
      return empfkto;

    empfkto = new AccountInput(getTransfer().getGegenkontoNummer(),HBCIProperties.HBCI_KTO_MAXLENGTH_SOFT);
    empfkto.setName(i18n.tr("Kontonummer"));
    empfkto.setComment("");
    empfkto.setValidChars(HBCIProperties.HBCI_KTO_VALIDCHARS);
    empfkto.setMandatory(true);
    empfkto.addListener(new KontonummerListener());
    return empfkto;
  }

  /**
   * Liefert das Eingabe-Feld fuer die BLZ.
   * @return Eingabe-Feld.
   * @throws RemoteException
   */
  public TextInput getEmpfaengerBlz() throws RemoteException
  {
    if (empfblz != null)
      return empfblz;
    empfblz = new BLZInput(getTransfer().getGegenkontoBLZ());
    empfblz.addListener(new KontonummerListener());
    empfblz.setMandatory(true);
    return empfblz;
  }

  /**
   * Liefert das Eingabe-Feld fuer den Verwendungszweck.
   * @return Eingabe-Feld.
   * @throws RemoteException
   */
  public TextInput getZweck() throws RemoteException
  {
    if (zweck != null)
      return zweck;
    // BUGZILLA #10 http://www.willuhn.de/bugzilla/show_bug.cgi?id=10
    zweck = new TextInput(getTransfer().getZweck(),HBCIProperties.HBCI_TRANSFER_USAGE_MAXLENGTH);
    zweck.setName(i18n.tr("Verwendungszweck"));
    zweck.setValidChars(HBCIProperties.HBCI_DTAUS_VALIDCHARS);
    zweck.setMandatory(true);
    return zweck;
  }

  /**
   * Liefert das Eingabe-Feld fuer den "weiteren" Verwendungszweck.
   * @return Eingabe-Feld.
   * @throws RemoteException
   */
  public DialogInput getZweck2() throws RemoteException
  {
    if (zweck2 != null)
      return zweck2;
    // BUGZILLA #10 http://www.willuhn.de/bugzilla/show_bug.cgi?id=10
    final String buttonText = "weitere Zeilen ({0})...";
    this.zweckDialog = new VerwendungszweckDialog(getTransfer(),VerwendungszweckDialog.POSITION_MOUSE);
    this.zweckDialog.addCloseListener(new Listener() {
      public void handleEvent(Event event)
      {
        try
        {
          String[] newLines = (String[]) zweckDialog.getData();
          if (newLines != null) // andernfalls wurde "Abbrechen" gedrueckt
            zweck2.setButtonText(i18n.tr(buttonText,String.valueOf(newLines.length)));
        }
        catch (Exception e)
        {
          Logger.error("unable to update line count",e);
          Application.getMessagingFactory().sendMessage(new StatusBarMessage(i18n.tr("Fehler beim Aktualisieren der Zeilen-Anzahl"), StatusBarMessage.TYPE_ERROR));
        }
      }
   
    });
    zweck2 = new DialogInput(getTransfer().getZweck2(),this.zweckDialog);
    zweck2.setName(i18n.tr("weiterer Verwendungszweck"));
    zweck2.setButtonText(i18n.tr(buttonText,String.valueOf(getTransfer().getWeitereVerwendungszwecke().length)));
    zweck2.setMaxLength(HBCIProperties.HBCI_TRANSFER_USAGE_MAXLENGTH);
    zweck2.setValidChars(HBCIProperties.HBCI_DTAUS_VALIDCHARS);
    return zweck2;
  }
 
  /**
   * Liefert das Eingabe-Feld fuer den Betrag.
   * @return Eingabe-Feld.
   * @throws RemoteException
   */
  public Input getBetrag() throws RemoteException
  {
    if (betrag != null)
      return betrag;
    HibiscusTransfer t = getTransfer();
    double d = t.getBetrag();
    if (d == 0.0d) d = Double.NaN;
    betrag = new DecimalInput(d,HBCI.DECIMALFORMAT);

    betrag.setName(i18n.tr("Betrag"));
    betrag.setComment(HBCIProperties.CURRENCY_DEFAULT_DE);
    betrag.setMandatory(true);
    return betrag;
  }

  /**
   * Liefert eine CheckBox ueber die ausgewaehlt werden kann,
   * ob der Empfaenger mitgespeichert werden soll.
   * @return CheckBox.
   * @throws RemoteException
   */
  public CheckboxInput getStoreEmpfaenger() throws RemoteException
  {
    if (storeEmpfaenger != null)
      return storeEmpfaenger;

    // Nur bei neuen Transfers aktivieren
    HibiscusTransfer t = getTransfer();
    // Checkbox nur setzen, wenn es eine neue Ueberweisung ist und
    // noch kein Gegenkonto definiert ist.
    boolean enabled = t.isNewObject() && t.getGegenkontoNummer() == null;
   
    // Per Hidden-Parameter kann die Checkbox komplett ausgeschaltet werden
    de.willuhn.jameica.system.Settings settings = Application.getPluginLoader().getPlugin(HBCI.class).getResources().getSettings();
    enabled &= settings.getBoolean("transfer.addressbook.autoadd",true);
    storeEmpfaenger = new CheckboxInput(enabled);

    return storeEmpfaenger;
  }

  /**
   * Speichert den Geld-Transfer.
   * @return true, wenn das Speichern erfolgreich war.
   */
  public synchronized boolean handleStore()
  {
    HibiscusTransfer t = null;
    try
    {
      t = this.getTransfer();
      t.transactionBegin();

      Double d = (Double) getBetrag().getValue();
      t.setBetrag(d == null ? Double.NaN : d.doubleValue());
     
      t.setKonto((Konto)getKontoAuswahl().getValue());
      t.setZweck((String)getZweck().getValue());
      t.setZweck2(getZweck2().getText())// "getText()" ist wichtig, weil das ein DialogInput ist

      String kto  = (String)getEmpfaengerKonto().getValue();
      String blz  = (String)getEmpfaengerBlz().getValue();
      String name = getEmpfaengerName().getText();

      t.setGegenkontoNummer(kto);
      t.setGegenkontoBLZ(blz);
      t.setGegenkontoName(name);


      // Geaenderte Verwendungszwecke uebernehmen. Allerdings nur, wenn
      // der Dialog tatsaechlich geoffnet und auf "Uebernehmen" geklickt wurde
      String[] lines = (String[]) this.zweckDialog.getData();
      if (lines != null)
        t.setWeitereVerwendungszwecke(lines);
       
      t.store();
     
      Boolean store = (Boolean) getStoreEmpfaenger().getValue();
      if (store.booleanValue())
      {
        HibiscusAddress e = (HibiscusAddress) Settings.getDBService().createObject(HibiscusAddress.class,null);
        e.setBlz(blz);
        e.setKontonummer(kto);
        e.setName(name);
       
        // Zu schauen, ob die Adresse bereits existiert, ueberlassen wir der Action
        new EmpfaengerAdd().handleAction(e);
      }
      t.transactionCommit();
      Application.getMessagingFactory().sendMessage(new StatusBarMessage(i18n.tr("Auftrag gespeichert"),StatusBarMessage.TYPE_SUCCESS));

      if (t.getBetrag() > Settings.getUeberweisungLimit())
        GUI.getView().setErrorText(i18n.tr("Warnung: Auftragslimit �berschritten: {0} ", HBCI.DECIMALFORMAT.format(Settings.getUeberweisungLimit()) + " " + getKonto().getWaehrung()));
     
      return true;
    }
    catch (Exception e)
    {
      if (t != null) {
        try {
          t.transactionRollback();
        }
        catch (Exception xe) {
          Logger.error("rollback failed",xe);
        }
      }
     
      if (e instanceof ApplicationException)
      {
        Application.getMessagingFactory().sendMessage(new StatusBarMessage(e.getMessage(),StatusBarMessage.TYPE_ERROR));
      }
      else
      {
        Logger.error("error while saving order",e);
        Application.getMessagingFactory().sendMessage(new StatusBarMessage(i18n.tr("Fehlgeschlagen: {0}",e.getMessage()),StatusBarMessage.TYPE_ERROR));
      }
    }
    return false;
  }

  /**
   * Listener, der die Auswahl des Kontos ueberwacht.
   */
  private class KontoListener implements Listener
  {
    /**
     * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
     */
    public void handleEvent(Event event) {

      try {
        Object o = getKontoAuswahl().getValue();
        if (o == null || !(o instanceof Konto))
          return;

        // Wird u.a. benoetigt, damit anhand des Auftrages ermittelt werden
        // kann, wieviele Zeilen Verwendungszweck jetzt moeglich sind
        getTransfer().setKonto(konto);
      }
      catch (RemoteException er)
      {
        Logger.error("error while updating currency",er);
        Application.getMessagingFactory().sendMessage(new StatusBarMessage(i18n.tr("Fehler bei Ermittlung der W�hrung"),StatusBarMessage.TYPE_ERROR));
      }
    }
  }
 
  /**
   * Listener, der die CRC-Pruefung von Kontonummer und BLZ vornimmt.
   */
  private class KontonummerListener implements Listener
  {
    /**
     * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
     */
    public void handleEvent(Event event)
    {
      try
      {
        String kto = StringUtils.trimToNull((String) getEmpfaengerKonto().getValue());
        String blz = StringUtils.trimToNull((String) getEmpfaengerBlz().getValue());
        if (kto == null || blz == null)
        {
          getEmpfaengerKonto().setComment("");
          return;
        }
        getEmpfaengerKonto().setComment(i18n.tr(HBCIProperties.checkAccountCRC(blz,kto) ? "Konto OK" : "BLZ/Kto ung�ltig, bitte pr�fen"));
      }
      catch (RemoteException er)
      {
        Logger.error("error while checking konto/blz",er);
        Application.getMessagingFactory().sendMessage(new StatusBarMessage(i18n.tr("Fehler beim Pr�fen der Bankverbindung"),StatusBarMessage.TYPE_ERROR));
      }
    }
   
  }

  /**
   * Listener, der bei Auswahl des Empfaengers die restlichen Daten vervollstaendigt.
   */
  private class EmpfaengerListener implements Listener
  {

    /**
     * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
     */
    public void handleEvent(Event event) {
      if (event == null)
        return;
      gegenkonto = (Address) event.data;
      if (gegenkonto == null)
        return;
      try {
        getEmpfaengerName().setText(gegenkonto.getName());
        getEmpfaengerKonto().setValue(gegenkonto.getKontonummer());
        getEmpfaengerBlz().setValue(gegenkonto.getBlz());
       
        // Listener zum Pruefen der Bankverbindung ausloesen
        new KontonummerListener().handleEvent(null);

        // Wenn der Empfaenger aus dem Adressbuch kommt, deaktivieren wir die Checkbox
        getStoreEmpfaenger().setValue(Boolean.FALSE);
       
        // BUGZILLA 408
        // Verwendungszweck automatisch vervollstaendigen
        try
        {
          String zweck = (String) getZweck().getValue();
          String zweck2 = getZweck2().getText(); // "getText()" ist wichtig, weil das ein DialogInput ist
          if ((zweck != null && zweck.length() > 0) || (zweck2 != null && zweck2.length() > 0))
            return;
         
          DBIterator list = getTransfer().getList();
          list.addFilter("empfaenger_konto = ?",new Object[]{gegenkonto.getKontonummer()});
          list.addFilter("empfaenger_blz = ?"new Object[]{gegenkonto.getBlz()});
          list.setOrder("order by id desc");
          if (list.hasNext())
          {
            HibiscusTransfer t = (HibiscusTransfer) list.next();
            getZweck().setValue(t.getZweck());
            getZweck2().setText(t.getZweck2()); // "setText()" ist wichtig, weil das ein DialogInput ist
          }
        }
        catch (Exception e)
        {
          Logger.error("unable to autocomplete subject",e);
        }

         
      }
      catch (RemoteException er)
      {
        Logger.error("error while choosing empfaenger",er);
        GUI.getStatusBar().setErrorText(i18n.tr("Fehler bei der Auswahl des Empf�ngers"));
      }
    }
  }
}


/**********************************************************************
* $Log: AbstractTransferControl.java,v $
* Revision 1.62  2012/05/03 20:51:37  willuhn
* @N CRC-Pruefung des Empfaengerkontos bei Auftraegen direkt nach Eingabe machen und als Kommentar anzeigen
*
* Revision 1.61  2011/10/20 16:20:05  willuhn
* @N BUGZILLA 182 - Erste Version von client-seitigen Dauerauftraegen fuer alle Auftragsarten
*
* Revision 1.60  2011-08-03 15:34:29  willuhn
* @B Fehlertext entfernen, wenn erfolgreich gespeichert
*
* Revision 1.59  2011-05-11 16:23:57  willuhn
* @N BUGZILLA 591
*
* Revision 1.58  2011-04-07 17:52:07  willuhn
* @N BUGZILLA 1014
*
* Revision 1.57  2010-08-17 11:32:10  willuhn
* @C Code-Cleanup
*
* Revision 1.56  2009/10/20 23:12:58  willuhn
* @N Support fuer SEPA-Ueberweisungen
* @N Konten um IBAN und BIC erweitert
*
* Revision 1.55  2009/10/07 23:08:56  willuhn
* @N BUGZILLA 745: Deaktivierte Konten in Auswertungen zwar noch anzeigen, jedoch mit "[]" umschlossen. Bei der Erstellung von neuen Auftraegen bleiben sie jedoch ausgeblendet. Bei der Gelegenheit wird das Default-Konto jetzt mit ">" markiert
*
* Revision 1.54  2009/03/13 00:25:12  willuhn
* @N Code fuer Auslandsueberweisungen fast fertig
*
* Revision 1.53  2009/02/24 23:51:01  willuhn
* @N Auswahl der Empfaenger/Zahlungspflichtigen jetzt ueber Auto-Suggest-Felder
*
* Revision 1.52  2009/01/04 16:18:22  willuhn
* @N BUGZILLA 404 - Kontoauswahl via SelectBox
**********************************************************************/
TOP

Related Classes of de.willuhn.jameica.hbci.gui.controller.AbstractTransferControl$KontoListener

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.