/*
'         $VER: HB 4.017 (12 Dec 1999)
'         © 1996/98 Gerald Froehlich
'
' PROGRAMNAME:
'     HB
'
' FUNCTION:
'     für Multiterm und HB
'
'
' $HISTORY:

' 12 Dec 1999 : 004.017 :  Bug mit Termin und Jahr 2000 gefixt
' 14 Jan 1999 : 004.016 :  DM/Euro gefixt
' 13 Jan 1999 : 004.015 :  DEM & EURO-Halbautomatik
' 11 Jan 1999 : 004.014 :  Bug mit Datum gefixt
' 10 Jan 1999 : 004.013 :  neuer Schlüssel
' 05 Jan 1999 : 004.012 :  Sicherheit erhöht ;)
' 29 Nov 1998 : 004.011 :  unverändert
' 29 Oct 1998 : 003.713 :  Ablauf nach ÜW geändert und TAn mit gesp.
' 28 Oct 1998 : 003.712 :  neue Datenmaske wegen EURO
' 05 Sep 1998 : 003.711 :  Aufträge löschen ??
' 29 Jun 1998 : 003.710 :  unverändert
' 29 Jun 1998 : 003.703 :  Anzeige der Reihenfolge erledigter ÜWs gefixt
' 18 Jun 1998 : 003.702 :  aufgefaltet
' 07 May 1998 : 003.701 :  Probs mit O_Auszuege gefixt
' 27 Apr 1998 : 003.610 :  Abbruch bei Fehler ÜW gefixt & Notbremse eingebaut
' 13 Apr 1998 : 003.609 :  neuer Ablauf gefixt
' 08 Apr 1998 : 003.608 :  ÜWs in umgekehrter Reihenfolge
' 08 Apr 1998 : 003.607 :  Fehler bei "Kein Werktag" und Wartezeit verkürzt
' 10 Mar 1998 : 003.606 :  ENV-Files ?_Auszuege ins Parameter-Verz.
' 01 Mar 1998 : 003.605 :  Ltan-Überprüfung verändert
' 27 Jan 1998 : 003.604 :  Z.507 + END + neues Req + d.500
' 22 Jan 1998 : 003.603 :  Strukturänderung
' 14 Jan 1998 : 003.602 :  delay nach Nervreq.
' 13 Jan 1998 : 003.601 :  Anzeige nach "Kein werktag"
' 11 Jan 1998 : 003.553 :  existstring gegen line gewechselt
' 10 Jan 1998 : 003.552 :  Nerv-Request bei Auszügen
' 09 Jan 1998 : 003.551 :  Clips umbenannt
' 05 Jan 1998 : 003.549 :  Speichern auch ohne ungeb. Daten
' 07 Jan 1998 : 003.550 :  TAN-Abfrage gefixt
' 31 Dec 1997 : 003.548 :  Key abfrage gefixt
' 30 Dec 1997 : 003.547 :  Keyabfrage
' 28 Dec 1997 : 003.546 :  Kommentare  überprüft
' 14 Dec 1997 : 003.545 :  .rexx weg
' 26 Nov 1997 : 003.544 :  Strukturänderung I
' 21 Nov 1997 : 003.543 :  Dateinamen in Senden verändert
' 27 Sep 1997 : 003.512 :  Berliner Sparkasse gelöscht
' 24 Aug 1997 : 003.511 :  falsche TAN-Eingabe abfangen
' 24 May 1997 : 003.503 :  zu weit in Zukunft enfernt
' 12 May 1997 : 003.502 :  ÜW-Schleife für 2.Konto gefixt
' 01 May 1997 : 003.501 :  Fehler mit anzahl2 behoben!
' 17 Apr 1997 : 003.500 :  ungebuchte Auszüge _extra speichern & Überpr. ob Auszugsdatei noch vorhanden
' 14 Apr 1997 : 003.160 :  D-Flag setzen
'   ************************************************************
*/
DPfad   = "HB:Parameter/"  /* Parameterpfad */
Sndpfad    = "HB:Senden/"     /* ÜW-Dateien-Pfad */
Ppfad  = "HB:Ablage/"     /* Pfad für Ablage */
Kasse      = ""               /* Btx-Seite der Bank */
Ktnr       = ""               /* Konto-Nr. 1 */
GKtnr      = ""               /* Konto-Nr. 2 */
Pin        = ""               /* PIN  */
Prot       = ""               /* der jeweilige Dateiname */
Tan        = ""               /* TAN */
Ltan       = ""               /* letzte verbrauchte TAN  */
Datum      = ""               /* Termin - Datum */
Dat        = ""               /* Datum des letzten Auszugs oder NEIN */
Dat1       = ""               /* wie oben aber Konto2 */
Datn       = "1"              /* Nummer der lfd. ÜW-Datei */
Datn2      = "1"              /* s.o. Konto 2 */
datnr      = 1               /* Nr. der lfd. ÜW */
datnr2     = 1               /* Konto 2 */
tm         = 0               /* lfd. Üw-Durchgang des jeweiligen Kontos */
Uebw       = ""              /* jeweilige Zeile aus ÜW-File */
Fehler     = ""              /* Fehlerstring */
okay       = "19"            /* Btx-Bestätigung */
TPos       = 0               /* Pos. in der TAN-Liste */
Al         = 1             /* Aufträge löschen ? */
Waehrung1  = Word(GetClip("Waehrung"),1)
Waehrung2  = Word(GetClip("Waehrung"),2)

