'DESCRIPTION: Wawi: Include: Belegroutinen
'USEDBY: WAWI

'dim erg as long
'dim runddiffbeleg(5), betrbrutto(5), betrnetto(5), mwst_satz(5) as double

function belegdefinition( beldefnummer as long, untergruppe as long) as long
  opentable("WBELDEF", "BELEGDEF")
  erg = 0
  if (&BELEGDEF.BELDEF_NUM = beldefnummer) and ( &BELEGDEF.BELDEF_ZUS = untergruppe) then
    erg = 1
  else
    erg = findkey("BELEGDEF", "BELDEF_NUM", beldefnummer, "BELDEF_ZUS", untergruppe)
  end if
  belegdefinition = 1
  if (erg = 0) and (untergruppe = 0) then
    erg = messagebox( "Bei Firmenstammdaten wurde keine Belegdefinition hinterlegt.", 1)
    belegdefinition = 0
  end if
  if (erg = 0) and (untergruppe > 0) then
    belegdefinition = 0
  end if
end function

sub belegdefinitionvorgabe( belegzeile as record, belegdef2 as record)
  &BELEGZEILE.BELDEF_NUM = &BELEGDEF2.BELDEF_NUM
  &BELEGZEILE.BELDEF_ZUS = &BELEGDEF2.BELDEF_ZUS
  &BELEGZEILE.FINANZ = &BELEGDEF2.FINANZ
  &BELEGZEILE.BESTELLW = &BELEGDEF2.BESTELLW
  &BELEGZEILE.AUFTRAG = &BELEGDEF2.AUFTRAG
  &BELEGZEILE.LAGER = &BELEGDEF2.LAGER
  &BELEGZEILE.VST_UST = &BELEGDEF2.VST_UST
end sub

sub belegvorgabe( belegstamm as record, beldef as record)
  &BELEGSTAMM.BELDEF_NUM = &BELDEF.BELDEF_NUM
  &BELEGSTAMM.SERNUM_JN = &BELDEF.SERNUM_JN
  &BELEGSTAMM.CHARGE_JN = &BELDEF.CHARGE_JN
  &BELEGSTAMM.BEARBEITER = bearbeiter( 1)
  &BELEGSTAMM.ARCHIVART = ""
end sub

sub belegnummer( belegstamm as record, beldef as record)
  &BELEGSTAMM.BEL_NUMMER = holenummer( "Beleg", str$(&BELDEF.BELDEF_NUM), &BELEGSTAMM.BEL_NUMMER)
  if valid = 0 then exit sub
 
  opentable( "WBELSTM", "BELSTAMMLOK")
  setindex( "BELSTAMMLOK", "BELNUMMER")
  setfilter( "BELSTAMMLOK", replace( "BELDEF_NUM = %1", &BELDEF.BELDEF_NUM))
  if findkey( "BELSTAMMLOK", "BEL_NUMMER", &BELEGSTAMM.BEL_NUMMER) = 1 then
    erg = messagebox( "Belegnummer bereits vorhanden.|Bitte verwenden Sie eine andere Belegnummer.", 2)
    valid = 0 
    closetable( "BELSTAMMLOK")
    exit sub
  end if
  closetable( "BELSTAMMLOK")

  if &BELEGSTAMM.BEL_NUMMER = "" then 
    erg = messagebox( "Belegnummer leer nicht möglich.|Bitte verwenden Sie eine Belegnummer.", 2)
    valid = 0
    exit sub 
  end if

  belegvorgabe( belegstamm, beldef)
  store( belegstamm)
  bemerkung_kopie( "Belegart", str$(&BELDEF.BELDEF_NUM), "Beleg", str$( &BELEGSTAMM.STM_NUMMER))
end sub

function bearbeiter( von_beleg as long) as string
  bearbeiter = ""
  opentable( "WVERTRET")
  if von_beleg = 1 then
    if &BELEGDEF.VST_UST = "U" then
      setfilter( "WVERTRET", REPLACE( "(EINK_VERK = 'J' or EINK_VERK = 'V') and USERID = '%1'", userid))
    end if
    if &BELEGDEF.VST_UST = "V" then
      setfilter( "WVERTRET", REPLACE( "(EINK_VERK = 'J' or EINK_VERK = 'E') and USERID = '%1'", userid))
    end if
    if &BELEGDEF.VST_UST = "I" then
      setfilter( "WVERTRET", REPLACE( "USERID = '%1'", userid))
    end if
  end if
  if von_beleg = 0 then setfilter( "WVERTRET", REPLACE( "USERID = '%1'", userid))
  gotofirst( "WVERTRET")
  if eof("WVERTRET") = 0 then
    bearbeiter = &WVERTRET.VTR_NUMMER
  end if
end function

