**BRegieR5.prg   -  Regie-Zentrum fr Bestattungsverwaltung
//                      Aufstellung/Abrechnung zu einem Auftrag

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Appedit.ch"
#include "Appbrow.ch"
#include "Font.ch"

FUNCTION Rech5Eingabe( cAuf, oDlg1 )
   LOCAL oDlg, nEvent, mp1, mp2, oXbp
   LOCAL aSizeDesktop := AppDesktop():currentSize()
   LOCAL nBSb := aSizeDesktop[1]
   LOCAL nBSh := aSizeDesktop[2]
   LOCAL nOldArea := Select()
   LOCAL lFlucht := .F., nFlucht
   PRIVATE oCB
// folgende Zahlen-Werte basieren auf 800x600:
   PRIVATE nV := nBSb/800         // Korrekturfaktor fr tatschliche Auflsung
   PRIVATE oEdit, oBrowse
   PRIVATE nZeile := 0, a3 := {}
   PRIVATE nVSum := 0, nASum := 0, nGSum := 0
   PRIVATE nSumme := 0 , nSummeI := 0 , nSummeII := 0

   cAuf5temp := "auf5"+LTrim(Str(Int(Seconds()/10)))
   SELECT 2
   FIND &cAuf
   DO WHILE 2->auftrnr = Val( cAuf ) .AND. .NOT. Eof()
      nVSum := nVSum + &b_b_g
      SKIP
   ENDDO
   SELECT 3
   COPY STRU TO (cAuf5temp)
   aData1 := Array(FCount())
   aData2 := Array(FCount())
   aDataD := Array(FCount())

   SELECT 13
   USE (cAuf5temp) EXCLUSIVE
   SELECT 3
   FIND &cAuf
   do while 3->auftrnr=val(cAuf) .and. .not. eof()
      IF 3->rn = "3"
//         Satzsp( oDlg )       // sperren fr die anderen???
         For n := 1 to FCount()
            aData2[n] := FieldGet( n )
         NEXT
         AAdd( a3, Recno() )
         SELECT 13
         APPEND BLANK
         For n := 1 to FCount()
            FieldPut( n, aData2[n] )
         NEXT
         SELECT 3
      ELSEIF 3->rn = "2"
         nSummeII := nSummeII + 3->(&b_g)
      ELSE
         nSummeI := nSummeI + 3->(&b_g)
      ENDIF
      3->(DbSkip())
   enddo
   nSumme := nSummeI + nSummeII
   ASort( a3 )
   SELECT 8
   USE serie index xserie
   SELECT 13
   GO BOTT
   DO WHILE Recno() < 10
      APPEND BLANK
   ENDDO
   SUM 13->(&b_g) TO nASum
   nGSum := nSumme - nVSum + nASum
   GO TOP

  lEinfg := .T.
  DO WHILE lEinfg = .T.

//   cFont := IIf( nBSb < 800, "8.Arial", "10.Arial" )

   oDlg := AKDialog():new( AppDesktop(), oDlg1,,, { { XBP_PP_FGCLR, GRA_CLR_GREEN } } )
   oDlg:tasklist := .T.
   oDlg:title := "Aufstellung zu Auftrag "+cAuf+" / "+;
                        Trim(1->name)+", "+Trim(1->vorname)+" / "+;
                        Trim(1->ansp_name)+", "+Trim(1->ansp_vname)
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, {10,10}, {int(770*nV),int(500*nV)} )