MT_Port = GetClip('MT_Port')
screen = GetClip('screenName')


IF (~show('l','rexxreqtools.library')) THEN
    call addlib('rexxreqtools.library',0,-30,0)

IF (~show('l','rexxsupport.library')) THEN
    CALL AddLib('rexxsupport.library',0,-30,0)


OPTIONS RESULTS
SIGNAL on error
SIGNAL ON break_c
SIGNAL ON break_d
SIGNAL ON break_e
SIGNAL ON break_f
SIGNAL ON failure
SIGNAL ON halt
SIGNAL ON ioerr
SIGNAL ON syntax

TRACE Background
ADDRESS command 'sys:rexxc/te'

IF ~(OpenPort("HB_REXX")) THEN DO
    CALL rtezrequest('Fehler beim Öffnen des Portes HB_REXX',
    ,'Ja doch!','HB','rt_pubscrname='screen)
    CALL FEHLER1
END

/*##########################
**** Werte einlesen ********
##########################*/

CALL stop

Prot      = DPfad || "homebank.config"            /* Configdatei auslesen */
IF ~(Open(A1,Prot,"r")) THEN DO
  CALL rtezrequest('Config-Datei nicht zu öffnen',
  ,'Ja doch!',,'rt_pubscrname='screen)
  EXIT 10
END

a = Seek(A1,125,'B')
Kasse = Strip(ReadLn(A1))

a = Seek(A1,166,'B')
Ktnr = Strip(ReadLn(A1))

a = Seek(A1,412,'B')
GKtnr = Strip(ReadLn(A1))

a = Seek(A1,207,'B')
Pin = Left(ReadLn(A1),5)
a = Close(A1)
a = "HB:skript/"Word(SourceLine(2),3)
        a = Open("a1",a,"r")
        a = Seek("a1", -3, "E")
        a = ReadCh("a1",2)
        IF a ~= "gf" THEN DO
         CALL rtezrequest('Soso!','Ja doch!',,'rt_pubscrname='screen)
         CALL bye
        END
        a = Close("a1")

Prot = DPfad || "priv.Uew"            /* Anzahl vorliegender ÜW feststellen */
IF ~(Open(A1,Prot,"r")) THEN DO
  CALL rtezrequest('priv.Uew nicht zu öffnen',
  ,'Ja doch!',,'rt_pubscrname='screen)
  EXIT 10
END
anzahl = ReadLn(A1)
a = Close(A1)

Prot = DPfad || "gesch.Uew"             /* das Gleiche nochmal für das 2.Konto */
IF ~(Open(A1,Prot,"r")) THEN DO
  CALL rtezrequest('gesch.Uew nicht zu öffnen',
  ,'Ja doch!',,'rt_pubscrname='screen)
  EXIT 10
END
anzahl2 = ReadLn(A1)
a = Close(A1)

IF (Open(A1,"HB:Parameter/P_Auszuege","r")) THEN DO          /* Auszuege ja-nein? */
  Dat = ReadLn(A1)
  a = Close(A1)
END
ELSE Dat = "Nein"

IF (Open(A1,"HB:Parameter/O_Auszuege","r")) THEN DO          /* Auszuege ja-nein? 2.Konto*/
  Dat1 = ReadLn(A1)
  a = Close(A1)
END
ELSE Dat1 = "Nein"

IF ~(Open(A1,"HB:parameter/letzte_TAN","r")) THEN DO    /* letzte TAN aus Datei abfragen */
  CALL rtezrequest('letzte TAN-Datei nicht zu öffnen',
  ,'Ja doch!',,'rt_pubscrname='screen)
  EXIT 10
END
Ltan = ReadLn(A1)
a = Close(A1)
Ltan = Left(Ltan,29)


/*##########################
****** Bankaufruf **********
##########################*/

CALL stop

ADDRESS VALUE MT_Port

SIGNAL off error
checkonline
IF rc ~= 0 THEN DO
    CALL rtezrequest('MT ist nicht online',
  ,'Ja doch!','Gebühren','rt_pubscrname='screen)
  ADDRESS "HB" MT_END
  EXIT
END

checkER
IF rc = 0 THEN DO
    CALL rtezrequest('Sie befinden sich noch in einem ER',
  ,'Ja doch!','Gebühren','rt_pubscrname='screen)
  ADDRESS "HB" MT_END
  EXIT
END

SIGNAL on error

callpage Kasse

TRACE Background

 IF ~Open("k","RAM:Key.HB4","R") THEN DO
    IF ~Open("k","HB:Key.HB4","R") THEN DO
        CALL rtezrequest('Die Demo-VERSION wurde noch nicht registriert!',
        '0a'x 'Alles klar?!','Ja doch!',,'rt_pubscrname='screen)
        ccc=1
    END
    ELSE DO
        ADDRESS command 'copy HB:Key.HB4 RAM:Key.HB4'
        ccc = 5
    END
 END
 ELSE DO

     j = ReadLn('k')
  PARSE VAR j 7  Datm +4 . +4 seST "j" +4 y "N" +2 co "0b1" se "101" Be "öß" Vers "\" seL "a" az1
  a = Length(j)-8
  PARSE VAR j az a "a" j
  az = COUNTCHARS(az,"1")
     j = Close("k")
   se = SubStr(se,seST,seL)
   CtS   = BitXor(B2C(Reverse(y)),co)
   CtUNR = BitXor(B2C(Reverse(y)),co)/1000
   CtUNR = CtUNR-se
   CtUNR = Trunc(CtUNR-B2C(Vers))
   CtU = BitXor(B2C(Reverse(Left(Be,Length(Be)-3))),co)
   IF Word(CtU,Words(CtU))~=CtUNR THEN CALL aha
   IF az ~= az1 THEN CALL aha
   ccc = 10
 END