function checkdatum( datum as long) as long
  checkdatum = 1
  if datum = 0 then exit function 
  if ( datum < belegzeitraum_anfang) or ( datum > belegzeitraum_ende) then
    erg = messagebox( "Belegdatum nicht im aktuellen Belegzeitraum!", 1)
    checkdatum = 0
  end if
end function

function check_bearbeiten( text as string, loeschen as string, letzenummerimkreis as string, belegstamm as record) as long
  check_bearbeiten = 1
  if checkdatum( &BELEGSTAMM.DATUM) = 0 then
    check_bearbeiten = 0
    exit function
  end if
  if loeschen = "I" then exit function
  if loeschen = "U" then
    if &BELEGSTAMM.GEDRUCKT <> 0 then
      check_bearbeiten = 0
      erg = messagebox( "%1 Beleg bereits gedruckt. Bearbeitung nicht mehr möglich.", 2, text)
      exit function
    end if
  end if
  if loeschen = "N" then
    if letzenummerimkreis <> &BELEGSTAMM.BEL_NUMMER then
      check_bearbeiten = 0
      erg = messagebox( "%1 Belege können nicht bearbeitet werden.", 2, text)
      exit function
    end if
  end if
'  check_bearbeiten = check_offene_posten( belegstamm)
end function

sub berechnezeile( belegstamm as record, belegzeile as record)
dim betrag, betrag_ursp, preis, preis_inkl, mwst_faktor as double
  preis = 0.0
  betrag = 0.0
  betrag_ursp = 0.0
  mwst_faktor = 0.0
  mwst_faktor = 1 + &BELEGZEILE.MWST_SATZ / 100
  preis = &BELEGZEILE.PREIS
  if &BELEGZEILE.RAB_JN = "J" then
    &BELEGZEILE.BETRRAB = preis * &BELEGZEILE.MENGE * (&BELEGZEILE.RABATT / 100)
    &BELEGZEILE.BRAB_URSP = preis * &BELEGZEILE.MENGE_URSP * (&BELEGZEILE.RABATT / 100)
  else
    &BELEGZEILE.BETRRAB = 0 
    &BELEGZEILE.BRAB_URSP = 0
    &BELEGZEILE.RABATT = 0
  end if
  if &BELEGZEILE.RRAB_JN = "J" then
    &BELEGZEILE.BETRRRAB = ( preis * &BELEGZEILE.MENGE - &BELEGZEILE.BETRRAB)  * (&BELEGZEILE.RECHRABATT / 100)
    &BELEGZEILE.BRRAB_URSP = ( preis * &BELEGZEILE.MENGE_URSP - &BELEGZEILE.BRAB_URSP)  * (&BELEGZEILE.RECHRABATT / 100)
  else
    &BELEGZEILE.BETRRRAB = 0 
    &BELEGZEILE.BRRAB_URSP = 0
    &BELEGZEILE.RECHRABATT = 0
  end if
  betrag = (preis * &BELEGZEILE.MENGE) - &BELEGZEILE.BETRRAB - &BELEGZEILE.BETRRRAB
  betrag_ursp = (preis * &BELEGZEILE.MENGE_URSP) - &BELEGZEILE.BRAB_URSP - &BELEGZEILE.BRRAB_URSP
  if &BELEGSTAMM.STEUERBER = "B" then
    &BELEGZEILE.BETRRAB = round( &BELEGZEILE.BETRRAB / mwst_faktor, 2)
    &BELEGZEILE.BRAB_URSP = round(&BELEGZEILE.BRAB_URSP / mwst_faktor, 2)
    &BELEGZEILE.BETRRRAB = round( &BELEGZEILE.BETRRRAB / mwst_faktor, 2)
    &BELEGZEILE.BRRAB_URSP = round(&BELEGZEILE.BRRAB_URSP / mwst_faktor, 2)
  else
    &BELEGZEILE.BETRRAB = round( &BELEGZEILE.BETRRAB, 2)
    &BELEGZEILE.BRAB_URSP = round(&BELEGZEILE.BRAB_URSP, 2)
    &BELEGZEILE.BETRRRAB = round( &BELEGZEILE.BETRRRAB, 2)
    &BELEGZEILE.BRRAB_URSP = round(&BELEGZEILE.BRRAB_URSP, 2)
  end if
  if &BELEGSTAMM.STEUERBER = "B" then
    &BELEGZEILE.BETRBRUTTO = round( betrag, 2)
    &BELEGZEILE.BEBRU_URSP = round( betrag_ursp, 2)
    &BELEGZEILE.BETRNETTO = round( &BELEGZEILE.BETRBRUTTO / mwst_faktor, 2)
    &BELEGZEILE.BENET_URSP = round( &BELEGZEILE.BEBRU_URSP / mwst_faktor, 2)
  else
    &BELEGZEILE.BETRNETTO = round( betrag, 2)
    &BELEGZEILE.BENET_URSP = round( betrag_ursp, 2)
    &BELEGZEILE.BETRBRUTTO = round( &BELEGZEILE.BETRNETTO * mwst_faktor, 2)
    &BELEGZEILE.BEBRU_URSP = round( &BELEGZEILE.BENET_URSP * mwst_faktor, 2)
  end if
  if (&BELEGSTAMM.STEUERBER = "O") or (&BELEGSTAMM.STEUERBER = "") then
    &BELEGZEILE.BETRBRUTTO = round( betrag, 2)
    &BELEGZEILE.BEBRU_URSP = round( betrag_ursp, 2)
  end if

  &BELEGZEILE.NETTO = round( fw_getbetrag_b( &BELEGZEILE.BETRNETTO, &BELEGSTAMM.FW_KURS, &BELEGSTAMM.FW_EHT), 2)
  &BELEGZEILE.NETTO_URSP = round( fw_getbetrag_b( &BELEGZEILE.BENET_URSP, &BELEGSTAMM.FW_KURS, &BELEGSTAMM.FW_EHT), 2)
  if &BELEGZEILE.EK_SPEZ = 0 then 
    &BELEGZEILE.ROHERTRAG = round( &BELEGZEILE.NETTO - &BELEGZEILE.EK * &BELEGZEILE.MENGE, 2)
    &BELEGZEILE.ROHER_URSP = round( &BELEGZEILE.NETTO_URSP - &BELEGZEILE.EK * &BELEGZEILE.MENGE_URSP, 2)
  else
    &BELEGZEILE.ROHERTRAG = round( &BELEGZEILE.NETTO - &BELEGZEILE.EK_SPEZ * &BELEGZEILE.MENGE, 2)
    &BELEGZEILE.ROHER_URSP = round( &BELEGZEILE.NETTO_URSP - &BELEGZEILE.EK_SPEZ * &BELEGZEILE.MENGE_URSP, 2)
  end if  

  &BELEGZEILE.BETRGEW = &BELEGZEILE.GEWICHT * &BELEGZEILE.MENGE
  &BELEGZEILE.BETRGEWBRT = &BELEGZEILE.GEWICHTBRT * &BELEGZEILE.MENGE
