'Description: Fibu: Warenwirtschaftsdaten übernehmen
'Usedby: fibu

dim letztegeholtenummer as string
dim runddiffbeleg(5), betrbrutto(5), betrnetto(5), mwst_satz(5) as double

'$include \bas\fbuchdim

  opentable("xjour1z", "fjour1z")
  setindex("fjour1z", "STAPEL_BELEGDATUM")
  dialogart = ""
  @datum_von = belegzeitraum_anfang
  @datum_bis = belegzeitraum_ende
end

'**********************************************************************************
@ok.onpress:
  if messagebox("Übernahme starten?", 20) <> 4 then end
  setindex("XFKTO", "BZ_ANFANG_KTO_NR")
  if findkey("XFKTO", "BZ_ANFANG", Belegzeitraum_anfang) = 0 then
    erg = messagebox("Für dieses Wirtschaftsjahr wurden noch keine Fibu-Konten angelegt!", 2)
    return
  end if  
  setindex("XFKTO", "")
  fverbuche_wawibelegkreis
return

'*****************************************************************************************
sub fverbuche_wawibelegkreis
dim records as long
dim akt_record as long
dim abbruch as long

  records = 0
  akt_record = 0
  erg = 1
  abbruch = 0
  stapel = @wawistapel
  zahl_kond_extern = 1

  opentable("wbelstm")
  opentable("wbelzeil")
  setindex("wbelzeil", "stm_posnummer")
  opentable("wzahlung")
  linktablelocal( "wzahlung", "WBELSTM.STM_NUMMER")
  opentable("wzahlart")
  opentable("xadresse", "adressen")
  opentable("wbeldef")
  opentable("wfmodeld")
  opentable("XJOUR1Z", "fjour1z")
  SETAUTOFIELD( "fjour1z", "id_nummer", 0)
  setindex("fjour1z", "STAPEL_BELEGDATUM")

  if (@beleg_von <> "") and (@beleg_bis <> "") then
    setindex("wbelstm", "belnummer")
    setrangestart("wbelstm")
    setrangestart("wbelstm", "bel_nummer", @beleg_von)
    setrangeend("wbelstm", "bel_nummer", @beleg_bis)
    setfilter("wbelstm", "DATUM >= " + str$(@datum_von) + " AND DATUM <= " + str$(@datum_bis))
  else
    setindex("wbelstm", "DATUM_I")
    setrangestart("wbelstm")
    setrangestart("wbelstm", "datum", @datum_von)
    setrangeend("wbelstm", "datum", @datum_bis)
  end if
  if @belegart <> "" then
    setfilter("wbelstm", "BELDEF_NUM = " + @Belegart)
  end if
  records = reccount("wbelstm")
  do while (eof("wbelstm") = 0) and (abbruch = 0)
    if findkey("wbeldef", "beldef_num", &wbelstm.beldef_num) = 0 then
      erg = messagebox("Belegdefinition: %1 in Beleg: %2 nicht gefunden!", 2, str$(&wbelstm.beldef_num), &wbelstm.bel_nummer)
      goto belstamm_weiter_skip
    end if
    if (&WBELDEF.VST_UST = "I") or ((@nur_gedruckte_belege = 1) and (&wbelstm.gedruckt = 0)) or (&WBELDEF.FINANZ = 0) then goto belstamm_weiter_skip
    if (&WBELSTM.ARCHIVART = "M") or (&WBELSTM.FIBU_GEB <> 0) then goto belstamm_weiter_skip
    if (&wbelstm.DATUM < belegzeitraum_anfang) or (&wbelstm.DATUM > belegzeitraum_ende) then goto belstamm_weiter_skip  
    akt_record = akt_record + 1
    abbruch = screeninfo( replace("Beleg: %1 wird übernommen!", &wbelstm.bel_nummer), records, akt_record, 1)
    fverbuche_wawibeleg
    belstamm_weiter_skip:
    skip("wbelstm", 1)
  loop
  erg = screeninfo("", 0, 0, 0)
end sub