split 3
locate 3 2
mplprint " Aufruf der Sparkasse    "
CALL cuwait
split 0

/*********** Aufruf 2.Konto ****************/

IF anzahl = 0 & Dat = "Nein" THEN DO     /* ab hier geschaeftl. Überweisungen */
  split 4
  locate 3 2
  mplprint " Keine Anforderungen vom privaten Konto!"
  locate 3 3
  mplprint " Zugang erfolgt gleich zum Geschaeftskonto!"
  send GKtnr
  CALL cuwait
  send Pin
  CALL cuwait
  send okay                /* mit 19 bestätigt und nun Auswahl 3 */
  CALL cuwait
  split 0
  ADDRESS "HB" ER

/*  line 12 */
  SIGNAL off error
  existstring Ltan
  IF rc ~=  0 THEN DO
  /*   SIGNAL off error */
     existstring "Fehler in unserem System"
     IF rc = 0 THEN DO
       CALL rtezrequest('Leider momentan kein Zugang zur Sparkasse möglich',
       ,'Ja doch!','HB','rt_pubscrname='screen)
       SIGNAL on error
       Al = 0
       CALL SCHLUSS
     END
     SIGNAL on error

     /* jetzt Abfrage nach letzter TAN */
     CALL rtezrequest('Da stimmt was mit den verbrauchten TANs nicht!!',
     ,'Ja doch!',,'rt_pubscrname='screen)
     CALL FEHLER2
  END
  SIGNAL on error

  split 4
  locate 3 2
  mplprint "Letzte verbrauchte TAN ist OKAY !"

  IF anzahl2 = 0 THEN DO              /* wenn keine ÜWs vorliegen */
     locate 3 3
     mplprint "es sind keine Geschäfts- Ueberweisungen vorhanden"
     CALL G_Auszuege
  END
   send "3"                                /* ansonsten -> in ÜW-Maske  */
   CALL cuwait

   CALL G_Konto
END

/****** hier weiter bei Aufträgen des 1.Kontos ***/

send Ktnr
call cuwait
send Pin
call cuwait

send okay                             /* mit 19 bestätigt und nun Auswahl 3 */
CALL cuwait

ADDRESS "HB" ER

/* line 12 */
SIGNAL off error
  existstring Ltan
  IF rc ~=  0 THEN DO

 /*IF RESULT ~= Ltan THEN DO */
/*     SIGNAL off error  */
     existstring "Fehler in unserem System"
     IF rc = 0 THEN DO
       CALL rtezrequest('Leider momentan kein Zugang zur Sparkasse möglich',
       ,'Ja doch!','HB','rt_pubscrname='screen)
       SIGNAL on error
       CALL SCHLUSS
     END

     /* jetzt Abfrage nach letzter TAN */
     CALL rtezrequest('Da stimmt was mit den verbrauchten TANs nicht!!',
     ,'Ja doch!',,'rt_pubscrname='screen)
     CALL FEHLER2
END

SIGNAL on error
split 4
locate 3 2
mplprint "Letzte verbrauchte TAN ist OKAY !"

IF anzahl = 0 THEN DO
  locate 3 3
  mplprint "es sind keine privaten Ueberweisungen vorhanden"
  CALL P_Auszuege
END



/**** ÜWs 1.Konto ****/
send "3"
locate 3 3
mplprint " jetzt werden die geschriebenen                             "
locate 3 4
mplprint " privaten bzw. Geschaefts-Ueberweisungen durchgefuehrt      "
a = delay(200)
call cuwait


/********** ÜW-Schleife 1.Konto **********/

Datn = anzahl-0  /* damit führende 0 wegfällt" */

Prot = Sndpfad || "UEBERWEISUNG" || Datn || ".hb"

CALL UEBERWEISEN Prot
DO FOREVER
    CALL P_UEW
    IF RESULT = "Auszüge" THEN BREAK
END

/***** nach ÜWs vom 1. Konto auf Übersichtsseite zurück *******/
send "0"
call cuwait

/**************** Auszüge vom 1. Konto *****************/
P_Auszuege:
Prot = Ppfad || "Kontostand.priv"
Prot1 = Ppfad || "Kontoauszuege.priv"
Prot2 = Ppfad || "Ausz_ungebucht.priv"
CALL STAND

/*###################################################
******************** 2. Konto ************************
####################################################*/

tm = 0
IF anzahl2 = 0 & Dat1 = "Nein" THEN DO    /* falls keine Anforderung an 2.Konto */
  a = delay(200)
  split 3
  locate 3 2
  mplprint "keine Anforderungen an Geschaeftskonto"
  a = delay(200)
  CALL SCHLUSS
END
/* CALL cuwait */

/***** Wechsel auf 2. Konto ***********/
send "5"
call cuwait
send GKtnr
sendter
CALL cuwait
IF anzahl2 ~= 0 THEN DO     /* falls ÜWs zu erledigen sind */
  send "3"                 
  CALL cuwait