end sub

sub setze_mwst_satz( belstamm as record, belzeile as record)
dim gefunden as long
  gefunden = 0
  if (&BELZEILE.ART <> "A") and (&BELZEILE.ART <> "P") and (&BELZEILE.ART <> "R") and (&BELZEILE.ART <> "H") then exit sub
  opentable( "XUSTSCHD")
  opentable( "WFMODELD")
  &BELZEILE.MWST_SATZ = 0.0
  &BELZEILE.UST_SCHL = ""
  if (&BELSTAMM.STEUERBER = "N") or ( &BELSTAMM.STEUERBER = "B") then
    if (&WFMODELD.ART = &BELSTAMM.ART) and (&WFMODELD.FIBUMODELL = &BELZEILE.FIBUMODELL) then
      gefunden = 1
    else
      gefunden = findkey( "WFMODELD", "FIBUMODELL", &BELZEILE.FIBUMODELL, "ART", &BELSTAMM.ART)
    end if
    if (&BELZEILE.FIBUMODELL <> "") and (gefunden = 1) then
      if (&XUSTSCHD.UST_SCHL <> &WFMODELD.UST_SCHL) and (&XUSTSCHD.ART <> &BELSTAMM.ART) then
        findfirst( "XUSTSCHD", "UST_SCHL", &WFMODELD.UST_SCHL, "ART", &BELSTAMM.ART) 
      end if
      if (&XUSTSCHD.UST_SCHL <> &WFMODELD.UST_SCHL) then
        findfirst( "XUSTSCHD", "UST_SCHL", &WFMODELD.UST_SCHL, "ART", "") 
      end if
      if &XUSTSCHD.UST_SCHL = &WFMODELD.UST_SCHL then
        if &XUSTSCHD.UST_G_KTO = "" then 
          &BELZEILE.MWST_SATZ = &XUSTSCHD.UST_PRZ
        end if 
        &BELZEILE.UST_SCHL = &WFMODELD.UST_SCHL
      end if
    else
      erg = messagebox( "Fehlendes Fibumodell bei Artikel/Ressource %1|Es wird keine Mehrwertsteuer berechnet.", 1, &BELZEILE.ART_NUMMER)
    end if
  end if
end sub

