--
-- $Id$
--
-- Script containing customer specific sql statements for the FACILITOR database
--
-- NB: Overbodig geworden: alle BCS2000 projecten zijn ingelezen.
--     Met script TWYN#55541.sql zijn de procedures en de tabellen die hiervoor gebruikt worden gedropt.
--

DEFINE thisfile = 'TWYN.SQL'
DEFINE dbuser   = '^TWYN'
DEFINE custid   = 'TWYN'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
WHENEVER SQLERROR EXIT;
SELECT adm.scriptspoolfile('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL;
WHENEVER SQLERROR CONTINUE;
SPOOL &fcltlogfile
SET DEFINE OFF

------ payload begin ------

--=============================================================================
-- IMPORTFUNCTIES
-------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE twyn_import_reportdbf (p_import_key IN NUMBER)
AS
   c_delim                  VARCHAR2 (1) := ';';
   v_newline                fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_searchline             fac_imp_file.fac_imp_file_line%TYPE;    -- Input line voor zoeken op kolomnummer
   v_errormsg               VARCHAR2 (1000);
   v_errorhint              VARCHAR2 (1000);
   oracle_err_num           NUMBER;
   oracle_err_mes           VARCHAR2 (200);
   v_aanduiding             VARCHAR2 (200);
   header_is_valid          NUMBER (1) := 0;
   v_ongeldig               NUMBER (1) := 0;
   v_imp_count              NUMBER (5) := 0;

   -- Importvelden staan in de procedures.
   -- Overige velden:
   -- Keys
   k_project_code           VARCHAR2(20) := NULL;
   k_subproject_code        VARCHAR2(20) := NULL;
   k_rubriek_nr             VARCHAR2(20) := NULL;
   k_groep_nr               VARCHAR2(60) := NULL;
   k_onderdeel_nr           VARCHAR2(5)  := NULL;
   k_budget_nr              VARCHAR2(5)  := NULL;
   k_bedrijf_code           VARCHAR2(4)  := NULL;
   k_contract_nr            NUMBER(5);
   k_contract_volgnr        NUMBER(5);
   k_factuur_nr             NUMBER(10);
   k_factuur_volgnr         NUMBER(10);

   CURSOR c1
   IS
        SELECT   fac_imp_file_line
             ,   LENGTH (TRIM (REPLACE (fac_imp_file_line, c_delim, '')))  regellengte
          FROM   FAC_IMP_FILE
         WHERE   fac_import_key = p_import_key
      ORDER BY   fac_imp_file_index;



   FUNCTION isDate(p_date IN VARCHAR2) RETURN NUMBER IS
      v_date DATE;
   BEGIN
      SELECT TO_DATE(p_date) INTO v_date FROM DUAL;
         RETURN 1;
      EXCEPTION
         WHEN OTHERS THEN RETURN 0;
   END; --isDate

   FUNCTION isNumeric(p_number IN VARCHAR2) RETURN NUMBER IS
      v_number NUMBER := 0;
   BEGIN
      IF (LENGTH(TRIM(TRANSLATE(p_number, ' +-.0123456789', ' '))) IS NULL) THEN
         v_number := 1;
      END IF;
      RETURN v_number;
   END; --isNumeric

   PROCEDURE imp_skip( p_line IN OUT VARCHAR2
                     , p_aantal      NUMBER)
   IS
      --v_nn_001                   VARCHAR2 (256); --001 DIUNITNO
      --v_nn_002                   VARCHAR2 (256); --002 DIDIR
      v_nn                         VARCHAR2 (256);
   BEGIN
     FOR i IN 1.. p_aantal
     LOOP
        fac.imp_getfield (p_line, c_delim, v_nn);
     END LOOP;
   END; --imp_skip

   PROCEDURE imp_project( p_line           IN OUT VARCHAR2
                        , p_project_nummer    OUT VARCHAR2)
   IS
      v_project_nummer             VARCHAR2 (256); --003 PRNUMMER           :projectnummer
      v_project_omschr             VARCHAR2 (256); --004 PROMSCHR           :omschrijving project
      v_project_fullnr             VARCHAR2 (256); --005 PRFULLNR           :(samenvoeging van projectnummer en omschrijving)
      v_project_opdrachtgever      VARCHAR2 (256); --006 PROPDRGVR          :opdractgever
      v_project_startdatum         VARCHAR2 (256); --007 PRSTRTDAT          :startdatum project
      v_project_code               VARCHAR2 (256); --008 PRCODEINT          :internationaal projectcode
      v_project_leider             VARCHAR2 (256); --009 PRLEIDER           :projectleider
      v_project_incl_btw           VARCHAR2 (256); --010 PRINCBTW           :bedragen inclusief btw
      v_project_indextabel         VARCHAR2 (256); --011 PRIDXTABEL         :naam indextabel
      v_project_valuta             VARCHAR2 (256); --012 PRVALUTA           :valuta
      v_count_project              NUMBER (3);
   BEGIN
      fac.imp_getfield (p_line, c_delim, v_project_nummer);
      fac.imp_getfield (p_line, c_delim, v_project_omschr);
      fac.imp_getfield (p_line, c_delim, v_project_fullnr);
      fac.imp_getfield (p_line, c_delim, v_project_opdrachtgever);
      fac.imp_getfield (p_line, c_delim, v_project_startdatum);
      fac.imp_getfield (p_line, c_delim, v_project_code);
      fac.imp_getfield (p_line, c_delim, v_project_leider);
      fac.imp_getfield (p_line, c_delim, v_project_incl_btw);
      fac.imp_getfield (p_line, c_delim, v_project_indextabel);
      fac.imp_getfield (p_line, c_delim, v_project_valuta);
      --
      p_project_nummer := NULL;
      v_project_nummer := TRIM(v_project_nummer);
      IF (v_project_nummer IS NOT NULL) THEN
         SELECT COUNT(*)
           INTO v_count_project
           FROM twyn_imp_discipline
          WHERE bgt_disc_params_code = v_project_nummer;


         IF (v_count_project = 0) THEN
            INSERT INTO twyn_imp_discipline
            (  bgt_disc_params_code
            ,  ins_discipline_omschrijving
            ,  bgt_disc_params_opdrachtgever
            ,  bgt_disc_params_startdatum
            ,  ins_discipline_btw
            ,  bgt_disc_params_leider
            )
            VALUES
            (  v_project_nummer
            ,  SUBSTR(v_project_omschr, 1, 30)
            ,  v_project_opdrachtgever
            ,  fac.safe_to_date(v_project_startdatum, 'dd-mm-yyyy')
            ,  CASE WHEN v_project_incl_btw = 'WAAR' THEN 1 ELSE 0 END
            ,  v_project_leider
            );
            p_project_nummer := v_project_nummer;
         END IF;
      END IF;
   END; --imp_project

   PROCEDURE imp_subproject( p_line              IN OUT VARCHAR2
                           , p_subproject_nummer    OUT VARCHAR2)
   IS
      v_nn_013                     VARCHAR2 (256); --013 VANAAM             :valuta naam
      v_subproject_nummer          VARCHAR2 (256); --014 SPNUMMER           :code subproject
      v_nn_015                     VARCHAR2 (256); --015 SPNR
      v_nn_016                     VARCHAR2 (256); --016 SPNRs
      v_subproject_omschr          VARCHAR2 (256); --017 SPOMSCHR           :omschrijving subproject
      v_nn_018                     VARCHAR2 (256); --018 SPFULLNR           :(samenvoeging van subprojectnummer en omschrijving)
      v_subproject_fase_nr         VARCHAR2 (256); --019 SPPSTATUS          :projectfase nummer
      v_subproject_prijspeildatum  VARCHAR2 (256); --020 SPDATPP            :datum prijsniveau
      v_nn_021                     VARCHAR2 (256); --021 SPBOUWTIJD         :bouwtijd
      v_nn_022                     VARCHAR2 (256); --022 SPCAPAC            :capaciteit
      v_nn_023                     VARCHAR2 (256); --023 SPBRUVLOPP         :vloeroppervlak
      v_nn_024                     VARCHAR2 (256); --024 SPINHOUD           :inhoud
      v_nn_025                     VARCHAR2 (256); --025 SPIPSPJ
      v_nn_026                     VARCHAR2 (256); --026 SPRESOFONV
      v_nn_027                     VARCHAR2 (256); --027 SPRENTE
      v_nn_028                     VARCHAR2 (256); --028 SPDIRKOST
      v_nn_029                     VARCHAR2 (256); --029 SPBIJKOMENDREPORT
      v_subproject_soort_nr        VARCHAR2 (256); --030 SPPROSOORT         :projectsoort nummer
      v_subproject_notes           VARCHAR2 (256); --031 SPOPMERKINGREPORT  :opmerking
      v_subproject_fase_omschr     VARCHAR2 (256); --032 PSSTATUS           :projectfase omschrijving
      v_subproject_soort_omschr    VARCHAR2 (256); --033 PSRTSOORT          :projesctsoort omschrijving
      s_project_nummer             VARCHAR2 (256); --003 PRNUMMER           :projectnummer
      v_count_subproject           NUMBER (3);
   BEGIN
      fac.imp_getfield (p_line, c_delim, v_nn_013);
      fac.imp_getfield (p_line, c_delim, v_subproject_nummer);
      fac.imp_getfield (p_line, c_delim, v_nn_015);
      fac.imp_getfield (p_line, c_delim, v_nn_016);
      fac.imp_getfield (p_line, c_delim, v_subproject_omschr);
      fac.imp_getfield (p_line, c_delim, v_nn_018);
      fac.imp_getfield (p_line, c_delim, v_subproject_fase_nr);
      fac.imp_getfield (p_line, c_delim, v_subproject_prijspeildatum);
      fac.imp_getfield (p_line, c_delim, v_nn_021);
      fac.imp_getfield (p_line, c_delim, v_nn_022);
      fac.imp_getfield (p_line, c_delim, v_nn_023);
      fac.imp_getfield (p_line, c_delim, v_nn_024);
      fac.imp_getfield (p_line, c_delim, v_nn_025);
      fac.imp_getfield (p_line, c_delim, v_nn_026);
      fac.imp_getfield (p_line, c_delim, v_nn_027);
      fac.imp_getfield (p_line, c_delim, v_nn_028);
      fac.imp_getfield (p_line, c_delim, v_nn_029);
      fac.imp_getfield (p_line, c_delim, v_subproject_soort_nr);
      fac.imp_getfield (p_line, c_delim, v_subproject_notes);
      fac.imp_getfield (p_line, c_delim, v_subproject_fase_omschr);
      fac.imp_getfield (p_line, c_delim, v_subproject_soort_omschr);
      --
      p_subproject_nummer := NULL;
      v_subproject_nummer := TRIM(v_subproject_nummer);
      IF (v_subproject_nummer IS NOT NULL) THEN
         fac.imp_getfield_nr(v_searchline, c_delim, 3, s_project_nummer);
         SELECT COUNT(*)
           INTO v_count_subproject
           FROM twyn_imp_project
          WHERE bgt_project_discipline = s_project_nummer
            AND bgt_project_code = v_subproject_nummer;

         IF (v_count_subproject = 0) THEN
            INSERT INTO twyn_imp_project
            (  bgt_project_code
            ,  bgt_project_omschrijving
            ,  bgt_project_volgnr
            ,  bgt_project_discipline
            ,  bgt_project_prijspeildatum
            ,  bgt_project_notes
            ,  bgt_project_fase_nr
            ,  bgt_project_fase_omschr
            ,  bgt_project_soort_nr
            ,  bgt_project_soort_omschr
            )
            VALUES
            (  v_subproject_nummer
            ,  TRIM(v_subproject_omschr)
            ,  1
            ,  s_project_nummer
            ,  fac.safe_to_date(v_subproject_prijspeildatum, 'dd-mm-yyyy')
            ,  v_subproject_notes
            ,  fac.safe_To_Integer(v_subproject_fase_nr)
            ,  v_subproject_fase_omschr
            ,  fac.safe_To_Integer(v_subproject_soort_nr)
            ,  v_subproject_soort_omschr
            );
            p_subproject_nummer := v_subproject_nummer;
         END IF;
      END IF;
   END; --imp_subproject

   PROCEDURE imp_rubriek( p_line       IN OUT VARCHAR2
                        , p_rubriek_nr    OUT VARCHAR2)
   IS
      v_rubriek_nr                 VARCHAR2 (256); --034 RUNUMMER           :rubriek volgnummer
      v_rubriek_omschr             VARCHAR2 (256); --035 RUOMSCHR           :rubriek omschrijving
      s_project_nummer             VARCHAR2 (256); --003 PRNUMMER           :projectnummer      (discipline)
      s_subproject_code            VARCHAR2 (256); --014 SPNUMMER           :code subproject    (project)
      v_count_rubriek              NUMBER (3);
   BEGIN
      fac.imp_getfield (p_line, c_delim, v_rubriek_nr);
      fac.imp_getfield (p_line, c_delim, v_rubriek_omschr);
      --
      p_rubriek_nr := NULL;
      v_rubriek_nr := TRIM(v_rubriek_nr);
      IF (v_rubriek_nr IS NOT NULL) THEN
         fac.imp_getfield_nr(v_searchline, c_delim,  3, s_project_nummer);
         fac.imp_getfield_nr(v_searchline, c_delim, 14, s_subproject_code);
         SELECT COUNT(*)
           INTO v_count_rubriek
           FROM twyn_imp_kostenrubriek
          WHERE bgt_project_code = s_subproject_code
            AND bgt_kostenrubriek_code = v_rubriek_nr;

         IF (v_count_rubriek = 0) THEN
            INSERT INTO twyn_imp_kostenrubriek
            (  bgt_project_discipline
            ,  bgt_project_code
            ,  bgt_kostenrubriek_code
            ,  bgt_kostenrubriek_oms
            )
            VALUES
            (  s_project_nummer
            ,  s_subproject_code
            ,  v_rubriek_nr
            ,  TRIM(v_rubriek_omschr)
            );
            p_rubriek_nr := v_rubriek_nr;
         END IF;
      END IF;
   END; --imp_rubriek

   PROCEDURE imp_groep( p_line     IN OUT VARCHAR2
                      , p_groep_nr    OUT VARCHAR2)
   IS
      v_groep_nr                   VARCHAR2 (256); --036 GRNUMMER           :groep volgnummer
      v_groep_omschr               VARCHAR2 (256); --037 GrOMSCHR           :groep omoschrijving
      s_project_nummer             VARCHAR2 (256); --003 PRNUMMER           :projectnummer      (discipline)
      s_subproject_code            VARCHAR2 (256); --014 SPNUMMER           :code subproject    (project)
      s_rubriek_nr                 VARCHAR2 (256); --034 RUNUMMER           :rubriek volgnummer (rubriek)
      v_count_groep                NUMBER (3);
   BEGIN
      fac.imp_getfield (p_line, c_delim, v_groep_nr);
      fac.imp_getfield (p_line, c_delim, v_groep_omschr);
      --
      p_groep_nr := NULL;
      v_groep_nr := TRIM(v_groep_nr);
      IF (v_groep_nr IS NOT NULL) THEN
         fac.imp_getfield_nr(v_searchline, c_delim,  3, s_project_nummer);
         fac.imp_getfield_nr(v_searchline, c_delim, 14, s_subproject_code);
         fac.imp_getfield_nr(v_searchline, c_delim, 34, s_rubriek_nr);
         SELECT COUNT(*)
           INTO v_count_groep
           FROM twyn_imp_kostensoortgrp
          WHERE bgt_project_code = s_subproject_code
            AND bgt_kostenrubriek_code = s_rubriek_nr
            AND prs_kostensoortgrp_altcode = v_groep_nr;

         IF (v_count_groep = 0) THEN
            INSERT INTO twyn_imp_kostensoortgrp
            (  bgt_project_discipline
            ,  bgt_project_code
            ,  bgt_kostenrubriek_code
            ,  prs_kostensoortgrp_altcode
            ,  prs_kostensoortgrp_oms
            )
            VALUES
            (  s_project_nummer
            ,  s_subproject_code
            ,  s_rubriek_nr
            ,  v_groep_nr
            ,  TRIM(v_groep_omschr)
            );
            p_groep_nr := v_groep_nr;
         END IF;
      END IF;
   END; --imp_groep

   PROCEDURE imp_onderdeel( p_line         IN OUT VARCHAR2
                          , p_onderdeel_nr    OUT VARCHAR2)
   IS
      v_onderdeel_nr               VARCHAR2 (256); --038 ONNUMMER              :onderdeel nummer
      v_onderdeel_omschr           VARCHAR2 (256); --039 ONOMSCHR              :onderdeel omschrijving
      v_nn_040                     VARCHAR2 (256); --040 ONOPMERK              :onderdeel opmerking
      v_nn_041                     VARCHAR2 (256); --041 ONIDXTABEL            :indextabel
      v_nn_042                     VARCHAR2 (256); --042 ONI_EDATUM            :einddatum
      s_project_nummer             VARCHAR2 (256); --003 PRNUMMER              :projectnummer      (discipline)
      s_subproject_code            VARCHAR2 (256); --014 SPNUMMER              :code subproject    (project)
      s_rubriek_nr                 VARCHAR2 (256); --034 RUNUMMER              :rubriek volgnummer (rubriek)
      s_groep_nr                   VARCHAR2 (256); --036 GRNUMMER              :groep volgnummer   (groep)
      s_btw_code                   VARCHAR2 (256); --094 COBTCODE              :btw code
      s_btw_waarde                 VARCHAR2 (256); --095 COBTBTW               :btw waarde
      v_count_onderdeel            NUMBER (3);
   BEGIN
      fac.imp_getfield (p_line, c_delim, v_onderdeel_nr);
      fac.imp_getfield (p_line, c_delim, v_onderdeel_omschr);
      fac.imp_getfield (p_line, c_delim, v_nn_040);
      fac.imp_getfield (p_line, c_delim, v_nn_041);
      fac.imp_getfield (p_line, c_delim, v_nn_042);
      --
      p_onderdeel_nr := NULL;
      v_onderdeel_nr := TRIM(v_onderdeel_nr);
      IF (v_onderdeel_nr IS NOT NULL) THEN
         fac.imp_getfield_nr(v_searchline, c_delim,  3, s_project_nummer);
         fac.imp_getfield_nr(v_searchline, c_delim, 14, s_subproject_code);
         fac.imp_getfield_nr(v_searchline, c_delim, 34, s_rubriek_nr);
         fac.imp_getfield_nr(v_searchline, c_delim, 36, s_groep_nr);
         fac.imp_getfield_nr(v_searchline, c_delim, 94, s_btw_code);
         fac.imp_getfield_nr(v_searchline, c_delim, 95, s_btw_waarde);

         SELECT COUNT(*)
           INTO v_count_onderdeel
           FROM twyn_imp_kostensoort
          WHERE bgt_project_code = s_subproject_code
            AND bgt_kostenrubriek_code = s_rubriek_nr
            AND prs_kostensoortgrp_altcode = s_groep_nr
            AND prs_kostensoort_oms = v_onderdeel_nr;

         IF (v_count_onderdeel = 0) THEN
            INSERT INTO twyn_imp_kostensoort
            (  bgt_project_discipline
            ,  bgt_project_code
            ,  bgt_kostenrubriek_code
            ,  prs_kostensoortgrp_altcode
            ,  prs_kostensoort_oms
            ,  prs_kostensoort_opmerking
            ,  bgt_btw_code
            ,  bgt_btw_waarde
            )
            VALUES
            (  s_project_nummer
            ,  s_subproject_code
            ,  s_rubriek_nr
            ,  s_groep_nr
            ,  v_onderdeel_nr
            ,  TRIM(v_onderdeel_omschr)
            ,  s_btw_code
            ,  fac.safe_To_Integer(s_btw_waarde)
            );
         END IF;
         p_onderdeel_nr := v_onderdeel_nr;
         --
         IF (s_btw_code IS NOT NULL) THEN
            UPDATE twyn_imp_kostensoort
               SET bgt_btw_code = s_btw_code
                 , bgt_btw_waarde = fac.safe_To_Integer(s_btw_waarde)
             WHERE bgt_btw_code IS NULL
               AND bgt_project_discipline = s_project_nummer
               AND bgt_project_code = s_subproject_code
               AND bgt_kostenrubriek_code = s_rubriek_nr
               AND prs_kostensoortgrp_altcode = s_groep_nr
               AND prs_kostensoort_oms = v_onderdeel_nr;
         END IF;
      END IF;
   END; --imp_onderdeel

   PROCEDURE imp_budget( p_line      IN OUT VARCHAR2
                       , p_budget_nr    OUT VARCHAR2)
   IS
      v_budget_nr                  VARCHAR2 (256); --043 BUNUMMER           :budgetnummer/meer-minder-code/reserve-code
      v_budget_omschr              VARCHAR2 (256); --044 BUOMSCHR           :omschrijving
      v_budget_meerminder          VARCHAR2 (256); --045 BUMEERMIND         :is meer-minder werk
      v_budget_init                VARCHAR2 (256); --046 BUBEDRINIT         :startbedrag
      v_nn_047                     VARCHAR2 (256); --047 BUWBRBINIT         :
      v_nn_048                     VARCHAR2 (256); --048 BUPSTIJGIN         :prijsstijging
      v_budget_mutatie             VARCHAR2 (256); --049 BUBEDRMUT          :bedrag mutatie
      v_nn_050                     VARCHAR2 (256); --050 BUWBRBMUT          :
      v_budget_reserve_mut         VARCHAR2 (256); --051 BUBEDRMUTR         :bedrag mutatie reserve
      v_nn_052                     VARCHAR2 (256); --052 BUBEDRMMW          :bedrag meer-minder werk
      v_nn_053                     VARCHAR2 (256); --053 BUWBRBMMW
      v_budget_reserve             VARCHAR2 (256); --054 BURESERVE          :bedrag reserve
      v_nn_055                     VARCHAR2 (256); --055 BUWBRRESRV
      v_nn_056                     VARCHAR2 (256); --056 BUWBRRESR
      v_nn_057                     VARCHAR2 (256); --057 BUWBRRES
      v_nn_058                     VARCHAR2 (256); --058 BUWBRRESR2
      v_nn_059                     VARCHAR2 (256); --059 BURESERVE2
      v_budget_type                VARCHAR2 (256); --060 BUTYPE             :budget type
      v_budget_datum               VARCHAR2 (256); --061 BUDATUM            :datum
      v_nn_062                     VARCHAR2 (256); --062 BUSTATUS           :status
      v_nn_063                     VARCHAR2 (256); --063 BUKSOORT           :kostensoort
      v_nn_064                     VARCHAR2 (256); --064 BUSORTNR           :
      v_nn_065                     VARCHAR2 (256); --065 KOOMSCHR
      v_nn_066                     VARCHAR2 (256); --066 BSSTATUS
      s_project_nummer             VARCHAR2 (256); --003 PRNUMMER           :projectnummer      (discipline)
      s_subproject_code            VARCHAR2 (256); --014 SPNUMMER           :code subproject    (project)
      s_rubriek_nr                 VARCHAR2 (256); --034 RUNUMMER           :rubriek volgnummer (rubriek)
      s_groep_nr                   VARCHAR2 (256); --036 GRNUMMER           :groep volgnummer   (groep)
      s_onderdeel_nr               VARCHAR2 (256); --038 ONNUMMER           :onderdeel nummer   (soort)
   BEGIN
      fac.imp_getfield (p_line, c_delim, v_budget_nr);
      fac.imp_getfield (p_line, c_delim, v_budget_omschr);
      fac.imp_getfield (p_line, c_delim, v_budget_meerminder);
      fac.imp_getfield (p_line, c_delim, v_budget_init);
      fac.imp_getfield (p_line, c_delim, v_nn_047);
      fac.imp_getfield (p_line, c_delim, v_nn_048);
      fac.imp_getfield (p_line, c_delim, v_budget_mutatie);
      fac.imp_getfield (p_line, c_delim, v_nn_050);
      fac.imp_getfield (p_line, c_delim, v_budget_reserve_mut);
      fac.imp_getfield (p_line, c_delim, v_nn_052);
      fac.imp_getfield (p_line, c_delim, v_nn_053);
      fac.imp_getfield (p_line, c_delim, v_budget_reserve);
      fac.imp_getfield (p_line, c_delim, v_nn_055);
      fac.imp_getfield (p_line, c_delim, v_nn_056);
      fac.imp_getfield (p_line, c_delim, v_nn_057);
      fac.imp_getfield (p_line, c_delim, v_nn_058);
      fac.imp_getfield (p_line, c_delim, v_nn_059);
      fac.imp_getfield (p_line, c_delim, v_budget_type);
      fac.imp_getfield (p_line, c_delim, v_budget_datum);
      fac.imp_getfield (p_line, c_delim, v_nn_062);
      fac.imp_getfield (p_line, c_delim, v_nn_063);
      fac.imp_getfield (p_line, c_delim, v_nn_064);
      fac.imp_getfield (p_line, c_delim, v_nn_065);
      fac.imp_getfield (p_line, c_delim, v_nn_066);

      p_budget_nr := NULL;
      v_budget_nr := TRIM(v_budget_nr);
      -- geldige budgetrecords hebben een geldige datum (anders nl "0-1-1900")
      IF (isDate(v_budget_datum) = 1 ) THEN
         fac.imp_getfield_nr(v_searchline, c_delim,  3, s_project_nummer);
         fac.imp_getfield_nr(v_searchline, c_delim, 14, s_subproject_code);
         fac.imp_getfield_nr(v_searchline, c_delim, 34, s_rubriek_nr);
         fac.imp_getfield_nr(v_searchline, c_delim, 36, s_groep_nr);
         fac.imp_getfield_nr(v_searchline, c_delim, 38, s_onderdeel_nr);
         IF (v_budget_type IN ('N','R','P','B')) THEN
            INSERT INTO twyn_imp_budget
            (  bgt_nr
            ,  bgt_oms
            ,  bgt_discipline
            ,  bgt_project
            ,  bgt_kostenrubriek
            ,  bgt_kostensoortgrp
            ,  bgt_kostensoort
            ,  bgt_meerminder
            ,  bgt_datum
            ,  bedr_init_excl
            ,  bedr_mut_excl
            ,  bedr_res_mut_excl
            ,  bedr_mmw_excl
            ,  reserve
            ,  reserve2
            ,  type
            ,  status
            ,  kostensoort
            ,  soortnr
            )
            VALUES
            (  v_budget_nr
            ,  v_budget_omschr
            ,  s_project_nummer
            ,  s_subproject_code
            ,  s_rubriek_nr
            ,  s_groep_nr
            ,  s_onderdeel_nr
            ,  CASE WHEN v_budget_meerminder = 'WAAR' THEN 1 ELSE 0 END
            ,  fac.safe_to_date(v_budget_datum, 'dd-mm-yyyy')
            ,  fac.safe_To_Number( REPLACE(v_budget_init,        ',', '.') )
            ,  fac.safe_To_Number( REPLACE(v_budget_mutatie,     ',', '.') )
            ,  fac.safe_To_Number( REPLACE(v_budget_reserve,     ',', '.') )
            ,  fac.safe_To_Number( REPLACE(v_nn_052,             ',', '.') )
            ,  fac.safe_To_Number( REPLACE(v_budget_reserve_mut, ',', '.') )
            ,  fac.safe_To_Number( REPLACE(v_nn_059,             ',', '.') )
            ,  TRIM(v_budget_type)
            ,  fac.safe_To_Integer(v_nn_062)
            ,  v_nn_063
            ,  fac.safe_To_Integer(v_nn_064)
            );
            p_budget_nr := v_budget_nr;
         END IF;
      END IF;
   END; --imp_budget

   PROCEDURE imp_contract( p_line         IN OUT VARCHAR2
                         , p_contract_nr     OUT NUMBER
                         , p_contract_volgnr OUT NUMBER)
   IS
      v_contract_nr                VARCHAR2 (256); --067 CONUMMER
      v_contract_volgnr            VARCHAR2 (256); --068 COSUBNUMME
      v_contract_meerminder        VARCHAR2 (256); --069 COMEERMIND
      v_bedrijf_code               VARCHAR2 (256); --070 COCONTTNT
      v_contract_omschr            VARCHAR2 (256); --071 COOMSCHR
      v_contract_datum             VARCHAR2 (256); --072 CODATUM
      v_contract_bedrag_excl       VARCHAR2 (256); --073 COBEDRAG
      v_nn_074                     VARCHAR2 (256); --074 COWBRBEDR
      v_nn_075                     VARCHAR2 (256); --075 COBEDRMMW
      v_nn_076                     VARCHAR2 (256); --076 COBEDRBMMW
      v_nn_077                     VARCHAR2 (256); --077 COWBRBEMMW
      v_contract_bedrag_btw        VARCHAR2 (256); --078 COBEDRAGBT
      v_nn_079                     VARCHAR2 (256); --079 COWBRBBTW
      v_nn_080                     VARCHAR2 (256); --080 COBWTTARIE
      v_contract_bedrag_incl       VARCHAR2 (256); --081 COEBEDRAG
      v_nn_082                     VARCHAR2 (256); --082 COOLDBEDRA
      v_nn_083                     VARCHAR2 (256); --083 COOLDBTW
      v_nn_084                     VARCHAR2 (256); --084 COOLDPSTIJ
      v_nn_085                     VARCHAR2 (256); --085 COPSTIJGIN
      v_nn_086                     VARCHAR2 (256); --086 COEDATUM
      v_contract_kenmerk           VARCHAR2 (256); --087 COKENMERK
      v_nn_088                     VARCHAR2 (256); --088 COMMWNR
      v_nn_089                     VARCHAR2 (256); --089 COMMWSTATU
      v_nn_090                     VARCHAR2 (256); --090 COBEDRRAM
      v_nn_091                     VARCHAR2 (256); --091 COBEDRDEF
      v_contract_status            VARCHAR2 (256); --092 COSTATUS           :contractstatus key
      v_nn_093                     VARCHAR2 (256); --093 COWITHFA
      v_nn_094                     VARCHAR2 (256); --094 COBTCODE           :btw code
      v_nn_095                     VARCHAR2 (256); --095 COBTBTW            :btw waarde
      v_nn_096                     VARCHAR2 (256); --096 CSSTATUS           :contractstatus omschrijving
      v_is_contract                VARCHAR2 (256); --097 COISCONTR          :iscontract
      s_factuur_nr                 VARCHAR2 (256); --107 FANUMMER           :factuurnummer
      s_grootboek_nr               VARCHAR2 (256); --121 GRB                :grootboek nummer
      s_grootboek_oms              VARCHAR2 (256); --124 GRB_OMSCHR         :grootboek omschrijving
      s_project_nummer             VARCHAR2 (256); --003 PRNUMMER           :projectnummer      (discipline)
      s_subproject_code            VARCHAR2 (256); --014 SPNUMMER           :code subproject    (project)
      s_rubriek_nr                 VARCHAR2 (256); --034 RUNUMMER           :rubriek volgnummer (rubriek)
      s_groep_nr                   VARCHAR2 (256); --036 GRNUMMER           :groep volgnummer   (groep)
      s_onderdeel_nr               VARCHAR2 (256); --038 ONNUMMER           :onderdeel nummer   (soort)
      v_count_contract             NUMBER(3);
      v_i_contract_nr              NUMBER(10);
      v_i_factuur_nr               NUMBER(10);
      v_i_grootboek_nr             NUMBER(10);
      v_i_iscontract               NUMBER(1);
   BEGIN
      fac.imp_getfield (p_line, c_delim, v_contract_nr);
      fac.imp_getfield (p_line, c_delim, v_contract_volgnr);
      fac.imp_getfield (p_line, c_delim, v_contract_meerminder);
      fac.imp_getfield (p_line, c_delim, v_bedrijf_code);
      fac.imp_getfield (p_line, c_delim, v_contract_omschr);
      fac.imp_getfield (p_line, c_delim, v_contract_datum);
      fac.imp_getfield (p_line, c_delim, v_contract_bedrag_excl);
      fac.imp_getfield (p_line, c_delim, v_nn_074);
      fac.imp_getfield (p_line, c_delim, v_nn_075);
      fac.imp_getfield (p_line, c_delim, v_nn_076);
      fac.imp_getfield (p_line, c_delim, v_nn_077);
      fac.imp_getfield (p_line, c_delim, v_contract_bedrag_btw);
      fac.imp_getfield (p_line, c_delim, v_nn_079);
      fac.imp_getfield (p_line, c_delim, v_nn_080);
      fac.imp_getfield (p_line, c_delim, v_contract_bedrag_incl);
      fac.imp_getfield (p_line, c_delim, v_nn_082);
      fac.imp_getfield (p_line, c_delim, v_nn_083);
      fac.imp_getfield (p_line, c_delim, v_nn_084);
      fac.imp_getfield (p_line, c_delim, v_nn_085);
      fac.imp_getfield (p_line, c_delim, v_nn_086);
      fac.imp_getfield (p_line, c_delim, v_contract_kenmerk);
      fac.imp_getfield (p_line, c_delim, v_nn_088);
      fac.imp_getfield (p_line, c_delim, v_nn_089);
      fac.imp_getfield (p_line, c_delim, v_nn_090);
      fac.imp_getfield (p_line, c_delim, v_nn_091);
      fac.imp_getfield (p_line, c_delim, v_contract_status);
      fac.imp_getfield (p_line, c_delim, v_nn_093);
      fac.imp_getfield (p_line, c_delim, v_nn_094);
      fac.imp_getfield (p_line, c_delim, v_nn_095);
      fac.imp_getfield (p_line, c_delim, v_nn_096);
      fac.imp_getfield (p_line, c_delim, v_is_contract);

      fac.imp_getfield_nr(v_searchline, c_delim, 107, s_factuur_nr);
      fac.imp_getfield_nr(v_searchline, c_delim, 121, s_grootboek_nr);
      fac.imp_getfield_nr(v_searchline, c_delim, 124, s_grootboek_oms);

      p_contract_nr := fac.safe_To_Integer(v_contract_nr);
      p_contract_volgnr := fac.safe_To_Integer(v_contract_volgnr);

      v_i_contract_nr  := fac.safe_To_Integer(v_contract_nr);
      v_i_factuur_nr   := fac.safe_To_Integer(s_factuur_nr);
      v_i_grootboek_nr := fac.safe_To_Integer(s_grootboek_nr);
      v_i_iscontract   := fac.safe_To_Integer(v_is_contract);

      IF (   (v_i_iscontract = 1)
         AND (v_i_contract_nr > 0)
         AND (v_i_factuur_nr = 0)
         ) THEN
         fac.imp_getfield_nr(v_searchline, c_delim,  3, s_project_nummer);
         fac.imp_getfield_nr(v_searchline, c_delim, 14, s_subproject_code);
         fac.imp_getfield_nr(v_searchline, c_delim, 34, s_rubriek_nr);
         fac.imp_getfield_nr(v_searchline, c_delim, 36, s_groep_nr);
         fac.imp_getfield_nr(v_searchline, c_delim, 38, s_onderdeel_nr);

         SELECT COUNT(*)
           INTO v_count_contract
           FROM twyn_imp_contract
          WHERE bgt_contract_nr = p_contract_nr
            AND bgt_contract_volgnr = p_contract_volgnr;

         IF (v_count_contract = 0) THEN
            INSERT INTO twyn_imp_contract
            (  bgt_contract_nr
            ,  bgt_contract_volgnr
            ,  bgt_contract_meerminder
            ,  bgt_bedrijf_code
            ,  bgt_contract_omschr
            ,  bgt_contract_datum
            ,  bgt_contract_bedrag_excl
            ,  bgt_contract_bedrag_btw
            ,  bgt_contract_bedrag_incl
            ,  bgt_contract_status
            ,  bgt_contract_referentie
            ,  bgt_discipline_code
            ,  bgt_project_code
            ,  bgt_kostenrubriek_code
            ,  prs_kostensoortgrp_code
            ,  prs_kostensoort_code
            ,  prs_kostenplaats_nr
            ,  prs_kostenplaats_oms
            )
            VALUES
            (  p_contract_nr
            ,  p_contract_volgnr
            ,  fac.safe_To_Integer(v_contract_meerminder)
            ,  v_bedrijf_code
            ,  v_contract_omschr
            ,  fac.safe_to_date(v_contract_datum, 'dd-mm-yyyy')
            ,  fac.safe_To_Number( REPLACE(v_contract_bedrag_excl, ',', '.') )
            ,  fac.safe_To_Number( REPLACE(v_contract_bedrag_btw,  ',', '.') )
            ,  fac.safe_To_Number( REPLACE(v_contract_bedrag_incl, ',', '.') )
            ,  fac.safe_To_Number(v_contract_status)
            ,  v_contract_kenmerk
            ,  s_project_nummer
            ,  s_subproject_code
            ,  s_rubriek_nr
            ,  s_groep_nr
            ,  s_onderdeel_nr
            ,  fac.safe_To_Integer(s_grootboek_nr)
            ,  s_grootboek_oms
            );
         END IF;
      END IF;
   END; --imp_contract

   PROCEDURE imp_contractant( p_line      IN OUT VARCHAR2
                            , p_bedrijf_code OUT VARCHAR2)
   IS
      v_bedrijf_code               VARCHAR2 (256); --098 CNNUMMER
      v_bedrijf_naam               VARCHAR2 (256); --099 CNNAAM
      v_bedrijf_adres              VARCHAR2 (256); --100 CNADRES
      v_bedrijf_postcode           VARCHAR2 (256); --101 CNPOSTCODE
      v_bedrijf_plaats             VARCHAR2 (256); --102 CNPLAATS
      v_bedrijf_contactpers        VARCHAR2 (256); --103 CNCTCTPERS
      v_bedrijf_telnr              VARCHAR2 (256); --104 CNTELNR
      v_bedrijf_faxnr              VARCHAR2 (256); --105 CNFAXNR
      v_bedrijf_debiteurnr         VARCHAR2 (256); --106 CNDEBNR
      v_count_bedrijf              NUMBER (3);
   BEGIN
      fac.imp_getfield (p_line, c_delim, v_bedrijf_code);
      fac.imp_getfield (p_line, c_delim, v_bedrijf_naam);
      fac.imp_getfield (p_line, c_delim, v_bedrijf_adres);
      fac.imp_getfield (p_line, c_delim, v_bedrijf_postcode);
      fac.imp_getfield (p_line, c_delim, v_bedrijf_plaats);
      fac.imp_getfield (p_line, c_delim, v_bedrijf_contactpers);
      fac.imp_getfield (p_line, c_delim, v_bedrijf_telnr);
      fac.imp_getfield (p_line, c_delim, v_bedrijf_faxnr);
      fac.imp_getfield (p_line, c_delim, v_bedrijf_debiteurnr);
      --
      p_bedrijf_code := NULL;
      IF (v_bedrijf_code IS NOT NULL) THEN
         SELECT COUNT(*)
           INTO v_count_bedrijf
           FROM fac_imp_ext_bedrijf
          WHERE prs_bedrijf_overig1 = v_bedrijf_code;

         IF (v_count_bedrijf = 0) THEN
            INSERT INTO fac_imp_ext_bedrijf
            (  prs_bedrijf_naam
            ,  prs_bedrijf_bezoek_adres
            ,  prs_bedrijf_bezoek_postcode
            ,  prs_bedrijf_bezoek_plaats
            ,  prs_bedrijf_telefoon
            ,  prs_bedrijf_fax
            ,  prs_bedrijf_contact_persoon
            ,  prs_bedrijf_overig1
            )
            VALUES
            (  v_bedrijf_naam
            ,  v_bedrijf_adres
            ,  v_bedrijf_postcode
            ,  v_bedrijf_plaats
            ,  v_bedrijf_telnr
            ,  v_bedrijf_faxnr
            ,  v_bedrijf_contactpers
            ,  v_bedrijf_code
            );
         ELSE
            UPDATE (SELECT prs_bedrijf_bezoek_adres
                         , prs_bedrijf_bezoek_postcode
                         , prs_bedrijf_bezoek_plaats
                         , prs_bedrijf_telefoon
                         , prs_bedrijf_fax
                         , prs_bedrijf_contact_persoon
                         , prs_bedrijf_overig1
                      FROM fac_imp_ext_bedrijf
                     WHERE prs_bedrijf_overig1 = v_bedrijf_code
                   )
               SET prs_bedrijf_bezoek_adres    = COALESCE(v_bedrijf_adres,       prs_bedrijf_bezoek_adres)
                 , prs_bedrijf_bezoek_postcode = COALESCE(v_bedrijf_postcode,    prs_bedrijf_bezoek_postcode)
                 , prs_bedrijf_bezoek_plaats   = COALESCE(v_bedrijf_plaats,      prs_bedrijf_bezoek_plaats)
                 , prs_bedrijf_telefoon        = COALESCE(v_bedrijf_telnr,       prs_bedrijf_telefoon)
                 , prs_bedrijf_fax             = COALESCE(v_bedrijf_faxnr,       prs_bedrijf_fax)
                 , prs_bedrijf_contact_persoon = COALESCE(v_bedrijf_contactpers, prs_bedrijf_contact_persoon);
         END IF;
         p_bedrijf_code := v_bedrijf_code;
      END IF;
   END; --imp_contractant

   PROCEDURE imp_factuur( p_line        IN OUT VARCHAR2
                        , p_factuur_nr     OUT NUMBER
                        , p_factuur_volgnr OUT NUMBER)
   IS
      v_factuur_nr                 VARCHAR2 (256); --107 FANUMMER
      v_factuur_volgnr             VARCHAR2 (256); --108 FASUBNUMME
      v_factuur_refnr              VARCHAR2 (256); --109 FACNTTNTNR
      v_factuur_omschr             VARCHAR2 (256); --110 FAOMSCHR
      v_factuur_datum              VARCHAR2 (256); --111 FADATUM
      v_nn_112                     VARCHAR2 (256); --112 FACOBEDRAG
      v_nn_113                     VARCHAR2 (256); --113 FACOEBEDRA
      v_nn_114                     VARCHAR2 (256); --114 FACOBEDRBT
      v_factuur_bedrag_excl        VARCHAR2 (256); --115 FABEDRAG
      v_factuur_bedrag_btw         VARCHAR2 (256); --116 FABEDRAGBT
      v_nn_117                     VARCHAR2 (256); --117 FABTWTARIE
      v_factuur_bedrag_incl        VARCHAR2 (256); --118 FAEBEDRAG
      v_factuur_adviesdatum        VARCHAR2 (256); --119 FAADVDAT
      v_nn_120                     VARCHAR2 (256); --120 FASTATUS
      v_factuur_grootboek          VARCHAR2 (256); --121 GRB
      v_nn_122                     VARCHAR2 (256); --122 GRB2
      v_nn_123                     VARCHAR2 (256); --123 GRBNummer
      v_nn_124                     VARCHAR2 (256); --124 GRB_OMSCHR
      v_nn_125                     VARCHAR2 (256); --125 FABTCODE
      v_nn_126                     VARCHAR2 (256); --126 FABTBTW
      v_factuur_status             VARCHAR2 (256); --127 FSSTATUS
      v_nn_128                     VARCHAR2 (256); --128 INNUMMER
      v_nn_129                     VARCHAR2 (256); --129 INNAAM
      v_nn_130                     VARCHAR2 (256); --130 INPERIODE
      v_nn_131                     VARCHAR2 (256); --131 INCIJFER
      v_nn_132                     VARCHAR2 (256); --132 RecordType
      s_project_nummer             VARCHAR2 (256); --003 PRNUMMER           :projectnummer      (discipline)
      s_subproject_code            VARCHAR2 (256); --014 SPNUMMER           :code subproject    (project)
      s_rubriek_nr                 VARCHAR2 (256); --034 RUNUMMER           :rubriek volgnummer (rubriek)
      s_groep_nr                   VARCHAR2 (256); --036 GRNUMMER           :groep volgnummer   (groep)
      s_onderdeel_nr               VARCHAR2 (256); --038 ONNUMMER           :onderdeel nummer   (soort)
      s_contract_nr                VARCHAR2 (256); --067 CONUMMER
      s_contract_volgnr            VARCHAR2 (256); --068 COSUBNUMME
      s_contract_kenmerk           VARCHAR2 (256); --087 COKENMERK
   BEGIN
      fac.imp_getfield (v_newline, c_delim, v_factuur_nr);
      fac.imp_getfield (v_newline, c_delim, v_factuur_volgnr);
      fac.imp_getfield (v_newline, c_delim, v_factuur_refnr);
      fac.imp_getfield (v_newline, c_delim, v_factuur_omschr);
      fac.imp_getfield (v_newline, c_delim, v_factuur_datum);
      fac.imp_getfield (v_newline, c_delim, v_nn_112);
      fac.imp_getfield (v_newline, c_delim, v_nn_113);
      fac.imp_getfield (v_newline, c_delim, v_nn_114);
      fac.imp_getfield (v_newline, c_delim, v_factuur_bedrag_excl);
      fac.imp_getfield (v_newline, c_delim, v_factuur_bedrag_btw);
      fac.imp_getfield (v_newline, c_delim, v_nn_117);
      fac.imp_getfield (v_newline, c_delim, v_factuur_bedrag_incl);
      fac.imp_getfield (v_newline, c_delim, v_factuur_adviesdatum);
      fac.imp_getfield (v_newline, c_delim, v_nn_120);
      fac.imp_getfield (v_newline, c_delim, v_factuur_grootboek);
      fac.imp_getfield (v_newline, c_delim, v_nn_122);
      fac.imp_getfield (v_newline, c_delim, v_nn_123);
      fac.imp_getfield (v_newline, c_delim, v_nn_124);
      fac.imp_getfield (v_newline, c_delim, v_nn_125);
      fac.imp_getfield (v_newline, c_delim, v_nn_126);
      fac.imp_getfield (v_newline, c_delim, v_factuur_status);
      fac.imp_getfield (v_newline, c_delim, v_nn_128);
      fac.imp_getfield (v_newline, c_delim, v_nn_129);
      fac.imp_getfield (v_newline, c_delim, v_nn_130);
      fac.imp_getfield (v_newline, c_delim, v_nn_131);
      fac.imp_getfield (v_newline, c_delim, v_nn_132);

      p_factuur_nr := fac.safe_To_Integer(v_factuur_nr);
      p_factuur_volgnr := fac.safe_To_Integer(v_factuur_volgnr);
      IF (isDate(v_factuur_datum) = 1 AND p_factuur_nr > 0) THEN
         fac.imp_getfield_nr(v_searchline, c_delim,  3, s_project_nummer);
         fac.imp_getfield_nr(v_searchline, c_delim, 14, s_subproject_code);
         fac.imp_getfield_nr(v_searchline, c_delim, 34, s_rubriek_nr);
         fac.imp_getfield_nr(v_searchline, c_delim, 36, s_groep_nr);
         fac.imp_getfield_nr(v_searchline, c_delim, 38, s_onderdeel_nr);
         fac.imp_getfield_nr(v_searchline, c_delim, 67, s_contract_nr);
         fac.imp_getfield_nr(v_searchline, c_delim, 68, s_contract_volgnr);
         fac.imp_getfield_nr(v_searchline, c_delim, 87, s_contract_kenmerk);

         INSERT INTO twyn_imp_factuur
         (  bgt_factuur_nr
         ,  bgt_factuur_volgnr
         ,  bgt_factuur_refnr
         ,  bgt_factuur_omschr
         ,  bgt_factuur_datum
         ,  bgt_factuur_bedrag_excl
         ,  bgt_factuur_bedrag_btw
         ,  bgt_factuur_bedrag_incl
         ,  bgt_factuur_adviesdatum
         ,  bgt_factuur_grootboek
         ,  bgt_factuur_status
         ,  bgt_contract_nr
         ,  bgt_contract_volgnr
         ,  bgt_contract_referentie
         ,  bgt_discipline_code
         ,  bgt_project_code
         ,  bgt_kostenrubriek_code
         ,  prs_kostensoortgrp_code
         ,  prs_kostensoort_code
         )
         VALUES
         (  p_factuur_nr
         ,  p_factuur_volgnr
         ,  SUBSTR(v_factuur_refnr, 1, 12)
         ,  v_factuur_omschr
         ,  fac.safe_to_date(v_factuur_datum, 'dd-mm-yyyy')
         ,  fac.safe_To_Number( REPLACE(v_factuur_bedrag_excl, ',', '.') )
         ,  fac.safe_To_Number( REPLACE(v_factuur_bedrag_btw , ',', '.') )
         ,  fac.safe_To_Number( REPLACE(v_factuur_bedrag_incl, ',', '.') )
         ,  fac.safe_to_date(v_factuur_adviesdatum, 'dd-mm-yyyy')
         ,  fac.safe_To_Integer(v_factuur_grootboek)
         ,  v_factuur_status
         ,  s_contract_nr
         ,  s_contract_volgnr
         ,  s_contract_kenmerk
         ,  s_project_nummer
         ,  s_subproject_code
         ,  s_rubriek_nr
         ,  s_groep_nr
         ,  s_onderdeel_nr
         );
      END IF;
   END; --imp_factuur

   PROCEDURE nabewerken_budget(p_import_key IN NUMBER)
   AS
      CURSOR c_budget
      IS
         SELECT key
              , bgt_discipline
              , bgt_project
              , bgt_kostenrubriek
              , bgt_kostensoortgrp
              , bgt_kostensoort
              , bgt_datum
              , bedr_init_excl
              , bedr_mut_excl
              , bedr_init_btw
              , bedr_mut_btw
              , type
           FROM twyn_imp_budget
          WHERE type IN ('N','R');

      v_discipline  twyn_imp_budget.bgt_discipline%TYPE;
      v_project     twyn_imp_budget.bgt_project%TYPE;
      v_rubriek     twyn_imp_budget.bgt_kostenrubriek%TYPE;
      v_groep       twyn_imp_budget.bgt_kostensoortgrp%TYPE;
      v_soort       twyn_imp_budget.bgt_kostensoort%TYPE;
      v_datum       twyn_imp_budget.bgt_datum%TYPE;
      v_init_excl   twyn_imp_budget.bedr_init_excl%TYPE;
      v_mut_excl    twyn_imp_budget.bedr_mut_excl%TYPE;
      v_type        twyn_imp_budget.type%TYPE;
   BEGIN
      fac.imp_writelog (p_import_key, 'I', 'Nabewerken budget', NULL);
      v_errormsg := 'Fout bij nabewerken budget ';
      DELETE FROM twyn_imp_budget WHERE bgt_datum IS NULL;
      --
      UPDATE twyn_imp_budget i
         SET bedr_init_btw = (SELECT COALESCE(MAX(b.bedr_init_excl), 0)
                                FROM twyn_imp_budget b
                               WHERE b.type = 'B'
                                 AND b.bgt_datum = i.bgt_datum
                                 AND b.bgt_discipline = i.bgt_discipline
                                 AND b.bgt_project = i.bgt_project
                                 AND ((b.bgt_kostenrubriek = i.bgt_kostenrubriek   AND i.bgt_kostenrubriek  IS NOT NULL)   OR (b.bgt_kostenrubriek  IS NULL AND i.bgt_kostenrubriek  IS NULL))
                                 AND ((b.bgt_kostensoortgrp = i.bgt_kostensoortgrp AND i.bgt_kostensoortgrp IS NOT NULL)   OR (b.bgt_kostensoortgrp IS NULL AND i.bgt_kostensoortgrp IS NULL))
                                 AND ((b.bgt_kostensoort = i.bgt_kostensoort       AND i.bgt_kostensoort    IS NOT NULL)   OR (b.bgt_kostensoort    IS NULL AND i.bgt_kostensoort    IS NULL))
                             )
           , bedr_mut_btw =  (SELECT COALESCE(MAX(b.bedr_mut_excl), 0)
                                FROM twyn_imp_budget b
                               WHERE b.type = 'B'
                                 AND b.bgt_datum IS NOT NULL
                                 AND b.bgt_datum = i.bgt_datum
                                 AND b.bgt_discipline = i.bgt_discipline
                                 AND b.bgt_project = i.bgt_project
                                 AND ((b.bgt_kostenrubriek = i.bgt_kostenrubriek   AND i.bgt_kostenrubriek  IS NOT NULL) OR (b.bgt_kostenrubriek  IS NULL AND i.bgt_kostenrubriek  IS NULL))
                                 AND ((b.bgt_kostensoortgrp = i.bgt_kostensoortgrp AND i.bgt_kostensoortgrp IS NOT NULL) OR (b.bgt_kostensoortgrp IS NULL AND i.bgt_kostensoortgrp IS NULL))
                                 AND ((b.bgt_kostensoort = i.bgt_kostensoort       AND i.bgt_kostensoort    IS NOT NULL) OR (b.bgt_kostensoort    IS NULL AND i.bgt_kostensoort    IS NULL))
                                 AND (b.bgt_nr = i.bgt_nr)
                              )
       WHERE type IN ('N','R');
      --
      -- verrekenen btw van reserve en prijsstijging die samen zijn genomen.
      UPDATE twyn_imp_budget
         SET bedr_init_btw = (bedr_init_excl * (SELECT SUM(COALESCE(b.bedr_init_btw, 0)) / SUM(COALESCE(b.bedr_init_excl, 0))
                                                  FROM twyn_imp_budget b
                                                 WHERE b.type in ('R','P')
                                                   AND b.bedr_init_excl > 0
                                               )
                             )
       WHERE type in ('R','P')
         AND bedr_init_excl > 0;
      --
      -- De P-regels mogen er nu uit.
      DELETE FROM twyn_imp_budget WHERE type = 'P';
      --
      DELETE FROM twyn_imp_budget WHERE type = 'B';
      UPDATE twyn_imp_budget SET key = ROWNUM;
      COMMIT;
  EXCEPTION
      WHEN OTHERS THEN
         oracle_err_num := SQLCODE;
         oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
         v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ' r.'|| v_imp_count || ')';
         fac.imp_writelog (p_import_key,
                           'W',
                           v_aanduiding ||' * '|| v_errormsg,
                           v_errorhint);
   END; --nabewerken_budget;
--
--
BEGIN
   -- Eerst opruiming
   DELETE FROM twyn_imp_discipline;
   DELETE FROM twyn_imp_project;
   DELETE FROM twyn_imp_kostenrubriek;
   DELETE FROM twyn_imp_kostensoortgrp;
   DELETE FROM twyn_imp_kostensoort;
   DELETE FROM twyn_imp_budget;
   DELETE FROM twyn_imp_contract;
   DELETE FROM fac_imp_ext_bedrijf;
   DELETE FROM twyn_imp_factuur;


   FOR rec IN c1
   LOOP
      BEGIN
         v_aanduiding := NULL;
         v_errorhint := 'Fout inlezen importregel';
         v_newline := rec.fac_imp_file_line;
         v_ongeldig := 0;
         v_imp_count := v_imp_count + 1;

         IF (header_is_valid = 0)
         THEN
            -- Sla voorlopig de eerste regel gewoon over.
            -- Later misschien controleren of het een geldige header is.
            header_is_valid := 1;
         ELSIF rec.regellengte > 1                   -- Lege regels overslaan!
         THEN
            -- Lees alle veldwaarden
            v_searchline := v_newline; -- bewaar de oorspronkelijke regel om in te kunnen zoeken.
            --
            v_aanduiding := 'START';
            imp_skip(v_newline, 2);
            --
            v_aanduiding := 'PROJECT';
            imp_project(v_newline, k_project_code);
            --
            v_aanduiding := 'SUBPROJECT';
            imp_subproject(v_newline, k_subproject_code);
            --
            v_aanduiding := 'RUBRIEK';
            imp_rubriek(v_newline, k_rubriek_nr);
            --
            v_aanduiding := 'GROEP';
            imp_groep(v_newline, k_groep_nr);
            --
            v_aanduiding := 'ONDERDEEL';
            imp_onderdeel(v_newline, k_onderdeel_nr);
            --
            v_aanduiding := 'BUDGET';
            imp_budget(v_newline, k_budget_nr);
            --
            v_aanduiding := 'CONTRACT';
            imp_contract(v_newline, k_contract_nr, k_contract_volgnr);
            --
            v_aanduiding := 'CONTRACTANT';
            imp_contractant(v_newline, k_bedrijf_code);
            --
            v_aanduiding := 'FACTUUR';
            imp_factuur(v_newline, k_factuur_nr, k_factuur_volgnr);
            --
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ' r.'|| v_imp_count || ')';
            fac.imp_writelog (p_import_key,
                              'W',
                              v_aanduiding ||' * '|| v_errormsg,
                              v_errorhint);
      END;
   END LOOP;
   --
   nabewerken_budget(p_import_key);

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ' r.'|| v_imp_count || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Inlezen bgt conversie afgebroken!');
END twyn_import_reportdbf;
/

CREATE OR REPLACE PROCEDURE twyn_update_reportdbf (p_import_key IN NUMBER)
AS
   g_errormsg        VARCHAR2 (1000);
   g_errorhint       VARCHAR2 (1000);
   oracle_err_num    NUMBER;
   oracle_err_mes    VARCHAR2 (200);
   g_aanduiding      VARCHAR2 (200);
   g_perslid_key     NUMBER   (10);

   TYPE budget_rec IS RECORD
   (
      bgt_discipline       twyn_imp_budget.bgt_discipline%TYPE,
      bgt_project          twyn_imp_budget.bgt_project%TYPE,
      bgt_kostenrubriek    twyn_imp_budget.bgt_kostenrubriek%TYPE,
      bgt_kostensoortgrp   twyn_imp_budget.bgt_kostensoortgrp%TYPE,
      bgt_kostensoort      twyn_imp_budget.bgt_kostensoort%TYPE,
      type                 VARCHAR2(1),
      bgt_datum            twyn_imp_budget.bgt_datum%TYPE,
      bedr_init_excl       twyn_imp_budget.bedr_init_excl%TYPE,
      bedr_init_btw        twyn_imp_budget.bedr_init_btw%TYPE,
      key                  NUMBER(10)
   );

   TYPE kosten_keys IS RECORD
   (
      bgt_discipline_key      bgt_disc_params.bgt_ins_discipline_key%TYPE,
      bgt_project_key         bgt_project.bgt_project_key%TYPE,
      bgt_kostenrubriek_key   bgt_kostenrubriek.bgt_kostenrubriek_key%TYPE,
      prs_kostensoortgrp_key  prs_kostensoortgrp.prs_kostensoortgrp_key%TYPE,
      prs_kostensoort_key     prs_kostensoort.prs_kostensoort_key%TYPE,
      is_reserve              NUMBER(1),
      status                  NUMBER(1),
      type                    VARCHAR2(1)
   );

   FUNCTION get_kosten_keys( p_import_key  IN NUMBER
                           , p_prefix      IN VARCHAR2
                           , p_discipline  IN VARCHAR2
                           , p_project     IN VARCHAR2
                           , p_rubriek     IN VARCHAR2
                           , p_groep       IN VARCHAR2
                           , p_soort       IN VARCHAR2
                           , p_type        IN VARCHAR2 DEFAULT NULL
                           ) RETURN kosten_keys
   IS
      a_rubriek_code       bgt_kostenrubriek.bgt_kostenrubriek_code%TYPE;
      a_groep_code         prs_kostensoortgrp.prs_kostensoortgrp_altcode%TYPE;
      a_soort_code         prs_kostensoort.prs_kostensoort_oms%TYPE;
      a_kosten_keys        KOSTEN_KEYS;
   BEGIN
      a_kosten_keys.status := -1;
      g_errormsg := 'Fout bij ophalen ('|| p_prefix ||')kosten-keys ['|| NVL(p_discipline, 'k')
                                                                 ||'.'|| NVL(p_project,    'k')
                                                                 ||'.'|| NVL(p_rubriek,    'k')
                                                                 ||'.'|| NVL(p_groep,      'k')
                                                                 ||'.'|| NVL(p_soort,      'k')
                                                                 ||'.'|| NVL(p_type,       'k')
                                                                 ||']';
      BEGIN
         IF (p_rubriek IS NULL) THEN
            SELECT d.bgt_ins_discipline_key
                 , p.bgt_project_key
                 , r.bgt_kostenrubriek_key
                 , NULL
                 , NULL
                 , p_type
              INTO a_kosten_keys.bgt_discipline_key
                 , a_kosten_keys.bgt_project_key
                 , a_kosten_keys.bgt_kostenrubriek_key
                 , a_kosten_keys.prs_kostensoortgrp_key
                 , a_kosten_keys.prs_kostensoort_key
                 , a_kosten_keys.type
              FROM bgt_disc_params d
                 , bgt_project p
                 , bgt_kostenrubriek r
             WHERE d.bgt_ins_discipline_key = p.ins_discipline_key
               AND p.bgt_project_key        = r.bgt_project_key
               AND r.bgt_kostenrubriek_code = 'R'
               AND d.bgt_disc_params_code   = p_discipline
               AND p.bgt_project_code       = p_project;
         ELSE
            a_rubriek_code := p_rubriek;
            SELECT DECODE(a_rubriek_code, NULL, NULL, DECODE(p_groep, NULL, NULL, a_rubriek_code ||'.'|| p_groep)) INTO a_groep_code FROM DUAL;
            SELECT DECODE(a_groep_code,   NULL, NULL, DECODE(p_soort, NULL, NULL, a_groep_code   ||'.'|| p_soort)) INTO a_soort_code FROM DUAL;
            SELECT DISTINCT
                   d.bgt_ins_discipline_key
                 , p.bgt_project_key
                 , DECODE(p_rubriek, NULL, NULL, r.bgt_kostenrubriek_key)
                 , DECODE(p_groep,   NULL, NULL, g.prs_kostensoortgrp_key)
                 , DECODE(p_soort,   NULL, NULL, s.prs_kostensoort_key)
              INTO a_kosten_keys.bgt_discipline_key
                 , a_kosten_keys.bgt_project_key
                 , a_kosten_keys.bgt_kostenrubriek_key
                 , a_kosten_keys.prs_kostensoortgrp_key
                 , a_kosten_keys.prs_kostensoort_key
              FROM bgt_disc_params d
                 , bgt_project p
                 , bgt_kostenrubriek r
                 , prs_kostensoortgrp g
                 , prs_kostensoort s
             WHERE d.bgt_ins_discipline_key = p.ins_discipline_key
               AND p.bgt_project_key        = r.bgt_project_key
               AND r.bgt_kostenrubriek_key  = g.bgt_kostenrubriek_key
               AND g.prs_kostensoortgrp_key = s.prs_kostensoortgrp_key
               AND d.bgt_disc_params_code       = p_discipline
               AND p.bgt_project_code           = p_project
               AND r.bgt_kostenrubriek_code     = NVL(a_rubriek_code, r.bgt_kostenrubriek_code)
               AND g.prs_kostensoortgrp_altcode = NVL(a_groep_code,   g.prs_kostensoortgrp_altcode)
               AND s.prs_kostensoort_altcode    = NVL(a_soort_code,   s.prs_kostensoort_altcode);
         END IF;
         --
         a_kosten_keys.status := 1;
         a_kosten_keys.is_reserve := 0;
         IF (   p_rubriek IS NULL
            AND p_groep   IS NULL
            AND p_soort   IS NULL
            ) THEN
            a_kosten_keys.is_reserve := 1;
         END IF;

      EXCEPTION
         WHEN TOO_MANY_ROWS THEN
            fac.imp_writelog ( p_import_key, 'W', g_errormsg, NULL);
         WHEN NO_DATA_FOUND THEN
            a_kosten_keys.status := 0;
      END;
      RETURN a_kosten_keys;
   END; --get_kosten_keys

   FUNCTION get_opdr_key( p_kostensoort_key IN NUMBER
                        , p_contract_nr     IN NUMBER
                        , p_contract_volgnr IN NUMBER
                        ) RETURN NUMBER
   IS
      a_opdr_key  mld_opdr.mld_opdr_key%TYPE;
   BEGIN
      g_errormsg := 'Fout bij ophalen opdracht-key ['|| TO_CHAR(p_contract_nr) ||'/'|| TO_CHAR(p_contract_volgnr) ||'] '||p_kostensoort_key;
      BEGIN
         SELECT mld_opdr_key
           INTO a_opdr_key
           FROM mld_opdr
          WHERE mld_opdr_ordernr = TO_CHAR(p_contract_nr)
            AND mld_opdr_bedrijfopdr_volgnr = TO_CHAR(p_contract_volgnr)
            AND prs_kostensoort_key = p_kostensoort_key;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            a_opdr_key := -1;
      END;
      RETURN a_opdr_key;
   END;

   FUNCTION get_btw_perc( p_excl IN NUMBER
                        , p_btw IN NUMBER
                        ) RETURN NUMBER
   IS
      a_perc     NUMBER (3);
      a_btw_key  fin_btwtabelwaarde.fin_btwtabelwaarde_key%TYPE;
   BEGIN
      -- Bepaal de btw-key door het percentage te berekenen
      IF ((p_excl = p_btw) OR (NVL(p_btw, 0) = 0) OR (NVL(p_excl, 0) = 0)) THEN
         a_perc := 0;
      ELSE
         SELECT ROUND((p_btw / p_excl) * 100)
           INTO a_perc
           FROM DUAL;
      END IF;
      BEGIN
         SELECT fin_btwtabelwaarde_key
           INTO a_btw_key
           FROM fin_btwtabelwaarde
          WHERE fin_btwtabelwaarde_perc = a_perc;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            a_btw_key := NULL;
      END;
      RETURN a_btw_key;
   END; --get_btw_perc

   FUNCTION get_btw_key( p_code IN VARCHAR2
                       , p_perc IN NUMBER
                       ) RETURN NUMBER
   IS
      a_btw_key  fin_btwtabelwaarde.fin_btwtabelwaarde_key%TYPE;
   BEGIN
      BEGIN
         SELECT fin_btwtabelwaarde_key
           INTO a_btw_key
           FROM fin_btwtabelwaarde
          WHERE fin_btwtabelwaarde_perc = p_perc;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN
             INSERT INTO fin_btwtabelwaarde
             ( fin_btwtabelwaarde_code
             , fin_btwtabelwaarde_oms
             , fin_btwtabelwaarde_perc
             , fin_btwtabel_key
             )
             VALUES
             ( SUBSTR(p_code,1,1) || TO_CHAR(p_perc)
             , p_code
             , p_perc
             , (SELECT MAX(fin_btwtabel_key) FROM fin_btwtabel)
             )
             RETURNING fin_btwtabelwaarde_key INTO a_btw_key;
       END;
       RETURN a_btw_key;
   END; -- get_btw_key


   PROCEDURE update_discipline(p_import_key IN NUMBER)
   AS
      CURSOR c_discipline
      IS
         SELECT bgt_disc_params_code
              , ins_discipline_omschrijving
              , bgt_disc_params_opdrachtgever
              , bgt_disc_params_startdatum
              , ins_discipline_btw
              , bgt_disc_params_leider
           FROM twyn_imp_discipline;
      l_disc_key  bgt_disc_params.bgt_ins_discipline_key%TYPE;
      l_count     NUMBER(3) := 0;
   BEGIN
      g_errormsg := NULL;
      FOR l_rec IN c_discipline
      LOOP
         g_errormsg := 'Fout bij toevoegen discipline ' || l_rec.bgt_disc_params_code;
         BEGIN
            SELECT dp.bgt_ins_discipline_key
              INTO l_disc_key
              FROM bgt_disc_params dp
                 , ins_tab_discipline td
             WHERE dp.bgt_ins_discipline_key = td.ins_discipline_key
               AND td.ins_discipline_verwijder IS NULL
               AND dp.bgt_disc_params_code = l_rec.bgt_disc_params_code;
            --
            fac.imp_writelog ( p_import_key
                             , 'W'
                             , 'Discipline [' || l_rec.bgt_disc_params_code || '] bestaat al'
                             , NULL
                             );
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               g_errorhint := 'Toevoegen discipline';
               INSERT INTO ins_tab_discipline
               (  ins_discipline_module
               ,  ins_discipline_omschrijving
               ,  ins_discipline_btw
               )
               VALUES
               (  'BGT'
               ,  l_rec.ins_discipline_omschrijving
               ,  l_rec.ins_discipline_btw
               )
               RETURNING ins_discipline_key INTO l_disc_key;
               --
               INSERT INTO bgt_disc_params
               (   bgt_ins_discipline_key
               ,   bgt_disc_params_code
               ,   bgt_disc_params_startdatum
               ,   bgt_disc_params_opdrachtgever
               )
               VALUES
               (   l_disc_key
               ,   l_rec.bgt_disc_params_code
               ,   l_rec.bgt_disc_params_startdatum
               ,   l_rec.bgt_disc_params_opdrachtgever
               );
               --
               fac.imp_writelog ( p_import_key
                                , 'I'
                                , 'Discipline [' || l_rec.bgt_disc_params_code || '] toegevoegd'
                                , NULL
                                );
               l_count := l_count + 1;
         END;
      END LOOP;
      fac.imp_writelog ( p_import_key, 'S', 'Discipline: aantal regels toegevoegd: ' || TO_CHAR(l_count), NULL);
      COMMIT;
   END; --update_discipline

   PROCEDURE update_project(p_import_key IN NUMBER)
   AS
      CURSOR c_project
      IS
         SELECT bgt_project_discipline
              , bgt_project_code
              , bgt_project_volgnr
              , bgt_project_omschrijving
              , bgt_project_prijspeildatum
              , bgt_project_notes
              , bgt_project_fase_nr
              , bgt_project_fase_omschr
              , bgt_project_soort_nr
              , bgt_project_soort_omschr
           FROM twyn_imp_project
          ORDER BY bgt_project_code;
      l_disc_key     bgt_disc_params.bgt_ins_discipline_key%TYPE;
      l_project_key  bgt_project.bgt_project_key%TYPE;
      l_count        NUMBER(3) := 0;
   BEGIN
      g_errormsg := NULL;
      FOR l_rec in c_project
      LOOP
         BEGIN
            g_errormsg := 'Fout bij opvragen discipline ' || l_rec.bgt_project_discipline;
            SELECT dp.bgt_ins_discipline_key
              INTO l_disc_key
              FROM bgt_disc_params dp
                 , ins_tab_discipline td
             WHERE dp.bgt_ins_discipline_key = td.ins_discipline_key
               AND td.ins_discipline_verwijder IS NULL
               AND dp.bgt_disc_params_code = l_rec.bgt_project_discipline;

            --
            g_errormsg := 'Fout bij toevoegen project ' || l_rec.bgt_project_code;
            BEGIN
               SELECT bgt_project_key
                 INTO l_project_key
                 FROM bgt_project
                WHERE ins_discipline_key = l_disc_key
                  AND bgt_project_code = l_rec.bgt_project_code
                  AND bgt_project_volgnr = l_rec.bgt_project_volgnr
                  AND bgt_project_verwijder IS NULL;
               --
               fac.imp_writelog ( p_import_key
                                , 'W'
                                , 'Project [' || l_rec.bgt_project_code || '] bestaat al in discipline [' || l_rec.bgt_project_discipline || ']'
                                , NULL
                                );
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  g_errorhint := 'Toevoegen project';
                  INSERT INTO bgt_project
                  (  ins_discipline_key
                  ,  bgt_project_code
                  ,  bgt_project_omschrijving
                  ,  bgt_project_volgnr
                  ,  bgt_project_prijspeildatum
                  ,  bgt_project_notes
                  )
                  VALUES
                  (  l_disc_key
                  ,  l_rec.bgt_project_code
                  ,  l_rec.bgt_project_omschrijving
                  ,  l_rec.bgt_project_volgnr
                  ,  l_rec.bgt_project_prijspeildatum
                  ,  l_rec.bgt_project_notes
                  )
                  RETURNING bgt_project_key INTO l_project_key;
                  --
                  fac.imp_writelog ( p_import_key
                                   , 'I'
                                   , 'Project [' || l_rec.bgt_project_code || '] toegevoegd'
                                   , NULL
                                   );
                  l_count := l_count + 1;
            END;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               fac.imp_writelog ( p_import_key, 'W', 'Onbekende discipline [' || l_rec.bgt_project_discipline || ']', NULL);
         END;
      END LOOP;
      fac.imp_writelog ( p_import_key, 'S', 'Project: aantal regels toegevoegd: ' || TO_CHAR(l_count), NULL);
      COMMIT;
   END; --update_project

   PROCEDURE update_rubriek(p_import_key IN NUMBER)
   AS
      CURSOR c_rubriek
      IS
         SELECT bgt_project_discipline
              , bgt_project_code
              , bgt_kostenrubriek_code
              , bgt_kostenrubriek_oms
           FROM twyn_imp_kostenrubriek
          ORDER BY bgt_kostenrubriek_code;
      l_project_key    bgt_project.bgt_project_key%TYPE;
      l_rubriek_key    bgt_kostenrubriek.bgt_kostenrubriek_key%TYPE;
      l_count          NUMBER(3) := 0;
   BEGIN
      g_errormsg := NULL;
      FOR l_rec IN c_rubriek
      LOOP
         BEGIN
            g_errormsg := 'Fout bij opvragen project ' || l_rec.bgt_project_code;
            SELECT bgt_project_key
              INTO l_project_key
              FROM bgt_project p
                 , bgt_disc_params d
             WHERE p.ins_discipline_key = d.bgt_ins_discipline_key
               AND p.bgt_project_code = l_rec.bgt_project_code
               AND d.bgt_disc_params_code = l_rec.bgt_project_discipline;
            --
            g_errormsg := 'Fout bij toevoegen rubriek ' || l_rec.bgt_kostenrubriek_code;
            BEGIN
               IF (l_count = 0) THEN
                  -- Discipline/project bevat geen enkele rubriek. Maak eerst rubriek Reserve aan.
                  BEGIN
                     SELECT bgt_kostenrubriek_key
                       INTO l_rubriek_key
                       FROM bgt_kostenrubriek
                      WHERE bgt_kostenrubriek_code = 'R'
                        AND bgt_project_key = l_project_key;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        INSERT INTO bgt_kostenrubriek
                        (  bgt_kostenrubriek_code
                        ,  bgt_kostenrubriek_oms
                        ,  bgt_project_key
                        )
                        VALUES
                        (  'R'
                        ,  'R' ||' '|| 'Reserve'
                        ,  l_project_key
                        );
                        fac.imp_writelog ( p_import_key
                                         , 'I'
                                         , 'Rubriek [R Reserve] toegevoegd'
                                         , NULL
                                         );
                  END;
               END IF;
               --
               SELECT bgt_kostenrubriek_key
                 INTO l_rubriek_key
                 FROM bgt_kostenrubriek
                WHERE bgt_project_key = l_project_key
                  AND bgt_kostenrubriek_code = l_rec.bgt_kostenrubriek_code;
               --
               fac.imp_writelog ( p_import_key
                                , 'W'
                                , 'Rubriek [' || l_rec.bgt_kostenrubriek_code || '] bestaat al'
                                , NULL
                                );
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  g_errorhint := 'Toevoegen rubriek';
                  INSERT INTO bgt_kostenrubriek
                  (  bgt_kostenrubriek_code
                  ,  bgt_kostenrubriek_oms
                  ,  bgt_project_key
                  )
                  VALUES
                  (  l_rec.bgt_kostenrubriek_code
                  ,  l_rec.bgt_kostenrubriek_code ||' '|| l_rec.bgt_kostenrubriek_oms
                  ,  l_project_key
                  )
                  RETURNING bgt_kostenrubriek_key INTO l_rubriek_key;
                  --
                  fac.imp_writelog ( p_import_key
                                   , 'I'
                                   , 'Rubriek [' || l_rec.bgt_kostenrubriek_code || '] toegevoegd'
                                   , NULL
                                   );
                  l_count := l_count + 1;
            END;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               fac.imp_writelog ( p_import_key, 'W', 'Onbekende project [' || l_rec.bgt_project_code || ']', NULL);
         END;
      END LOOP;
      fac.imp_writelog ( p_import_key, 'S', 'Rubriek: aantal regels toegevoegd: ' || TO_CHAR(l_count), NULL);
      COMMIT;
   END; --update_rubriek

   PROCEDURE update_groep(p_import_key IN NUMBER)
   AS
      CURSOR c_groep
      IS
         SELECT bgt_project_discipline
              , bgt_project_code
              , bgt_kostenrubriek_code
              , prs_kostensoortgrp_altcode
              , prs_kostensoortgrp_oms
           FROM twyn_imp_kostensoortgrp
          ORDER BY prs_kostensoortgrp_altcode;
      l_rubriek_key  bgt_kostenrubriek.bgt_kostenrubriek_key%TYPE;
      l_groep_key    prs_kostensoortgrp.prs_kostensoortgrp_key%TYPE;
      l_rubriek_code bgt_kostenrubriek.bgt_kostenrubriek_code%TYPE;
      l_groep_code   prs_kostensoortgrp.prs_kostensoortgrp_altcode%TYPE;
      l_count        NUMBER(3) := 0;
   BEGIN
      g_errormsg := NULL;
      FOR l_rec IN c_groep
      LOOP
         BEGIN
            l_rubriek_code := l_rec.bgt_kostenrubriek_code;
            g_errormsg := 'Fout bij opvragen rubriek ' || l_rubriek_code;
            SELECT bgt_kostenrubriek_key
              INTO l_rubriek_key
              FROM bgt_kostenrubriek r
                 , bgt_project p
                 , bgt_disc_params d
             WHERE r.bgt_project_key = p.bgt_project_key
               AND p.ins_discipline_key = d.bgt_ins_discipline_key
               AND d.bgt_disc_params_code = l_rec.bgt_project_discipline
               AND p.bgt_project_code = l_rec.bgt_project_code
               AND r.bgt_kostenrubriek_code = l_rubriek_code;
            --
            l_groep_code := l_rec.bgt_kostenrubriek_code ||'.'|| l_rec.prs_kostensoortgrp_altcode;
            g_errormsg := 'Fout bij toevoegen groep ' || l_groep_code;
            BEGIN
               SELECT prs_kostensoortgrp_key
                 INTO l_groep_key
                 FROM prs_kostensoortgrp
                WHERE bgt_kostenrubriek_key = l_rubriek_key
                  AND prs_kostensoortgrp_altcode = l_groep_code;
               --
               fac.imp_writelog ( p_import_key
                                , 'W'
                                , 'Groep [' || l_groep_code || '] bestaat al'
                                , NULL
                                );
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  g_errorhint := 'Toevoegen groep';
                  INSERT INTO prs_kostensoortgrp
                  (  prs_kostensoortgrp_oms
                  ,  prs_kostensoortgrp_altcode
                  ,  bgt_kostenrubriek_key
                  )
                  VALUES
                  (  l_groep_code ||' '|| l_rec.prs_kostensoortgrp_oms
                  ,  l_groep_code
                  ,  l_rubriek_key
                  )
                  RETURNING prs_kostensoortgrp_key INTO l_groep_key;
                  --
                  fac.imp_writelog ( p_import_key
                                   , 'I'
                                   , 'Groep [' || l_groep_code || ': ' || l_rec.prs_kostensoortgrp_oms || '] toegevoegd'
                                   , NULL
                                   );
                  l_count := l_count + 1;
            END;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               fac.imp_writelog ( p_import_key, 'W', 'Onbekende rubriek [' || l_rec.bgt_kostenrubriek_code || ']', NULL);
         END;
      END LOOP;
      fac.imp_writelog ( p_import_key, 'S', 'Groep: aantal regels toegevoegd: ' || TO_CHAR(l_count), NULL);
      COMMIT;
   END; --update_groep

   PROCEDURE update_soort(p_import_key IN NUMBER)
   AS
      CURSOR c_soort
      IS
         SELECT bgt_project_discipline
              , bgt_project_code
              , bgt_kostenrubriek_code
              , prs_kostensoortgrp_altcode
              , prs_kostensoort_oms
              , prs_kostensoort_opmerking
              , bgt_btw_code
              , bgt_btw_waarde
           FROM twyn_imp_kostensoort
          ORDER BY prs_kostensoort_oms;
      l_groep_key    prs_kostensoortgrp.prs_kostensoortgrp_key%TYPE;
      l_soort_key    prs_kostensoort.prs_kostensoort_key%TYPE;
      l_groep_code   prs_kostensoortgrp.prs_kostensoortgrp_altcode%TYPE;
      l_soort_code   prs_kostensoort.prs_kostensoort_oms%TYPE;
      l_btw_key      fin_btwtabelwaarde.fin_btwtabelwaarde_key%TYPE;
      l_count        NUMBER(3) := 0;
   BEGIN
      g_errormsg := NULL;
      FOR l_rec IN c_soort
      LOOP
         BEGIN
            l_groep_code := l_rec.bgt_kostenrubriek_code ||'.'|| l_rec.prs_kostensoortgrp_altcode;
            g_errormsg := 'Fout bij opvragen groep ' || l_groep_code;
            SELECT prs_kostensoortgrp_key
              INTO l_groep_key
              FROM bgt_disc_params d
                 , bgt_project p
                 , bgt_kostenrubriek r
                 , prs_kostensoortgrp g
             WHERE r.bgt_project_key = p.bgt_project_key
               AND r.bgt_kostenrubriek_key = g.bgt_kostenrubriek_key
               AND p.ins_discipline_key = d.bgt_ins_discipline_key
               AND d.bgt_disc_params_code = l_rec.bgt_project_discipline
               AND p.bgt_project_code = l_rec.bgt_project_code
               AND r.bgt_kostenrubriek_code = l_rec.bgt_kostenrubriek_code
               AND g.prs_kostensoortgrp_altcode = l_groep_code;
            --
            l_soort_code := l_groep_code ||'.'|| l_rec.prs_kostensoort_oms;
            g_errormsg := 'Fout bij toevoegen soort ' || l_soort_code;
            BEGIN
               SELECT prs_kostensoort_key
                 INTO l_soort_key
                 FROM prs_kostensoort
                WHERE prs_kostensoortgrp_key = l_groep_key
                  AND prs_kostensoort_altcode = l_soort_code;
               --
               fac.imp_writelog ( p_import_key
                                , 'W'
                                , 'Soort [' || l_soort_code || '] bestaat al'
                                , NULL
                                );
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  g_errorhint := 'Toevoegen soort';
                  l_btw_key := get_btw_key(l_rec.bgt_btw_code, l_rec.bgt_btw_waarde);
                  INSERT INTO prs_kostensoort
                  (  prs_kostensoort_oms
                  ,  prs_kostensoort_altcode
                  ,  prs_kostensoort_opmerking
                  ,  prs_kostensoortgrp_key
                  ,  fin_btwtabelwaarde_key
                  )
                  VALUES
                  (  l_soort_code ||' '|| l_rec.prs_kostensoort_opmerking
                  ,  l_soort_code
                  ,  l_soort_code
                  ,  l_groep_key
                  ,  l_btw_key
                  )
                  RETURNING prs_kostensoort_key INTO l_soort_key;
                  --
                  fac.imp_writelog ( p_import_key
                                   , 'I'
                                   , 'Soort [' || l_soort_code || ': ' || l_rec.prs_kostensoort_opmerking || '] toegevoegd'
                                   , NULL
                                   );
                  l_count := l_count + 1;
            END;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               fac.imp_writelog ( p_import_key, 'W', 'Onbekende groep [' || l_groep_code || ']', NULL);
         END;
      END LOOP;
      fac.imp_writelog ( p_import_key, 'S', 'Soort: aantal regels toegevoegd: ' || TO_CHAR(l_count), NULL);
      COMMIT;
   END; --update_soort

   PROCEDURE update_bedrijf(p_import_key IN NUMBER)
   AS
      CURSOR c_bedrijf
      IS
         SELECT prs_bedrijf_overig1
              , prs_bedrijf_naam
              , prs_bedrijf_bezoek_adres
              , prs_bedrijf_bezoek_postcode
              , prs_bedrijf_bezoek_plaats
              , prs_bedrijf_telefoon
              , prs_bedrijf_fax
              , prs_bedrijf_contact_persoon
           FROM fac_imp_ext_bedrijf
          ORDER BY prs_bedrijf_overig1;

      l_count_i      NUMBER(3) := 0;
      l_count_u      NUMBER(3) := 0;
      l_bedrijf_key  NUMBER(10);
   BEGIN
      g_errormsg := NULL;
      FOR r_bedrijf IN c_bedrijf
      LOOP
         g_errormsg := 'Fout bij toevoegen contractant ' || r_bedrijf.prs_bedrijf_overig1;
         BEGIN
            SELECT prs_bedrijf_key
              INTO l_bedrijf_key
              FROM prs_bedrijf
             WHERE prs_bedrijf_naam_upper = UPPER(r_bedrijf.prs_bedrijf_naam);
            --
            UPDATE prs_bedrijf
               SET prs_bedrijf_post_adres      = r_bedrijf.prs_bedrijf_bezoek_adres
                 , prs_bedrijf_post_postcode   = r_bedrijf.prs_bedrijf_bezoek_postcode
                 , prs_bedrijf_post_plaats     = r_bedrijf.prs_bedrijf_bezoek_plaats
                 , prs_bedrijf_telefoon        = r_bedrijf.prs_bedrijf_telefoon
                 , prs_bedrijf_fax             = r_bedrijf.prs_bedrijf_fax
                 , prs_bedrijf_contact_persoon = r_bedrijf.prs_bedrijf_contact_persoon
                 , prs_leverancier_nr          = r_bedrijf.prs_bedrijf_overig1
             WHERE prs_bedrijf_key = l_bedrijf_key;
            fac.imp_writelog ( p_import_key
                             , 'I'
                             , 'Bedrijf [' || r_bedrijf.prs_bedrijf_overig1 || '] aangepast'
                             , NULL
                             );
            l_count_u := l_count_u + 1;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               INSERT INTO prs_bedrijf
               (  prs_bedrijf_naam
               ,  prs_bedrijf_post_adres
               ,  prs_bedrijf_post_postcode
               ,  prs_bedrijf_post_plaats
               ,  prs_bedrijf_telefoon
               ,  prs_bedrijf_fax
               ,  prs_bedrijf_contact_persoon
               ,  prs_leverancier_nr
               )
               VALUES
               (  r_bedrijf.prs_bedrijf_naam
               ,  r_bedrijf.prs_bedrijf_bezoek_adres
               ,  r_bedrijf.prs_bedrijf_bezoek_postcode
               ,  r_bedrijf.prs_bedrijf_bezoek_plaats
               ,  r_bedrijf.prs_bedrijf_telefoon
               ,  r_bedrijf.prs_bedrijf_fax
               ,  r_bedrijf.prs_bedrijf_contact_persoon
               ,  r_bedrijf.prs_bedrijf_overig1
               );
               fac.imp_writelog ( p_import_key
                                , 'I'
                                , 'Bedrijf [' || r_bedrijf.prs_bedrijf_overig1 || '] toegevoegd'
                                , NULL
                                );
            l_count_i := l_count_i + 1;
         END;
      END LOOP;
      fac.imp_writelog ( p_import_key, 'S', 'Bedrijf: aantal regels toegevoegd: ' || TO_CHAR(l_count_i), NULL);
      fac.imp_writelog ( p_import_key, 'S', 'Bedrijf: aantal regels gewijzigd: '  || TO_CHAR(l_count_u), NULL);
      COMMIT;
   END; --update_bedrijf


   PROCEDURE update_budget(p_import_key IN NUMBER)
   AS
      CURSOR c_budget(p_isinit NUMBER)
      IS
         SELECT t.key
              , t.bgt_nr
              , t.soortnr
              , t.bgt_oms
              , t.bgt_budget_key
              , t.bgt_discipline
              , t.bgt_project
              , t.bgt_kostenrubriek
              , t.bgt_kostensoortgrp
              , t.bgt_kostensoort
              , t.bedr_init_excl
              , t.bedr_init_btw
              , t.bgt_datum
              , t.type
              , min(x.bedrag) bedrag_min
              , max(x.bedrag) bedrag_max
              , min(t.bedr_mut_btw) bedrag_btw
           FROM twyn_imp_budget t
              , (SELECT bgt_nr, key, bgt_budget_key, bedr_mmw_excl bedrag     FROM twyn_imp_budget WHERE bgt_datum IS NOT NULL
                  UNION
                 SELECT bgt_nr, key, bgt_budget_key, bedr_mut_excl bedrag     FROM twyn_imp_budget WHERE bgt_datum IS NOT NULL
                  UNION
                 SELECT bgt_nr, key, bgt_budget_key, bedr_res_mut_excl bedrag FROM twyn_imp_budget WHERE bgt_datum IS NOT NULL
                 ) x
           WHERE t.key = x.key
             AND ( (soortnr = 0 AND p_isinit = 0)
                OR (soortnr > 0 AND p_isinit = 1)
                )
          GROUP BY t.key
                 , t.bgt_nr
                 , t.soortnr
                 , t.bgt_oms
                 , t.bgt_budget_key
                 , t.bgt_discipline
                 , t.bgt_project
                 , t.bgt_kostenrubriek
                 , t.bgt_kostensoortgrp
                 , t.bgt_kostensoort
                 , t.bedr_init_excl
                 , t.bedr_init_btw
                 , t.bgt_datum
                 , t.type
          ORDER BY t.bgt_nr;

      CURSOR c_reserve
      IS
         SELECT p.ins_discipline_key
              , r.bgt_project_key
              , r.bgt_kostenrubriek_key
              , r.bgt_kostenrubriek_code
           FROM bgt_kostenrubriek  r
              , bgt_project p
              , bgt_disc_params d
          WHERE d.bgt_ins_discipline_key = p.ins_discipline_key
            AND p.bgt_project_key = r.bgt_project_key
            AND (d.bgt_disc_params_code, p.bgt_project_code) IN
                  (SELECT DISTINCT
                          bgt_discipline
                        , bgt_project
                   FROM twyn_imp_budget
                  );

      CURSOR c_contract
      IS
         SELECT DISTINCT
                bgt_discipline_code      bgt_discipline
              , bgt_project_code         bgt_project
              , bgt_kostenrubriek_code   bgt_kostenrubriek
              , prs_kostensoortgrp_code  bgt_kostensoortgrp
              , prs_kostensoort_code     bgt_kostensoort
              , (SELECT MIN(bgt_datum) FROM twyn_imp_budget) bgt_datum
              , 0 bedr_init_excl
              , 0 bedr_init_btw
              , 0 is_reserve
              , 'C'  type
              , NULL key
           FROM twyn_imp_contract c
          WHERE NOT EXISTS
                (SELECT 1
                   FROM twyn_imp_budget b
                  WHERE b.bgt_discipline     = c.bgt_discipline_code
                    AND b.bgt_project        = c.bgt_project_code
                    AND b.bgt_kostenrubriek  = c.bgt_kostenrubriek_code
                    AND b.bgt_kostensoortgrp = c.prs_kostensoortgrp_code
                    AND b.bgt_kostensoort    = c.prs_kostensoort_code
                )
          ORDER BY 1,2,3,4,5;

      l_disc_key           bgt_disc_params.bgt_ins_discipline_key%TYPE;
      l_project_key        bgt_project.bgt_project_key%TYPE;
      l_rubriek_key        bgt_kostenrubriek.bgt_kostenrubriek_key%TYPE;
      l_groep_key          prs_kostensoortgrp.prs_kostensoortgrp_key%TYPE;
      l_soort_key          prs_kostensoort.prs_kostensoort_key%TYPE;
      l_budget_key         bgt_budget.bgt_budget_key%TYPE;
      l_bedrag_van         bgt_budgetmutatie.bgt_budget_bedrag_van%TYPE;
      l_bedrag_naar        bgt_budgetmutatie.bgt_budget_bedrag_naar%TYPE;
      l_btw_naar           bgt_budgetmutatie.bgt_budget_btwbedrag_naar%TYPE;
      l_budget_van         bgt_budgetmutatie.bgt_budget_key_van%TYPE;
      l_budget_naar        bgt_budgetmutatie.bgt_budget_key_naar%TYPE;
      l_bedrag_min         bgt_budgetmutatie.bgt_budget_bedrag_van%TYPE;
      l_bedrag_max         bgt_budgetmutatie.bgt_budget_bedrag_van%TYPE;
      l_btw_van            bgt_budgetmutatie.bgt_budget_btwbedrag_van%TYPE;
      l_budgetmutatie_key  bgt_budgetmutatie.bgt_budgetmutatie_key%TYPE;
      l_budget_gegevens    VARCHAR2(200);
      l_count              NUMBER(3);
      l_aantal             NUMBER(3);
      l_mut_volgnr         VARCHAR2(10);
      l_mut_code           VARCHAR2(1);
      t_rec                BUDGET_REC;

      FUNCTION get_budgetrec_1( b_rec IN c_budget%ROWTYPE
                              , c_rec IN c_contract%ROWTYPE
                              ) RETURN budget_rec
      IS
         a_budget_rec  BUDGET_REC;
      BEGIN
         IF (b_rec.bgt_discipline IS NOT NULL) THEN
         a_budget_rec.bgt_discipline     := b_rec.bgt_discipline;
         a_budget_rec.bgt_project        := b_rec.bgt_project;
         a_budget_rec.bgt_kostenrubriek  := b_rec.bgt_kostenrubriek;
         a_budget_rec.bgt_kostensoortgrp := b_rec.bgt_kostensoortgrp;
         a_budget_rec.bgt_kostensoort    := b_rec.bgt_kostensoort;
         a_budget_rec.bgt_datum          := b_rec.bgt_datum;
         a_budget_rec.type               := b_rec.type;
         a_budget_rec.bedr_init_excl     := b_rec.bedr_init_excl;
         a_budget_rec.bedr_init_btw      := b_rec.bedr_init_btw;
         a_budget_rec.key                := b_rec.key;
         END IF;
         --
         IF (c_rec.bgt_discipline IS NOT NULL) THEN
         a_budget_rec.bgt_discipline     := c_rec.bgt_discipline;
         a_budget_rec.bgt_project        := c_rec.bgt_project;
         a_budget_rec.bgt_kostenrubriek  := c_rec.bgt_kostenrubriek;
         a_budget_rec.bgt_kostensoortgrp := c_rec.bgt_kostensoortgrp;
         a_budget_rec.bgt_kostensoort    := c_rec.bgt_kostensoort;
         a_budget_rec.bgt_datum          := c_rec.bgt_datum;
         a_budget_rec.type               := c_rec.type;
         a_budget_rec.bedr_init_excl     := c_rec.bedr_init_excl;
         a_budget_rec.bedr_init_btw      := c_rec.bedr_init_btw;
         a_budget_rec.key                := c_rec.key;
         END IF;
         --
         RETURN a_budget_rec;
      END; -- get_budgetrec_1

      PROCEDURE add_budget( p_import_key IN NUMBER
                          , p_mode       IN VARCHAR2
                          , p_rec        IN BUDGET_REC)
      AS
         a_budget_key         bgt_budget.bgt_budget_key%TYPE;
         a_kosten_keys        KOSTEN_KEYS;
      BEGIN
         a_kosten_keys := get_kosten_keys( p_import_key
                                         , 'budget'
                                         , p_rec.bgt_discipline
                                         , p_rec.bgt_project
                                         , p_rec.bgt_kostenrubriek
                                         , p_rec.bgt_kostensoortgrp
                                         , p_rec.bgt_kostensoort
                                         , p_rec.type);
         --
         g_errormsg := 'Fout bij toevoegen ' || p_mode ||' '
                    ||'[('|| NVL(TO_CHAR(a_kosten_keys.bgt_discipline_key),     'x') ||'='|| NVL(p_rec.bgt_discipline,'-')     ||')'
                    ||'.('|| NVL(TO_CHAR(a_kosten_keys.bgt_project_key),        'x') ||'='|| NVL(p_rec.bgt_project,'-')        ||')'
                    ||'.('|| NVL(TO_CHAR(a_kosten_keys.bgt_kostenrubriek_key),  'x') ||'='|| NVL(p_rec.bgt_kostenrubriek,'-')  ||')'
                    ||'.('|| NVL(TO_CHAR(a_kosten_keys.prs_kostensoortgrp_key), 'x') ||'='|| NVL(p_rec.bgt_kostensoortgrp,'-') ||')'
                    ||'.('|| NVL(TO_CHAR(a_kosten_keys.prs_kostensoort_key),    'x') ||'='|| NVL(p_rec.bgt_kostensoort,'-')    ||')'
                    ||'.('|| NVL(a_kosten_keys.type, 'x')                            ||'='|| NVL(p_rec.type,'-')               ||')'
                    ||']';
         BEGIN
            SELECT bgt_budget_key
              INTO a_budget_key
              FROM bgt_budget
             WHERE ins_discipline_key      = a_kosten_keys.bgt_discipline_key
               AND bgt_project_key         = a_kosten_keys.bgt_project_key
               AND (bgt_kostenrubriek_key  = NVL(a_kosten_keys.bgt_kostenrubriek_key,-1)  OR (NVL(a_kosten_keys.bgt_kostenrubriek_key,-1)  < 0 AND bgt_kostenrubriek_key IS NULL))
               AND (prs_kostensoortgrp_key = NVL(a_kosten_keys.prs_kostensoortgrp_key,-1) OR (NVL(a_kosten_keys.prs_kostensoortgrp_key,-1) < 0 AND prs_kostensoortgrp_key IS NULL))
               AND (prs_kostensoort_key    = NVL(a_kosten_keys.prs_kostensoort_key,-1)    OR (NVL(a_kosten_keys.prs_kostensoort_key,-1)    < 0 AND prs_kostensoort_key IS NULL));
         EXCEPTION
            WHEN TOO_MANY_ROWS THEN
               fac.imp_writelog ( p_import_key, 'W'
                                , 'SELECT bgt_budget_key FROM bgt_budget WHERE ins_discipline_key = ' || a_kosten_keys.bgt_discipline_key
                                || ' AND bgt_project_key = ' || a_kosten_keys.bgt_project_key
                                || ' AND (bgt_kostenrubriek_key = '  || a_kosten_keys.bgt_kostenrubriek_key  || ' OR bgt_kostenrubriek_key IS NULL)'
                                || ' AND (prs_kostensoortgrp_key = ' || a_kosten_keys.prs_kostensoortgrp_key || ' OR prs_kostensoortgrp_key IS NULL)'
                                || ' AND (prs_kostensoort_key = '    || a_kosten_keys.prs_kostensoort_key    || ' OR prs_kostensoort_key IS NULL)'
                                , NULL
                                );
            WHEN NO_DATA_FOUND THEN
               l_budget_gegevens := p_rec.bgt_discipline
                            ||':'|| p_rec.bgt_project
                            ||':'|| p_rec.bgt_kostenrubriek
                            ||':'|| p_rec.bgt_kostensoortgrp
                            ||':'|| p_rec.bgt_kostensoort
                            ||':'|| p_rec.type
                            ||' R='|| a_kosten_keys.is_reserve
                            ||' E='|| NVL(p_rec.bedr_init_excl, 0);
               g_errorhint := 'Toevoegen budget';
               INSERT INTO bgt_budget
               ( ins_discipline_key
               , bgt_project_key
               , bgt_kostenrubriek_key
               , prs_kostensoortgrp_key
               , prs_kostensoort_key
               , bgt_budget_aanmaak
               , bgt_budget_bedrag
               , bgt_budget_btwbedrag
               , bgt_budget_isreserve
               )
               VALUES
               ( a_kosten_keys.bgt_discipline_key
               , a_kosten_keys.bgt_project_key
               , a_kosten_keys.bgt_kostenrubriek_key
               , a_kosten_keys.prs_kostensoortgrp_key
               , a_kosten_keys.prs_kostensoort_key
               , p_rec.bgt_datum
               , NVL(p_rec.bedr_init_excl, 0)
               , NVL(p_rec.bedr_init_btw, 0)
               , NVL(a_kosten_keys.is_reserve, 0)
               )
               RETURNING bgt_budget_key INTO a_budget_key;
               fac.imp_writelog ( p_import_key, 'I', 'budgetkey: ['|| a_budget_key ||'] '|| l_budget_gegevens, NULL);
         END;
         --
         -- Zet de budget_key bij alle overeenkomstige regels, dus ook mutaties
         fac.imp_writelog ( p_import_key, 'I', 'budgetkey: ['|| a_budget_key ||'] bijwerken', NULL);
         UPDATE twyn_imp_budget
            SET bgt_budget_key = a_budget_key
          WHERE key = p_rec.key
             OR (   bgt_discipline = p_rec.bgt_discipline
                AND bgt_project = p_rec.bgt_project
                AND bgt_kostenrubriek = p_rec.bgt_kostenrubriek
                AND bgt_kostensoortgrp = p_rec.bgt_kostensoortgrp
                AND bgt_kostensoort = p_rec.bgt_kostensoort
                );
      END; --add_budget

   BEGIN
      g_errormsg := NULL;
      -- initialisatie budget
      l_count := 0;
      FOR l_rec IN c_budget(0)
      LOOP
         -- Keys ophalen
         t_rec := get_budgetrec_1(l_rec, NULL);
         add_budget(p_import_key, 'budget', t_rec);
         l_count := l_count + 1;
      END LOOP;
      fac.imp_writelog ( p_import_key, 'S', 'Budget: aantal regels toegevoegd: ' || TO_CHAR(l_count), NULL);
      --
      -- Budget reserveposten voor rubrieken aanmaken
      l_count := 0;
      FOR l_rec IN c_reserve
      LOOP
         g_errormsg := 'Fout bij toevoegen budget op rubriek [' || l_rec.bgt_kostenrubriek_code ||']';
         BEGIN
            SELECT bgt_budget_key
              INTO l_budget_key
              FROM bgt_budget
             WHERE ins_discipline_key    = l_rec.ins_discipline_key
               AND bgt_project_key       = l_rec.bgt_project_key
               AND bgt_kostenrubriek_key = l_rec.bgt_kostenrubriek_key
               AND prs_kostensoort_key  IS NULL;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               INSERT INTO bgt_budget
               ( ins_discipline_key
               , bgt_project_key
               , bgt_kostenrubriek_key
               , bgt_budget_bedrag
               , bgt_budget_btwbedrag
               , bgt_budget_isreserve
               )
               VALUES
               ( l_rec.ins_discipline_key
               , l_rec.bgt_project_key
               , l_rec.bgt_kostenrubriek_key
               , 0
               , 0
               , 0
               )
               RETURNING bgt_budget_key INTO l_budget_key;
               --
               UPDATE twyn_imp_budget
                  SET bgt_budget_key = (SELECT bgt_budget_key
                                          FROM bgt_budget b
                                             , bgt_kostenrubriek r
                                         WHERE b.bgt_kostenrubriek_key = r.bgt_kostenrubriek_key
                                           AND r.bgt_kostenrubriek_code = 'R'
                                           AND b.bgt_project_key = l_rec.bgt_project_key
                                       )
                WHERE key IN (SELECT tb.key
                                FROM twyn_imp_budget tb
                                   , bgt_project p
                                   , bgt_disc_params d
                               WHERE tb.bgt_project           = p.bgt_project_code
                                 AND tb.bgt_discipline        = d.bgt_disc_params_code
                                 AND tb.bgt_kostenrubriek     = l_rec.bgt_kostenrubriek_code
                                 AND p.bgt_project_key        = l_rec.bgt_project_key
                                 AND d.bgt_ins_discipline_key = l_rec.ins_discipline_key
                                 AND tb.bgt_kostensoortgrp   IS NULL
                                 AND tb.bgt_kostensoort      IS NULL
                             );
               l_count := l_count + 1;
         END;
      END LOOP;
      fac.imp_writelog ( p_import_key, 'S', 'Rubriekbudget: aantal regels toegevoegd: ' || TO_CHAR(l_count), NULL);
      --
      -- Overige budgetposten: niet geinitialiseerd, maar wel gebruikt in contracten.
      l_count := 0;
      FOR l_rec in c_contract
      LOOP
         t_rec := get_budgetrec_1(NULL, l_rec);
         add_budget(p_import_key, 'budgetpost contracten', t_rec);
         l_count := l_count + 1;
      END LOOP;
      fac.imp_writelog ( p_import_key, 'S', 'Budgetposten: aantal regels toegevoegd tgv contracten: ' || TO_CHAR(l_count), NULL);
      --
      -- Overige budgetposten: niet geinitialiseerd, maar wel gebruikt in mutaties.
      l_count := 0;
      FOR l_rec in c_budget(1)
      LOOP
         IF (l_rec.bgt_budget_key IS NULL) THEN
            t_rec := get_budgetrec_1(l_rec, NULL);
            add_budget(p_import_key, 'budgetpost mutaties', t_rec);
            l_count := l_count + 1;
         END IF;
      END LOOP;
      fac.imp_writelog ( p_import_key, 'S', 'Budgetposten: aantal regels toegevoegd tgv mutaties: ' || TO_CHAR(l_count), NULL);
      --
      -- De mutaties
      l_count := 0;
      FOR l_rec IN c_budget(1)
      LOOP
         g_errormsg := 'Fout bij toevoegen budgetmutatie '
                    || '[('||l_rec.bgt_nr||';'||l_rec.key||')'
                    || '.'|| NVL(l_rec.bgt_kostenrubriek,  'x')
                    || '.'|| NVL(l_rec.bgt_kostensoortgrp, 'x')
                    || '.'|| NVL(l_rec.bgt_kostensoort,    'x')
                    || '.'|| NVL(l_rec.type,               'x')
                    || ']';
         BEGIN
            SELECT count(*)
              INTO l_aantal
              FROM twyn_imp_budget
             WHERE bgt_nr = l_rec.bgt_nr;
            --
            IF (l_aantal > 1) THEN
               -- Er zijn zowel van- als naar- budget regels.
               SELECT x.bgt_budget_key
                    , min(x.bedrag)
                    , max(x.bedrag)
                 INTO l_budget_key
                    , l_bedrag_min
                    , l_bedrag_max
                 FROM (SELECT bgt_nr, key, bgt_budget_key, bedr_mmw_excl     bedrag FROM twyn_imp_budget WHERE bgt_datum IS NOT NULL
                        UNION
                       SELECT bgt_nr, key, bgt_budget_key, bedr_mut_excl     bedrag FROM twyn_imp_budget WHERE bgt_datum IS NOT NULL
                        UNION
                       SELECT bgt_nr, key, bgt_budget_key, bedr_res_mut_excl bedrag FROM twyn_imp_budget WHERE bgt_datum IS NOT NULL
                      ) x
                WHERE x.key <> l_rec.key
                  AND x.bgt_nr = l_rec.bgt_nr
                  AND x.bgt_nr IS NOT NULL
                GROUP BY x.bgt_budget_key;
            ELSE
               -- Er is alleen een van- of naar- budget regel.
               SELECT x.bgt_budget_key
                     , min(x.bedrag)
                     , max(x.bedrag)
                  INTO l_budget_key
                     , l_bedrag_min
                     , l_bedrag_max
                  FROM (SELECT bgt_nr, key, bgt_budget_key, bedr_mmw_excl     bedrag FROM twyn_imp_budget
                         UNION
                        SELECT bgt_nr, key, bgt_budget_key, bedr_mut_excl     bedrag FROM twyn_imp_budget
                         UNION
                        SELECT bgt_nr, key, bgt_budget_key, bedr_res_mut_excl bedrag FROM twyn_imp_budget
                       ) x
                 WHERE x.key = l_rec.key
                   AND x.bgt_nr IS NOT NULL
                 GROUP BY x.bgt_budget_key;
            END IF;
            --
            IF (l_bedrag_min < 0) THEN
               l_btw_van     := 0;
               l_bedrag_van  := l_bedrag_min;
               l_budget_van  := l_budget_key;
               l_btw_naar    := l_rec.bedrag_btw;
               l_bedrag_naar := l_rec.bedrag_max;
               l_budget_naar := l_rec.bgt_budget_key;
            ELSE
               l_btw_van     := 0;
               l_bedrag_van  := l_rec.bedrag_min;
               l_budget_van  := l_rec.bgt_budget_key;
               l_btw_naar    := l_rec.bedrag_btw;
               l_bedrag_naar := l_bedrag_max;
               l_budget_naar := l_budget_key;
            END IF;
            --
            l_mut_volgnr := CASE WHEN UPPER(SUBSTR(l_rec.bgt_nr,1,1)) IN ('R','N','M') THEN SUBSTR(l_rec.bgt_nr,2)   ELSE l_rec.bgt_nr END;
            l_mut_code   := CASE WHEN UPPER(SUBSTR(l_rec.bgt_nr,1,1)) IN ('R','N','M') THEN SUBSTR(l_rec.bgt_nr,1,1) ELSE NULL END;
            --
            BEGIN
               SELECT bgt_budgetmutatie_key
                 INTO l_budgetmutatie_key
                 FROM bgt_budgetmutatie
                WHERE bgt_budgetmutatie_datum = l_rec.bgt_datum
                  AND bgt_budgetmutatie_volgnr = l_mut_volgnr
                  AND bgt_budgetmutatie_omschrijving = l_rec.bgt_oms
                  AND bgt_budget_key_van = l_budget_van
                  AND bgt_budget_bedrag_van = l_bedrag_van;
               l_budget_gegevens := 'Mutatie-key '|| l_budgetmutatie_key
                                 ||' gevonden voor budget-key '|| l_budget_van
                                 ||' ('|| l_mut_volgnr ||' '|| l_rec.bgt_datum ||' '|| l_bedrag_van ||' '|| l_rec.bgt_oms
                                 ||' )';
               fac.imp_writelog ( p_import_key, 'I', l_budget_gegevens, NULL);
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  fac.imp_writelog ( p_import_key, 'I', 'Mutatie: '||ABS(l_bedrag_van)||' van '||TO_CHAR(l_budget_van)||' naar '||TO_CHAR(l_budget_naar), NULL);
                  INSERT INTO bgt_budgetmutatie
                  (  bgt_budgetmutatie_datum
                  ,  bgt_budgetmutatie_volgnr
                  ,  bgt_budgetmutatie_code
                  ,  bgt_budgetmutatie_omschrijving
                  ,  prs_perslid_key
                  ,  bgt_budget_key_van
                  ,  bgt_budget_bedrag_van
                  ,  bgt_budget_btwbedrag_van
                  ,  bgt_budget_key_naar
                  ,  bgt_budget_bedrag_naar
                  ,  bgt_budget_btwbedrag_naar
                  )
                  VALUES
                  (  l_rec.bgt_datum
                  ,  l_mut_volgnr
                  ,  l_mut_code
                  ,  l_rec.bgt_oms
                  ,  g_perslid_key
                  ,  l_budget_van
                  ,  l_bedrag_van
                  ,  l_btw_van
                  ,  l_budget_naar
                  ,  l_bedrag_naar
                  ,  l_btw_naar
                  )
                  RETURNING bgt_budgetmutatie_key INTO l_budgetmutatie_key;
                  --
                  l_count := l_count + 1;
            END;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               l_budget_gegevens:= 'Geen budgetmutatie voor '
                    || '[('||l_rec.bgt_nr||';'||l_rec.key||')'
                    || '.'|| NVL(l_rec.bgt_kostenrubriek,  'x')
                    || '.'|| NVL(l_rec.bgt_kostensoortgrp, 'x')
                    || '.'|| NVL(l_rec.bgt_kostensoort,    'x')
                    || ']';
               fac.imp_writelog ( p_import_key, 'I', l_budget_gegevens, NULL);
         END;
      END LOOP;
      fac.imp_writelog ( p_import_key, 'S', 'Budgetmutaties: aantal regels toegevoegd: ' || TO_CHAR(l_count), NULL);

   END;

   PROCEDURE update_opdracht(p_import_key IN NUMBER)
   AS
      CURSOR c_opdracht
      IS
         SELECT bgt_contract_nr
              , bgt_contract_volgnr
              , bgt_contract_omschr
              , bgt_contract_datum
              , bgt_contract_bedrag_excl
              , bgt_contract_bedrag_btw
              , bgt_contract_meerminder
              , bgt_contract_status
              , bgt_contract_referentie
              , bgt_bedrijf_code
              , bgt_discipline_code
              , bgt_project_code
              , bgt_kostenrubriek_code
              , prs_kostensoortgrp_code
              , prs_kostensoort_code
              , prs_kostenplaats_nr
              , prs_kostenplaats_oms
           FROM twyn_imp_contract;

      a_kosten_keys           KOSTEN_KEYS;
      a_bedrijf_key           prs_bedrijf.prs_bedrijf_key%TYPE;
      a_kostenplaats_key      prs_kostenplaats.prs_kostenplaats_key%TYPE;
      a_kostenplaatsgrp_key   prs_kostenplaatsgrp.prs_kostenplaatsgrp_key%TYPE;
      l_count                 NUMBER (3) := 0;
   BEGIN
      g_errormsg := NULL;
      FOR l_rec IN c_opdracht
      LOOP
         a_kosten_keys := get_kosten_keys( p_import_key
                                         , 'opdracht'
                                         , l_rec.bgt_discipline_code
                                         , l_rec.bgt_project_code
                                         , l_rec.bgt_kostenrubriek_code
                                         , l_rec.prs_kostensoortgrp_code
                                         , l_rec.prs_kostensoort_code);
         --
         g_errormsg := 'Fout bij toevoegen contract['|| l_rec.bgt_contract_nr ||'/'|| l_rec.bgt_contract_volgnr ||']';
         BEGIN
            SELECT pb.prs_bedrijf_key
              INTO a_bedrijf_key
              FROM prs_bedrijf pb
                 , fac_imp_ext_bedrijf eb
             WHERE pb.prs_bedrijf_naam_upper = UPPER(eb.prs_bedrijf_naam)
               AND pb.prs_leverancier_nr = l_rec.bgt_bedrijf_code;
            --
            --
            IF (l_rec.prs_kostenplaats_nr IS NOT NULL) THEN
               BEGIN
                  SELECT prs_kostenplaats_key
                    INTO a_kostenplaats_key
                    FROM prs_kostenplaats
                   WHERE prs_kostenplaats_upper = UPPER(TO_CHAR(l_rec.prs_kostenplaats_nr));
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     INSERT INTO prs_kostenplaats
                     ( prs_kostenplaats_nr
                     , prs_kostenplaats_omschrijving
                     , prs_kostenplaats_upper
                     , prs_kostenplaats_module
                     , prs_kostenplaatsgrp_key
                     )
                     VALUES
                     ( TO_CHAR(l_rec.prs_kostenplaats_nr)
                     , l_rec.prs_kostenplaats_oms
                     , UPPER(TO_CHAR(l_rec.prs_kostenplaats_nr))
                     , 'PRJ'
                     , 1
                     )
                     RETURNING prs_kostenplaats_key INTO a_kostenplaats_key;
               END;
            ELSE
               a_kostenplaats_key := NULL;
            END IF;
            --
            -- conversie contractstatus naar mld_statusopdr_key:
            -- 10 Raming        10 Ter goedkeuring
            -- 20 Te besluiten   3 Ter fiattering
            -- 30 Accoord        8 Geaccepteerd
            -- 40 Opgedragen     5 Toegekend
            -- 50 vervallen      1 Afgewezen
            -- overige codes:    2 Niet akkoord
            INSERT INTO mld_opdr
            (  mld_opdr_id
            ,  mld_opdr_ordernr
            ,  mld_opdr_bedrijfopdr_volgnr
            ,  mld_uitvoerende_keys
            ,  mld_opdr_omschrijving
            ,  mld_opdr_datumbegin
            ,  mld_opdr_kosten
            ,  mld_opdr_kosten_btw
            ,  prs_kostensoort_key
            ,  prs_perslid_key
            ,  mld_typeopdr_key
            ,  mld_opdr_module
            ,  mld_statusopdr_key
            ,  prs_kostenplaats_key
            ,  mld_opdr_meerwerk
            )
            VALUES
            (  l_rec.bgt_contract_referentie
            ,  l_rec.bgt_contract_nr
            ,  l_rec.bgt_contract_volgnr
            ,  a_bedrijf_key
            ,  l_rec.bgt_contract_omschr
            ,  l_rec.bgt_contract_datum
            ,  l_rec.bgt_contract_bedrag_excl
            ,  l_rec.bgt_contract_bedrag_btw
            ,  a_kosten_keys.prs_kostensoort_key
            ,  g_perslid_key
            ,  5
            ,  'MLD'
            ,  DECODE(l_rec.bgt_contract_status, 10,10, 20,3, 30,8, 40,5, 50,1, 2)
            ,  a_kostenplaats_key
            ,  CASE WHEN l_rec.bgt_contract_meerminder = 0 THEN 0 ELSE 1 END
            );
            fac.imp_writelog ( p_import_key
                             , 'I'
                             , 'Contract [' || l_rec.bgt_contract_nr ||'/'|| l_rec.bgt_contract_volgnr  || '] toegevoegd'
                             , NULL
                             );
            l_count := l_count + 1;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               fac.imp_writelog ( p_import_key, 'W', 'Onbekend bedrijf [' || l_rec.bgt_bedrijf_code || ']', NULL);
         END;
      END LOOP;
      fac.imp_writelog ( p_import_key, 'S', 'Contracten: aantal regels toegevoegd: ' || TO_CHAR(l_count), NULL);
      COMMIT;
   END; --update_opdracht

   PROCEDURE update_factuur(p_import_key IN NUMBER)
   AS
      CURSOR c_factuur
      IS
         SELECT bgt_factuur_nr
              , bgt_factuur_volgnr
              , bgt_factuur_refnr
              , bgt_factuur_omschr
              , bgt_factuur_datum
              , bgt_factuur_bedrag_excl
              , bgt_factuur_bedrag_btw
              , bgt_factuur_bedrag_incl
              , bgt_factuur_adviesdatum
              , bgt_factuur_grootboek
              , bgt_factuur_status
              , bgt_contract_nr
              , bgt_contract_volgnr
              , bgt_discipline_code
              , bgt_project_code
              , bgt_kostenrubriek_code
              , prs_kostensoortgrp_code
              , prs_kostensoort_code
           FROM twyn_imp_factuur;

      l_opdr_key           mld_opdr.mld_opdr_key%TYPE;
      l_factuur_key        fin_factuur.fin_factuur_key%TYPE;
      l_btw_key            fin_btwtabelwaarde.fin_btwtabelwaarde_key%TYPE;
      l_refnr              fin_factuur.fin_factuur_nr%TYPE;
      l_kosten_keys        KOSTEN_KEYS;
      l_count_f            NUMBER (10) := 0;
   BEGIN
      g_errormsg := NULL;
      FOR l_rec in c_factuur
      LOOP
         BEGIN
            l_kosten_keys := get_kosten_keys( p_import_key
                                            , 'factuur'
                                            , l_rec.bgt_discipline_code
                                            , l_rec.bgt_project_code
                                            , l_rec.bgt_kostenrubriek_code
                                            , l_rec.prs_kostensoortgrp_code
                                            , l_rec.prs_kostensoort_code);
            l_opdr_key := get_opdr_key( l_kosten_keys.prs_kostensoort_key
                                      , l_rec.bgt_contract_nr
                                      , l_rec.bgt_contract_volgnr);
            --
            g_errormsg := 'Fout bij toevoegen factuur['|| l_rec.bgt_contract_nr ||'/'|| l_rec.bgt_contract_volgnr ||']';
            l_refnr := l_rec.bgt_factuur_refnr;
            IF (l_refnr = '' OR l_refnr IS NULL) THEN
               l_refnr := 'F_' || l_rec.bgt_factuur_nr ||'.'|| l_rec.bgt_factuur_volgnr;
            END IF;
            fac.imp_writelog ( p_import_key, 'I', 'Opdracht('||l_opdr_key||') '||l_kosten_keys.prs_kostensoort_key||','||l_rec.bgt_contract_nr||','||l_rec.bgt_contract_volgnr, NULL);
            IF (l_opdr_key > -1) THEN
               g_errormsg := 'Fout bij toevoegen factuur['|| l_rec.bgt_factuur_nr  ||']';
               --
               INSERT INTO fin_factuur
               ( fin_factuur_nr
               , fin_factuur_advies
               , fin_factuur_datum
               , fin_factuur_boekmaand
               , fin_factuur_opmerking
               , fin_factuur_totaal
               , fin_factuur_totaal_btw
               , mld_opdr_key
               , prs_kostensoort_key
               , fin_factuur_bron
               , fin_factuur_statuses_key
               )
               VALUES
               ( l_refnr
               , l_rec.bgt_factuur_adviesdatum
               , l_rec.bgt_factuur_datum
               , TO_CHAR(l_rec.bgt_factuur_datum, 'yyyy-mm')
               , l_rec.bgt_factuur_omschr
               , l_rec.bgt_factuur_bedrag_excl
               , l_rec.bgt_factuur_bedrag_btw
               , l_opdr_key
               , l_kosten_keys.prs_kostensoort_key
               , 1
               , 6
               )
               RETURNING fin_factuur_key INTO l_factuur_key;
               l_count_f := l_count_f + 1;
               --
               fac.imp_writelog ( p_import_key
                                , 'I'
                                , 'Factuur [' || l_rec.bgt_factuur_nr ||'/'|| l_rec.bgt_factuur_volgnr  || '] toegevoegd'
                                , NULL
                                );
            END IF;
         END;
      END LOOP;
      --
      fac.imp_writelog ( p_import_key, 'S', 'Facturen: aantal regels toegevoegd: ' || TO_CHAR(l_count_f), NULL);
      COMMIT;
   END; --update_factuur


BEGIN
   SELECT prs_perslid_key
     INTO g_perslid_key
     FROM fac_import
    WHERE fac_import_key = p_import_key;

   update_discipline(p_import_key);
   update_project(p_import_key);
   update_rubriek(p_import_key);
   update_groep(p_import_key);
   update_soort(p_import_key);
   update_bedrijf(p_import_key);
   update_budget(p_import_key);
   update_opdracht(p_import_key);
   update_factuur(p_import_key);
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      g_errormsg :=
            g_errormsg
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        g_aanduiding || g_errormsg,
                        'Verwerken BCS conversie afgebroken!');
      COMMIT;
END;
/



------ payload end   ------

SET DEFINE OFF
BEGIN adm.systrackscriptId ('$Id$', 0); END;
/

COMMIT;
SET ECHO OFF
SPOOL OFF
SET DEFINE ON
PROMPT Logfile of this upgrade is: &fcltlogfile