END
ELSE CALL G_Auszuege        /* falls keine ÜW vorliegt */


/********** ÜW-Schleife 2.Konto **********/

G_Konto:
Datn2 = anzahl2-0    /* damit führende 0 wegfällt */
Prot = Sndpfad || "GKtoUeberwsg" || Datn2 || ".hb"
anzahl = anzahl2

CALL UEBERWEISEN Prot
anzahl2 = anzahl
DO FOREVER
    CALL G_UEW
    IF RESULT = "Auszüge" THEN BREAK
END

/******** Auszüge vom 2. Konto **********/
G_Auszuege:
Prot = Ppfad || "Kontostand.gesch"
Prot1 = Ppfad || "Kontoauszuege.gesch"
Prot2 = Ppfad || "Ausz_ungebucht.gesch"
Dat = Dat1
CALL STAND

/*################################################
************** Beenden der Bankverbindung ********
################################################*/

SCHLUSS:
call cuwait

Prot = "ENV:Bank"         /*  soll Bankverbindung gehalten werden? */
IF ~(Open(A1,Prot,"r")) THEN DO
  CALL rtezrequest('ENV:Bank ist nicht zu öffnen',
  ,'Ja doch!',,'rt_pubscrname='screen)
  EXIT 10
END

Bank = ReadLn(A1)
a = Close(A1)

IF Bank = "NO" THEN DO    /* ER beenden */
 send "9"
 CALL cuwait

END 

split 4
locate 3 2
IF Bank = "NO" THEN
 mplprint " Verbindung zum Kassenrechner beendet "

ELSE
 mplprint " Bankverbindung bleibt bestehen!  "

locate 3 3
mplprint "Das Skript endet hier ... "
a = delay(200)
split 0
/* falls Zugang nicht möglich aufträge behalten */
IF al = 0 THEN ADDRESS "HB" MT_1END
ELSE ADDRESS "HB" MT_END
EXIT


/*##################################
**** ENDE des Ablaufs **************
##################################*/

/********* Auf Cursor warten **********/
cuwait:
CALL stop
SIGNAL off error
a = delay(30)
checkcuron
DO WHILE rc ~= 0
 CALL stop
 a = delay(30)
 checkcuron
END
SIGNAL on error
RETURN


TAN:
ccc = 0
TRACE Background
TRACE I
IF ~Open("k","RAM:Key.HB4","R") THEN DO

    Tan = rtgetstring(,'Sie haben leider nicht den richtigen Key!' '0a'x,
    'Sie müssen jetzt die TAN selbst eintippen!',,
   'Demo-VERSION','Ja doch!','rt_pubscrname='screen)

    ccc = 1
END
ELSE DO
     j = ReadLn('k')
   PARSE VAR j 7  Datm +4 . +4 seST "j" +4 y "N" +2 co "0b1" se "101" Be "öß" Vers "\" seL "a" az1
  a = Length(j)-8
  PARSE VAR j az a "a" j
  az = COUNTCHARS(az,"1")
     j = Close("k")

   se = SubStr(se,seST,seL)
   CtS   = BitXor(B2C(Reverse(y)),co)
   CtUNR = BitXor(B2C(Reverse(y)),co)/1000
   CtUNR = CtUNR-se
   CtUNR = Trunc(CtUNR-B2C(Vers))
   CtU = BitXor(B2C(Reverse(Left(Be,Length(Be)-3))),co)
   CtUN = Word(CtU,Words(CtU)-1)
   IF Word(CtU,Words(CtU))~=CtUNR THEN CALL baeh
   IF az ~= az1 THEN CALL baeh
  line 3
  IF Pos("ÜBERWEISUNG",UPPER(RESULT)) ~= 0 THEN line 4

  IF Pos(UPPER(CtUN),UPPER(RESULT)) = 0 THEN DO
   Tan = rtgetstring(,'Sie haben leider nicht den richtigen Key!' '0a'x,
    'Sie müssen jetzt die TAN selbst eintippen!',,
   'Demo-VERSION','Ja doch!','rt_pubscrname='screen)
   ccc = -120
  END
  ELSE DO
    Prot = "HB:Parameter/Tan.lst"
    IF ~(Open(A2,Prot,"r")) THEN DO
     CALL rtezrequest('TAN-Liste nicht zu öffnen',
     ,'Ja doch!',,'rt_pubscrname='screen)
     EXIT 10
    END
    ccc=10
    a = Seek(A2,TPos,'B')
    Tan = ReadLn(A2)
    TPos = Seek(A2,0,'C')
    a = Close(A2)
  END
END
RETURN

/*###############################################
*** Kontostand & Auszüge speichern ************
###############################################*/

STAND:
IF ccc < 10 THEN DO
     CALL rtezrequest('Sie haben leider nicht den richtigen Key!' '0a'x,
    '(Es folgt eine kurze Wartepause)','Ja doch!','Demo-VERSION','rt_pubscrname='screen)
    a = delay(500)
 END
IF Dat = "Nein" THEN RETURN                    /* falls keine Auszüge gewünscht */
call cuwait
send "1"
CALL cuwait


/***** Kontostand speichern *******/

CALL WartenAuf "Aktueller",1,6,500          /* Ist es wirklich der Kontostand? */
/* CALL WartenAuf String,Spalte,Zeile,Zeit(in 100.s) */
/* Aufruf ist nicht Case-sensitiv! */