sub init_belegzeile( belegzeile as record)
  &BELEGZEILE.REF_BZ_NR = 0
  &BELEGZEILE.REF_STM_NR = 0
  &BELEGZEILE.REFW_BZ_NR = 0
  &BELEGZEILE.STM_NUMMER = 0
  &BELEGZEILE.DATUM = 0
  &BELEGZEILE.BELDEF_NUM = 0
  &BELEGZEILE.BELDEF_ZUS = 0
  &BELEGZEILE.POS_NR = 0
  &BELEGZEILE.POS_NUMMER = ""
  &BELEGZEILE.ART = ""
  &BELEGZEILE.ART_NUMMER = ""
  &BELEGZEILE.ART_TEXT = ""
  &BELEGZEILE.IHR_TEXT = ""
  &BELEGZEILE.MENGE = 0
  &BELEGZEILE.MENGE_URSP = 0
  &BELEGZEILE.LIEFMENGE = 0
  &BELEGZEILE.MENGE_AUSGL = 0
  &BELEGZEILE.FIFOPOSITIV = ""
  &BELEGZEILE.AUSGLEICH = ""
  &BELEGZEILE.FIFODATUM = 0
  &BELEGZEILE.EINHEIT = ""
  &BELEGZEILE.GEWICHT = 0
  &BELEGZEILE.GEWICHTBRT = 0
  &BELEGZEILE.BETRGEW = 0
  &BELEGZEILE.BETRGEWBRT = 0
  &BELEGZEILE.PROV_JN = ""
  &BELEGZEILE.RAB_JN = ""
  &BELEGZEILE.RRAB_JN = ""
  &BELEGZEILE.BONUS_JN = ""
  &BELEGZEILE.SKONTO_JN = ""
  &BELEGZEILE.BESTELL_JN = ""
  &BELEGZEILE.SERNUM_JN = ""
  &BELEGZEILE.CHARGE_JN = ""
  &BELEGZEILE.AUFMASS1 = 0
  &BELEGZEILE.AUFMASS2 = 0
  &BELEGZEILE.AUFMASS3 = 0
  &BELEGZEILE.STD_NETTO = 0
  &BELEGZEILE.PREIS = 0
  &BELEGZEILE.RABATT = 0
  &BELEGZEILE.RECHRABATT = 0
  &BELEGZEILE.BETRNETTO = 0
  &BELEGZEILE.BETRBRUTTO = 0
  &BELEGZEILE.BETRRAB = 0
  &BELEGZEILE.BETRRRAB = 0
  &BELEGZEILE.BENET_URSP = 0
  &BELEGZEILE.BEBRU_URSP = 0
  &BELEGZEILE.EK = 0
  &BELEGZEILE.EK_SPEZ = 0
  &BELEGZEILE.ROHERTRAG = 0
  &BELEGZEILE.ROHER_URSP = 0
  &BELEGZEILE.NETTO = 0
  &BELEGZEILE.LAG_NUMMER = 0
  &BELEGZEILE.MWST_SATZ = 0
  &BELEGZEILE.UST_SCHL = ""
  &BELEGZEILE.FIBUMODELL = ""
  &BELEGZEILE.LIEFDATUM = 0
  &BELEGZEILE.LIEFDATUMB = 0
  &BELEGZEILE.PROJEKT_NR = ""
  &BELEGZEILE.HAUPTAKT = ""
  &BELEGZEILE.UNTERAKT = ""
  &BELEGZEILE.TEILAKT = ""
  &BELEGZEILE.K_STL = ""	
  &BELEGZEILE.K_ART = ""	
  &BELEGZEILE.K_TRG = ""	
  &BELEGZEILE.KORE_SCHL = ""	
  &BELEGZEILE.KORE_ID = 0
  &BELEGZEILE.FIBU_ID = 0
  &BELEGZEILE.DRUCKEN = ""	
  &BELEGZEILE.STATVER = ""	
  &BELEGZEILE.STATZWE = ""	
  &BELEGZEILE.STATART = ""	
  &BELEGZEILE.STATLKZ = ""	
  &BELEGZEILE.STATWERT = 	
  &BELEGZEILE.URSPRUNG = ""	
  &BELEGZEILE.STATPERIOD = 	
  &BELEGZEILE.VST_UST = ""	
  &BELEGZEILE.BESTELLW = 0	
  &BELEGZEILE.LAGER = 0
  &BELEGZEILE.FINANZ = 0
  &BELEGZEILE.AUFTRAG = 0
  &BELEGZEILE.BEWERTUNG = 0
  &BELEGZEILE.BESTELLW_L = 0
  &BELEGZEILE.LAGER_L = 0
  &BELEGZEILE.FINANZ_L = 0
  &BELEGZEILE.AUFTRAG_L = 0
  &BELEGZEILE.BRRAB_URSP = 0
  &BELEGZEILE.BRAB_URSP = 0
  &BELEGZEILE.NETTO_URSP = 0
end sub