//   oDlg:drawingArea:setFontCompoundName( cFont )
   oDlg:drawingArea:setColorBG( GRA_CLR_GREEN )
   oCB := oDlg:drawingArea

   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(20*nV),int(155*nV)}, {int(50*nV),int(25*nV)})
   oXbp:caption := "Leist I/II:"
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   oSle1 := XbpSLE():new( oDlg:drawingArea, ,  {int(70*nV),int(155*nV)}, {int(60*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSle1:bufferLength := 8
   oSle1:align := XBPSLE_RIGHT
   oSle1:group := XBP_WITHIN_GROUP
   oSle1:dataLink := {|x| IIf( PCOUNT()==0, Transform( nSummeI, '99999.99' ), nSummeI := Val(x)  ) }
   oSle1:create():setData()

   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(130*nV),int(155*nV)}, {int(10*nV),int(25*nV)})
   oXbp:caption := "+"
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   oSle2 := XbpSLE():new( oDlg:drawingArea, ,  {int(140*nV),int(155*nV)}, {int(60*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSle2:bufferLength := 8
   oSle2:group := XBP_WITHIN_GROUP
   oSle2:dataLink := {|x| IIf( PCOUNT()==0, Transform( nSummeII, '99999.99' ), nSummeII := Val(x)  ) }
   oSle2:create():setData()

   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(200*nV),int(155*nV)}, {int(10*nV),int(25*nV)})
   oXbp:caption := "="
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   oSle := XbpSLE():new( oDlg:drawingArea, ,  {int(210*nV),int(155*nV)}, {int(60*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSle:bufferLength := 8
   oSle:group := XBP_WITHIN_GROUP
   oSle:dataLink := {|x| IIf( PCOUNT()==0, Transform( nSumme, '99999.99' ), nSumme := Val(x)  ) }
   oSle:create():setData()

   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(270*nV),int(155*nV)}, {int(70*nV),int(25*nV)})
   oXbp:caption := "Versich.:"
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   oSle3 := XbpSLE():new( oDlg:drawingArea, ,  {int(340*nV),int(155*nV)}, {int(60*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSle3:bufferLength := 8
   oSle3:group := XBP_WITHIN_GROUP
   oSle3:dataLink := {|x| IIf( PCOUNT()==0, Transform( nVSum, '999999.99' ), nVSum := Val(x)  ) }
   oSle3:create():setData()

   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(400*nV),int(155*nV)}, {int(70*nV),int(25*nV)})
   oXbp:caption := "Aufst. :"
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   oSle4 := XbpSLE():new( oDlg:drawingArea, ,  {int(470*nV),int(155*nV)}, {int(60*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSle4:bufferLength := 8
   oSle4:group := XBP_WITHIN_GROUP
   oSle4:dataLink := {|x| IIf( PCOUNT()==0, Transform( nASum, '99999.99' ), nASum := Val(x)  ) }
   oSle4:create():setData()

   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(530*nV),int(155*nV)}, {int(70*nV),int(25*nV)})
   oXbp:caption := "Gesamt :"
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   oSle5 := XbpSLE():new( oDlg:drawingArea, ,  {int(600*nV),int(155*nV)}, {int(60*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSle5:bufferLength := 8
   oSle5:group := XBP_WITHIN_GROUP
   oSle5:dataLink := {|x| IIf( PCOUNT()==0, Transform( nGSum, '999999.99' ), nGSum := Val(x)  ) }
   oSle5:create():setData()

   oPbDruck := XbpPushButton():new( oDlg:drawingArea, , {int(690*nV),int(155*nV)}, {int(50*nV),int(25*nV)} )
   oPbDruck:caption := "~Druck"
   oPbDruck:group := XBP_WITHIN_GROUP
   oPbDruck:create()
   oPbDruck:activate := {||  Rechdr2uni( cAuf, cDrucker, DtoC( date() ), "J", 1, .F., oDlg ), ;
                                SetAppFocus( oPbDruck ) }

   APPBROWSE ;
        PARENT oDlg:drawingArea ;
        POSITION TOP ;
        FONT &cFont ;
        SIZE 60,100 PERCENT

   APPFIELD zugr_z_st CAPTION "Art-Nr." WIDTH 5
   APPFIELD bezeichf1 CAPTION "Leistung (Zeile1)" WIDTH 25
   APPFIELD bezeichf2 CAPTION "Leistung (Zeile2)" WIDTH 10
   APPFIELD &b_g CAPTION "Betrag/"+w_g WIDTH 6
   APPFIELD rn CAPTION "K" READONLY
   APPFIELD zeile CAPTION "Z"

   APPDISPLAY MODELESS

   APPEDIT INTO oEdit ;
        PARENT oDlg:drawingArea ;
        POSITION BOTTOM ;
        FONT &cFont ;
        SEEK Rech5Such( cAuf, oDlg ) ;
        TRIGGER "Rech5Einfg" ON INSERT ;
        TRIGGER "Rech5Aend" ON UPDATE ;
        TRIGGER "Rech5Entf" ON DELETE ;
        SIZE 30,100 PERCENT

   APPFIELD zugr_z_st INTO oEdit CAPTION "Art-Nr." WIDTH 5 COMMENT "Artikelnr. eingeben ..."
   APPFIELD bezeichf1 INTO oEdit CAPTION "Leistung (Zeile1)" WIDTH 30
   APPFIELD bezeichf2 INTO oEdit CAPTION "Leistung (Zeile2)" WIDTH 15
   APPFIELD &b_g INTO oEdit CAPTION "Betrag/"+w_g WIDTH 6
   APPFIELD rn INTO oEdit CAPTION "K" READONLY
   APPFIELD zeile INTO oEdit CAPTION "Z"

   APPDISPLAY oEdit MODELESS

   oDlg:setModalState( XBP_DISP_APPMODAL )
   oDlg:show()
   oFocus := SetAppFocus( oEdit )

  lEinfg := .F.
   nEvent := xbeP_None
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 == xbeK_ESC
            nFlucht := ConfirmBox( oCB, "nderungen speichern?", ;
                        "Programm AUFSTELLUNG beenden.", ;
                        XBPMB_YESNOCANCEL, ;
                        XBPMB_QUESTION )
            IF nFlucht == XBPMB_RET_YES
               lEinfg := .F.
               lFlucht := .F.
               PostAppEvent( xbeP_Close)
            ELSEIF nFlucht == XBPMB_RET_NO
               lEinfg := .F.
               lFlucht := .T.
               PostAppEvent( xbeP_Close)
            ELSE
            ENDIF
         CASE mp1 == xbeK_F10
            lEinfg := .F.
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_ALT_E
            lEinfg := .T.
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_F1
            ModalDialog( (cDatver+"f1_R5.dbf"), "Bedienungshinweise", oDlg, 680*nV, 460*nV )
         CASE mp1 == xbeK_F5
            SELECT 8
            if .not. Bof()
               skip -1
            endif
            cArt := 8->art
            SELECT 13
            Rech5Such( cAuf, cArt, oDlg )
         CASE mp1 == xbeK_F6
            SELECT 8
            if .not. Eof()
               skip 1
            endif
            cArt := 8->art
            SELECT 13
            Rech5Such( cAuf, cArt, oDlg )
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()
   SetAppFocus( oFocus )

   SELECT 13
  IF lEinfg = .T.
     SET DELETED OFF
     R3SatzEinfg( Recno() )
     SET DELETED ON
  ENDIF
  ENDDO

   SELECT 13
   IF lFlucht == .F.               // ESC-Taste: lFlucht = .T.
      GO TOP
      SELECT 3
      FIND &cAuf
      SELECT 11
      USE tauftr EXCLUSIVE
      LOCATE FOR auftrnr == Val( cAuf ) .AND. rn == "3"
   // Wenn Tripel zu dieser Auftrnr schon vorhanden:
   // lokalisieren eines freien, unberspielten Tripels:
         DO WHILE auftrnr == Val( cAuf ) .AND. rn == "3" .AND. .NOT. Eof()
            cTTFlag := TTFlag
            IF SUBSTR( cTTFlag, VAL( cSystem ), 1 ) <> "1" ;
                   .AND..NOT. "2"$cTTFlag
               EXIT
            ENDIF
            SKIP 2
            CONTINUE
         ENDDO
      SELECT 13
      DELETE FOR 13->auftrnr <> Val( cAuf )
      PACK
      IF .NOT. Bof()
         GO TOP
      ENDIF
      nZeile := 0
      DO WHILE .NOT. Eof()
        DO WHILE 13->auftrnr <> Val( cAuf ) .AND. .NOT. Eof() // Stze mit auftrnr == 0
           SKIP
        ENDDO
         ++nZeile
         For n := 1 to FCount()
            aData2[n] := FieldGet( n )
         NEXT
//         delete                            // oder nicht delete ?????
         SELECT 3
         IF 3->auftrnr <> Val( cAuf ) .OR. nZeile > Len( a3 ) .OR. Eof()
            APPEND BLANK
         ELSE
            c3 := Str( a3[nZeile] )
            GO &c3
         ENDIF
   //*
         aData1 := Satzget( 3, Recno() )
   *//
         Satzsp( oCB )
         For n := 1 to FCount()
            FieldPut( n, aData2[n] )
         NEXT
         REPLACE 3->zeile WITH Str( nZeile,2,0 )
         DbRUnlock( Recno() )
         n4 := 0
         aDataD := SatzDiff( 13, @aData1, @aData2, "AUFTR" )
         SELECT 11
         IF auftrnr == Val( cAuf ) .AND. rn == "3" .AND. .NOT. Eof()
            SatzPut( 11, RecNo(), aData1, "0" )
            SKIP
            SatzPut( 11, RecNo(), aData2, "0" )
            SKIP
            SatzPut( 11, RecNo(), aDataD, "0" )
            CONTINUE
         ELSE
            APPEND BLANK
            SatzPut( 11, RecNo(), aData1, "0" )
            APPEND BLANK
            SatzPut( 11, RecNo(), aData2, "0" )
            APPEND BLANK
            SatzPut( 11, RecNo(), aDataD, "0" )
            SKIP
         ENDIF
         SELECT 3
         SKIP
         SELECT 13
         SKIP
      ENDDO
      USE
      SELECT 3
      DO WHILE nZeile < Len( a3 ) .AND. .NOT. Eof()
         c3 := Str( a3[++nZeile] )
         GO &c3
         IIf( 3->auftrnr == Val( cAuf ) .AND. Val( 3->rn ) = 3, SatzDelete(), )
      ENDDO
      SELECT 11
      DO WHILE .NOT. Eof()
         DELETE NEXT 3
         IF .NOT. Eof()
            SKIP -1
         ENDIF
         CONTINUE
      ENDDO
      USE
   ELSE
      USE                 // schlieen der TEMP-Datei
   ENDIF
   FErase( cDatver+cAuf5temp+".dbf" )
   Select &nOldArea
RETURN .T.

FUNCTION Rech5Such( cAuf, oDlg1 )
   LOCAL oDlg, nEvent, mp1, mp2
   LOCAL aSizeDesktop := AppDesktop():currentSize()
   LOCAL nBSb := aSizeDesktop[1]
   LOCAL nBSh := aSizeDesktop[2]
// folgende Zahlen-Werte basieren auf 800x600:
   LOCAL nV := nBSb/800         // Korrekturfaktor fr tatschliche Auflsung
   LOCAL nOldArea := Select()
   LOCAL lFlucht := .F.
   PRIVATE oCB

   SELECT 6
   GO TOP
//   cFont := IIf( nBSb < 700, "7.Arial", "8.Arial" )

   oDlg := AKDialog():new( AppDesktop(), oDlg1 )
   oDlg:tasklist := .T.
   oDlg:title := "Artikel/Leistung auswhlen"
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, {10,10}, {int(740*nV),int(460*nV)} )

//   oDlg:drawingArea:setFontCompoundName( "8.Arial" )
   oDlg:drawingArea:setColorBG( GRA_CLR_DARKGREEN )

   APPBROWSE ;
        PARENT oDlg:drawingArea ;
        POSITION TOP ;
        FONT &cFont ;
        SIZE 100,100 PERCENT

   APPFIELD art_lei CAPTION "Art-Nr."
   APPFIELD bezf1 CAPTION "Leistung (Zeile1)" WIDTH 25
   APPFIELD bezf2 CAPTION "Leistung (Zeile2)" WIDTH 10
   APPFIELD &v_p_s CAPTION "Preis/"+w_g

   APPDISPLAY MODELESS

   oDlg:setModalState( XBP_DISP_APPMODAL )
   oDlg:show()

   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeM_LbDblClick
            PostAppEvent( xbeP_Close)
      ENDIF
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 == xbeK_RETURN .or. mp1 == xbeK_F10
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_ESC
            lFlucht := .T.
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_F5
            SELECT 8
            if .not. Bof()
               skip -1
            endif
            cArt := 8->art
            SELECT 6
            FIND &cArt
         CASE mp1 == xbeK_F6
            SELECT 8
            if .not. Eof()
               skip 1
            endif
            cArt := 8->art
            SELECT 6
            FIND &cArt
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
   IF lFlucht = .F.               // ESC-Taste: lFlucht = .T.
      SELECT 13
      IF Val( 13->zugr_z_st ) > 0
         LOCATE FOR Val( 13->zugr_z_st ) == 0
         IF Eof()
            APPEND BLANK
         ENDIF
      ENDIF
      REPLACE 13->auftrnr WITH Val( cAuf )
      REPLACE 13->rn WITH "3"
      REPLACE 13->kennz WITH 6->ausg
      REPLACE 13->zeile WITH Str( Recno(),2,0 )
      REPLACE 13->mwst_schl WITH 6->mwst_schl
      REPLACE 13->zugr_z_st WITH 6->art_lei
      REPLACE 13->bezeichf1 WITH 6->bezf1
      REPLACE 13->bezeichf2 WITH 6->bezf2
      REPLACE 13->&b_g WITH 6->&v_p_s
      REPLACE 13->&b_gh WITH 6->&v_p_sh
      DbCommit()
      SUM 13->(&b_g) TO nASum
      nGSum := nSumme - nVSum + nASum
      oSle4:setdata( Str( nASum,8,2 ) )
      oSle5:setdata( Str( nGSum,8,2 ) )
   ENDIF
   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()
   Select &nOldArea
RETURN APPOP_PROCEED

FUNCTION Rech5Einfg(aRechPos)
RETURN APPOP_PROCEED

FUNCTION Rech5Aend(aRechPos)
   cArt := aRechPos[1]
   c6b1 := aRechPos[2]
   c6b2 := aRechPos[3]
   IF xdmeu="D"
      n6v := aRechPos[4]
      n6veu := n6v/xFaktor
   ELSE
      n6veu := aRechPos[4]
      n6v := n6veu*xFaktor
   ENDIF
   n1a := 1->auftrnr
   SELECT 6
   FIND &cArt
   IF Eof()
      c6b1 := c6b2 := ""
      n6v := n6veu := 0
   ELSE
      c6b1 := IIf( Len(aRechPos[2])=0, 6->bezf1, c6b1 )
      c6b2 := IIf( Len(aRechPos[3])=0, 6->bezf2, c6b2 )
      n6v := IIf( aRechPos[4] = 0, 6->vk_preis, n6v )
      n6veu := IIf( aRechPos[4] =0, 6->vk_preiseu, n6veu  )
   ENDIF
   SELECT 13
   REPLACE 13->auftrnr WITH n1a
   REPLACE 13->rn WITH "3"
   REPLACE 13->kennz WITH 6->ausg
   REPLACE 13->zeile WITH IIf( Val(aRechPos[6])>0, aRechPos[6], Str(Recno(),2,0) )
   REPLACE 13->mwst_schl WITH 6->mwst_schl
   REPLACE 13->zugr_z_st WITH cArt
   REPLACE 13->bezeichf1 WITH c6b1
   REPLACE 13->bezeichf2 WITH c6b2
   REPLACE 13->betrag WITH n6v
   REPLACE 13->betrageu WITH n6veu
   DbCommit()
   nRec := Recno()
   SUM 13->(&b_g) TO nASum
   nGSum := nSumme - nVSum + nASum
   oSle4:setdata( Str( nASum,8,2 ) )
   oSle5:setdata( Str( nGSum,8,2 ) )
   GO nRec
RETURN APPOP_PROCEED


FUNCTION Rech5Entf(aRechPos)
   IF AScan( aRechPos, {|x| ! Empty(x) } ) == 0
      RETURN APPOP_PROCEED
   ENDIF
   IF ConfirmBox( oCB, "Soll der Datensatz gelscht werden?", ;
                        "Datensatz lschen", ;
                        XBPMB_YESNO, ;
                        XBPMB_QUESTION ) == XBPMB_RET_NO
      RETURN APPOP_IGNORE
   ENDIF
   nASum := nASum - aRechPos[4]
   nGSum := nSumme - nVSum + nASum
   oSle4:setdata( Str( nASum,8,2 ) )
   oSle5:setdata( Str( nGSum,8,2 ) )
RETURN APPOP_PROCEED