'*****************************************************************************************
sub fverbuche_wawibeleg
dim fibupersonenkonto as string
dim gebucht as long
dim skiped as long
dim wbelzeil_ust_schl as string
dim fehler as long
dim bz_nummer as long
dim ust_speicher as double
dim uebersteuere_ust as long

  fibupersonenkonto = ""
  personenkontoart = ""
  gebucht = 0
  skiped = 0
  fehler = 0
  wbelzeil_ust_schl = ""
  bz_nummer = 0
  setrangestart("wbelzeil")
  setrangestart("wbelzeil", "stm_nummer", &wbelstm.stm_nummer)
  setrangeend("wbelzeil", "stm_nummer", &wbelstm.stm_nummer)
'  findfirst("wbeldef", "beldef_num", &wbelstm.beldef_num)
  if findkey("adressen", "adr_nummer", &wbelstm.adr_numm_r) = 0 then
    erg = messagebox("Adresse: %1 nicht gefunden!", 2, &wbelstm.adr_numm_r)
    exit sub
  end if
  fibupersonenkonto = &adressen.fib_kto_nr
  if (fibupersonenkonto = "") or (&adressen.kund_art = "") or (&adressen.lief_art = "") then
    if fibupersonenkonto = "" then
      fibupersonenkonto = &adressen.adr_nummer
      &adressen.fib_kto_nr = fibupersonenkonto
    end if
    if &adressen.kund_art = "" then &adressen.kund_art = set_adr_art(&adressen.lkz, "KUND")
    if &adressen.lief_art = "" then &adressen.lief_art = set_adr_art(&adressen.lkz, "LIEF")
    store("adressen")
  end if
  if findkey("xfkto", "kto_nr", fibupersonenkonto, "bz_anfang", belegzeitraum_anfang) = 0 then
    appendblank("xfkto")
    &xfkto.kto_nr = &adressen.fib_kto_nr
    &xfkto.name = &adressen.name1
    &xfkto.kto_art = "PK"
    &xfkto.bz_anfang = belegzeitraum_anfang
    store("xfkto")
  end if

' Wenn der OP in der Warenwirtschaft schon gebildet wurde (aus alten Beständen) dann löschen
  findfirst("XOP", "fib_kto_nr", fibupersonenkonto, "BEL_NUMMER", &wbelstm.bel_nummer, "BEL_DATUM", &wbelstm.DATUM)
  if (&XOP.fib_kto_nr = fibupersonenkonto) and (&XOP.BEL_NUMMER = &wbelstm.bel_nummer) and (&XOP.BEL_DATUM = &wbelstm.DATUM) then
    deleterecord("XOP")
  end if

  korrigiere_mwst( "WBELSTM", "WBELZEIL")
  Splittbetrag = 999999999
  gotofirst("wbelzeil")
  do while eof("wbelzeil") = 0
    korebetrag_minus = 0
    skiped = 0
    if ((&wbelzeil.ART <> "A") and (&wbelzeil.ART <> "P") and (&wbelzeil.ART <> "R")) or (&wbelzeil.netto = 0) or (&wbelzeil.BELDEF_ZUS > 0) or (upper$(&wbelzeil.fibumodell)="DUMMY") then
      skiped = 1
      goto bz_weiter_skip
    end if
    appendblank("FJOUR1Z")
    gosub FJOUR1Z_ONRECORDCHANGE
    gosub fjour1z_ONNEWRECORD
    &FJOUR1Z.BEL_DATUM = &wbelstm.DATUM
    &FJOUR1Z.BEL_SYMBOL = &wbeldef.BEL_SYMBOL
    if (&WBELDEF.VST_UST = "V") and (&WBELDEF.FINANZ = -1) then      'ER
'      personenkontoart = &adressen.lief_art
      if &wbelzeil.netto > 0 then
        &FJOUR1Z.BUCH_SH = "H"
      else
        &FJOUR1Z.BUCH_SH = "S"
        &FJOUR1Z.KST_LST = "K"
        korebetrag_minus = 1
      end if
    end if
    if (&WBELDEF.VST_UST = "U") and (&WBELDEF.FINANZ = 1) then      'AR
'      personenkontoart = &adressen.kund_art
      if &wbelzeil.netto > 0 then
        &FJOUR1Z.BUCH_SH = "S"
      else
        &FJOUR1Z.BUCH_SH = "H"
        &FJOUR1Z.KST_LST = "L"
        korebetrag_minus = 1
      end if
    end if
    if (&WBELDEF.VST_UST = "V") and (&WBELDEF.FINANZ = 1) then      'Gutschrift ER