sub loeschesumme( belegstamm as record)
  &BELEGSTAMM.SUM_BRUTTO = 0
  &BELEGSTAMM.SUM_NETTO = 0
  &BELEGSTAMM.SUBRU_URSP = 0
  &BELEGSTAMM.SUNET_URSP = 0
  &BELEGSTAMM.ROHERTRAG = 0
  &BELEGSTAMM.ROHER_URSP = 0
  &BELEGSTAMM.NETTO = 0
  &BELEGSTAMM.NETTO_URSP = 0
  &BELEGSTAMM.SUM_RAB = 0
  &BELEGSTAMM.SRAB_URSP = 0
  &BELEGSTAMM.SUM_RRAB = 0
  &BELEGSTAMM.SRRAB_URSP = 0
  &BELEGSTAMM.SUM_GEW = 0
  &BELEGSTAMM.SUM_GEWBRT = 0
  &BELEGSTAMM.UST_SCHL1 = ""
  &BELEGSTAMM.BRT_BETR1 = 0
  &BELEGSTAMM.UST_SCHL2 = ""
  &BELEGSTAMM.BRT_BETR2 = 0
  &BELEGSTAMM.UST_SCHL3 = ""
  &BELEGSTAMM.BRT_BETR3 = 0
  &BELEGSTAMM.UST_SCHL4 = ""
  &BELEGSTAMM.BRT_BETR4 = 0
  &BELEGSTAMM.UST_SCHL5 = ""
  &BELEGSTAMM.BRT_BETR5 = 0
end sub

sub berechne_summe( belegstamm as record, belegzeilen as record, plusminus as long, vonwandlung as long)
dim i as long
'vonwandlung = 1 verhindert das reduzieren der Ursprungsbeträge
  if &BELEGZEILEN.BELDEF_ZUS <> 0 then exit sub
  if (&BELEGZEILEN.ART <> "A") and (&BELEGZEILEN.ART <> "P") and (&BELEGZEILEN.ART <> "R") then exit sub
  &BELEGSTAMM.SUM_BRUTTO = &BELEGSTAMM.SUM_BRUTTO + &BELEGZEILEN.BETRBRUTTO * plusminus
  &BELEGSTAMM.SUM_NETTO = &BELEGSTAMM.SUM_NETTO + &BELEGZEILEN.BETRNETTO * plusminus
  &BELEGSTAMM.ROHERTRAG = &BELEGSTAMM.ROHERTRAG + &BELEGZEILEN.ROHERTRAG * plusminus
  &BELEGSTAMM.NETTO = &BELEGSTAMM.NETTO + &BELEGZEILEN.NETTO * plusminus
  &BELEGSTAMM.SUM_RAB = &BELEGSTAMM.SUM_RAB + &BELEGZEILEN.BETRRAB * plusminus
  &BELEGSTAMM.SUM_RRAB = &BELEGSTAMM.SUM_RRAB + &BELEGZEILEN.BETRRRAB * plusminus
  &BELEGSTAMM.SUM_GEW = &BELEGSTAMM.SUM_GEW + &BELEGZEILEN.BETRGEW * plusminus
  &BELEGSTAMM.SUM_GEWBRT = &BELEGSTAMM.SUM_GEWBRT + &BELEGZEILEN.BETRGEWBRT * plusminus
  if vonwandlung = 0 then  
    &BELEGSTAMM.SUBRU_URSP = &BELEGSTAMM.SUBRU_URSP + &BELEGZEILEN.BEBRU_URSP * plusminus
    &BELEGSTAMM.SUNET_URSP = &BELEGSTAMM.SUNET_URSP + &BELEGZEILEN.BENET_URSP * plusminus
    &BELEGSTAMM.ROHER_URSP = &BELEGSTAMM.ROHER_URSP + &BELEGZEILEN.ROHER_URSP * plusminus
    &BELEGSTAMM.NETTO_URSP = &BELEGSTAMM.NETTO_URSP + &BELEGZEILEN.NETTO_URSP * plusminus
    &BELEGSTAMM.SRAB_URSP = &BELEGSTAMM.SRAB_URSP + &BELEGZEILEN.BRAB_URSP * plusminus
    &BELEGSTAMM.SRRAB_URSP = &BELEGSTAMM.SRRAB_URSP + &BELEGZEILEN.BRRAB_URSP * plusminus
  end if

  i = 1
  do
    if (getfield(belegstamm, "UST_SCHL" + str$(i)) = &BELEGZEILEN.UST_SCHL) or (getfield(belegstamm, "UST_SCHL" + str$(i)) = "") then
      putfield(belegstamm, "UST_SCHL" + str$(i), &BELEGZEILEN.UST_SCHL)
      putfield(belegstamm, "BRT_BETR" + str$(i), getfield(belegstamm, "BRT_BETR" + str$(i)) + &BELEGZEILEN.BETRBRUTTO * plusminus)
      if getfield(belegstamm, "BRT_BETR" + str$(i)) = 0 then 
        putfield(belegstamm, "UST_SCHL" + str$(i), "")
      end if
      i = 5
    end if
    i = i + 1
  loop while i <= 5
end sub