IF RESULT = 1 THEN DO
 a = Open(A2,Prot,"w")
 a = WriteLn(A2,"Kontostand vom " || Date() || "-" || Time())
 DO i= 3 TO 15
  line i
  a = WriteLn(A2,RESULT)
 END
 a = WriteLn(A2,Copies("=",40))
 a = Close(A2)
 split 4
 locate 3 2
 mplprint " Kontostand wurde gespeichert.                    "
END
ELSE DO                              /* Falls Fehler im Bank-ER */
 CALL rtezrequest('Leider konnte kein Kontostand gespeichert werden',
  || '0A'x || 'Abbruch des Bank-Skriptes!',
  ,'Ja doch!',,'rt_pubscrname='screen)
 CALL SCHLUSS
END


/***** vorliegende (noch nicht gebuchte) Umsätze speichern *********/

CALL WartenAuf "Vorliegende",1,17,500   /* sind noch nicht gebuchte Daten vorhanden? */

IF RESULT = 1 THEN DO
 a = Open(A1,Prot2,"w")
 send "3"
 call cuwait
 locate 3 3
 mplprint "Vorliegende Umsätze werden gespeichert ... "
 a = WriteLn(A1,"Kontoauszug vom "||Date()||" "||Time())
 a = WriteLn(A1,"vorliegende aber noch nicht gebuchte Vorgänge:")
 a = WriteLn(A1,Copies("-",30))

 CALL WartenAuf "#",37,22,500     /* sind noch mehr ungebuchte Daten vorhanden? */
 DO  WHILE RESULT = 1
   DO i=3 TO 21
      line i
      a = WriteLn(A1,RESULT)
   END
   sendter
   call cuwait
   CALL WartenAuf "#",37,22,500
 END

 DO i=3 TO 21
   line i
   a = WriteLn(A1,RESULT)
 END
 a = WriteLn(A1 ,Copies("=",40))
 split 0
 CALL cuwait
 send "0"
 call cuwait
 send "1"
 call cuwait
 a = Close(A1)
END
ELSE DO         /* falls keine ungebuchte Daten */
   a = Open(A1,Prot2,"w")
   a = WriteLn(A1,"Am "||Date()||" "||Time())
   a = WriteLn(A1,"lagen keine ungebuchten Vorgänge vor!")
   a = Close(A1)
END

 /******** Auszüge speichern *********/

send "2"
call cuwait
send "A"
call cuwait
IF Dat = "" THEN                   /* Datum des letzten Auszuges vorhanden? */
 sendter
ELSE
 send Dat

senddct

IF Exists(Prot1) THEN a = Open(A1,Prot1,"a")
ELSE a = Open(A1,Prot1,"w")

call cuwait

CALL WartenAuf "Sammelanzeige",10,4,500     /* Ist das auch die richtige Seite? */
IF RESULT = 1 THEN DO
 IF ccc < 10 THEN DO
     CALL rtezrequest('Sie haben leider nicht den richtigen Key!' '0a'x,
    '(kurze Wartepause)','Ja doch!','Demo-VERSION','rt_pubscrname='screen)
    a = delay(500)
 END
 split 4
 locate 3 2
 mplprint " Die Kontoauszüge werden gespeichert..."
 a = WriteLn(A1,"gebuchte Daten vom "||Date()||" "||Time())
 a = WriteLn(A1,Copies("-",34))
 DO i=3 TO 8
   line i
   a = WriteLn(A1,RESULT)
 END

 CALL WartenAuf "11",2,21,500     /* liegen noch mehr Buchungen vor ? */
 DO WHILE RESULT = 1
     IF ccc < 10 THEN DO
       CALL rtezrequest('Sie haben leider nicht den richtigen Key!' '0a'x,
       '(kurze Wartepause)','Ja doch!','Demo-VERSION','rt_pubscrname='screen)
       a = delay(500)
     END
     DO i=9 TO 20
      line i
      a = WriteLn(A1,RESULT)
     END
   callpage "11"
   call cuwait

   CALL WartenAuf "11",2,21,500
 END
 DO i=9 TO 20
   line i
   a = WriteLn(A1,RESULT)
 END
 a = WriteLn(A1,Copies("=",40))
 a = Close(A1)

 CALL cuwait
 callpage "2"
 call cuwait

 locate 3 3
 mplprint " Speichern beendet. "
 send "0"
 call cuwait
END
ELSE DO
 CALL rtezrequest('Leider konnten keine Auszüge gespeichert werden',
  || '0A'x || 'Abbruch des Bank-Skriptes!',
  ,'Ja doch!',,'rt_pubscrname='screen)
 a = Close(A1)
 CALL SCHLUSS
END
RETURN


/*##########################################################
******** Überweisen ***************************************
##########################################################*/


UEBERWEISEN:
ARG Prot1

Datum = ""
CALL TAN

IF ~(Open(A1,Prot1,"r")) THEN DO
  CALL rtezrequest('Überweisungsdatei kann nicht geöffnet werden',
  ,'Ja doch!',,'rt_pubscrname='screen)
  EXIT 10
END
Uebw = ReadLn(A1)                   /* Termin- oder normale Ueberweisung? */

