**BRegieAK.prg   -  Regie-Zentrum fr Bestattungsverwaltung
// 06.11.2005 Auftrnr statt 6 jetzt 7-stellig bei MengX
// 06.11.2005: E ersetzt 6: aus StrX(1->auftrnr,6,0) wird StrX(1->auftrnr,E,0)
#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 AuftrControl( cAuf, oDlg1, aPos, ASize )
   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 nOldArea := Select() //, aV := {} , nBbSum, nZeile
   LOCAL lFlucht := .F., nFlucht, nVS, i
   PRIVATE oCB, oKODA, oEdit, nVSum, cIK, cKonto := Trim(" "), o  // o soll oEdit ersetzen 16.5.2005
   aPos := IIf(Empty(aPos),{10,30*nV},aPos)
   ASize:= IIf(Empty(ASize),{770*nH,500*nV},ASize)

   IF Upper(AppName()) $ "RAGUSEX.EXE-RAGUSEY.EXE-HANDEL.EXE" // 29.08.2005 erg„nzt
      IF !Empty(1->schladr)   // schladr entspricht gkz
         5->(DbSeek( 1->schladr, .T. ))
         v_n_o := "vk_preis"+IIf(5->preisgr$"1234567", 5->preisgr, "1" )
      ELSE
         v_n_o := "vk_preis1"    // weil es ein NETTO-Preis ist - in art.dbf
      ENDIF
         v_p_s := "vk_preis"     // neu anlegen!: Bruttopreis - in art.dbf
         u_n   := "umsatz"       // weil es ein NETTO-Umsatz ist - in art.dbf
         u_z   := "umsbrteu"     // neu anlegen!: Bruttoumsatz - in art.dbf
         b_n   := "betrag"       // weil es ein NETTO-Betrag ist - in auftr.dbf
         b_g   := "betbrteu"     // neu anlegen!: Bruttobetrag - in auftr.dbf
   ENDIF

   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:title := IIf(SET(43)==0,ConvToAnsiCP(oDlg:title),oDlg:title)   //03.12.2006 18:02
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, aPos, ASize )
   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*nH,0}, {770*nH,475*nV},,, nBz, "s_kont", -100, 299, 1 )
   oEdit:CREATE( oKODA,oDlg, {0*nH,0}, {770*nH,475*nV},,, nBz, "s_kont", -100, 299, 1 )
   o := oEdit     // 16.5.2005, damit es in bl_xx/s_xx krzer zugeht
   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]:dataLink := {|x| IIf( PCOUNT()==0, Trim(cKonto), cKonto := x ) }
   sleep(5) //+06.11.2011 22:36 gem„á Alaska-PDR-5346 : race-Fehler!
   oEdit:MultiZeile[2]:setData( cKonto )
   cKonto := KontrRech( cAuf )

   oDlg:setModalState( XBP_DISP_APPMODAL )

   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.
            PostAppEvent( xbeP_Activate,,, oEdit:DruckKnopf[oEdit:XbpNummer(oEdit:DruckKnopf,"ENDE")] )
//            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_F1
            ModalDialog( (cDatver+"f1_AK.dbf"), "Bedienungshinweise", oKODA, 680*nH, 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,E,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)                // Fremdleistungen
      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+3->mwst_satz/100)
      ELSEIF 3->rn = "2"
         nSumme2 := nSumme2 + 3->(&b_g)
      ELSEIF 3->rn = "1" .or. 3->rn = " "
         nSumme1 := nSumme1 + 3->(&b_g)*(1+3->mwst_satz/100)