sub standardbelegzeile( stamm_quelle as record, zeilen_quelle as record, stamm_ziel as record, zeilen_ziel as record, wbeldef as record, menge as double)
dim preis as double
dim netto as double

  erg = rts("ASSIGNRECORD", zeilen_quelle, zeilen_ziel)  
  &ZEILEN_ZIEL.BZ_NUMMER = 0
  if menge <> 0 then
    &ZEILEN_ZIEL.MENGE = menge
    &ZEILEN_ZIEL.MENGE_URSP = menge
  end if
  &ZEILEN_ZIEL.STM_NUMMER = &STAMM_ZIEL.STM_NUMMER
  &ZEILEN_ZIEL.DATUM = &STAMM_ZIEL.DATUM
  &ZEILEN_ZIEL.FIFODATUM = &STAMM_ZIEL.DATUM

  belegdefinitionvorgabe( zeilen_ziel, wbeldef)
  &ZEILEN_ZIEL.BELDEF_ZUS = 0

  &ZEILEN_ZIEL.REF_STM_NR = &STAMM_QUELLE.STM_NUMMER
  &ZEILEN_ZIEL.REFW_BZ_NR = &ZEILEN_QUELLE.BZ_NUMMER

  if (&STAMM_ZIEL.LKZ_L <> "") and (&ZEILEN_ZIEL.VST_UST = "U") then
    &ZEILEN_ZIEL.STATLKZ = &STAMM_ZIEL.LKZ_L
  else
    &ZEILEN_ZIEL.STATLKZ = &STAMM_ZIEL.LKZ_A
  end if

'es wird bei Belegumwandlung immer auf den Nettopreis rückgerechnet
  if &STAMM_QUELLE.STEUERBER = "B" then
    preis = &ZEILEN_QUELLE.PREIS / (1 + ( &ZEILEN_QUELLE.MWST_SATZ / 100))
  else
    preis = &ZEILEN_QUELLE.PREIS
  end if

'die Fremdwährung rückrechnen
  if &STAMM_QUELLE.FW_ISOCODE <> &STAMM_ZIEL.FW_ISOCODE then
    if &STAMM_QUELLE.FW_ISOCODE <> "" then
      preis = fw_getbetrag_b( preis, &STAMM_QUELLE.FW_KURS, &STAMM_QUELLE.FW_EHT)
    end if
    if &STAMM_ZIEL.FW_ISOCODE <> "" then
      preis = fw_getfwbetrag_b( preis, &STAMM_ZIEL.FW_KURS, &STAMM_ZIEL.FW_EHT)
    end if
  end if

  setze_mwst_satz( stamm_ziel, zeilen_ziel)

  if preis <> 0 then
    if &STAMM_ZIEL.STEUERBER = "B" then
      &ZEILEN_ZIEL.PREIS = preis * (1 + ( &ZEILEN_ZIEL.MWST_SATZ / 100))
    else
      &ZEILEN_ZIEL.PREIS = preis
    end if
  end if
end sub

sub korrigiere_mwst( belegstamm as record, belegzeile as record)
dim i, hatdifferenz as long
dim runddiffzeile, betragnetto, betragbrutto, rohertrag as double
dim korr_urspwerte as long

  if &BELEGSTAMM.ARCHIVART <> "" then 
    exit sub
  end if

  i = 0
  runddiffzeile = 0.0
  betragnetto = 0.0
  betragbrutto = 0.0
  rohertrag = 0.0
  hatdifferenz = 0
  korr_urspwerte = 0

  for i = 1 to 5
    mwst_satz(i) = -1.0
    betrnetto(i) = 0.0
    betrbrutto(i) = 0.0
    runddiffbeleg(i) = 0.0
  next

  do while eof( belegzeile) = 0
    i = 1
    do
      if (&BELEGZEILE.MWST_SATZ > 0) and ((mwst_satz(i) = &BELEGZEILE.MWST_SATZ) or (mwst_satz(i) < 0)) then
        mwst_satz(i) = &BELEGZEILE.MWST_SATZ
        betrnetto(i) = betrnetto(i) + &BELEGZEILE.BETRNETTO
        betrbrutto(i) = betrbrutto(i) + &BELEGZEILE.BETRBRUTTO
        i = 5 
      end if 
      i = i + 1
    loop while i <= 5
    betragnetto = betragnetto + &BELEGZEILE.BETRNETTO
    betragbrutto = betragbrutto + &BELEGZEILE.BETRBRUTTO
    rohertrag = rohertrag + &BELEGZEILE.ROHERTRAG
    skip( belegzeile, 1)
  loop

  for i = 1 to 5 
    if mwst_satz(i) > 0 then
      if &BELEGSTAMM.STEUERBER = "B" then
        runddiffbeleg(i) = round( betrbrutto(i) / (1 + mwst_satz(i) / 100), 2) - betrnetto(i)
      end if  
      if &BELEGSTAMM.STEUERBER <> "B" then
        runddiffbeleg(i) = betrbrutto(i) - round( betrnetto(i) * (1 + mwst_satz(i) / 100), 2)
      end if
      hatdifferenz = 1
    end if
  next

  if (&BELEGSTAMM.SUM_BRUTTO <> betragbrutto) or (&BELEGSTAMM.SUM_NETTO <> betragnetto) or (&BELEGSTAMM.ROHERTRAG <> rohertrag) then
    gotofirst( belegzeile)
    loeschesumme( belegstamm)
    do while eof( belegzeile) = 0 
      berechne_summe( belegstamm, belegzeile, 1, 0)
      skip( belegzeile, 1)
    loop
    store( belegstamm)
  end if

  if (hatdifferenz = 0) or (&BELEGSTAMM.SUM_NETTO = &BELEGSTAMM.SUM_BRUTTO) then
    exit sub
  end if

