**BRegieAK.prg   -  Regie-Zentrum fr Bestattungsverwaltung
//                      Versicherungsanschreiben zu einem Auftrag

//      NEU: mit Auftrnr + Bb (=Zeile) ist der Satz eindeutig
//              beschrieben. D.h. Zeile darf nur ge„ndert aber nie (!)
//              gel”scht werden! (Z.B. mit "LEER"/"----" berschreiben)

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Appedit.ch"
#include "Appbrow.ch"
#include "Font.ch"
#include "Dmlb.ch"
#include "Common.ch"

FUNCTION AuftrKontrolle( cAuf, oDlg1 )
   LOCAL oDlg, nEvent, mp1, mp2, oXbp, oBrowse
   LOCAL oCtrl, oFocus := SetAppFocus(), aEditControls := {}
   LOCAL aPP := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                  { XBP_PP_BGCLR       , GRA_CLR_WHITE    } }
   LOCAL aPPSle := { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }
   LOCAL aPPTxt := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                     { XBP_PP_BGCLR       , XBPSYSCLR_DIALOGBACKGROUND } }
   LOCAL nBo := 400*nV  //, nBz := 25*nV
   LOCAL nOldArea := Select() //, aV := {} , nBbSum, nZeile
   LOCAL lFlucht := .F., nFlucht, nVS, i
   PRIVATE oCB, oKODA, oEdit, oSle0, oSle, oSle1, nVSum, cIK, cKonto := Trim(" ")


   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
   oDlg:tasklist := .T.
   oDlg:title := "A U F T R A G S  -  K O N T R O L L E"
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, {10,int(30*nV)}, {int(770*nV),int(500*nV)} )
   SetAppFocus(oDlg)       // Fenster muá den Focus haben, damit Parts ihn dann kriegen k”nnen!
   oDlg:lockUpdate(.T.)    // damit der Bildaufbau unsichtbar bleibt

//   oDlg:drawingArea:setColorBG( GRA_CLR_PINK )
   oDlg:drawingArea:setColorBG( XBPSYSCLR_TRANSPARENT )
   oCB := oDlg:drawingArea
   oKODA := oDlg:drawingArea
   oKODA:cargo := oDlg

// jetzt folgt die Erzeugung der Eingabefelder
   oEdit := KontFF():new( oKODA,oDlg, {0*nV,0}, {770*nV,475*nV},,, nBz, "s_kont", -100, 299, 1 )
   oEdit:CREATE( oKODA,oDlg, {0*nV,0}, {770*nV,475*nV},,, nBz, "s_kont", -100, 299, 1 )
   FOR i := 1 TO oEdit:SZNr -1
      oEdit:SingleZeile[i]:editable := .F.
   NEXT
   AEval( oEdit:editControls, {|x| oDlg:addEditControl( x ) } )
//   AEval( oEdit:appendControls, {|x| oDlg:addAppendControl( x ) } )
// bis hierhin geht die Erzeugung der Eingabefelder

// DialogFF kann nur Field-Variablen verarbeiten, daher erzeuge ich zuerst einen Dummy und dann :
// berladen der Multizeile[2] mit einer Speicher-Variablen und einer Schrift:
   oEdit:MultiZeile[2]:setFontCompoundName( FONT_COURIER_SMALL )
//   oEdit:MultiZeile[2]:horizScroll := .T.
//   oEdit:MultiZeile[2]:XbpMle:configure()
//   oMle:vertScroll := .T.
   oEdit:MultiZeile[2]:dataLink := {|x| IIf( PCOUNT()==0, Trim(cKonto), cKonto := x ) }
   oEdit:MultiZeile[2]:setData( cKonto )
   cKonto := KontrRech( cAuf )

   oDlg:setModalState( XBP_DISP_APPMODAL )
//   oDlg:show()

   oCtrl := XbpGetController():new( oDlg )
   oCtrl:create()
   oCtrl:READ( , .F. )