/* ACHTUNG folgendes zum Jahr 2000 löschen !!!! */
IF SubStr(Uebw,3,1) = "." & SubStr(Uebw,7,2) = "19" THEN DO
    split 3
    locate 3 2
    mplprint "Aha, Termin-Ueberweisung!             "
    callpage "99"
    call cuwait
    send "4"
    CALL cuwait
    send "2"
    CALL cuwait

    CALL WartenAuf "bersicht Ihrer Termin",3,7,500
    IF RESULT = 1 THEN DO                /*  falls schon Termin-ÜWs in der Bank vorliegen! */
       send "1"
       call cuwait
    END
    Datum = Uebw
    Uebw = ReadLn(A1)
END

/* hier f. Jahr 2000 */
IF SubStr(Uebw,3,1) = "." & SubStr(Uebw,7,2) = "20" THEN DO
    split 3
    locate 3 2
    mplprint "Aha, Termin-Ueberweisung!             "
    callpage "99"
    call cuwait
    send "4"
    CALL cuwait
    send "2"
    CALL cuwait

    CALL WartenAuf "bersicht Ihrer Termin",3,7,500
    IF RESULT = 1 THEN DO                /*  falls schon Termin-ÜWs in der Bank vorliegen! */
       send "1"
       call cuwait
    END
    Datum = Uebw
    Uebw = ReadLn(A1)
END
send Uebw

DO i = 2 TO 7
  IF i = 4 THEN DO   /* Mark */
    a= 0
    IF Pos("GKTOUEB",Prot1) = 0 & Waehrung1 = "DEM" THEN a = 1 /* P-Konto */
    IF Pos("GKTOUEB",Prot1) ~= 0 & Waehrung2 = "DEM" THEN a = 1 /* G- Konto */

    IF a = 1 THEN DO
       sendter          /*   hier 2x sendter bei DEM */
       sendter
       Uebw = ReadLn(A1)
       send Uebw
       sendter
    END
    ELSE DO
       Uebw = ReadLn(A1)
       send Uebw
       sendter
    END
  END
  IF i = 5 THEN DO      /* Pf */
    a = 0
    IF Pos("GKTOUEB",Prot1) = 0 & Waehrung1 = "DEM" THEN a = 1
    IF Pos("GKTOUEB",Prot1) ~= 0 & Waehrung2 = "DEM" THEN a = 1

    IF a = 1 THEN DO
       
       Uebw = ReadLn(A1)
       send Uebw
    END
    ELSE DO
       Uebw = ReadLn(A1)
       send Uebw
       sendter          /*   hier 2x sendter bei EURO */
       sendter
    END
  END
  IF i ~= 4 & i ~= 5 THEN DO  /* sonstige Zeilen */
    Uebw = ReadLn(A1)
    IF Strip(Uebw) = "" THEN sendter
    ELSE send Uebw
  END
END
  a = Close(A1)
  IF Datum ~= "" THEN send Datum         /* nur bei T-ÜW */
  CALL cuwait

/***** Fehlermeldungen beim Überweisen ******/
getcury
DO WHILE RESULT ~= 18                    /* falls Termin kein Werktag ist */
  CALL WartenAuf "Kein Werktag",1,22,500
  IF RESULT = 1 THEN DO                   /* übernimmt automatisch nächsten Werktag */
    getcury
    DO WHILE RESULT ~= 18
     sendter
     call cuwait
    getcury
    END
  split 3
  mplprint "Der Termin wurde automatisch geaendert"
  END

  getcury
  IF RESULT = 18 THEN BREAK

  CALL WartenAuf "ndern",2,22,500    /* bei sonstigem Fehler */
  /* hier geändert:Zeile von 21 auf 22! */
  IF RESULT = 1 THEN DO
    split 3
    mplprint "Fehler bei Ueberweisung !!"
    mplprint "es geht mit der naechsten weiter!"
    Prot = Ppfad || "Fehler-Ueberweisung"
    IF ~exists(Prot) THEN
      a = Open(A2,Prot,"w")
    ELSE
      a = Open(A2,Prot,"a")
    DO i =2 TO 22
     line i
     a = WriteLn(A2,RESULT)
    END
    a = WriteLn(A2,Copies("=",40))
    a = Close(A2)
    a = delay(200)
    callpage "99"
    call cuwait
    TPos = TPos - 7             /* Zeiger in TAN-Liste wieder zurücksetzen */
    RETURN
  END

  CALL WartenAuf "nicht in der Zukunft.",18,22,500    /* Termin liegt nicht in der Zukunft */
  IF RESULT = 1 THEN DO
    split 3
    mplprint "Fehler bei Ueberweisung !!"
    mplprint "es geht mit der naechsten weiter!"
    Prot = Ppfad || "Fehler-Ueberweisung"
    IF ~exists(Prot) THEN
      a = Open(A2,Prot,"w")
    ELSE
      a = Open(A2,Prot,"a")
    DO i =2 TO 22
     line i
     a = WriteLn(A2,RESULT)
    END
    a = WriteLn(A2,Copies("=",40))
    a = Close(A2)
    a = delay(200)
    callpage "99"
    call cuwait
    TPos = TPos - 7             /* Zeiger in TAN-Liste wieder zurücksetzen */
    RETURN
  END
  split 0
  getcury
  
END

send Tan
call cuwait
sendter
call cuwait


/*************** TAN-Fehler abfangen ***************/