'Ursprungswerte nur korrigieren, wenn noch keine Teilumwandlung stattfand, z.B. Rechnung und Fibuübernahme
  if (&BELEGZEILE.BETRBRUTTO = &BELEGZEILE.BEBRU_URSP) and (&BELEGZEILE.BETRNETTO = &BELEGZEILE.BENET_URSP) then
    korr_urspwerte = 1
  end if

  do while bof( belegzeile) = 0
    i = 1
    do
      if (mwst_satz(i) = &BELEGZEILE.MWST_SATZ) and (runddiffbeleg(i) <> 0) then
        runddiffzeile = &BELEGZEILE.BETRBRUTTO - &BELEGZEILE.BETRNETTO * (1 + &BELEGZEILE.MWST_SATZ / 100)
        if (runddiffbeleg(i) > 0) and (runddiffzeile > 0) then
          korr_mis_mwst( belegstamm, belegzeile, -1)
          if &BELEGSTAMM.STEUERBER = "B" then
            &BELEGZEILE.BETRNETTO = &BELEGZEILE.BETRNETTO + 0.01
            &BELEGZEILE.NETTO = round( fw_getbetrag_b( &BELEGZEILE.BETRNETTO, &BELEGSTAMM.FW_KURS, &BELEGSTAMM.FW_EHT), 2)
            if &BELEGZEILE.EK_SPEZ = 0 then 
              &BELEGZEILE.ROHERTRAG = round( &BELEGZEILE.NETTO - &BELEGZEILE.EK * &BELEGZEILE.MENGE, 2)
            else
              &BELEGZEILE.ROHERTRAG = round( &BELEGZEILE.NETTO - &BELEGZEILE.EK_SPEZ * &BELEGZEILE.MENGE, 2)
            end if  
          end if  
          if &BELEGSTAMM.STEUERBER <> "B" then
            &BELEGZEILE.BETRBRUTTO = &BELEGZEILE.BETRBRUTTO - 0.01
          end if
          if korr_urspwerte = 1 then 
            &BELEGZEILE.NETTO_URSP = &BELEGZEILE.NETTO
            &BELEGZEILE.ROHER_URSP = &BELEGZEILE.ROHERTRAG 
            &BELEGZEILE.BEBRU_URSP = &BELEGZEILE.BETRBRUTTO
            &BELEGZEILE.BENET_URSP = &BELEGZEILE.BETRNETTO 
          end if     
          korr_mis_mwst( belegstamm, belegzeile, 1)
          runddiffbeleg(i) = runddiffbeleg(i) - 0.01 
          store( belegzeile)
        end if
        if (runddiffbeleg(i) < 0) and (runddiffzeile < 0) then
          korr_mis_mwst( belegstamm, belegzeile, -1)
          if &BELEGSTAMM.STEUERBER = "B" then
            &BELEGZEILE.BETRNETTO = &BELEGZEILE.BETRNETTO - 0.01
            &BELEGZEILE.NETTO = round( fw_getbetrag_b( &BELEGZEILE.BETRNETTO, &BELEGSTAMM.FW_KURS, &BELEGSTAMM.FW_EHT), 2)
            if &BELEGZEILE.EK_SPEZ = 0 then 
              &BELEGZEILE.ROHERTRAG = round( &BELEGZEILE.NETTO - &BELEGZEILE.EK * &BELEGZEILE.MENGE, 2)
            else
              &BELEGZEILE.ROHERTRAG = round( &BELEGZEILE.NETTO - &BELEGZEILE.EK_SPEZ * &BELEGZEILE.MENGE, 2)
            end if  
          end if  
          if &BELEGSTAMM.STEUERBER <> "B" then
            &BELEGZEILE.BETRBRUTTO = &BELEGZEILE.BETRBRUTTO + 0.01
          end if
          if korr_urspwerte = 1 then 
            &BELEGZEILE.NETTO_URSP = &BELEGZEILE.NETTO
            &BELEGZEILE.ROHER_URSP = &BELEGZEILE.ROHERTRAG 
            &BELEGZEILE.BEBRU_URSP = &BELEGZEILE.BETRBRUTTO
            &BELEGZEILE.BENET_URSP = &BELEGZEILE.BETRNETTO 
          end if
          korr_mis_mwst( belegstamm, belegzeile, 1)
          runddiffbeleg(i) = runddiffbeleg(i) + 0.01
          store( belegzeile)
        end if
        i = 5
      end if
      i = i + 1
    loop while i <= 5
    skip( belegzeile, -1)
  loop

  store( belegstamm)