//   SetAppFocus( oDlg:childFromName( 1->(FieldPos( "name" )) ) )
   * Shortcuts initialisieren
   oDlg:InitShortCuts( oDlg )
   oDlg:lockUpdate(.F.)
   oDlg:invalidateRect()

   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 != xbeK_ESC .AND. mp1 != xbeK_F10 .AND. oXbp = oEdit:Multizeile[1]
            oXbp:KEYBOARD( mp1 )
            LOOP
         CASE mp1 != xbeK_ESC .AND. mp1 != xbeK_F10 .AND. oXbp = oEdit:Multizeile[2]
            oEdit:Multizeile[2]:KEYBOARD( mp1 )
            LOOP
         CASE mp1 == xbeK_ALT_G
            BlattDrG( "Bl_v",, oDlg )
         CASE mp1 == xbeK_ESC
               lFlucht := .T.
               PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_F10
            lEinfg := .F.
            oDlg:writeData()
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_F1
            ModalDialog( (cDatver+"f1_AK.dbf"), "Bedienungshinweise", oKODA, 680*nV, 460*nV )
            oXbp:enable()
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

   oDlg:setModalState( XBP_DISP_MODELESS )
   DbDeRegisterClient(oEdit)
   oEdit:destroy()
   oDlg:destroy()
   SetAppFocus( oFocus )
   Select &nOldArea
RETURN .T.

FUNCTION KontrDruck( cString )
   SET DEVICE TO PRINTW
   @ 2,8 SAY "Kontrollbersicht fr Auftrag "+StrX( 1->auftrnr,6,0 )
   @ 4,8 SAY "Verstorbener:    "+Trim( 1->vorname )+" "+Trim( 1->name )
   @ 5,8 SAY "Sterbe-Datum:    "+DtoC( gestorben )
   @ 6,8 SAY "Ansprechpartner: "+Trim( 1->ansp_vname )+" "+Trim( 1->ansp_name ) ;
                +", "+Trim( 1->ansp_bez )
   @ 7,8 SAY "Telefon:         "+Trim( 1->ansp_telp )

   FOR i := 1 TO MlCount( cString )
      @ 9+i,8 SAY MemoLine( cString,, i )
   NEXT
//   EJECT
   SET DEVICE TO SCREEN
RETURN .T.

FUNCTION KontrRech( cAuf )
   LOCAL nOldArea := Select(), CRLF := Chr(13)+Chr(10)
   LOCAL nGSum := nASum := nVSum := nSumme := 0
   LOCAL nSumme4 := nSumme3 := nSumme2 := nSumme1 := nSumme0 := 0 // 9.2.2005
   LOCAL cString := CRLF
   LOCAL nX := IIf(AppDesktop():currentSize()[1]/800<=1,10,0)

   SELECT 3
   FIND &cAuf
   DO WHILE 3->auftrnr=val(cAuf) .and. .not. eof()
      IF 3->kennz $ "23" .and. Val(3->rn)<4        // 13.4.2005   "23" wegen Disch
         nASum := nASum + 3->(&b_g)
      ENDIF
      IF 3->rn = "4"                // 9.2.2005 Mllers Friedhofsgebhren
         nSumme4 := nSumme4 + 3->(&b_g)
      ENDIF
     IF Upper( AppName() ) = "NOLTEX.EXE"
      IF 3->rn = "3"
         nSumme3 := nSumme3 + 3->(&b_g)*(1+zschl_voll/100)
      ELSEIF 3->rn = "2"
         nSumme2 := nSumme2 + 3->(&b_g)
      ELSEIF 3->rn = "1" .or. 3->rn = " "
         nSumme1 := nSumme1 + 3->(&b_g)*(1+zschl_voll/100)
//      ELSE
//         nSumme0 := nSumme0 + 3->(&b_g)
      ENDIF
     ELSE
      IF 3->rn = "3"
         nSumme3 := nSumme3 + 3->(&b_g)
      ELSEIF 3->rn = "2"
         nSumme2 := nSumme2 + 3->(&b_g)
      ELSEIF 3->rn = "1"
         nSumme1 := nSumme1 + 3->(&b_g)
      ELSEIF 3->rn = " " .or. 3->rn = "0"
         nSumme0 := nSumme0 + 3->(&b_g)
      ENDIF
     ENDIF
      3->(DbSkip())
   ENDDO
   nSumme := nSumme0 + nSumme1 + nSumme2 + nSumme3
     IF Upper( AppName() ) = "NOLTEX.EXE"
   cString := cString + PadR( "unsere Eigenleistungs-Rechnung ", 56-nX )+Str( nSumme1,10,2 )+CRLF
   cString := cString + PadR( "unsere Fremdleistungs-Rechnung ", 56-nX )+Str( nSumme2,10,2 )+CRLF
   cString := cString + PadR( "unsere Nachtrags-Rechnung ", 56-nX )+Str( nSumme3,10,2 )+CRLF