SIGNAL off error
existstring "TAN falsch"
IF rc = 0 THEN DO
       CALL rtezrequest('Oh-No! die TAN stimmt nicht! Mach schnell Schluß!' '0a'x,
       'Dazu jetzt die ÜW per Hand abbrechen,' '0a'x 'oder eine richtige TAN eingeben.',
       '0a'x 'ACHTUNG: Erst DANACH auf [Ja doch!] klicken!',
       ,'Ja doch!','HB','rt_pubscrname='screen)
       SIGNAL on error
       CALL stop
       CALL HALT1
END

existstring "TAN ung"
IF rc = 0 THEN DO
       CALL rtezrequest('Oh-No! die TAN stimmt nicht! Mach schnell Schluß!' '0a'x,
       'Dazu jetzt die ÜW per Hand abbrechen,' '0a'x 'oder eine richtige TAN eingeben.',
       '0a'x 'ACHTUNG: Erst DANACH auf [Ja doch!] klicken!',
       ,'Ja doch!','HB','rt_pubscrname='screen)
       SIGNAL on error
       CALL stop
       CALL HALT1
END
getcury
IF RESULT = 18 THEN DO
   CALL rtezrequest('Es könnte sein, dass die TAN nicht stimmt! Mach schnell Schluß!' '0a'x,
       'Dazu jetzt die ÜW per Hand abbrechen,' '0a'x 'oder eine richtige TAN eingeben.',
       '0a'x 'ACHTUNG: Erst DANACH auf [Ja doch!] klicken!',
       ,'Ja doch!','HB','rt_pubscrname='screen)
       SIGNAL on error
       CALL stop
       CALL HALT1
END

SIGNAL on error

IF ~SETPROTECTION(Prot1,'----RWED') THEN                /* D-Flag setzen **/
       CALL rtezrequest('Fehler beim Setzen des D-Flags',
       ,'Ja doch!',,'rt_pubscrname='screen)

Prot = "Env:Tan"                 /* verbrauchte TAN festhalten */
a = Open(A1,Prot,"w")
a = WriteLn(A1,Tan)
a = Close(A1)
call cuwait

/**** Bestätigung speichern *****/
/*** für 1. Konto ***/

IF Pos("UEBERWEISUNG",Prot1) > 0 THEN DO
    IF Datum = "" THEN DO
    Prot = SubStr(Date('S'),3,2) || "-" || SubStr(Date('S'),5,2) || "-" || Right(Date('S'),2)
    Prot = Ppfad || "UeW/UeW_" || Prot
    END
    ELSE DO
    Prot = Right(Datum,2) || "-" || SubStr(Datum,4,2) || "-" || Left(Datum,2)
    Prot = Ppfad || "UeW/Termin_" || Prot
    END
END
/*** für 2. Konto ***/        
IF Pos("GKTOUEBERWSG",Prot1) > 0 THEN DO
    IF Datum = "" THEN DO
    Prot = SubStr(Date('S'),3,2) || "-" || SubStr(Date('S'),5,2) || "-" || Right(Date('S'),2)
    Prot = Ppfad || "UeW/UeW_gesch._" || Prot
    END
    ELSE DO
    Prot = Right(Datum,2) || "-" || SubStr(Datum,4,2) || "-" || Left(Datum,2)
    Prot = Ppfad || "UeW/Termin_gesch._" || Prot
    END
END


IF ~exists(Prot) THEN
    a = Open(A8,Prot,"w")
ELSE
    a = Open(A8,Prot,"A")
 a = WriteLn(A8," ")
 line 2
 a = WriteLn(A8,RESULT)
 line 3
 a = WriteLn(A8,RESULT)
 line 4
 a = WriteLn(A8,RESULT)

 DO i = 8 TO 21
  IF i = 17 THEN
    a = WriteLn(A8,"TAN:         "||Tan)
  ELSE DO
    line i
    a = WriteLn(A8,RESULT)
  END
 END
 a = WriteLn(A8,Copies("=",40))
 a = Close(A8)
split 3
locate 3 2
IF Pos("UEBERWEISUNG",Prot1) > 0 THEN
 mplprint " Die " || datnr || ". Ueberweisung (privat) wurde durchgefuehrt           "
ELSE
 mplprint " Die " || datnr2 || ". Ueberweisung  (Geschaefts-Kto.) wurde durchgefuehrt "

a = delay(200)

/***** verbrauchte TAN speichern *******/
a = Open(A1,"HB:Parameter/letzte_TAN","w")
a = WriteLn(A1 ,"Letzte verbrauchte TAN " || Tan || ".          ")
a = Close(A1)
a = delay(200)

RETURN

/*###########################################################
*********** Ansteuerung der Überweisungsroutine ************
############################################################*/



P_UEW:

/* für Austritt aus Termin-Ü. */
IF Datum ~= "" THEN DO             /* vorher Termin-ÜW ? */
  send "0"
  call cuwait
  send "0"
  call cuwait
END
IF anzahl >1 & Datum ~= "" THEN DO   /*vorher T-ÜW und mehrere ÜWs*/
 datnr = datnr + 1
 Datn = anzahl + 1 - datnr
 IF datnr <= anzahl THEN DO         /* noch ÜWs offen? */
  send "3"
  call cuwait
  tm = 1
  Prot = Sndpfad || "UEBERWEISUNG" || Datn || ".hb"
  CALL UEBERWEISEN Prot
  RETURN
 END
 ELSE DO
  send "0"
  call cuwait
  RETURN "Auszüge"
 END
END