'      personenkontoart = &adressen.lief_art
      if &wbelzeil.netto > 0 then
        &FJOUR1Z.BUCH_SH = "S"
        &FJOUR1Z.KST_LST = "K"
        korebetrag_minus = 1
      else
        &FJOUR1Z.BUCH_SH = "H"
      end if
    end if
    if (&WBELDEF.VST_UST = "U") and (&WBELDEF.FINANZ = -1) then      'Gutschrift AR
'      personenkontoart = &adressen.kund_art
      if &wbelzeil.netto > 0 then
        &FJOUR1Z.BUCH_SH = "H"
        &FJOUR1Z.KST_LST = "L"
        korebetrag_minus = 1
      else
        &FJOUR1Z.BUCH_SH = "S"
      end if
    end if
    if KOSTEN_LEISTUNG_MINUSBETR = 0 then 
      &FJOUR1Z.KST_LST = ""
      korebetrag_minus = 0
    end if
    personenkontoart = &wbelstm.art
    if findkey("wfmodeld", "fibumodell", &wbelzeil.fibumodell, "art", personenkontoart) = 0 then
      findfirst("wfmodeld", "fibumodell", &wbelzeil.fibumodell)
    end if
    if &wbelzeil.fibumodell <> &wfmodeld.fibumodell then
      cancel("fjour1z")
      erg = messagebox("Fibumodell: %1 nicht gefunden. Bitte kontrollieren Sie Ihre Einstellungen in Artikel: %2 bzw. in den Fibu-Modellen!", 2, &wbelzeil.fibumodell, &wbelzeil.art_nummer)
      exit sub
    end if
    &FJOUR1Z.BUCH_KTO = fibupersonenkonto
    &FJOUR1Z.GEGEN_KTO = &wfmodeld.fibu_kto
    wbelzeil_ust_schl = &wbelzeil.ust_schl
    uebersteuere_ust = 0
    if &wbelstm.STEUERBER = "B" then
      &FJOUR1Z.BRT_NETTO = "B"
      &FJOUR1Z.BRUTTO = abs(&wbelzeil.BETRBRUTTO)
      &FJOUR1Z.UST = abs(&wbelzeil.BETRBRUTTO) - abs(&wbelzeil.betrnetto)
      do_ust
      ust_speicher = &FJOUR1Z.UST 
      uebersteuere_ust = 1
    else 
      &FJOUR1Z.BRT_NETTO = "N"
      &FJOUR1Z.NETTO = abs(&wbelzeil.netto)
      &FJOUR1Z.UST = abs(&wbelzeil.BETRBRUTTO) - abs(&wbelzeil.betrnetto)
      ust_speicher = &FJOUR1Z.UST 
      uebersteuere_ust = 1
    end if
    if (&WBELDEF.VST_UST = "V") then                  'ER
      if &WBELSTM.REFERENZ = "" then
        &FJOUR1Z.BEL_NUMMER = &wbelstm.bel_nummer
      else
        &FJOUR1Z.BEL_NUMMER = &wbelstm.referenz
      end if
    else
      &FJOUR1Z.BEL_NUMMER = &wbelstm.bel_nummer
    end if
    &FJOUR1Z.BUCH_TEXT = text_to_field(AUTOMATISCHER_UEBERNAHMETEXT)
    if &wbelstm.FW_ISOCODE <> "" then
      uebersteuere_ust = 0
      &FJOUR1Z.FW_ISOCODE = &wbelstm.FW_ISOCODE
      &FJOUR1Z.FW_KURS = &wbelstm.FW_KURS
      &FJOUR1Z.FW_EHT = &wbelstm.FW_EHT
      if &wbelzeil.betrnetto = &wbelzeil.betrbrutto then
        &FJOUR1Z.FW_NETTO = abs(&wbelzeil.betrnetto)
        do_fw_netto
      else
        &FJOUR1Z.FW_BRUTTO = abs(&wbelzeil.betrbrutto)
        &FJOUR1Z.BRT_NETTO = ""
        do_fw_brutto
      end if
    end if
    &FJOUR1Z.VAL_DATUM = &wbelstm.DATUM
    &FJOUR1Z.MENGE = &wbelzeil.MENGE
    &FJOUR1Z.EINHEIT = &wbelzeil.EINHEIT
    &FJOUR1Z.K_STL = &wbelzeil.K_STL
    &FJOUR1Z.K_ART = &wbelzeil.K_ART
    &FJOUR1Z.K_TRG = &wbelzeil.K_TRG
    &fjour1z.div_code = "WAWI"
    bz_nummer = &wbelzeil.bz_nummer
    bz_weiter_skip:
    skip("wbelzeil", 1)
    if ((&wbelzeil.ART <> "A") and (&wbelzeil.ART <> "P") and (&wbelzeil.ART <> "R")) or (&wbelzeil.netto = 0) or (&wbelzeil.BELDEF_ZUS > 0) then
      if eof("wbelzeil") = 0 then goto bz_weiter_skip
    end if
    if eof("wbelzeil") = 1 then
      Splittbetrag = 0.0
    end if
    if skiped = 0 then
      set_all_variables(1, 0)
      &FJOUR1Z.ZESS_KZ = &adressen.ZESS_KZ
      &FJOUR1Z.ZAHL_KOND = &wbelstm.ZAHL_KOND
      &FJOUR1Z.ZAHL_ZIEL = &wbelstm.ZAHL_ZIEL
      &FJOUR1Z.SKONTOPRZ1 = &wbelstm.SKONTOPRZ1
      &FJOUR1Z.SKONTOTGE1 = &wbelstm.SKONTOTGE1
      &FJOUR1Z.SKONTOPRZ2 = &wbelstm.SKONTOPRZ2
      &FJOUR1Z.SKONTOTGE2 = &wbelstm.SKONTOTGE2
      if &FJOUR1Z.UST_SCHL <> wbelzeil_ust_schl then