//      ELSE
//         nSumme0 := nSumme0 + 3->(&b_g)
      ENDIF
     ELSEIF cBrNe1 = "N"   // z.B.: Upper( AppName() ) = "HANELX.EXE"
      IF 3->rn = "3"
         nSumme3 := nSumme3 + 3->(&b_n)*(1+3->mwst_satz/100)
      ELSEIF 3->rn = "2"
         nSumme2 := nSumme2 + 3->(&b_n)*(1+3->mwst_satz/100)
      ELSEIF 3->rn = "1"
         nSumme1 := nSumme1 + 3->(&b_n)*(1+3->mwst_satz/100)
      ELSEIF 3->rn = " " .or. 3->rn = "0"
         nSumme0 := nSumme0 + 3->(&b_n)*(1+3->mwst_satz/100)
      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             "+IIf(1->(IsFieldVar("rechnr")), ;
                        "Nr.: "+1->rechnr,""),56-nX )+Str( nSumme0,10,2 )+CRLF
   cString := cString + PadR( "unsere Nachtrags-Rechnung 1 "+IIf(1->(IsFieldVar("rechnrn")), ;
                        "Nr.: "+1->rechnrn,""), 56-nX )+Str( nSumme1,10,2 )+CRLF
   cString := cString + PadR( "unsere Nachtrags-Rechnung 2 "+IIf(1->(IsFieldVar("rechnrn2")), ;
                        "Nr.: "+1->rechnrn2,""), 56-nX )+Str( nSumme2,10,2 )+CRLF
   cString := cString + PadR( "unsere Nachtrags-Rechnung 3 "+IIf(1->(IsFieldVar("rechnrn3")), ;
                        "Nr.: "+1->rechnrn3,""), 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-BLEINX.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
   VAR dZahlDat               // Datum der Zahlung       // 19.4.2005
   VAR cZahlKto               // "bar" oder Konto, auf das die Zahlung erfolgt
   VAR aU0                    // šberschriften fr Statistik         // 16.4.2005
   VAR aV0                    // (Feld-)Variable fr Statistik
   VAR aF0                    // Filterbedingungen fr Statistik
   VAR aU1                    // šberschriften fr Statistik         // 16.4.2005
   VAR aV1                    // (Feld-)Variable fr Statistik
   VAR aF1                    // Filterbedingungen fr Statistik
   METHOD INIT
   METHOD CREATE
   METHOD notify
   METHOD ZumBlockAnfang
   METHOD ZumBlockEnde
   METHOD ZahlungsEingabe     // nZahlung wird zu einer Zeile in VV.dbf // 30.12.2004
   METHOD VI                  // Initialisierung der aU1,aV1,aF1
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
   ::dZahlDat := DATE()
   ::cZahlKto := "    "
   ::aU0 := {}
   ::aV0 := {}
   ::aF0 := {} // 16.4.2005
   ::aU1 := {}
   ::aV1 := {}
   ::aF1 := {} // 16.4.2005
   ::BEArea := {}
   AAdd( ::BEArea, oParent )
   ::BENr := Len( ::BEArea )
   ::Fancy := "0"
   ::cBestLF := oFocSle:cargo       // letztes Feld, welches in Best den Focus hatte
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,E,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,E,0)[1], DbSkip(-1), DbSkip(0) )
RETURN self

METHOD KontFF:ZahlungsEingabe( nZahlBetrag, cZMin, cZPlus, dZahlDatum, cZahlKonto )
   LOCAL nOldArea := SELECT(), cBB := 1
   DEFAULT  cZMin TO "zahl-" , cZPlus TO "zahl+" , ;
            dZahlDatum TO ::dZahlDat , cZahlKonto TO ::cZahlKto
            
   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( StrX(1->auftrnr,E,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
   2->bez_am := dZahlDatum
   IIf(2->(IsFieldVar("bez_wie")), 2->bez_wie := cZahlKonto, )
   IIf(2->(IsFieldVar("bezwie")), 2->bezwie := cZahlKonto, )         // Sander
   IIf(2->(IsFieldVar("eingkto")), 2->eingkto := cZahlKonto, )       // Dischleid, Menge
   IIf(2->(IsFieldVar("wiebez")), 2->wiebez := cZahlKonto, )         // Klemmer
   1->(Satzsp(oBEDA))
   1->&v_m += nZahlBetrag
   1->&t_l -= nZahlBetrag
   1->(DbRUnlock())
   SELECT (nOldArea)
   cKonto := KontrRech( StrX(2->auftrnr,E,0) )
   ::MultiZeile[2]:setData(  )
   ::nZahlung := 0
RETURN self

METHOD KONTFF:VI(n)
   ::aU1 := AClone(::aU0[n])
   ::aV1 := AClone(::aV0[n])
   ::aF1 := AClone(::aF0[n])
RETURN self