//   cString := cString + PadR( "unsere Nachtrags-Rechnung 3 ", 56-nX )+Str( nSumme3,10,2 )+CRLF
   cString := cString + PadR( Replicate( "-", 66-nX ), 67-nX )+CRLF
   cString := cString + PadR( "Summe der Rechnungen               ", 53-nX )+w_g+Str( nSumme,10,2 )+CRLF
//   cString := cString + "(Davon aus Fremdleistungen " + Str( nASum,8,2 ) + " "+w_g+")"+CRLF
   cString := cString + PadR( " ", 66-nX )+CRLF
     ELSEIF Upper( AppName() ) = "KOMPAKTX.EXE"
     nSumme := nSumme0 + nSumme3
   cString := cString + PadR( "unsere Bestattungs-Rechnung ", 56-nX )+Str( nSumme0,10,2 )+CRLF
   cString := cString + PadR( "unsere Gemeinde-Rechnung  ", 56-nX )+Str( nSumme3,10,2 )+CRLF
   cString := cString + PadR( Replicate( "-", 66-nX ), 67-nX )+CRLF
   cString := cString + PadR( "Summe der Rechnungen               ", 53-nX )+w_g+Str( nSumme,10,2 )+CRLF
   cString := cString + "(Davon aus Fremdleistungen " + Str( nASum,8,2 ) + " "+w_g+")"+CRLF
   cString := cString + PadR( " ", 66-nX )+CRLF
     ELSE
   cString := cString + PadR( "unsere Rechnung             ", 56-nX )+Str( nSumme0,10,2 )+CRLF
   cString := cString + PadR( "unsere Nachtrags-Rechnung 1 ", 56-nX )+Str( nSumme1,10,2 )+CRLF
   cString := cString + PadR( "unsere Nachtrags-Rechnung 2 ", 56-nX )+Str( nSumme2,10,2 )+CRLF
   cString := cString + PadR( "unsere Nachtrags-Rechnung 3 ", 56-nX )+Str( nSumme3,10,2 )+CRLF
   cString := cString + PadR( Replicate( "-", 66-nX ), 67-nX )+CRLF
   cString := cString + PadR( "Summe der Rechnungen               ", 53-nX )+w_g+Str( nSumme,10,2 )+CRLF
   cString := cString + "(Davon aus Fremdleistungen " + Str( nASum,8,2 ) + " "+w_g+")"+CRLF
   IF Upper(AppName())$"MUELLX.EXE" .AND. nSumme4 != 0      // 9.2.2005
      cString := cString + "(nicht enthalten: R4/Friedhofsgebhren" + Str( nSumme4,8,2 ) + " "+w_g+")"+CRLF
   ENDIF
   cString := cString + PadR( " ", 66-nX )+CRLF
     ENDIF
   cString := cString + PadR( "Versicherungen:", 66-nX )+CRLF
   IF nX = 10
      cString := cString + PadR( "Name                          Erf-Dat  bez.am    bez-"+w_g, 66-nX )+CRLF
   ELSE
      cString := cString + PadR( "Name                          Erf-Dat   Pol-"+w_g+"  bez.am    bez-"+w_g, 66-nX )+CRLF
   ENDIF
   cString := cString + PadR( Replicate( "-", 66-nX ), 66-nX )+CRLF

   SELECT 2
   FIND &cAuf
   DO WHILE 2->auftrnr = Val( cAuf ) .AND. .NOT. Eof()
      nVSum := nVSum + &b_b_g
      cString := cString + PadR( Substr( name1,1,30 )+" "+Substr( DtoC( erf_datum ),1,6 ) + ;
                IIf( nX=0,Str( &p_b_g,10,2 ),"")+"  "+Substr( DtoC( bez_am ),1,6 )+" " + Str( &b_b_g,10,2 ), 66-nX )+CRLF
      SKIP
   ENDDO
   nGSum := nSumme - nVSum

   cString := cString + PadR( Replicate( "-", 66-nX ), 67-nX )+CRLF
   cString := cString + PadR( "Summe der Versicherungen/Zahlungen   ", 56-nX )+Str( nVSum,10,2 )+CRLF
   cString := cString + PadR( Replicate( "-", 66-nX ), 67-nX )+CRLF
   cString := cString + PadR( "Total-Saldo dieses Auftrages         ", 53-nX )+w_g+Str( nGSum,10,2 )