end sub

sub korr_mis_mwst( belegstamm as record, belegzeile as record, vorz as long)
  if (&BELEGZEILE.ART = "A") or (&BELEGZEILE.ART = "P") then
    berechne_summe( belegstamm, belegzeile, vorz, 0)
    if &BELEGSTAMM.STEUERBER = "B" then
      mis_artikel( belegstamm, belegzeile, vorz)
      mis_adresse_artikel( belegstamm, belegzeile, vorz)
      mis_adresse( belegstamm, belegzeile, vorz)
    end if  
  end if
  if &BELEGZEILE.ART = "R" then
    berechne_summe( belegstamm, belegzeile, vorz, 0)
    if &BELEGSTAMM.STEUERBER = "B" then
      mis_artikel( belegstamm, belegzeile, vorz)
      mis_adresse_artikel( belegstamm, belegzeile, vorz)
      mis_adresse( belegstamm, belegzeile, vorz)
    end if  
  end if
end sub

function hole_op_betrag( belegstamm as record) as double
dim op_gesamt as double
  op_gesamt = 0.0
  opentable( "XADRESSE", "XADRESSEOP")
  findfirst( "XADRESSEOP", "ADR_NUMMER", &BELEGSTAMM.ADR_NUMM_R)
  if &XADRESSEOP.CREDIT_LIM = 0 then 
    hole_op_betrag = 0.0
    exit function
  end if
  opentable( "XOP", "XOPOP")
  setindex("XOPOP", "ADRBELNUMMER")
  if aliasname <> "" then
    openquery( "SQL")
    addsql( "SQL", "SELECT SUM( XOP.OP) AS OP_SUM")
    addsql( "SQL", "FROM XOP")
    addsql( "SQL", "WHERE FIB_KTO_NR = %1", &XADRESSEOP.FIB_KTO_NR)
    addsql( "SQL", "AND XOP.OP <> 0")
    addsql( "SQL", "AND MANDANT = %1", upper$ ( companyname ))
    opensql( "SQL")
    op_gesamt = &SQL.OP_SUM
    closequery( "SQL")
  else
    setrangestart("XOPOP", "FIB_KTO_NR", &XADRESSEOP.FIB_KTO_NR, "BEL_NUMMER", "", "BEL_DATUM", "")
    setrangeend("XOPOP", "FIB_KTO_NR", &XADRESSEOP.FIB_KTO_NR, "BEL_NUMMER", chr$(255), "BEL_DATUM", chr$(255))
    setfilter("XOPOP", "OP <> 0")
    do while eof("XOPOP") = 0
      op_gesamt = op_gesamt + &XOPOP.OP
      skip("XOPOP", 1)
    loop
  end if  
'nicht archivierte Belege, notwendig, wenn in der Warenwirtschaft keine OP's gebildet werden
  openquery( "SQL")
  addsql( "SQL", "SELECT SUM(D.SUM_BRUTTO) AS BRUTTO")
  addsql( "SQL", "FROM WBELSTM D, WBELDEF D1")
  addsql( "SQL", "WHERE D.BELDEF_NUM = D1.BELDEF_NUM") 
  addsql( "SQL", "AND D.STM_NUMMER <> %1", &BELEGSTAMM.STM_NUMMER)
  addsql( "SQL", "AND D.ADR_NUMM_R = %1", &BELEGSTAMM.ADR_NUMM_R)
  addsql( "SQL", "AND D.ARCHIVART = %1", " ")
  addsql( "SQL", "AND D.MANDANT = %1", upper$ ( companyname ))
  addsql( "SQL", "AND D1.MANDANT = %1", upper$ ( companyname ))
  addsql( "SQL", "AND ((D1.LAGER <> 0 AND D1.VST_UST = 'U') OR D1.AUFTRAG = 1)")
  opensql( "SQL")
  hole_op_betrag = op_gesamt + &SQL.BRUTTO
  closequery( "SQL")
end function

function check_belegdefzus( beldefnummer as long, untergruppe as long) as long
dim alte_untergruppe as long
  opentable("WBELDEF", "BELEGDEF")
  alte_untergruppe = &BELEGDEF.BELDEF_ZUS
  erg = belegdefinition( beldefnummer, untergruppe)
  check_belegdefzus = erg  
  if beldefnummer <> 0 then 
    erg = belegdefinition( beldefnummer, alte_untergruppe)
  end if
end function

'$INCLUDE \BAS\XIBEMERK
'$INCLUDE \BAS\XISERIE
'$INCLUDE \BAS\WIMIS