IF anzahl >1 & Datum = "" THEN DO    /* vorher keine T-Üw gewesen */
 datnr = datnr + 1
 Datn = anzahl + 1 - datnr
 IF datnr <= anzahl THEN DO            /* noch ÜWs offen */
 /* send "1"  geändert wegen neuer Masken */
  send 0
  call cuwait
  send 3
  CALL cuwait
  Prot = Sndpfad || "UEBERWEISUNG" || Datn || ".hb"
  CALL UEBERWEISEN Prot
  RETURN
 END
 ELSE DO
  send "0"
  call cuwait
  RETURN "Auszüge"
 END
END
RETURN "Auszüge"

/*############################################################
********** Ansteuerung der Überweisungsroutine (2.Konto) ***
############################################################*/

G_UEW:
/* für Austritt aus Termin-Ü. */

IF Datum ~= "" THEN DO
  send "0"
  call cuwait
  send "0"
  call cuwait
END
IF anzahl2 >1 & Datum ~= "" THEN DO
   datnr2 = datnr2 + 1
   Datn2 = anzahl2 + 1 - datnr2
   IF datnr2 <= anzahl2 THEN DO
      send "3"
      CALL cuwait
      tm = 1
      Prot = Sndpfad || "GKtoUeberwsg" || Datn2 || ".hb"
      anzahl = anzahl2
      CALL UEBERWEISEN Prot
      anzahl2 = anzahl
      RETURN
   END
   ELSE DO
    send "0"
    CALL cuwait
    RETURN "Auszüge"
   END
END

IF anzahl2 >1 & Datum = "" THEN DO
   datnr2 = datnr2 + 1
   Datn2 = anzahl2 + 1 - datnr2
   IF datnr2 <= anzahl2 THEN DO
      /* send "1" geändert wegen neuer Masken */
      send 0
      CALL cuwait
      send 3
      CALL cuwait
      Prot = Sndpfad || "GKtoUeberwsg" || Datn2 || ".hb"
      anzahl = anzahl2
      CALL UEBERWEISEN Prot
      anzahl2 = anzahl
      RETURN
   END
   ELSE do
    send "0"
    CALL cuwait
    RETURN "Auszüge"
   END
END
send "0"              /* hoffentlich jetzt auf Übersichtsseite! */
CALL cuwait
RETURN "Auszüge"


/*###########################################
*************** auf String warten ***********
###########################################*/

WartenAuf:
ARG text,Spalte,Zeile,Zeit
Erg = 0
Zeit = Trunc(Zeit/3)
DO i=1 TO 3
 line Zeile
 IF Pos(text,UPPER(RESULT)) = Spalte THEN DO
     Erg = 1
     LEAVE
 END
 a = delay(Zeit)
END
RETURN Erg

/*########################################
********** BREAK-Message ? **************
#######################################*/


STOP:

packet = GetPkt("HB_REXX")
      IF packet ~= "0000 0000"x THEN DO
        pack = GetArg(packet)
        CALL Reply(packet,0)
        IF pack = "STOP" THEN DO
          CALL HALT
        END
      END
RETURN


/*###########################################
*************** Fehler-Routinen *************
###########################################*/



FEHLER1:                   /* Beenden des Skriptes ohne Offline */
CALL rtezrequest('Fehler1',
  ,'Ja doch!','HB-REXX','rt_pubscrname='screen)
  ADDRESS "HB" END
EXIT

FEHLER2:                   /* Beenden des Skriptes nach Offline */
                           /* wenn nicht Bank_halten eingestellt war */

CALL rtezrequest('Fehler2',
  ,'Ja doch!','HB-REXX','rt_pubscrname='screen)
CALL SCHLUSS


/*###################################
*** Debugging-Fehlerroutinen *******
###################################*/
syntax:
text =  'Syntax-Fehler' rc 'in Zeile' sigl '0A'x ErrorText(rc),
    '0A'x || SourceLine(sigl)
   CALL rtezrequest(text,"Alles klar!", "Fehlermeldung HB-REXX",'rt_pubscrname='screen)
  EXIT 10

failure:
ioerr:
ERROR:
text =  'Fehler' rc 'in Zeile' sigl '0A'x ErrorText(rc),
    '0A'x || SourceLine(sigl)
   CALL rtezrequest(text,"Alles klar!", "Fehlermeldung HB-REXX",'rt_pubscrname='screen)
  EXIT 10
baeh: EXIT
halT:
break_c:
break_d:
break_e:
break_f:
text =  'User-Abbruch durch Halt!' || '0A'x || 'Wirklich abbrechen ?'
 ab = rtezrequest(text,"_Mach Schluss|_Neeiiin", "HB-REXX",'rt_pubscrname='screen)
 IF ab = 1 THEN DO
   ADDRESS "HB" END
   EXIT
 END
 ELSE RETURN

aha: CALL SCHLUSS

HALT1:
CALL stop
text =  'Die TAN verbessert?' || '0A'x || 'Und nun müßte die Bestätigung' || '0A'x,
 || 'der Bank erscheinen.' || '0A'x || 'Solls nun weiter gehen?'
 ab = rtezrequest(text,"_Weiter|_Mach Schluss", "HB-REXX",'rt_pubscrname='screen)
 IF ab = 0 THEN DO
   ADDRESS "HB" END
   EXIT
 END
 ELSE DO
   CALL stop
   RETURN
 END