//   oEdit:MultiZeile[2]:setData( cString )
   SELECT &nOldArea
RETURN cString


CLASS KontFF FROM DialogFF
   EXPORTED:
   VAR VArea
   VAR nZahlung               // Zahlung zur Verbuchung in VV.dbf  // 30.12.2004
   METHOD INIT
   METHOD CREATE
   METHOD notify
   METHOD ZumBlockAnfang
   METHOD ZumBlockEnde
   METHOD ZahlungsEingabe     // nZahlung wird zu einer Zeile in VV.dbf // 30.12.2004
ENDCLASS

METHOD KontFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   ::DialogFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   ::VArea := nA
   ::nZahlung := 0      // 30.12.2004
   ::BEArea := {}
   AAdd( ::BEArea, oParent )
   ::BENr := Len( ::BEArea )
   ::Fancy := "0"
RETURN self

METHOD KontFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   ::DialogFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   (nA)->(DbRegisterClient(self))     // reicht es, wenn das Fenster als Ganzes registriert ist??
RETURN self

METHOD KontFF:notify( nEvent, mp1, mp2 )
   LOCAL nRec, oFocus, i
      IF nEvent == xbeDBO_Notify             // Notify-Ereignis
         IF mp1 == DBO_MOVE_DONE             // Skip ist beendet
            ::MultiZeile[2]:setData( cKonto := KontrRech(StrX(1->auftrnr,6,0)) )
         ENDIF
      ENDIF
RETURN self

METHOD KontFF:ZumBlockAnfang(cAuf)
   cAuf := IIf( Val(cAuf[1])!=0, cAuf[1]+"00000", "      " )
   SET ORDER TO 1
   DbSeek( cAuf, .T. )
RETURN self

METHOD KontFF:ZumBlockEnde(cAuf)
   cAuf := cAuf[1]+"99999"
   SET ORDER TO 1
   DbSuspendNotifications()
   DbSeek( cAuf, .T. )
   DbResumeNotifications()
   IIf( cAuf[1] != StrX(field->auftrnr,6,0)[1], DbSkip(-1), DbSkip(0) )
RETURN self

METHOD KontFF:ZahlungsEingabe( nZahlBetrag, cZMin, cZPlus )
   LOCAL nOldArea := SELECT(), cBB := 1
   DEFAULT  cZMin TO "zahl-" , ;
            cZPlus TO "zahl+"
            
   IF ConfirmBox( oCB, "Abbrechen mit <NEIN>", ;
                        "Kunden-Zahlung eintragen?", ;
                        XBPMB_YESNO, ;
                        XBPMB_WARNING, ;
                        XBPMB_DEFBUTTON2 ) ;
                        =  XBPMB_RET_NO
      ::nZahlung := 0
      RETURN self
   ENDIF
   SELECT 2
   DbSeek( Str(1->auftrnr,6,0), .F. )
   IF !Eof()
      DO WHILE 2->auftrnr == 1->auftrnr
         cBB := 2->BB
         SKIP
      ENDDO
   ENDIF
   APPEND BLANK
   2->auftrnr := 1->auftrnr
   2->verskz := IIf( nZahlBetrag < 0, cZMin, cZPlus )
   5->(DbSeek( 2->verskz, .F. ))
   2->name1 := IIf(!Empty(5->name1),5->name1, ;
                  IIf(2->verskz=cZMin,"Auszahlung an den Kunden","Zahlung des Kunden") )
   2->name2 := 5->name2
   2->erf_datum := DATE()
   2->bez_am := DATE()
   2->&b_b_g := nZahlBetrag
   1->(Satzsp(oBEDA))
   1->&v_m += nZahlBetrag
   1->&t_l -= nZahlBetrag
   1->(DbRUnlock())
   SELECT (nOldArea)
   cKonto := KontrRech( Str(2->auftrnr,6,0) )
   ::MultiZeile[2]:setData(  )
   ::nZahlung := 0
RETURN self