'       Bis auf weiteres außer kraft gesetzt, da nicht abzuschätzen ist, wie sich diese Überprüfung auswirkt!
'        erg = messagebox("Im Beleg: %1, Belegzeile: % wird ein anderer UST-Schlüssel verwendet als in den Kontostammdaten!", 2, &wbelstm.bel_nummer, &wbelzeil.pos_nummer)
        &FJOUR1Z.UST_SCHL = wbelzeil_ust_schl
        do_ust_schl(1)
        do_ust_kto(1)
        do_ust_sh(1)
      end if
      if uebersteuere_ust then 
        &FJOUR1Z.UST = ust_speicher
        do_ust
      end if
      if &FJOUR1Z.KST_LST = "" then
        if &FJOUR1Z.BUCH_SH = "S" then
          &FJOUR1Z.KST_LST = "L"
        else
          &FJOUR1Z.KST_LST = "K"
        end if
      end if
      if findkey("xfkto", "kto_nr", &FJOUR1Z.GEGEN_KTO, "bz_anfang", belegzeitraum_anfang) = 1 then
        if &xfkto.zm_ok <> "" then &fjour1z.zm_ok = &xfkto.zm_ok
        if &xfkto.zm_1 <> "" then &fjour1z.zm_1 = &xfkto.zm_1
        if &xfkto.zm_2 <> "" then &fjour1z.zm_2 = &xfkto.zm_2
        if &xfkto.zm_3 <> "" then &fjour1z.zm_3 = &xfkto.zm_3
      end if
      if (&FJOUR1Z.K_STL = "") and (&FJOUR1Z.K_ART = "") and (&FJOUR1Z.K_TRG = "") then &FJOUR1Z.KST_LST = ""
      F_onbeforepost(1)
      if (&FJOUR1Z.K_STL = "") and (&FJOUR1Z.K_ART = "") and (&FJOUR1Z.K_TRG = "") then &FJOUR1Z.KST_LST = ""
      if @testen = 0 then F_onpost(1, 1)
      if (valid <> 0) and (@testen = 0) then
        store("fjour1z")
        fibu_alles_speichern(1)
        gebucht = 1
        if (instr(1, upper$(aliasname), "MICR") > 0) then
          opentable( "WBELZEIL", "WBELZEIL_FIBU") 
          if findkey( "WBELZEIL_FIBU", "BZ_NUMMER", bz_nummer) = 1 then 
            &WBELZEIL_FIBU.FIBU_ID = &FJOUR1Z.id_nummer 
            store( "WBELZEIL_FIBU")
          end if
        else 
          openquery( "SQL")
          addsql( "SQL", "UPDATE WBELZEIL SET FIBU_ID = " + str$(&fjour1z.id_nummer) + " WHERE MANDANT = '" + upper$(CompanyName) + "' AND BZ_NUMMER = " + str$(bz_nummer) + ";")
          execsql( "SQL")
          closetable("SQL")
        end if 
      end if
      if valid = 0 then
        erg = messagebox("Fehler bei der Übernahme in Beleg: %1", 2, &wbelstm.bel_nummer)
        deleterecord("fjour1z")
        fehler = 1
        exit sub
      end if
      if Splittbetrag = 0.0 then akt_bel_nr = 0
    else
      valid = 0
    end if
    if (valid = 0) and (skiped = 0) or (@testen = 1) then cancel("FJOUR1Z")
  loop
  if (gebucht = 1) and (fehler = 0) then
    if @testen = 0 then
      &WBELSTM.FIBU_GEB = date
      &WBELSTM.ARCHIVART = "F"
      &WBELSTM.ARCHIVVON = userid
      &WBELSTM.ARCHIVDAT = date
      store("WBELSTM")
    end if
    if findkey("WZAHLUNG", "STM_NUMMER", &wbelstm.stm_nummer) = 1 then
      do while (eof("WZAHLUNG") = 0) and (&wzahlung.stm_nummer = &wbelstm.stm_nummer)
        if findkey("WZAHLART", "ZAHLART", &wzahlung.zahlart) = 0 then goto skip_zahlung
        if &wzahlart.fib_kto_nr = fibupersonenkonto then goto skip_zahlung
        appendblank("FJOUR1Z")
        gosub FJOUR1Z_ONRECORDCHANGE
        gosub fjour1z_ONNEWRECORD
        &FJOUR1Z.BEL_DATUM = &wbelstm.DATUM
        &FJOUR1Z.BEL_SYMBOL = &wbeldef.BEL_SYMBOL
        if (&WBELDEF.VST_UST = "V") and (&WBELDEF.FINANZ = -1) then      'ER
          &FJOUR1Z.BUCH_SH = "S"
        end if
        if (&WBELDEF.VST_UST = "U") and (&WBELDEF.FINANZ = 1) then      'AR
          &FJOUR1Z.BUCH_SH = "H"
        end if
        if (&WBELDEF.VST_UST = "V") and (&WBELDEF.FINANZ = 1) then      'Gutschrift ER
          &FJOUR1Z.BUCH_SH = "H"
        end if
        if (&WBELDEF.VST_UST = "U") and (&WBELDEF.FINANZ = -1) then      'Gutschrift AR
          &FJOUR1Z.BUCH_SH = "S"
        end if
        &FJOUR1Z.BUCH_SH = "H"
        &FJOUR1Z.BUCH_KTO = fibupersonenkonto
        &FJOUR1Z.GEGEN_KTO = &wzahlart.fib_kto_nr
        &FJOUR1Z.BRUTTO = &wzahlung.betrag
        &FJOUR1Z.BUCH_TEXT = "Automatische Umbuchung Zahlungsart"
        &FJOUR1Z.BEL_NUMMER = &wbelstm.bel_nummer
        set_all_variables(1, 0)
        do_brutto
        F_onbeforepost(1)
        if @testen = 0 then F_onpost(1, 1)
        if (valid <> 0) and (@testen = 0) then
          store("fjour1z")
          fibu_alles_speichern(1)
        else
          cancel("FJOUR1Z")
        end if
        skip_zahlung:
        skip("wzahlung", 1)
      loop
    end if
    if (instr(1, upper$(aliasname), "MICR") > 0) then
      commit
    end if
  end if
end sub

'$include \bas\fbucheve
'$include \bas\xadr_art
'$include \bas\xfwprc
'$include \bas\xkore
'$include \bas\fktoext
'$include \bas\fbuchrec
'$include \bas\fbuchop
'$include \bas\fbuchsub
'$include \bas\fbuchinc
'$include \bas\xopaufb
'$include \bas\fktosum
'$include \bas\xtools
'$INCLUDE \BAS\WIBELEG
