/*  $Revision$
 *  $Id$
 */

/*  FAC_PACX, (X means XML) to be included from fac_pac.src, isolated for convenience only
 *  The XML-package source. Maakt DE XML nodes voor alle bekende entiteiten van facilitor.
 *
 *  Usage: xml.make_xml(...);
 *
 *  Voor de XML functies is soms de concise (=beknopt) parameter beschikbaar, Indien waar, dan wordt er minder info
 *  van die node opgenomen. Soort van vuistregel is dat als het er om gaat deze false is, en als er slechts een
 *  vermelding is deze true is. Voorbeeld voor perslid: aanvrager moet niet concise, maar fiatteur wel.
 *
 *  In de packageheader zijn alleen die declaraties opgenomen die qua volgorde bekend moesten zijn bij gebruik (in de body)
 *
 */


CREATE OR REPLACE PACKAGE xml
AS
   PROCEDURE addvarchartoclob (text IN VARCHAR2);

   PROCEDURE createheadernode (p_custid IN VARCHAR2);

   PROCEDURE add_header (p_custid IN VARCHAR2);

   PROCEDURE add_footer (dummy IN VARCHAR2);

   PROCEDURE add_localisation (p_xmlnode IN VARCHAR2);

   FUNCTION char_to_html (p_char IN VARCHAR2)
      RETURN VARCHAR2;

   PROCEDURE mydatetochar (p_tag IN VARCHAR2, p_date IN DATE);

   FUNCTION mynumbertochar (p_number IN NUMBER)
      RETURN VARCHAR2;

   PROCEDURE createopentag (p_tag IN VARCHAR2);

   PROCEDURE createconciseopentag (p_tag IN VARCHAR2);

   PROCEDURE createopentagattributes (
      p_tag          IN   VARCHAR2,
      p_attrname1    IN   VARCHAR2,
      p_attrvalue1   IN   VARCHAR2,
      p_attrname2    IN   VARCHAR2,
      p_attrvalue2   IN   VARCHAR2,
      p_attrname3    IN   VARCHAR2,
      p_attrvalue3   IN   VARCHAR2,
      p_attrname4    IN   VARCHAR2,
      p_attrvalue4   IN   VARCHAR2
   );

   PROCEDURE createclosetag (p_tag IN VARCHAR2);

   PROCEDURE createxmltagvalue (p_tag IN VARCHAR2, p_value IN VARCHAR2);

   PROCEDURE createxmltagvalueattributes (
      p_tag          IN   VARCHAR2,
      p_attrname1    IN   VARCHAR2,
      p_attrvalue1   IN   VARCHAR2,
      p_attrname2    IN   VARCHAR2,
      p_attrvalue2   IN   VARCHAR2,
      p_attrname3    IN   VARCHAR2,
      p_attrvalue3   IN   VARCHAR2,
      p_attrname4    IN   VARCHAR2,
      p_attrvalue4   IN   VARCHAR2,
      p_attrname5    IN   VARCHAR2,
      p_attrvalue5   IN   VARCHAR2,
      p_kmdkey       IN   VARCHAR2,
      p_value        IN   VARCHAR2
   );

   PROCEDURE create_prs_perslid_node (p_key IN NUMBER, p_nodename IN VARCHAR2, p_concise IN BOOLEAN);

   PROCEDURE create_alg_locatie_node (
      p_locatie_key         IN   NUMBER,
      p_gebouw_key          IN   NUMBER,
      p_verdieping_key      IN   NUMBER,
      p_ruimte_key          IN   NUMBER,
      p_terreinsector_key   IN   NUMBER,
      p_withchildren        IN   BOOLEAN,
      p_concise             IN   BOOLEAN
   );

   PROCEDURE create_mld_adres_node (p_key IN NUMBER, p_nodename IN VARCHAR2, p_concise IN BOOLEAN);

   PROCEDURE create_prs_werkplek_node (p_werkplek_key IN NUMBER, p_perslid_key IN NUMBER, p_concise IN BOOLEAN);

   PROCEDURE create_ins_srtdeel_node (p_key IN NUMBER, p_concise BOOLEAN);

   PROCEDURE create_ins_deel_node (p_key IN NUMBER, p_deelsrtcontrole_key IN NUMBER, p_concise IN BOOLEAN);

   PROCEDURE create_prs_bedrijf_node (p_bedrijf_key IN NUMBER, p_nodename IN VARCHAR2, p_concise IN BOOLEAN);

   PROCEDURE create_prs_bedrijf_bdr_node (p_key IN NUMBER);

   PROCEDURE create_prs_kostenpltsgrp_node (p_key IN NUMBER);

   PROCEDURE create_prs_kostenplaats_node (p_key IN NUMBER, p_concise IN BOOLEAN);

   PROCEDURE create_alg_onroerendgoed_node (
      p_key            IN   NUMBER,
      p_nodename       IN   VARCHAR2,
      p_lockey         IN   NUMBER,
      p_concise        IN   BOOLEAN,
      p_withchildren   IN   BOOLEAN
   );

   PROCEDURE create_mld_opdr_node (p_key IN NUMBER, p_extra_key IN NUMBER, p_concise IN BOOLEAN, p_bgtmode IN BOOLEAN DEFAULT FALSE);
   PROCEDURE create_bes_bestelling_node (p_key       IN NUMBER, p_concise IN BOOLEAN);
   PROCEDURE create_bes_bestelopdr_node (p_key IN NUMBER, p_concise IN BOOLEAN);
   PROCEDURE create_bes_bestellevr_node (p_key IN NUMBER, p_concise IN BOOLEAN);
   PROCEDURE create_bez_afspraak_node (p_key       IN NUMBER,
                                       p_extra     IN NUMBER,
                                       p_concise   IN BOOLEAN);
   PROCEDURE create_res_reservering_node (p_key                  IN NUMBER,
                                          p_res_rsv_ruimte_key   IN NUMBER);
   PROCEDURE create_res_rsv_ruimte_node (p_key IN NUMBER, p_concise IN BOOLEAN);
   PROCEDURE create_cnt_contract_node (p_key IN NUMBER, p_concise IN BOOLEAN, p_extra_key IN NUMBER DEFAULT NULL);
   PROCEDURE create_fin_factuur_node (p_key IN NUMBER, p_concise IN BOOLEAN, p_bgtmode IN BOOLEAN DEFAULT FALSE, p_extra_key IN NUMBER DEFAULT NULL);
   PROCEDURE create_bgt_discipline_node (p_key IN NUMBER);

   PROCEDURE xml_node (p_xmlnode     IN VARCHAR2,
                       p_key         IN NUMBER,
                       p_custid      IN VARCHAR2,
                       p_sessionid   IN VARCHAR2,
                       p_extra       IN NUMBER,
                       p_where       IN VARCHAR2,
                       p_concise     IN BOOLEAN
                      );

   FUNCTION make_xml2 (
      p_xmlnode     IN   VARCHAR2,
      p_key         IN   NUMBER,
      p_custid      IN   VARCHAR2,
      p_sessionid   IN   VARCHAR2,
      p_extra       IN   NUMBER,
      p_where       IN   VARCHAR2
    ) RETURN CLOB;

   FUNCTION make_view_xml2 (
      p_view        IN   VARCHAR2,
      p_key         IN   NUMBER,
      p_custid      IN   VARCHAR2,
      p_sessionid   IN   VARCHAR2,
      p_extra       IN   NUMBER,
      p_where       IN   VARCHAR2,
      p_nodename    IN   VARCHAR2,
      p_rowname     IN   VARCHAR2
   ) RETURN CLOB;
END xml;
/
CREATE OR REPLACE PACKAGE BODY xml
AS
   aclob           CLOB;
   xmlnode_depth   NUMBER; -- Prevent nested xmlnode-kenmerken (and loops); max. depth=1!

   PROCEDURE addvarchartoclob (text IN VARCHAR2)
   AS
   BEGIN
      DBMS_LOB.WRITEAPPEND (aclob, LENGTH (text), text);
   END;

   PROCEDURE add_header (p_custid IN VARCHAR2)
   AS
   BEGIN
      addvarchartoclob (
         '<?xml version="1.0" encoding="windows-1252"?>' || CHR (10));
      createopentag ('facilitor');
      createheadernode (p_custid);
   END;

   PROCEDURE add_footer (dummy IN VARCHAR2)
   AS
   BEGIN
      createclosetag ('facilitor');
   END;

   PROCEDURE add_localisation (p_xmlnode IN VARCHAR2)
   AS
      CURSOR c1(userlang VARCHAR2)
      IS
           SELECT fac_locale_xsl_label,
                  COALESCE(fac_locale_xsl_cust, fac_locale_xsl_tekst) fac_locale_xsl_tekst,
                  fac_locale_xsl_module
             FROM fac_locale_xsl,
                  (SELECT 'MLD' module
                     FROM DUAL
                    WHERE p_xmlnode IN ('melding', 'opdracht', 'factuur')
                   UNION ALL
                   SELECT 'FIN'
                     FROM DUAL
                    WHERE p_xmlnode IN ('factuur', 'verkoopfactuur')
                   UNION ALL
                   SELECT 'ALG'
                     FROM DUAL
                    WHERE p_xmlnode IN
                                ('ruimte',
                                 'verdieping',
                                 'gebouw',
                                 'locatie',
                                 'deel',
                                 'controle',
                                 'contract')
                   UNION ALL
                   SELECT 'PRS'
                     FROM DUAL
                    WHERE p_xmlnode IN ('perslid', 'afdeling', 'kostenplaats')
                   UNION ALL
                   SELECT 'BEZ'
                     FROM DUAL
                    WHERE p_xmlnode IN
                                ('afspraak', 'reservering', 'xreservering', 'bezoeker')
                   UNION ALL
                   SELECT 'BES'
                     FROM DUAL
                    WHERE p_xmlnode IN ('bestelling', 'bestelopdr', 'factuur')
                   UNION ALL
                   SELECT 'RES'
                     FROM DUAL
                    WHERE p_xmlnode IN ('reservering', 'xreservering')
                   UNION ALL
                   SELECT 'PRJ'
                     FROM DUAL
                    WHERE p_xmlnode IN ('scenario')
                   UNION ALL
                   SELECT 'MSG'
                     FROM DUAL
                    WHERE p_xmlnode IN ('message')
                   UNION ALL
                   SELECT 'INS'
                     FROM DUAL
                    WHERE p_xmlnode IN
                                ('deel', 'melding', 'opdracht', 'contract', 'controle')
                   UNION ALL
                   SELECT 'CNT'
                     FROM DUAL
                    WHERE p_xmlnode IN ('contract', 'deel', 'factuur')
                   UNION ALL
                     SELECT 'FAC' FROM DUAL) modules
            WHERE fac_locale_xsl_lang = userlang
                  AND fac_locale_xsl_module = modules.module
         ORDER BY fac_locale_xsl_module, fac_locale_xsl_label;

      lmodule   VARCHAR2 (3);
   BEGIN
      createopentag ('lcl');
      lmodule := 'XXX';

      FOR rec1 IN c1(lcl.getuserlanguage ())
      LOOP
         IF lmodule <> rec1.fac_locale_xsl_module
         THEN
            IF lmodule <> 'XXX'
            THEN
               createclosetag (lmodule);
            END IF;

            createopentag (rec1.fac_locale_xsl_module);
            lmodule := rec1.fac_locale_xsl_module;
         END IF;

         createxmltagvalue (rec1.fac_locale_xsl_label,
                            rec1.fac_locale_xsl_tekst);
      END LOOP;

      IF lmodule <> 'XXX'
      THEN
         createclosetag (lmodule);
      END IF;

      createclosetag ('lcl');
   END;


   -- Levert een bookmarks node op met daarin een (of meer) info om een link naar het detailscherm van deze node
   -- te construeren. Dit ging via de standaard bookmarks per xmlnode, maar nu gewoon met een pseudobookmark
   -- met dezelfde naam als de xmlnode dit het vertegenwoordigd.
   -- Een waarde is bijvoorbeeld u=melding&k=
   -- Waar je in de xsl de facilitorroot voor en de keywaarde achter moet zetten voor een goede link
   -- (ook te overwegen is om de &k= door de xsl te laten plakken; net zo goed, maar op deze manier
   --  laten we de route naar uiteindelijk https://root/xmlnode/key beter open)
   PROCEDURE create_bookmarks_node (p_xmlnode IN VARCHAR2, p_refkey IN NUMBER)
   AS
      CURSOR c2
      IS
           SELECT fac_bookmark_naam,
                  fac_bookmark_id
             FROM fac_bookmark
            WHERE fac_bookmark_xmlnode = p_xmlnode
              AND fac_bookmark_refkey = p_refkey;
   BEGIN
      createopentag ('bookmarks');
      -- de generieke
      createxmltagvalue (p_xmlnode, 'u='||p_xmlnode || '&k=');
      FOR rec2 IN c2 -- de specifieke
      LOOP
         createxmltagvalue (rec2.fac_bookmark_naam, 'u='||rec2.fac_bookmark_id);
      END LOOP;
      createclosetag ('bookmarks');
   END;

   FUNCTION char_to_html (p_char IN VARCHAR2)
      RETURN VARCHAR2
   IS
   BEGIN
      RETURN REPLACE (
                REPLACE (
                   REPLACE (
                      REPLACE (
                         REPLACE (p_char, CHR (38), CHR (38) || 'amp;'),
                         CHR (60),
                         CHR (38) || 'lt;'),
                      CHR (62),
                      CHR (38) || 'gt;'),
                   CHR (34),
                   CHR (38) || 'quot;'),
                CHR (39),
                CHR (38) || 'apos;');
   END;

   PROCEDURE mydatetochar (p_tag IN VARCHAR2, p_date IN DATE)
   AS
      v_return     VARCHAR2 (1000);
      l_timezone   VARCHAR2 (20);
      v_utc        TIMESTAMP;
      user_ts        TIMESTAMP;
   BEGIN
      IF p_date IS NOT NULL
      THEN
         createopentag (p_tag);
         createxmltagvalue ('datum', TO_CHAR (p_date, 'dd-mm-yyyy'));
         createxmltagvalue ('tijd', TO_CHAR (p_date, 'hh24:mi'));
         user_ts := FROM_TZ (CAST (p_date AS TIMESTAMP), fac.getsetting('fac_server_timezone')) AT TIME ZONE SESSIONTIMEZONE;
         createxmltagvalue ('localdatum', TO_CHAR (user_ts, 'dd-mm-yyyy'));
         createxmltagvalue ('localtijd', TO_CHAR (user_ts, 'hh24:mi'));
         createxmltagvalue ('localdatetime', TO_CHAR (user_ts, 'YYYY-MM-DD') || 'T' || TO_CHAR (user_ts, 'HH24:MI:SS') || TO_CHAR(FROM_TZ(user_ts, SESSIONTIMEZONE), 'TZH:TZM'));
         v_utc :=
            SYS_EXTRACT_UTC (FROM_TZ (CAST (p_date AS TIMESTAMP), 'CET'));
         createxmltagvalue ('utcdatum', TO_CHAR (v_utc, 'YYYYMMDD'));
         createxmltagvalue ('utctijd', TO_CHAR (v_utc, 'HH24MISS'));
         createxmltagvalue ('dag', TO_CHAR (p_date, 'dd'));
         createxmltagvalue ('maand', TO_CHAR (p_date, 'mm'));
         createxmltagvalue ('jaar', TO_CHAR (p_date, 'yyyy'));
         createxmltagvalue (
            'timestamp',
            TO_CHAR (
               (p_date - TO_DATE ('01-01-1970', 'DD-MM-YYYY')) * 86400,
               'FM9999999999'));
         createclosetag (p_tag);
      END IF;
   END;

   FUNCTION mynumbertochar (p_number IN NUMBER)
      RETURN VARCHAR2
   IS
   BEGIN
      RETURN TO_CHAR (p_number);
   END;

   PROCEDURE createopentag (p_tag IN VARCHAR2)
   AS
   BEGIN
      IF p_tag IS NULL
      THEN
         addvarchartoclob ('<>');
      ELSE
         addvarchartoclob ('<' || p_tag || '>' || CHR (10));
      END IF;
   END;

   PROCEDURE createconciseopentag (p_tag IN VARCHAR2)
   AS
   BEGIN
      -- Pas op: in de onrgoednode wordt het attribuut zelf gezet (want meerdere attributen)
      createopentagattributes (p_tag,
                               'mode',
                               'concise',
                               NULL,
                               NULL,
                               NULL,
                               NULL,
                               NULL,
                               NULL);
   END;

   -- * createXMLtagValue
   -- * function to return a complex XML node including up to 4 attributes
   -- * use the null value in the attrNameX argument for empty attributes
   PROCEDURE createopentagattributes (p_tag          IN VARCHAR2,
                                      p_attrname1    IN VARCHAR2,
                                      p_attrvalue1   IN VARCHAR2,
                                      p_attrname2    IN VARCHAR2,
                                      p_attrvalue2   IN VARCHAR2,
                                      p_attrname3    IN VARCHAR2,
                                      p_attrvalue3   IN VARCHAR2,
                                      p_attrname4    IN VARCHAR2,
                                      p_attrvalue4   IN VARCHAR2)
   AS
      v_return   VARCHAR2 (5000);
   BEGIN
      v_return := '<' || p_tag;

      IF p_attrname1 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname1 || '=';

         IF p_attrvalue1 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue1) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      IF p_attrname2 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname2 || '=';

         IF p_attrvalue2 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue2) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      IF p_attrname3 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname3 || '=';

         IF p_attrvalue3 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue3) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      IF p_attrname4 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname4 || '=';

         IF p_attrvalue4 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue4) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      v_return := v_return || '>' || CHR (10);
      addvarchartoclob (v_return);
   END;

   PROCEDURE createclosetag (p_tag IN VARCHAR2)
   AS
   BEGIN
      IF p_tag IS NULL
      THEN
         addvarchartoclob ('</>');
      ELSE
         addvarchartoclob ('</' || p_tag || '>' || CHR (10));
      END IF;
   END;

   -- * createXMLtagValue
   -- * function to return a simple XML node without attributes
   -- * empty nodes are skipped.
   -- * Since the value is made HTML-safe it can become a lot longer than it was
   --   worst case that is 5 times, when 4000 ampersands become 4000 times &amp;
   --   Yet since that is very unlikely we make our buffer 9999 instead of 20000,
   --   assuming this will save use of memory. If that is bullshit we should
   --   make it 20000 and 20100 or so.
   PROCEDURE createxmltagvalue (p_tag IN VARCHAR2, p_value IN VARCHAR2)
   AS
      v_value    VARCHAR2 (9999);
      v_return   VARCHAR2 (9999);
   BEGIN
      IF p_value IS NULL
      THEN
         RETURN;
      END IF;

      v_value := char_to_html (p_value);
      v_return := '<' || p_tag || '>';
      v_return := v_return || v_value;
      v_return := v_return || '</' || p_tag || '> ' || CHR (10);
      addvarchartoclob (v_return);
   END;

   PROCEDURE create_attachments_node (p_value IN VARCHAR2)
   AS
      CURSOR c1(c_refkey NUMBER, c_kenmerk_key NUMBER)
      IS
         SELECT fac_bijlagen_key
              , fac_bijlagen_disk_directory
              , fac_bijlagen_filename
              , fac_bijlagen_file_size
              , fac_bijlagen_aanmaak
           FROM fac_bijlagen
          WHERE fac_bijlagen_verwijder IS NULL
            AND fac_bijlagen_refkey = c_refkey
            AND fac_bijlagen_kenmerk_key = COALESCE(c_kenmerk_key, fac_bijlagen_kenmerk_key);

      v_value       VARCHAR2(50);
      v_refkey      NUMBER DEFAULT -1;
      v_kenmerkkey  NUMBER DEFAULT NULL;
   BEGIN
      v_value := SUBSTR(p_value, 16);
      IF (SUBSTR(v_value,1,1) = 'R')
      THEN
         v_refkey := SUBSTR(v_value, 4, INSTR(v_value, '#')-4);
      END IF;
      v_value := SUBSTR(v_value, INSTR(v_value, '#')+1);
      IF (SUBSTR(v_value,1,1) = 'K')
      THEN
         v_kenmerkkey := SUBSTR(v_value, 4, INSTR(v_value, '#')-4);
      END IF;

      createopentag ('attachments');
      FOR rec1 IN c1(v_refkey, v_kenmerkkey)
      LOOP
         createopentagattributes ('attachment',
                                  'key',
                                  rec1.fac_bijlagen_key,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL);
         createxmltagvalue ('filename', rec1.fac_bijlagen_filename);
         mydatetochar ('filedate', rec1.fac_bijlagen_aanmaak);
         createxmltagvalue ('filesize', rec1.fac_bijlagen_file_size);
         createclosetag ('attachment');
      END LOOP;
      createclosetag ('attachments');
   END;



   -- * createxmltagvalueattributes9
   -- * function to return a complex XML node including up to 9 attributes
   -- * use the NULL value in the attrnameX argument for empty attributes
   -- * used for Kenmerk-nodes; if the fac_kenmerkdomein_key from p_kmdkey
   -- * defines a fac_kenmerkdomein_xmlnode the corresponding subnode
   -- * is added on the highest level only
   -- * Per 5.4.3 empty nodes are skipped here too, unless the value is '#donotsuppress#'
   PROCEDURE createxmltagvalueattributes9 (p_tag          IN VARCHAR2,
                                           p_attrname1    IN VARCHAR2,
                                           p_attrvalue1   IN VARCHAR2,
                                           p_attrname2    IN VARCHAR2,
                                           p_attrvalue2   IN VARCHAR2,
                                           p_attrname3    IN VARCHAR2,
                                           p_attrvalue3   IN VARCHAR2,
                                           p_attrname4    IN VARCHAR2,
                                           p_attrvalue4   IN VARCHAR2,
                                           p_attrname5    IN VARCHAR2,
                                           p_attrvalue5   IN VARCHAR2,
                                           p_attrname6    IN VARCHAR2,
                                           p_attrvalue6   IN VARCHAR2,
                                           p_attrname7    IN VARCHAR2,
                                           p_attrvalue7   IN VARCHAR2,
                                           p_attrname8    IN VARCHAR2,
                                           p_attrvalue8   IN VARCHAR2,
                                           p_attrname9    IN VARCHAR2,
                                           p_attrvalue9   IN VARCHAR2,
                                           p_kmdkey       IN VARCHAR2,
                                           p_value        IN VARCHAR2)
   AS
      v_value    VARCHAR2 (5000);
      v_return   VARCHAR2 (5000);
      v_xmlnode  fac_kenmerkdomein.fac_kenmerkdomein_xmlnode%TYPE;
   BEGIN
      IF p_value IS NULL
      THEN
         RETURN;
      END IF;

      v_return := '<' || p_tag;

      IF p_attrname1 IS NOT NULL AND p_attrvalue1 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname1 || '=';

         IF p_attrvalue1 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue1) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      IF p_attrname2 IS NOT NULL AND p_attrvalue2 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname2 || '=';

         IF p_attrvalue2 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue2) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      IF p_attrname3 IS NOT NULL AND p_attrvalue3 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname3 || '=';

         IF p_attrvalue3 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue3) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      IF p_attrname4 IS NOT NULL AND p_attrvalue4 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname4 || '=';

         IF p_attrvalue4 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue4) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      IF p_attrname5 IS NOT NULL AND p_attrvalue5 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname5 || '=';

         IF p_attrvalue5 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue5) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      IF p_attrname6 IS NOT NULL AND p_attrvalue6 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname6 || '=';

         IF p_attrvalue6 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue6) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      IF p_attrname7 IS NOT NULL AND p_attrvalue7 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname7 || '=';

         IF p_attrvalue7 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue7) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      IF p_attrname8 IS NOT NULL AND p_attrvalue8 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname8 || '=';

         IF p_attrvalue8 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue8) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      IF p_attrname9 IS NOT NULL AND p_attrvalue9 IS NOT NULL
      THEN
         v_return := v_return || ' ' || p_attrname9 || '=';

         IF p_attrvalue9 IS NOT NULL
         THEN
            v_return := v_return || '"' || char_to_html (p_attrvalue9) || '"';
         ELSE
            v_return := v_return || '""';
         END IF;
      END IF;

      IF p_kmdkey IS NOT NULL
      THEN
         -- this domein-reference could be a xmlnode reference
         -- then we should add a subnode of that type
         SELECT fac_kenmerkdomein_xmlnode
           INTO v_xmlnode
           FROM fac_kenmerkdomein
          WHERE  fac_kenmerkdomein_key = p_kmdkey;
          IF v_xmlnode IS NOT NULL
          THEN
             v_return := v_return || ' xmlnode=' || '"' || char_to_html (v_xmlnode) || '"';
          END IF;
      END IF;

      v_return := v_return || '>';

      -- Alleen uitstapjes naar xmlnode-kenmerken toegestaan vanaf de basis!
      IF p_value IS NOT NULL AND v_xmlnode IS NOT NULL AND xmlnode_depth = 0
      THEN
         addvarchartoclob (v_return); -- Tussenresultaat; nog geen waarde en sluithaakje
         -- Plak nu xmlnode-kenmerk direct in het resultaat (als side effect)
         xmlnode_depth := xmlnode_depth + 1; -- Increment depth; even van het pad af!
         BEGIN
             IF v_xmlnode = 'reservering' THEN
                 xml_node (v_xmlnode,
                           NULL, -- res_reservering_key mogen we leeg laten
                           NULL,
                           NULL,
                           fac.safe_to_number (p_value), -- res_rsv_ruimte_key moet in p_extra
                           NULL,
                           TRUE);
             ELSE
                 xml_node (v_xmlnode,
                           fac.safe_to_number (p_value),
                           NULL,
                           NULL,
                           NULL,
                           NULL,
                           TRUE);
             END IF;
         EXCEPTION
             WHEN NO_DATA_FOUND
             THEN
                 raise_application_error (
                     -20001,
                        'Could not find kenmerk_key '
                     || p_attrvalue4
                     || ' ('
                     || p_attrvalue1
                     || ') '
                     || v_xmlnode
                     || ' key: '
                     || p_value
                     || CHR (13)
                     || DBMS_UTILITY.FORMAT_ERROR_STACK);
         END;
         xmlnode_depth := xmlnode_depth - 1; -- Decrement depth; terug naar de basis!
      ELSE
         IF p_value IS NULL OR SUBSTR(p_value,1,15) = '#donotsuppress#'
         THEN
            v_value := '';
         ELSE
            v_value := p_value;
         END IF;

         v_return := v_return || char_to_html (v_value);
         addvarchartoclob (v_return); -- Tussenresultaat met waarde / zonder sluithaakje

         IF (SUBSTR(p_value,1,15) = '#donotsuppress#')
         THEN
            create_attachments_node(p_value);
         END IF;
      END IF;

      -- En het sluithaakje (na xmlnode-kenmerk of tussenresultaat hierboven)
      v_return := '</' || p_tag || '> ' || CHR (10);
      addvarchartoclob (v_return);
   END;

   -- Compatible function for 5 attributes
   PROCEDURE createxmltagvalueattributes (p_tag          IN VARCHAR2,
                                          p_attrname1    IN VARCHAR2,
                                          p_attrvalue1   IN VARCHAR2,
                                          p_attrname2    IN VARCHAR2,
                                          p_attrvalue2   IN VARCHAR2,
                                          p_attrname3    IN VARCHAR2,
                                          p_attrvalue3   IN VARCHAR2,
                                          p_attrname4    IN VARCHAR2,
                                          p_attrvalue4   IN VARCHAR2,
                                          p_attrname5    IN VARCHAR2,
                                          p_attrvalue5   IN VARCHAR2,
                                          p_kmdkey       IN VARCHAR2,
                                          p_value        IN VARCHAR2)
   AS
   BEGIN
        createxmltagvalueattributes9 (p_tag,
                                      p_attrname1, p_attrvalue1,
                                      p_attrname2, p_attrvalue2,
                                      p_attrname3, p_attrvalue3,
                                      p_attrname4, p_attrvalue4,
                                      p_attrname5, p_attrvalue5,
                                      NULL,        NULL,
                                      NULL,        NULL,
                                      NULL,        NULL,
                                      NULL,        NULL,
                                      p_kmdkey,
                                      p_value);
   END;

   -- *
   -- * Create the header node including the timestamps.
   -- * Note: the parameter is a dummy now
   -- *
   PROCEDURE createheadernode (p_custid IN VARCHAR2)
   AS
      l_custid         fac_version.fac_version_cust%TYPE;
      l_otap           fac_version.fac_version_otap%TYPE;
      l_naam_full      prs_v_perslid_fullnames_all.prs_perslid_naam_full%TYPE;
      l_naam_friendly  prs_v_perslid_fullnames_all.prs_perslid_naam_friendly%TYPE;
   BEGIN
      createopentagattributes ('header',
                               'revision',
                               SUBSTR ('$Revision$', 12, 3),
                               NULL,
                               NULL,
                               NULL,
                               NULL,
                               NULL,
                               NULL);

      BEGIN
          SELECT prs_perslid_naam_full, prs_perslid_naam_friendly
            INTO l_naam_full, l_naam_friendly
            FROM prs_v_perslid_fullnames_all
           WHERE prs_perslid_key = sys_context('USERENV', 'CLIENT_IDENTIFIER');
      EXCEPTION
          WHEN NO_DATA_FOUND  -- for putorders a.o. this is unknown
          THEN NULL;
      END;
      createxmltagvalue ('dateTime',
                         TO_CHAR (SYSDATE, 'dd-mm-yyyy hh24:mi:ss'));
      createxmltagvalue ('dateDay', TO_CHAR (SYSDATE, 'dd'));
      createxmltagvalue ('dateMonth', TO_CHAR (SYSDATE, 'mm'));
      createxmltagvalue ('dateYear', TO_CHAR (SYSDATE, 'yyyy'));
      createxmltagvalue ('user', USER);
      createxmltagvalue ('usernamefull', l_naam_full);
      createxmltagvalue ('usernamefriendly', l_naam_friendly);
      SELECT fac_version_cust, fac_version_otap
        INTO l_custid, l_otap
        FROM  fac_version;
      createxmltagvalue ('custId', l_custid);
      createxmltagvalue ('env', l_otap);
      createxmltagvalue ('language', lcl.getuserlanguage ());
      -- Cannot retrieve server timezone as region name, so display both as offsets
      createxmltagvalue ('servertimezone', TO_CHAR (SYSTIMESTAMP, 'tzr'));
      createxmltagvalue ('usertimezone', SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,6));
      createxmltagvalue ('version', fac.getdbversion ());
      createxmltagvalue ('fac_logo_file', fac.getsetting ('fac_logo_file'));
      createclosetag ('header');
   END;

   FUNCTION find_kenmerk_waarde (p_kenmerk_waarde               IN VARCHAR2,
                                 p_kenmerk_default              IN VARCHAR2,
                                 p_kenmerk_type                 IN VARCHAR2,
                                 p_kenmerkdomein_key            IN NUMBER,
                                 srtkenmerk_nmin                IN NUMBER,
                                 srtkenmerk_nmax                IN NUMBER,
                                 p_refkey                       IN NUMBER DEFAULT NULL,
                                 p_kenmerk_key                  IN NUMBER DEFAULT NULL)
      RETURN VARCHAR
   IS
      sql_stmt    VARCHAR2 (1000);
      kenmerk_m   VARCHAR2 (50);
      sresult     fac_bijlagen.fac_bijlagen_filename%TYPE;
   BEGIN
      IF p_kenmerk_waarde IS NULL
      THEN
         IF p_kenmerk_type IN ('L')
         THEN
            RETURN p_kenmerk_default;
         ELSIF p_kenmerk_type IN ('M')
         THEN
            kenmerk_m := '#donotsuppress#';
            IF p_refkey IS NOT NULL
            THEN
               -- Voor de x in Rx kan eventueel nog de alg_level worden ingevuld.
               kenmerk_m := kenmerk_m || 'Rx=' || TO_CHAR(p_refkey) || '#';
               IF p_kenmerk_key IS NOT NULL
               THEN
                  kenmerk_m := kenmerk_m || 'Kx=' || p_kenmerk_key || '#';
               END IF;
            END IF;
            RETURN kenmerk_m;
         ELSE
            RETURN NULL;
         END IF;
      END IF;

      -- Zo nodig oplossen referentie, maar niet voor xmlnode-kenmerken tenzij wij hier al in de diepte zitten (dan weer wel)!
      IF (p_kenmerk_type = 'R' OR p_kenmerk_type = 'S')
      THEN
         RETURN flx.getdomeinwaarde (p_kenmerkdomein_key, p_kenmerk_waarde, CASE WHEN xmlnode_depth = 0 THEN 1 ELSE 0 END);
      ELSIF (    p_kenmerk_type = 'B'
             AND srtkenmerk_nmin = 0
             AND srtkenmerk_nmax = 1
             AND p_kenmerk_waarde = 0)
      THEN
         RETURN lcl.L ('lcl_check_xml_0');
      ELSIF (    p_kenmerk_type = 'B'
             AND srtkenmerk_nmin = 0
             AND srtkenmerk_nmax = 1
             AND p_kenmerk_waarde = 1)
      THEN
         RETURN lcl.L ('lcl_check_xml_1');
      ELSIF (    p_kenmerk_type = 'V'
             AND p_kenmerk_waarde = 0)
      THEN
         RETURN lcl.L ('lcl_check_xml_0');
      ELSIF (    p_kenmerk_type = 'V'
             AND p_kenmerk_waarde = 1)
      THEN
         RETURN lcl.L ('lcl_check_xml_1');
      END IF;

      RETURN p_kenmerk_waarde;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         RETURN NULL;
   END;

   -- *
   -- * Factuuradres
   -- * Argument is MLD_OPDR_KEY
   -- *

   PROCEDURE create_factuuradres_node (o_key IN NUMBER)
   AS
      v_return            VARCHAR2 (10000);
      v_adres_key         mld_adres.mld_adres_key%TYPE;
      factuuradresfound   NUMBER;
   BEGIN
      factuuradresfound := 0;

      IF o_key IS NOT NULL
      THEN
         BEGIN
            SELECT mld_adres_key
              INTO v_adres_key
              FROM mld_adres a, prs_bedrijf b, mld_opdr o
             WHERE     a.mld_adres_key = b.mld_adres_key_fac
                   AND o.mld_uitvoerende_keys = b.prs_bedrijf_key
                   AND o.mld_opdr_key = o_key;

            factuuradresfound := 1;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               BEGIN
                  SELECT mld_adres_key
                    INTO v_adres_key
                    FROM mld_adres
                   WHERE mld_adres_key IN
                               (SELECT fac.safe_to_number(
                                           NVL (
                                              fa5.prs_kenmerklink_waarde,
                                              NVL (
                                                 fa4.prs_kenmerklink_waarde,
                                                 NVL (
                                                    fa3.prs_kenmerklink_waarde,
                                                    NVL (
                                                       fa2.prs_kenmerklink_waarde,
                                                       NVL (
                                                          fa1.prs_kenmerklink_waarde,
                                                          abd.mld_adres_key_fac))))))
                                  FROM prs_bedrijf abd,
                                       mld_opdr o,
                                       mld_melding m,
                                       prs_v_afdeling_boom a,
                                       prs_perslid p,
                                       prs_v_aanwezigkenmerklink fa1,
                                       prs_v_aanwezigkenmerklink fa2,
                                       prs_v_aanwezigkenmerklink fa3,
                                       prs_v_aanwezigkenmerklink fa4,
                                       prs_v_aanwezigkenmerklink fa5
                                 WHERE abd.prs_bedrijf_key =
                                          a.prs_bedrijf_key
                                       AND p.prs_afdeling_key =
                                             a.prs_afdeling_key
                                       AND fa5.prs_kenmerk_key(+) = 6
                                       AND a.prs_afdeling_key5 =
                                             fa5.prs_link_key(+)
                                       AND fa4.prs_kenmerk_key(+) = 6
                                       AND a.prs_afdeling_key4 =
                                             fa4.prs_link_key(+)
                                       AND fa3.prs_kenmerk_key(+) = 6
                                       AND a.prs_afdeling_key3 =
                                             fa3.prs_link_key(+)
                                       AND fa2.prs_kenmerk_key(+) = 6
                                       AND a.prs_afdeling_key2 =
                                             fa2.prs_link_key(+)
                                       AND fa1.prs_kenmerk_key(+) = 6
                                       AND a.prs_afdeling_key1 =
                                             fa1.prs_link_key(+)
                                       AND p.prs_perslid_key =
                                             m.prs_perslid_key
                                       AND o.mld_melding_key =
                                             m.mld_melding_key
                                       AND o.mld_opdr_key = o_key);

                  factuuradresfound := 1;
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     factuuradresfound := 0;
               END;
         END;

         IF factuuradresfound = 1
         THEN
            create_mld_adres_node (v_adres_key, 'factuuradres', TRUE);
         END IF;
      END IF;
   END;

   -- *
   -- * FAC
   -- *

   PROCEDURE create_fac_note_group_node (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT fac_note_group_key,
                  fac_note_group_xmlnode,
                  fac_note_group_volgnr,
                  fac_note_group_naam,
                  fac_note_group_omschrijving
             FROM fac_note_group
            WHERE fac_note_group_key = p_key;
   BEGIN
      IF p_key IS NOT NULL
      THEN

         FOR rec1 IN c1
         LOOP
            createopentag ('note_group');
            createxmltagvalue ('key', rec1.fac_note_group_key);
            createxmltagvalue ('xmlnode', rec1.fac_note_group_xmlnode);
            createxmltagvalue ('naam', rec1.fac_note_group_naam);
            createxmltagvalue ('omschrijving',
                               rec1.fac_note_group_omschrijving);
            createclosetag ('note_group');
         END LOOP;

      END IF;
   END;

   PROCEDURE create_fac_tracking_node (pxmlnodename   IN VARCHAR2,
                                       p_refkey       IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT t.fac_tracking_datum,
                  t.fac_tracking_oms,
                  t.prs_perslid_key,
                  st.fac_srtnotificatie_code
             FROM fac_tracking t, fac_srtnotificatie st
            WHERE     t.fac_srtnotificatie_key = st.fac_srtnotificatie_key
                  AND st.fac_srtnotificatie_xmlnode = pxmlnodename
                  AND t.fac_tracking_refkey = p_refkey
         ORDER BY fac_tracking_datum;
   BEGIN
      IF p_refkey IS NOT NULL
      THEN
         createopentag ('tracking');

         FOR rec1 IN c1
         LOOP
            createopentagattributes ('track',
                                     'code',
                                     rec1.fac_srtnotificatie_code,
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL);
            mydatetochar ('datum', rec1.fac_tracking_datum);
            create_prs_perslid_node (rec1.prs_perslid_key, 'user', TRUE);
            createxmltagvalue ('code', rec1.fac_srtnotificatie_code);
            createxmltagvalue ('omschrijving', rec1.fac_tracking_oms);
            createclosetag ('track');
         END LOOP;

         createclosetag ('tracking');
      END IF;
   END;

   PROCEDURE create_fac_activiteit_node (p_key IN NUMBER)
   AS
      v_perslid_key   fac_activiteit.prs_perslid_key%TYPE;
      v_user_key      fac_activiteit.fac_activiteit_user_key%TYPE;
      v_eerste        fac_activiteit.fac_activiteit_eerste%TYPE;
      v_laatste       fac_activiteit.fac_activiteit_laatste%TYPE;
      v_volgende      fac_activiteit.fac_activiteit_volgende%TYPE;
      v_xmlnode       fac_activiteit.fac_activiteit_xmlnode%TYPE;
      v_eenheid       fac_activiteit.fac_activiteit_eenheid%TYPE;
      v_bits          fac_activiteit.fac_activiteit_bits%TYPE;
      v_periode       fac_activiteit.fac_activiteit_periode%TYPE;
      v_aantal        fac_activiteit.fac_activiteit_aantal%TYPE;
      v_einddatum     fac_activiteit.fac_activiteit_einddatum%TYPE;
      v_aanmaak       fac_activiteit.fac_activiteit_aanmaak%TYPE;
      v_verwijder     fac_activiteit.fac_activiteit_verwijder%TYPE;
      v_status_key    fac_activiteit.fac_activiteit_status_key%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('activiteit');

         SELECT prs_perslid_key,
                fac_activiteit_user_key,
                fac_activiteit_eerste,
                fac_activiteit_laatste,
                fac_activiteit_volgende,
                fac_activiteit_xmlnode,
                fac_activiteit_eenheid,
                fac_activiteit_bits,
                fac_activiteit_periode,
                fac_activiteit_aantal,
                fac_activiteit_einddatum,
                fac_activiteit_aanmaak,
                fac_activiteit_verwijder,
                fac_activiteit_status_key
           INTO v_perslid_key,
                v_user_key,
                v_eerste,
                v_laatste,
                v_volgende,
                v_xmlnode,
                v_eenheid,
                v_bits,
                v_periode,
                v_aantal,
                v_einddatum,
                v_aanmaak,
                v_verwijder,
                v_status_key
           FROM fac_activiteit
          WHERE fac_activiteit_key = p_key;

         create_prs_perslid_node (v_perslid_key, 'aanvrager', TRUE);
         --v_user_key,
         mydatetochar ('eerste', v_eerste);
         mydatetochar ('laatste', v_laatste);
         mydatetochar ('volgende', v_volgende);
         createxmltagvalue ('xmlnode', v_xmlnode);
         createxmltagvalue ('eenheid', v_eenheid);
         createxmltagvalue ('bits', v_bits);
         createxmltagvalue ('periode', v_periode);
         createxmltagvalue ('aantal', v_aantal);
         mydatetochar ('einddatum', v_einddatum);
         createxmltagvalue ('status', v_status_key);
         createclosetag ('activiteit');
      END IF;
   END;

   -- *
   -- * PRS
   -- *

   PROCEDURE create_prs_kostenpltsgrp_node (p_key IN NUMBER)
   AS
      v_omschrijving      prs_kostenplaatsgrp.prs_kostenplaatsgrp_oms%TYPE;
      v_prs_perslid_key   prs_kostenplaatsgrp.prs_perslid_key%TYPE;
      v_nr                prs_kostenplaatsgrp.prs_kostenplaatsgrp_nr%TYPE;
      v_limiet            prs_kostenplaatsgrp.prs_kostenplaatsgrp_limiet%TYPE;
      v_limperiode        prs_kostenplaatsgrp.prs_kostenplaatsgrp_limperiode%TYPE;
      v_fin_limit1        prs_kostenplaatsgrp.prs_kostenplaatsgrp_fin_limit1%TYPE;
      v_fin_limit2        prs_kostenplaatsgrp.prs_kostenplaatsgrp_fin_limit2%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('kostenplaatsgrp');
         SELECT kpg.prs_kostenplaatsgrp_oms,
                kpg.prs_perslid_key,
                kpg.prs_kostenplaatsgrp_nr,
                kpg.prs_kostenplaatsgrp_limiet,
                kpg.prs_kostenplaatsgrp_limperiode
           INTO v_omschrijving,
                v_prs_perslid_key,
                v_nr,
                v_limiet,
                v_limperiode
           FROM prs_kostenplaatsgrp kpg
          WHERE kpg.prs_kostenplaatsgrp_key = p_key;
         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('omschrijving', v_omschrijving);
         create_prs_perslid_node (v_prs_perslid_key, 'budgethouder', TRUE); -- FALSE geeft oneindige loop
         createxmltagvalue ('nr', v_nr);
         createxmltagvalue ('limiet', v_limiet);
         createxmltagvalue ('limietperiode', v_limperiode);
         createxmltagvalue ('kostenplaatslimiet1', v_fin_limit1);
         createxmltagvalue ('kostenplaatslimiet2', v_fin_limit2);
         createclosetag ('kostenplaatsgrp');
     END IF;
   END;

   PROCEDURE create_prs_kostenplaats_node (p_key IN NUMBER, p_concise IN BOOLEAN)
   AS
      v_nr                prs_kostenplaats.prs_kostenplaats_nr%TYPE;
      v_omschrijving      prs_kostenplaats.prs_kostenplaats_omschrijving%TYPE;
      v_prs_perslid_key   prs_kostenplaats.prs_perslid_key%TYPE;
      v_begin             prs_kostenplaats.prs_kostenplaats_begin%TYPE;
      v_eind              prs_kostenplaats.prs_kostenplaats_eind%TYPE;
      v_module            prs_kostenplaats.prs_kostenplaats_module%TYPE;
      v_limiet            prs_kostenplaats.prs_kostenplaats_limiet%TYPE;
      v_limietperiode     prs_kostenplaats.prs_kostenplaats_limietperiode%TYPE;
      v_extern            prs_kostenplaats.prs_kostenplaats_extern%TYPE;
      v_kostenplaatsgrp_key prs_kostenplaats.prs_kostenplaatsgrp_key%TYPE;
      v_externnr          prs_kostenplaats.prs_kostenplaats_externnr%TYPE;
      v_externsyncdate    prs_kostenplaats.prs_kostenplaats_extsyncdate%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('kostenplaats');
         SELECT k.prs_kostenplaats_nr,
                k.prs_kostenplaats_omschrijving,
                k.prs_perslid_key,
                k.prs_kostenplaats_begin,
                k.prs_kostenplaats_eind,
                k.prs_kostenplaats_module,
                k.prs_kostenplaats_limiet,
                k.prs_kostenplaats_limietperiode,
                k.prs_kostenplaats_extern,
                k.prs_kostenplaatsgrp_key,
                k.prs_kostenplaats_externnr,
                k.prs_kostenplaats_extsyncdate
           INTO v_nr,
                v_omschrijving,
                v_prs_perslid_key,
                v_begin,
                v_eind,
                v_module,
                v_limiet,
                v_limietperiode,
                v_extern,
                v_kostenplaatsgrp_key,
                v_externnr,
                v_externsyncdate
           FROM prs_kostenplaats k
          WHERE prs_kostenplaats_key = p_key;
         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('nr', v_nr);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('begin', v_begin);
         createxmltagvalue ('eind', v_eind);
         createxmltagvalue ('module', v_module);
         createxmltagvalue ('limiet', v_limiet);
         createxmltagvalue ('limietperiode', v_limietperiode);
         createxmltagvalue ('extern', v_extern);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);
         create_prs_kostenpltsgrp_node (v_kostenplaatsgrp_key);
         IF NOT p_concise
         THEN
            create_prs_perslid_node (v_prs_perslid_key, 'budgethouder', TRUE);
         END IF;
         createclosetag ('kostenplaats');
      END IF;
   END;

   PROCEDURE create_bgt_ancestor_node(p_child IN VARCHAR2, p_key IN NUMBER)
   AS
      CURSOR c_soort(p_child_key NUMBER)
      IS
         SELECT s.prs_kostensoort_key
              , s.prs_kostensoort_altcode
              , s.prs_kostensoort_oms
              , f.fin_btwtabelwaarde_perc
           FROM prs_kostensoort s
              , fin_btwtabelwaarde f
          WHERE s.fin_btwtabelwaarde_key = f.fin_btwtabelwaarde_key(+)
            AND s.prs_kostensoort_key = p_child_key;
      CURSOR c_groep(p_child_key NUMBER)
      IS
         SELECT g.prs_kostensoortgrp_key
              , g.prs_kostensoortgrp_altcode
              , g.prs_kostensoortgrp_oms
           FROM prs_kostensoortgrp g
              , prs_kostensoort s
          WHERE g.prs_kostensoortgrp_key = s.prs_kostensoortgrp_key
            AND s.prs_kostensoort_key = p_child_key;
      CURSOR c_rubriek(p_child_key NUMBER)
      IS
         SELECT r.bgt_kostenrubriek_key
              , r.bgt_kostenrubriek_code
              , r.bgt_kostenrubriek_oms
              , f.fin_btwtabelwaarde_perc
           FROM bgt_kostenrubriek r
              , prs_kostensoortgrp g
              , fin_btwtabelwaarde f
          WHERE r.bgt_kostenrubriek_key = g.bgt_kostenrubriek_key
            AND r.fin_btwtabelwaarde_key = f.fin_btwtabelwaarde_key(+)
            AND g.prs_kostensoortgrp_key = p_child_key;
      CURSOR c_project(p_child_key NUMBER)
      IS
         SELECT p.bgt_project_key
              , p.bgt_project_code
              , p.bgt_project_omschrijving
           FROM bgt_project p
              , bgt_kostenrubriek r
          WHERE p.bgt_project_key = r.bgt_project_key
            AND r.bgt_kostenrubriek_key = p_child_key;
      CURSOR c_discipline(p_child_key NUMBER)
      IS
         SELECT d.ins_discipline_key
              , d.ins_discipline_omschrijving
              , p.bgt_disc_params_code
              , p.bgt_disc_params_opdrachtgever
           FROM ins_tab_discipline d
              , bgt_disc_params p
              , bgt_project s
          WHERE d.ins_discipline_key = p.bgt_ins_discipline_key
            AND d.ins_discipline_key = s.ins_discipline_key
            AND s.bgt_project_key = p_child_key;

      v_key    NUMBER(10);
      v_child  VARCHAR2(30);
   BEGIN
     createopentag ('ancestor');
        v_key := p_key;
        v_child := p_child;
        IF v_child = 'soort_key' -- als je alleen de kostensoort_key hebt, maar geen kostensoort gegevens.
        THEN
           FOR c5 IN c_soort(v_key)
           LOOP
              createopentag('soort');
              createxmltagvalue('key',     c5.prs_kostensoort_key);
              createxmltagvalue('code',    c5.prs_kostensoort_altcode);
              createxmltagvalue('name',    c5.prs_kostensoort_oms);
              createxmltagvalue('btwperc', c5.fin_btwtabelwaarde_perc);
              createclosetag('soort');
              v_child := 'soort';
              v_key := c5.prs_kostensoort_key;
           END LOOP;
        END IF;
        IF v_child = 'soort'
        THEN
           FOR c4 IN c_groep(v_key)
           LOOP
              createopentag('groep');
              createxmltagvalue('key',  c4.prs_kostensoortgrp_key);
              createxmltagvalue('code', c4.prs_kostensoortgrp_altcode);
              createxmltagvalue('name', c4.prs_kostensoortgrp_oms);
              createclosetag('groep');
              v_child := 'groep';
              v_key := c4.prs_kostensoortgrp_key;
           END LOOP;
        END IF;
        IF v_child = 'groep'
        THEN
           FOR c3 IN c_rubriek(v_key)
           LOOP
              createopentag('rubriek');
              createxmltagvalue('key',     c3.bgt_kostenrubriek_key);
              createxmltagvalue('code',    c3.bgt_kostenrubriek_code);
              createxmltagvalue('name',    c3.bgt_kostenrubriek_oms);
              createxmltagvalue('btwperc', c3.fin_btwtabelwaarde_perc);
              createclosetag('rubriek');
              v_child := 'rubriek';
              v_key := c3.bgt_kostenrubriek_key;
           END LOOP;
        END IF;
        IF v_child = 'rubriek'
        THEN
           FOR c2 IN c_project(v_key)
           LOOP
              createopentag('project');
              createxmltagvalue('key', c2.bgt_project_key);
              createxmltagvalue('code', c2.bgt_project_code);
              createxmltagvalue('name', c2.bgt_project_omschrijving);
              createclosetag('project');
              v_child := 'project';
              v_key := c2.bgt_project_key;
           END LOOP;
        END IF;
        if v_child = 'project'
        THEN
           FOR c1 IN c_discipline(v_key)
           LOOP
              createopentag('discipline');
              createxmltagvalue('key', c1.ins_discipline_key);
              createxmltagvalue('code', c1.bgt_disc_params_code);
              createxmltagvalue('name', c1.ins_discipline_omschrijving);
              createxmltagvalue('principal', c1.bgt_disc_params_opdrachtgever);
              createclosetag('discipline');
              v_child := 'discipline';
              v_key := c1.ins_discipline_key;
           END LOOP;
        END IF;
        -- IF v_child = 'discipline' :: Dan heb je alle gegevens al.
     createclosetag ('ancestor');
   END;

   PROCEDURE create_bgt_budgetmutatie_node (p_budget_key IN NUMBER, p_mutatie_key IN NUMBER)
   AS
      v_datum           bgt_budgetmutatie.bgt_budgetmutatie_datum%TYPE;
      v_omschrijving    bgt_budgetmutatie.bgt_budgetmutatie_omschrijving%TYPE;
      v_key_van         bgt_budgetmutatie.bgt_budget_key_van%TYPE;
      v_key_naar        bgt_budgetmutatie.bgt_budget_key_naar%TYPE;
      v_bedrag_van      bgt_budgetmutatie.bgt_budget_bedrag_van%TYPE;
      v_btwbedrag_van   bgt_budgetmutatie.bgt_budget_btwbedrag_van%TYPE;
      v_bedrag_naar     bgt_budgetmutatie.bgt_budget_bedrag_naar%TYPE;
      v_btwbedrag_naar  bgt_budgetmutatie.bgt_budget_btwbedrag_naar%TYPE;
      v_reserve         bgt_budgetmutatie.bgt_budgetmutatie_reserve%TYPE;
      v_volgnr          bgt_budgetmutatie.bgt_budgetmutatie_volgnr%TYPE;
      v_code            bgt_budgetmutatie.bgt_budgetmutatie_code%TYPE;
      v_persoon         prs_perslid.prs_perslid_key%TYPE;
   BEGIN
      IF p_mutatie_key IS NOT NULL
      THEN
         SELECT bgt_budgetmutatie_datum
              , bgt_budgetmutatie_omschrijving
              , prs_perslid_key
              , bgt_budget_key_van
              , bgt_budget_key_naar
              , bgt_budget_bedrag_van
              , bgt_budget_btwbedrag_van
              , bgt_budget_bedrag_naar
              , bgt_budget_btwbedrag_naar
              , bgt_budgetmutatie_reserve
              , bgt_budgetmutatie_volgnr
              , bgt_budgetmutatie_code
           INTO v_datum
              , v_omschrijving
              , v_persoon
              , v_key_van
              , v_key_naar
              , v_bedrag_van
              , v_btwbedrag_van
              , v_bedrag_naar
              , v_btwbedrag_naar
              , v_reserve
              , v_volgnr
              , v_code
           FROM bgt_budgetmutatie
          WHERE bgt_budgetmutatie_key = p_mutatie_key;
         createopentag ('mutation');
         createxmltagvalue ('key', mynumbertochar (p_mutatie_key));
         mydatetochar ('date', v_datum);
         createxmltagvalue ('remark', v_omschrijving);
         IF (p_budget_key = v_key_van) THEN
            createxmltagvalue ('amount',    mynumbertochar (v_bedrag_van));
            createxmltagvalue ('amountvat', mynumbertochar (v_btwbedrag_van));
         END IF;
         IF (p_budget_key = v_key_naar) THEN
            createxmltagvalue ('amount',    mynumbertochar (v_bedrag_naar));
            createxmltagvalue ('amountvat', mynumbertochar (v_btwbedrag_naar));
         END IF;
         createxmltagvalue ('reserve',  mynumbertochar (v_reserve));
         createxmltagvalue ('sequence', mynumbertochar (v_volgnr));
         createxmltagvalue ('code',     v_code);
         createclosetag ('mutation');
      END IF;
   END;
   PROCEDURE create_bgt_budget_node (p_key IN NUMBER)
   AS
      CURSOR c_mutatie
      IS
         SELECT bgt_budgetmutatie_key
           FROM bgt_budgetmutatie
          WHERE bgt_budget_key_van = p_key
             OR bgt_budget_key_naar = p_key;
      v_disc_key      bgt_budget.ins_discipline_key%TYPE;
      v_project_key   bgt_budget.bgt_project_key%TYPE;
      v_rubriek_key   bgt_budget.bgt_kostenrubriek_key%TYPE;
      v_groep_key     bgt_budget.prs_kostensoortgrp_key%TYPE;
      v_soort_key     bgt_budget.prs_kostensoort_key%TYPE;
      v_begin         bgt_budget.bgt_budget_begin%TYPE;
      v_eind          bgt_budget.bgt_budget_eind%TYPE;
      v_aanmaak       bgt_budget.bgt_budget_aanmaak%TYPE;
      v_verval        bgt_budget.bgt_budget_vervaldatum%TYPE;
      v_bedrag        bgt_budget.bgt_budget_bedrag%TYPE;
      v_btwbedrag     bgt_budget.bgt_budget_btwbedrag%TYPE;
      v_isreserve     bgt_budget.bgt_budget_isreserve%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         SELECT ins_discipline_key
              , bgt_project_key
              , bgt_kostenrubriek_key
              , prs_kostensoortgrp_key
              , prs_kostensoort_key
              , bgt_budget_begin
              , bgt_budget_eind
              , bgt_budget_aanmaak
              , bgt_budget_vervaldatum
              , bgt_budget_bedrag
              , bgt_budget_btwbedrag
              , bgt_budget_isreserve
           INTO v_disc_key
              , v_project_key
              , v_rubriek_key
              , v_groep_key
              , v_soort_key
              , v_begin
              , v_eind
              , v_aanmaak
              , v_verval
              , v_bedrag
              , v_btwbedrag
              , v_isreserve
           FROM bgt_budget
          WHERE bgt_budget_key = p_key;
         createopentag ('budget');
         mydatetochar ('startdate', v_begin);
         mydatetochar ('enddate', v_eind);
         mydatetochar ('created', v_aanmaak);
         mydatetochar ('expires', v_verval);
         createxmltagvalue ('amount', mynumbertochar (v_bedrag));
         createxmltagvalue ('withvat', mynumbertochar (v_btwbedrag));
         FOR rec1 IN c_mutatie
         LOOP
            create_bgt_budgetmutatie_node (p_key, rec1.bgt_budgetmutatie_key);
         END LOOP;
         createclosetag ('budget');
      END IF;
   END;
   PROCEDURE create_prs_kostensoort_node (p_key IN NUMBER, p_concise IN BOOLEAN DEFAULT FALSE)
   AS
      CURSOR c_opdracht
      IS
         SELECT mld_opdr_key
           FROM mld_opdr
          WHERE prs_kostensoort_key = p_key;

      CURSOR c_budget
      IS
         SELECT bgt_budget_key
           FROM bgt_budget
          WHERE prs_kostensoort_key = p_key;

      v_omschrijving      prs_kostensoort.prs_kostensoort_oms%TYPE;
      v_omschrijving_alt  prs_kostensoort.prs_kostensoort_altcode%TYPE;
      v_groep             prs_kostensoortgrp.prs_kostensoortgrp_oms%TYPE;
      v_groep_alt         prs_kostensoortgrp.prs_kostensoortgrp_altcode%TYPE;
      v_opmerking         prs_kostensoort.prs_kostensoort_opmerking%TYPE;
      v_refcode           prs_kostensoort.prs_kostensoort_refcode%TYPE;
      v_doorbelasten      prs_kostensoort.prs_kostensoort_doorbelasten%TYPE;
      v_btw               prs_kostensoort.prs_kostensoort_btw%TYPE;
      v_btwperc           fin_btwtabelwaarde.fin_btwtabelwaarde_perc%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('kostensoort');
         --
         IF p_concise  -- dan ook parent_info
         THEN
            create_bgt_ancestor_node('soort', p_key);
         END IF;
         --
         SELECT k.prs_kostensoort_oms,
                k.prs_kostensoort_altcode,
                g.prs_kostensoortgrp_oms,
                g.prs_kostensoortgrp_altcode,
                k.prs_kostensoort_opmerking,
                k.prs_kostensoort_refcode,
                k.prs_kostensoort_doorbelasten,
                k.prs_kostensoort_btw,
                f.fin_btwtabelwaarde_perc
           INTO v_omschrijving,
                v_omschrijving_alt,
                v_groep,
                v_groep_alt,
                v_opmerking,
                v_refcode,
                v_doorbelasten,
                v_btw,
                v_btwperc
           FROM prs_kostensoort k
              , prs_kostensoortgrp g
              , fin_btwtabelwaarde f
          WHERE k.prs_kostensoortgrp_key = g.prs_kostensoortgrp_key(+)
            AND k.fin_btwtabelwaarde_key = f.fin_btwtabelwaarde_key(+)
            AND k.prs_kostensoort_key = p_key;

         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('omschrijving_alt', v_omschrijving_alt);
         createxmltagvalue ('groep', v_groep);
         createxmltagvalue ('groep_alt', v_groep_alt);
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('refcode', v_refcode);
         createxmltagvalue ('doorbelasten', v_doorbelasten);
         createxmltagvalue ('btw', v_btw);
         --
         IF p_concise THEN
            FOR rec1 IN c_opdracht
            LOOP
               create_mld_opdr_node (rec1.mld_opdr_key, NULL, TRUE, TRUE);
            END LOOP;
            --
            FOR rec2 IN c_budget
            LOOP
               create_bgt_budget_node (rec2.bgt_budget_key);
            END LOOP;
         END IF;
         createclosetag ('kostensoort');
      END IF;
   END;

   -- *
   -- * PRS kenmerken
   -- *

   PROCEDURE create_prs_kenmerken (p_key IN NUMBER, p_niveau IN VARCHAR2)
   AS
      CURSOR c1
      IS
           SELECT k.prs_kenmerk_key,
                  k.prs_kenmerk_code,
                  lcl.x ('prs_kenmerk_omschrijving', k.prs_kenmerk_key, prs_kenmerk_omschrijving) prs_kenmerk_omschrijving,
                  k.prs_kenmerk_kenmerktype,
                  k.fac_kenmerkdomein_key,
                  k.prs_kenmerk_lengte,
                  k.prs_kenmerk_dec,
                  k.prs_kenmerk_nmin,
                  k.prs_kenmerk_nmax,
                  k.prs_kenmerk_default,
                  NVL (k.prs_kenmerk_volgnr, 0) volgnummer,
                  lcl.x ('prs_kenmerk_dimensie',
                         k.prs_kenmerk_key,
                         prs_kenmerk_dimensie)
                     dimensie,
                  lcl.x ('prs_kenmerk_hint',
                         k.prs_kenmerk_key,
                         prs_kenmerk_hint)
                     hint,
                  v.prs_kenmerklink_waarde
             FROM prs_kenmerk k,
                  (SELECT w.prs_kenmerk_key
                        , w.prs_kenmerklink_waarde
                     FROM prs_kenmerklink w
                    WHERE w.prs_link_key = p_key
                      AND w.prs_kenmerklink_niveau = p_niveau
                      AND w.prs_kenmerklink_verwijder IS NULL
                  ) v
            WHERE k.prs_kenmerk_niveau = p_niveau
              AND k.prs_kenmerk_verwijder IS NULL
              AND v.prs_kenmerk_key(+) = k.prs_kenmerk_key
         ORDER BY k.prs_kenmerk_volgnr;

      v_kenmerk_waarde       prs_kenmerklink.prs_kenmerklink_waarde%TYPE;
   BEGIN
      FOR rec1 IN c1
      LOOP
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.prs_kenmerklink_waarde,
                                 rec1.prs_kenmerk_default,
                                 rec1.prs_kenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.prs_kenmerk_nmin,
                                 rec1.prs_kenmerk_nmax,
                                 p_key,
                                 rec1.prs_kenmerk_key);

         createxmltagvalueattributes9('kenmerk',
                                      'kenmerkcode',  rec1.prs_kenmerk_code,
                                      'naam',         rec1.prs_kenmerk_omschrijving,
                                      'type',         rec1.prs_kenmerk_kenmerktype,
                                      'volgnummer',   rec1.volgnummer,
                                      'key',          rec1.prs_kenmerk_key,
                                      'dimensie',     rec1.dimensie,
                                      NULL,           NULL,
                                      NULL,           NULL,
                                      NULL,           NULL,
                                      rec1.fac_kenmerkdomein_key,
                                      v_kenmerk_waarde
                                     );
      END LOOP;
   END;

   PROCEDURE create_prs_contactpersoon_node (p_key IN NUMBER,
                                             p_concise IN BOOLEAN)
   AS
      v_cp_naam          prs_contactpersoon.prs_contactpersoon_naam%TYPE;
      v_cp_voorletters   prs_contactpersoon.prs_contactpersoon_voorletters%TYPE;
      v_cp_voornaam      prs_contactpersoon.prs_contactpersoon_voornaam%TYPE;
      v_cp_aanhef        prs_contactpersoon.prs_contactpersoon_aanhef%TYPE;
      v_cp_telefoon1     prs_contactpersoon.prs_contactpersoon_telefoon_1%TYPE;
      v_cp_telefoon2     prs_contactpersoon.prs_contactpersoon_telefoon_2%TYPE;
      v_cp_fax           prs_contactpersoon.prs_contactpersoon_fax%TYPE;
      v_cp_email         prs_contactpersoon.prs_contactpersoon_email%TYPE;
      v_cp_opmerking     prs_contactpersoon.prs_contactpersoon_opmerking%TYPE;
      v_cp_tussenv       prs_contactpersoon.prs_contactpersoon_tussenv%TYPE;
      v_cp_functie       prs_contactpersoon.prs_contactpersoon_functie%TYPE;
      v_cp_titel         prs_contactpersoon.prs_contactpersoon_titel%TYPE;
      v_externnr         prs_contactpersoon.prs_contactpersoon_externnr%TYPE;
      v_externsyncdate   prs_contactpersoon.prs_contactpersoon_extsyncdate%TYPE;
      v_naam_full        VARCHAR2 (255);

      CURSOR c1
      IS
         SELECT alg_locatie_key
           FROM prs_contactpersoon_locatie
          WHERE prs_contactpersoon_key = p_key;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         -- balen dat we contact_persoon hebben, en niet contactpersoon
         createopentag ('contactpersoon');

         SELECT prs_contactpersoon_naam,
                prs_contactpersoon_voorletters,
                prs_contactpersoon_voornaam,
                prs_contactpersoon_aanhef,
                prs_contactpersoon_telefoon_1,
                prs_contactpersoon_telefoon_2,
                prs_contactpersoon_fax,
                prs_contactpersoon_email,
                prs_contactpersoon_opmerking,
                prs_contactpersoon_tussenv,
                prs_contactpersoon_functie,
                prs_contactpersoon_titel,
                DECODE (prs_contactpersoon_aanhef,
                        NULL, '',
                        prs_contactpersoon_aanhef || ' ')
                || DECODE (prs_contactpersoon_voorletters,
                           NULL, '',
                           prs_contactpersoon_voorletters || ' ')
                || DECODE (prs_contactpersoon_tussenv,
                           NULL, '',
                           prs_contactpersoon_tussenv || ' ')
                || prs_contactpersoon_naam
                   naam_full,
                prs_contactpersoon_externnr,
                prs_contactpersoon_extsyncdate
           INTO v_cp_naam,
                v_cp_voorletters,
                v_cp_voornaam,
                v_cp_aanhef,
                v_cp_telefoon1,
                v_cp_telefoon2,
                v_cp_fax,
                v_cp_email,
                v_cp_opmerking,
                v_cp_tussenv,
                v_cp_functie,
                v_cp_titel,
                v_naam_full,
                v_externnr,
                v_externsyncdate
           FROM prs_contactpersoon
          WHERE prs_contactpersoon_key = p_key;

         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('naam_full', v_naam_full);
         createxmltagvalue ('naam', v_cp_naam);
         createxmltagvalue ('voorletters', v_cp_voorletters);
         createxmltagvalue ('voornaam', v_cp_voornaam);
         createxmltagvalue ('aanhef', v_cp_aanhef);
         createxmltagvalue ('telefoon1', v_cp_telefoon1);
         createxmltagvalue ('telefoon2', v_cp_telefoon2);
         createxmltagvalue ('fax', v_cp_fax);
         createxmltagvalue ('email', v_cp_email);
         createxmltagvalue ('opmerking', v_cp_opmerking);
         createxmltagvalue ('tussenv', v_cp_tussenv);
         createxmltagvalue ('functie', v_cp_functie);
         createxmltagvalue ('titel', v_cp_titel);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);

         FOR rec1 IN c1
         LOOP
            create_alg_locatie_node (rec1.alg_locatie_key,
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL,
                                     FALSE,
                                     p_concise);
         END LOOP;

         createclosetag ('contactpersoon');
      END IF;
   END;

   PROCEDURE create_prs_relatietype_node (p_key IN NUMBER)
   AS
      v_omschrijving         prs_relatietype.prs_relatietype_omschrijving%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('relatietype');

         SELECT prs_relatietype_omschrijving
           INTO v_omschrijving
           FROM prs_relatietype
          WHERE prs_relatietype_key = p_key;

         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('omschrijving', v_omschrijving);

         createclosetag ('relatietype');
      END IF;
   END;

   PROCEDURE create_prs_bedrijfadres_node (p_key IN NUMBER)
   AS
   BEGIN
      IF p_key IS NOT NULL
      THEN
         FOR rec IN (SELECT *
                FROM prs_bedrijfadres
                WHERE prs_bedrijfadres_key = p_key)
         LOOP
             createopentag ('bedrijfadres');
             createxmltagvalue ('key', rec.prs_bedrijfadres_key);
             createxmltagvalue ('type', rec.prs_bedrijfadres_type);
             createxmltagvalue ('typeopdr', rec.mld_typeopdr_key);
             createxmltagvalue ('soapversion', rec.prs_bedrijfadres_soapversion);
             createxmltagvalue ('soapaction', rec.prs_bedrijfadres_soapaction);
             createxmltagvalue ('authmethod', rec.prs_bedrijfadres_authmethod);
             createxmltagvalue ('token_url', rec.prs_bedrijfadres_oa_token_url);
             createxmltagvalue ('scope', rec.prs_bedrijfadres_oa_scope);
             createxmltagvalue ('resource', rec.prs_bedrijfadres_oa_resource);
             createxmltagvalue ('district_key', rec.alg_district_key);
             createxmltagvalue ('locatie_key', rec.alg_locatie_key);
             createxmltagvalue ('mailsender', rec.prs_bedrijfadres_sender);
             createxmltagvalue ('mailreply', rec.prs_bedrijfadres_replyaddress);
             createxmltagvalue ('flexfiles', rec.prs_bedrijfadres_flexfiles);
             createxmltagvalue ('encoding', rec.prs_bedrijfadres_encoding);
             createxmltagvalue ('charset', rec.prs_bedrijfadres_charset);
             createxmltagvalue ('plugin', rec.prs_bedrijfadres_plugin);
             createxmltagvalue ('plugindata', rec.prs_bedrijfadres_plugindata);
             createxmltagvalue ('error_handler', rec.prs_bedrijfadres_error_handler);
             IF rec.prs_bedrijfadres_authmethod = 3
             THEN
                 createxmltagvalue ('username', rec.prs_bedrijfadres_username);
                 createxmltagvalue ('password', rec.prs_bedrijfadres_password);
             END IF;
             createclosetag ('bedrijfadres');
         END LOOP;
      END IF;
   END;

   PROCEDURE create_prs_bedrijf_node (p_bedrijf_key   IN NUMBER,
                                      p_nodename      IN VARCHAR2,
                                      p_concise       IN BOOLEAN)
   AS
      v_naam                 prs_bedrijf.prs_bedrijf_naam%TYPE;
      v_post_adres           prs_bedrijf.prs_bedrijf_post_adres%TYPE;
      v_post_postcode        prs_bedrijf.prs_bedrijf_post_postcode%TYPE;
      v_post_plaats          prs_bedrijf.prs_bedrijf_post_plaats%TYPE;
      v_post_land            prs_bedrijf.prs_bedrijf_post_land%TYPE;
      v_bezoek_adres         prs_bedrijf.prs_bedrijf_bezoek_adres%TYPE;
      v_bezoek_postcode      prs_bedrijf.prs_bedrijf_bezoek_postcode%TYPE;
      v_bezoek_plaats        prs_bedrijf.prs_bedrijf_bezoek_plaats%TYPE;
      v_bezoek_land          prs_bedrijf.prs_bedrijf_bezoek_land%TYPE;
      v_telefoon             prs_bedrijf.prs_bedrijf_telefoon%TYPE;
      v_fax                  prs_bedrijf.prs_bedrijf_fax%TYPE;
      v_url                  prs_bedrijf.prs_bedrijf_url%TYPE;
      v_contact_persoon      prs_bedrijf.prs_bedrijf_contact_persoon%TYPE;
      v_contact_telefoon     prs_bedrijf.prs_bedrijf_contact_telefoon%TYPE;
      v_contact_fax          prs_bedrijf.prs_bedrijf_fax%TYPE;
      v_opmerking            prs_bedrijf.prs_bedrijf_opmerking%TYPE;
      v_uurloon              prs_bedrijf.prs_bedrijf_uurloon%TYPE;
      v_leverancier_nr       prs_bedrijf.prs_leverancier_nr%TYPE;
      v_overeenkomst_nr      prs_bedrijf.prs_overeenkomst_nr%TYPE;
      v_overeenkomst_datum   prs_bedrijf.prs_overeenkomst_datum%TYPE;
      v_leverancier          prs_bedrijf.prs_bedrijf_leverancier%TYPE;
      v_uitvoerende          prs_bedrijf.prs_bedrijf_uitvoerende%TYPE;
      v_contract             prs_bedrijf.prs_bedrijf_contract%TYPE;
      v_huurder              prs_bedrijf.prs_bedrijf_huurder%TYPE;
      v_intern               prs_bedrijf.prs_bedrijf_intern%TYPE;
      v_email                prs_bedrijf.prs_bedrijf_email%TYPE;
      v_image_loc            prs_bedrijf.prs_bedrijf_image_loc%TYPE;
      v_details_loc          prs_bedrijf.prs_bedrijf_details_loc%TYPE;
      v_telefoon2            prs_bedrijf.prs_bedrijf_telefoon2%TYPE;
      v_opmerking2           prs_bedrijf.prs_bedrijf_opmerking2%TYPE;
      v_mld_adres_key_lev    prs_bedrijf.mld_adres_key_lev%TYPE;
      v_mld_adres_key_fac    prs_bedrijf.mld_adres_key_fac%TYPE;
      v_xmldetails_loc       prs_bedrijf.prs_bedrijf_xmldetails_loc%TYPE;
      v_bes_limiet           prs_bedrijf.prs_bedrijf_bes_limiet%TYPE;
      v_bes_kosten           prs_bedrijf.prs_bedrijf_bes_kosten%TYPE;
      v_relatietype_key      prs_bedrijf.prs_relatietype_key%TYPE;
      v_x                    prs_bedrijf.prs_bedrijf_x%TYPE;
      v_y                    prs_bedrijf.prs_bedrijf_y%TYPE;

      CURSOR c1
      IS
         SELECT prs_contactpersoon_key
           FROM prs_contactpersoon
          WHERE prs_contactpersoon_verwijder IS NULL
            AND prs_bedrijf_key = p_bedrijf_key;
   BEGIN
      IF p_bedrijf_key IS NOT NULL
      THEN
         createopentag (p_nodename);

         SELECT prs_bedrijf_naam,
                prs_bedrijf_post_adres,
                prs_bedrijf_post_postcode,
                prs_bedrijf_post_plaats,
                prs_bedrijf_post_land,
                prs_bedrijf_bezoek_adres,
                prs_bedrijf_bezoek_postcode,
                prs_bedrijf_bezoek_plaats,
                prs_bedrijf_bezoek_land,
                prs_bedrijf_telefoon,
                prs_bedrijf_fax,
                prs_bedrijf_url,
                prs_bedrijf_contact_persoon,
                prs_bedrijf_contact_telefoon,
                prs_bedrijf_contact_fax,
                prs_bedrijf_opmerking,
                prs_bedrijf_uurloon,
                prs_leverancier_nr,
                prs_overeenkomst_nr,
                prs_overeenkomst_datum,
                prs_bedrijf_leverancier,
                prs_bedrijf_uitvoerende,
                prs_bedrijf_contract,
                prs_bedrijf_huurder,
                prs_bedrijf_intern,
                prs_bedrijf_email,
                prs_bedrijf_image_loc,
                prs_bedrijf_details_loc,
                prs_bedrijf_telefoon2,
                prs_bedrijf_opmerking2,
                mld_adres_key_lev,
                mld_adres_key_fac,
                prs_bedrijf_xmldetails_loc,
                prs_bedrijf_bes_limiet,
                prs_bedrijf_bes_kosten,
                prs_relatietype_key,
                prs_bedrijf_x,
                prs_bedrijf_y
           INTO v_naam,
                v_post_adres,
                v_post_postcode,
                v_post_plaats,
                v_post_land,
                v_bezoek_adres,
                v_bezoek_postcode,
                v_bezoek_plaats,
                v_bezoek_land,
                v_telefoon,
                v_fax,
                v_url,
                v_contact_persoon,
                v_contact_telefoon,
                v_contact_fax,
                v_opmerking,
                v_uurloon,
                v_leverancier_nr,
                v_overeenkomst_nr,
                v_overeenkomst_datum,
                v_leverancier,
                v_uitvoerende,
                v_contract,
                v_huurder,
                v_intern,
                v_email,
                v_image_loc,
                v_details_loc,
                v_telefoon2,
                v_opmerking2,
                v_mld_adres_key_lev,
                v_mld_adres_key_fac,
                v_xmldetails_loc,
                v_bes_limiet,
                v_bes_kosten,
                v_relatietype_key,
                v_x,
                v_y
           FROM prs_bedrijf
          WHERE prs_bedrijf_key = p_bedrijf_key;

         createxmltagvalue ('key', mynumbertochar (p_bedrijf_key));
         createxmltagvalue ('naam', v_naam);
         createxmltagvalue ('post_adres', v_post_adres);
         createxmltagvalue ('post_postcode', v_post_postcode);
         createxmltagvalue ('post_plaats', v_post_plaats);
         createxmltagvalue ('post_land', v_post_land);
         createxmltagvalue ('bezoek_adres', v_bezoek_adres);
         createxmltagvalue ('bezoek_postcode', v_bezoek_postcode);
         createxmltagvalue ('bezoek_plaats', v_bezoek_plaats);
         createxmltagvalue ('bezoek_land', v_bezoek_land);
         createxmltagvalue ('telefoon', v_telefoon);
         createxmltagvalue ('fax', v_fax);
         createxmltagvalue ('url', v_url);
         createxmltagvalue ('contact_persoon', v_contact_persoon);
         createxmltagvalue ('contact_telefoon', v_contact_telefoon);
         createxmltagvalue ('contact_fax', v_contact_fax);
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('uurloon', v_uurloon);
         createxmltagvalue ('leverancier_nr', v_leverancier_nr);
         createxmltagvalue ('overeenkomst_nr', v_overeenkomst_nr);
         mydatetochar ('overeenkomst_datum', v_overeenkomst_datum);
         createxmltagvalue ('isleverancier', v_leverancier);
         createxmltagvalue ('isuitvoerende', v_uitvoerende);
         createxmltagvalue ('iscontract', v_contract);
         createxmltagvalue ('ishuurder', v_huurder);
         createxmltagvalue ('isintern', v_intern);
         createxmltagvalue ('email', v_email);
         createxmltagvalue ('xmldetails_loc', v_xmldetails_loc);
         createxmltagvalue ('image_loc', v_image_loc);
         createxmltagvalue ('details_loc', v_details_loc);
         createxmltagvalue ('telefoon2', v_telefoon2);
         createxmltagvalue ('opmerking2', v_opmerking2);
         create_mld_adres_node (v_mld_adres_key_lev, 'afleveradres', TRUE);
         create_mld_adres_node (v_mld_adres_key_fac, 'factuuradres', TRUE);
         create_prs_kenmerken (p_bedrijf_key, 'B');
         createxmltagvalue ('beslimiet', v_bes_limiet);
         createxmltagvalue ('beskosten', v_bes_kosten);
         createxmltagvalue ('x', v_x);
         createxmltagvalue ('y', v_y);

         FOR rec1 IN c1
         LOOP
            create_prs_contactpersoon_node (rec1.prs_contactpersoon_key, TRUE);
         END LOOP;

         IF NOT p_concise
         THEN
             FOR rec IN (SELECT prs_bedrijfadres_key
                    FROM prs_bedrijfadres
                    WHERE prs_bedrijf_key = p_bedrijf_key)
             LOOP
                 create_prs_bedrijfadres_node(rec.prs_bedrijfadres_key);
             END LOOP;
         END IF;

         create_prs_relatietype_node (v_relatietype_key);

         createclosetag (p_nodename);
      END IF;
   END;

   PROCEDURE create_prs_bedrijf_bdr_node (p_key IN NUMBER)
   AS
      v_prs_bedrijf_bedrijf_key         prs_bedrijf_bedrijf.prs_bedrijf_bedrijf_key%TYPE;
      v_prs_bedrijf_key1                prs_bedrijf_bedrijf.prs_bedrijf_key1%TYPE;
      v_prs_bedrijf_externid1           prs_bedrijf_bedrijf.prs_bedrijf_externid1%TYPE;
      v_prs_bedrijf_externsyncdate1     prs_bedrijf_bedrijf.prs_bedrijf_externsyncdate1%TYPE;
      v_prs_bedrijf_key2                prs_bedrijf_bedrijf.prs_bedrijf_key2%TYPE;
      v_prs_bedrijf_externid2           prs_bedrijf_bedrijf.prs_bedrijf_externid2%TYPE;
      v_prs_bedrijf_externsyncdate2     prs_bedrijf_bedrijf.prs_bedrijf_externsyncdate2%TYPE;
      v_prs_bedrijf_bedrijf_startdtm  prs_bedrijf_bedrijf.prs_bedrijf_bedrijf_startdatum%TYPE;
      v_prs_bedrijf_bedrijf_einddtm   prs_bedrijf_bedrijf.prs_bedrijf_bedrijf_einddatum%TYPE;
      v_prs_bedrijf_bedrijf_status      prs_bedrijf_bedrijf.prs_bedrijf_bedrijf_status%TYPE;
      v_prs_bedrijf_bedrijf_charged     prs_bedrijf_bedrijf.prs_bedrijf_bedrijf_charged%TYPE;
      v_prs_bedrijf_bdr_chargemode  prs_bedrijf_bedrijf.prs_bedrijf_bedrijf_chargemode%TYPE;
      v_prs_bedrijf_bedrijf_fee1        prs_bedrijf_bedrijf.prs_bedrijf_bedrijf_fee1%TYPE;
      v_prs_bedrijf_bedrijf_fee2        prs_bedrijf_bedrijf.prs_bedrijf_bedrijf_fee2%TYPE;
      v_prs_bedrijf_bedrijf_fee3        prs_bedrijf_bedrijf.prs_bedrijf_bedrijf_fee3%TYPE;
      v_fin_btwtabelwaarde_key          prs_bedrijf_bedrijf.fin_btwtabelwaarde_key%TYPE;
      v_prs_bedrijf_bedrijf_g_pct       prs_bedrijf_bedrijf.prs_bedrijf_bedrijf_g_pct%TYPE;
      v_prs_bedrijf_bedrijf_account1    prs_bedrijf_bedrijf.prs_bedrijf_bedrijf_account1%TYPE;
      v_prs_bedrijf_bedrijf_account2    prs_bedrijf_bedrijf.prs_bedrijf_bedrijf_account2%TYPE;

   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('bedrijf_bedrijf');

         SELECT prs_bedrijf_bedrijf_key,
                prs_bedrijf_key1,
                prs_bedrijf_externid1,
                prs_bedrijf_externsyncdate1,
                prs_bedrijf_key2,
                prs_bedrijf_externid2,
                prs_bedrijf_externsyncdate2,
                prs_bedrijf_bedrijf_startdatum,
                prs_bedrijf_bedrijf_einddatum,
                prs_bedrijf_bedrijf_status,
                prs_bedrijf_bedrijf_charged,
                prs_bedrijf_bedrijf_chargemode,
                prs_bedrijf_bedrijf_fee1,
                prs_bedrijf_bedrijf_fee2,
                prs_bedrijf_bedrijf_fee3,
                fin_btwtabelwaarde_key,
                prs_bedrijf_bedrijf_g_pct,
                prs_bedrijf_bedrijf_account1,
                prs_bedrijf_bedrijf_account2
           INTO v_prs_bedrijf_bedrijf_key,
                v_prs_bedrijf_key1,
                v_prs_bedrijf_externid1,
                v_prs_bedrijf_externsyncdate1,
                v_prs_bedrijf_key2,
                v_prs_bedrijf_externid2,
                v_prs_bedrijf_externsyncdate2,
                v_prs_bedrijf_bedrijf_startdtm,
                v_prs_bedrijf_bedrijf_einddtm,
                v_prs_bedrijf_bedrijf_status,
                v_prs_bedrijf_bedrijf_charged,
                v_prs_bedrijf_bdr_chargemode,
                v_prs_bedrijf_bedrijf_fee1,
                v_prs_bedrijf_bedrijf_fee2,
                v_prs_bedrijf_bedrijf_fee3,
                v_fin_btwtabelwaarde_key,
                v_prs_bedrijf_bedrijf_g_pct,
                v_prs_bedrijf_bedrijf_account1,
                v_prs_bedrijf_bedrijf_account2
           FROM prs_bedrijf_bedrijf
          WHERE prs_bedrijf_bedrijf_key = p_key;

         createxmltagvalue ('key', v_prs_bedrijf_bedrijf_key);
         createxmltagvalue ('bedrijf_key1', v_prs_bedrijf_key1);
         createxmltagvalue ('externid1', v_prs_bedrijf_externid1);
         mydatetochar ('externsyncdate1', v_prs_bedrijf_externsyncdate1);
         createxmltagvalue ('bedrijf_key2', v_prs_bedrijf_key2);
         createxmltagvalue ('externid2', v_prs_bedrijf_externid2);
         mydatetochar ('externsyncdate2', v_prs_bedrijf_externsyncdate2);
         mydatetochar ('startdatum', v_prs_bedrijf_bedrijf_startdtm);
         mydatetochar ('einddatum', v_prs_bedrijf_bedrijf_einddtm);
         createxmltagvalue ('status', v_prs_bedrijf_bedrijf_status);
         createxmltagvalue ('charged', v_prs_bedrijf_bedrijf_charged);
         createxmltagvalue ('chargemode', v_prs_bedrijf_bdr_chargemode);
         createxmltagvalue ('fee1', v_prs_bedrijf_bedrijf_fee1);
         createxmltagvalue ('fee2', v_prs_bedrijf_bedrijf_fee2);
         createxmltagvalue ('fee3', v_prs_bedrijf_bedrijf_fee3);
         createxmltagvalue ('btwtabelwaarde_key', v_fin_btwtabelwaarde_key);
         createxmltagvalue ('g_pct', v_prs_bedrijf_bedrijf_g_pct);
         createxmltagvalue ('account1', v_prs_bedrijf_bedrijf_account1);
         createxmltagvalue ('account2', v_prs_bedrijf_bedrijf_account2);

         createclosetag ('bedrijf_bedrijf');
      END IF;
   END;

   -- * create_PRS_AFDELING_node
   -- *
   --

   PROCEDURE create_prs_afdeling_node (p_key        IN NUMBER,
                                       p_nodename   IN VARCHAR2)
   AS
      v_naam               prs_afdeling.prs_afdeling_naam%TYPE;
      v_omschrijving       prs_afdeling.prs_afdeling_omschrijving%TYPE;
      v_adres_key          prs_afdeling.mld_adres_key%TYPE;
      v_kostenplaats_key   prs_afdeling.prs_kostenplaats_key%TYPE;
      v_parentkey          prs_afdeling.prs_afdeling_parentkey%TYPE;
      v_naam1              prs_v_afdeling_fullnames.prs_afdeling_naam1%TYPE;
      v_naam2              prs_v_afdeling_fullnames.prs_afdeling_naam2%TYPE;
      v_naam3              prs_v_afdeling_fullnames.prs_afdeling_naam3%TYPE;
      v_naam4              prs_v_afdeling_fullnames.prs_afdeling_naam4%TYPE;
      v_naam5              prs_v_afdeling_fullnames.prs_afdeling_naam5%TYPE;
      v_naam6              prs_v_afdeling_fullnames.prs_afdeling_naam6%TYPE;
      v_bedrijf_key        prs_afdeling.prs_bedrijf_key%TYPE;
      v_externid           prs_afdeling.prs_afdeling_externid%TYPE;
      v_externsyncdate     prs_afdeling.prs_afdeling_externsyncdate%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag (p_nodename);

         SELECT d.prs_afdeling_naam,
                d.prs_afdeling_omschrijving,
                d.mld_adres_key,
                d.prs_kostenplaats_key,
                d.prs_afdeling_parentkey,
                af.prs_afdeling_naam1,
                af.prs_afdeling_naam2,
                af.prs_afdeling_naam3,
                af.prs_afdeling_naam4,
                af.prs_afdeling_naam5,
                af.prs_afdeling_naam6,
                d.prs_bedrijf_key,
                d.prs_afdeling_externid,
                d.prs_afdeling_externsyncdate
           INTO v_naam,
                v_omschrijving,
                v_adres_key,
                v_kostenplaats_key,
                v_parentkey,
                v_naam1,
                v_naam2,
                v_naam3,
                v_naam4,
                v_naam5,
                v_naam6,
                v_bedrijf_key,
                v_externid,
                v_externsyncdate
           FROM prs_afdeling d, prs_v_afdeling_fullnames af
          WHERE d.prs_afdeling_key = af.prs_afdeling_key
                AND d.prs_afdeling_key = p_key;

         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('naam', v_naam);
         createxmltagvalue ('naam1', v_naam1);
         createxmltagvalue ('naam2', v_naam2);
         createxmltagvalue ('naam3', v_naam3);
         createxmltagvalue ('naam4', v_naam4);
         createxmltagvalue ('naam5', v_naam5);
         createxmltagvalue ('naam6', v_naam6);
         createxmltagvalue ('externid', v_externid);
         mydatetochar ('externsyncdate', v_externsyncdate);
         createxmltagvalue ('omschrijving', v_omschrijving);
         create_prs_kostenplaats_node (v_kostenplaats_key, FALSE);
         create_mld_adres_node (v_adres_key, 'afleveradres', TRUE);
         create_prs_kenmerken (p_key, 'A');

         IF v_parentkey IS NOT NULL
         THEN
            create_prs_afdeling_node (v_parentkey, 'parent');
         ELSE
            create_prs_bedrijf_node (v_bedrijf_key, 'bedrijf', TRUE);
         END IF;

         createclosetag (p_nodename);
      END IF;
   END;

   -- * create_PRS_SRTPERSLID_node
   -- *
   --

   PROCEDURE create_prs_srtperslid_node (p_key IN NUMBER)
   AS
      v_omschrijving   prs_srtperslid.prs_srtperslid_omschrijving%TYPE;
      v_opp            prs_srtperslid.prs_srtperslid_opp%TYPE;
      v_uurloon        prs_srtperslid.prs_srtperslid_uurloon%TYPE;
      v_bedrijf_key    prs_srtperslid.prs_bedrijf_key%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('srtperslid');

         SELECT lcl.x ('prs_srtperslid_omschrijving',
                       prs_srtperslid_key,
                       prs_srtperslid_omschrijving)
                   prs_srtperslid_omschrijving,
                prs_bedrijf_key,
                prs_srtperslid_uurloon,
                prs_srtperslid_opp
           INTO v_omschrijving,
                v_bedrijf_key,
                v_uurloon,
                v_opp
           FROM prs_srtperslid
          WHERE prs_srtperslid_key = p_key;

         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('opp', v_opp);
         createxmltagvalue ('uurloon', v_uurloon);
         create_prs_bedrijf_node (v_bedrijf_key, 'bedrijf', TRUE);
         createclosetag ('srtperslid');
      END IF;
   END;

   -- * create_PRS_PERSLID_node
   -- * ?? do we include srtperslid here??
   -- select xml.create_PRS_PERSLID_node(1042,'Persoon') FROM DUAL

   PROCEDURE create_prs_perslid_node (p_key        IN NUMBER,
                                      p_nodename   IN VARCHAR2,
                                      p_concise    IN BOOLEAN)
   AS
      v_titel            prs_perslid.prs_perslid_titel%TYPE;
      v_voorletters      prs_perslid.prs_perslid_voorletters%TYPE;
      v_naam             prs_perslid.prs_perslid_naam%TYPE;
      v_tussenvoegsel    prs_perslid.prs_perslid_tussenvoegsel%TYPE;
      v_voornaam         prs_perslid.prs_perslid_voornaam%TYPE;
      v_initialen        prs_perslid.prs_perslid_initialen%TYPE;
      v_nr               prs_perslid.prs_perslid_nr%TYPE;
      v_oslogin          prs_perslid.prs_perslid_oslogin%TYPE;
      v_oslogin2         prs_perslid.prs_perslid_oslogin2%TYPE;
      v_opp              prs_perslid.prs_perslid_opp%TYPE;
      v_ingangsdatum     prs_perslid.prs_perslid_ingangsdatum%TYPE;
      v_einddatum        prs_perslid.prs_perslid_einddatum%TYPE;
      v_uurloon          prs_perslid.prs_perslid_uurloon%TYPE;
      v_telefoonnr       prs_perslid.prs_perslid_telefoonnr%TYPE;
      v_email            prs_perslid.prs_perslid_email%TYPE;
      v_mobiel           prs_perslid.prs_perslid_mobiel%TYPE;
      v_afdeling_key     prs_perslid.prs_afdeling_key%TYPE;
      v_naam_full        prs_v_perslid_fullnames_all.prs_perslid_naam_full%TYPE;
      v_naam_friendly    prs_v_perslid_fullnames_all.prs_perslid_naam_friendly%TYPE;
      v_adres_key        prs_perslid.mld_adres_key%TYPE;
      v_srtperslid_key   prs_perslid.prs_srtperslid_key%TYPE;
      v_srtnoti_mode     prs_perslid.prs_perslid_srtnoti_mode%TYPE;
      v_geslacht         prs_perslid.prs_perslid_geslacht%TYPE;
      v_externid         prs_perslid.prs_perslid_externid%TYPE;
      v_externsyncdate   prs_perslid.prs_perslid_externsyncdate%TYPE;
      v_visibility       prs_perslid.prs_perslid_visibility%TYPE;
      v_firstwpdone      BOOLEAN;

      CURSOR c1
      IS
           SELECT wp.prs_werkplek_key
             FROM prs_perslidwerkplek pwp, prs_werkplek wp
            WHERE     pwp.prs_perslid_key = p_key
                  AND pwp.prs_werkplek_key = wp.prs_werkplek_key
                  AND wp.prs_werkplek_virtueel = 0
         ORDER BY pwp.prs_perslidwerkplek_volgnr, pwp.prs_perslidwerkplek_bezetting DESC;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         IF p_concise
         THEN
            createconciseopentag (p_nodename);
         ELSE
            createopentag (p_nodename);
         END IF;

         SELECT NVL (prs_perslid_titel, ''),
                NVL (prs_perslid_voorletters, ''),
                NVL (prs_perslid_naam, ''),
                NVL (prs_perslid_tussenvoegsel, ''),
                NVL (prs_perslid_voornaam, ''),
                NVL (prs_perslid_initialen, ''),
                NVL (prs_perslid_nr, ''),
                NVL (prs_perslid_oslogin, ''),
                NVL (prs_perslid_oslogin2, ''),
                NVL (prs_perslid_opp, 0),
                NVL (prs_perslid_ingangsdatum, ''),
                NVL (prs_perslid_einddatum, ''),
                NVL (prs_perslid_uurloon, 0),
                NVL (prs_perslid_telefoonnr, ''),
                prs_afdeling_key,
                mld_adres_key,
                prs_perslid_email,
                prs_perslid_mobiel,
                prs_srtperslid_key,
                prs_perslid_srtnoti_mode,
                prs_perslid_geslacht,
                prs_perslid_externid,
                prs_perslid_externsyncdate,
                prs_perslid_visibility
           INTO v_titel,
                v_voorletters,
                v_naam,
                v_tussenvoegsel,
                v_voornaam,
                v_initialen,
                v_nr,
                v_oslogin,
                v_oslogin2,
                v_opp,
                v_ingangsdatum,
                v_einddatum,
                v_uurloon,
                v_telefoonnr,
                v_afdeling_key,
                v_adres_key,
                v_email,
                v_mobiel,
                v_srtperslid_key,
                v_srtnoti_mode,
                v_geslacht,
                v_externid,
                v_externsyncdate,
                v_visibility
           FROM prs_perslid p
          WHERE prs_perslid_key = p_key;

         SELECT prs_perslid_naam_full, prs_perslid_naam_friendly
           INTO v_naam_full, v_naam_friendly
           FROM prs_v_perslid_fullnames_all
          WHERE prs_perslid_key = p_key;

         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('telefoonnr', v_telefoonnr);
         createxmltagvalue ('mobiel', v_mobiel);
         createxmltagvalue ('email', v_email);
         createxmltagvalue ('naam_full', v_naam_full);
         createxmltagvalue ('naam_friendly', v_naam_friendly);
         createxmltagvalue ('titel', v_titel);
         createxmltagvalue ('voorletters', v_voorletters);
         createxmltagvalue ('naam', v_naam);
         createxmltagvalue ('tussenvoegsel', v_tussenvoegsel);
         createxmltagvalue ('voornaam', v_voornaam);
         createxmltagvalue ('initialen', v_initialen);
         createxmltagvalue ('nr', v_nr);
         createxmltagvalue ('geslacht', v_geslacht);
         createxmltagvalue ('externid', v_externid);
         mydatetochar ('externsyncdate', v_externsyncdate);
         createxmltagvalue ('visibility', v_visibility);

         IF NOT p_concise
         THEN
            -- Fax zit nog bij de flexprops, die gingen we missen als we die weglieten
            -- Er is een discussie mogelijk: concise bevat geen flexkenmerken vs. stylesheets gebruiken nu
            -- Ik kies er nu voor om ze concise weg te laten, dit scheelt heel veel, en wie faxt er nog..
            create_prs_kenmerken (p_key, 'P');
            create_prs_srtperslid_node (v_srtperslid_key);
            create_mld_adres_node (v_adres_key, 'afleveradres', TRUE);
            createxmltagvalue ('oslogin', v_oslogin);
            createxmltagvalue ('oslogin2', v_oslogin2);
            createxmltagvalue ('opp', mynumbertochar (v_opp));
            mydatetochar ('ingangsdatum', v_ingangsdatum);
            mydatetochar ('einddatum', v_einddatum);
            createxmltagvalue ('uurloon', mynumbertochar (v_uurloon));

            v_firstwpdone := FALSE;
            FOR rec1 IN c1
            LOOP
               create_prs_werkplek_node (rec1.prs_werkplek_key,
                                         p_key,
                                         v_firstwpdone);  -- Eentje volledig is soms nodig (WVA#25793)
                v_firstwpdone := TRUE; -- rest concise
            END LOOP;

            create_prs_afdeling_node (v_afdeling_key, 'afdeling');
            createxmltagvalue ('srtnoti_mode', v_srtnoti_mode);
         -- Profiel toevoegen
         END IF;

         createclosetag (p_nodename);
      END IF;
   END;

   -- *
   -- * create_PRS_WERKPLEK_node
   -- *

   PROCEDURE create_prs_werkplek_node (p_werkplek_key   IN NUMBER,
                                       p_perslid_key    IN NUMBER,
                                       p_concise        IN BOOLEAN)
   AS
      v_perslidwerkplek_key   prs_perslidwerkplek.prs_perslidwerkplek_key%TYPE;
      v_prs_werkplek_key      prs_werkplek.prs_werkplek_key%TYPE;
      v_bezetting             prs_perslidwerkplek.prs_perslidwerkplek_key%TYPE;
      v_volgnr                prs_werkplek.prs_werkplek_volgnr%TYPE;
      v_omschrijving          prs_werkplek.prs_werkplek_omschrijving%TYPE;
      v_vastopp               prs_werkplek.prs_werkplek_vastopp%TYPE;
      v_opp                   prs_werkplek.prs_werkplek_opp%TYPE;
      v_virtueel              prs_werkplek.prs_werkplek_virtueel%TYPE;
      v_alg_ruimte_key        prs_werkplek.prs_alg_ruimte_key%TYPE;
      v_externnr              prs_werkplek.prs_werkplek_externnr%TYPE;
      v_externsyncdate        prs_werkplek.prs_werkplek_externsyncdate%TYPE;
      v_dwgx                  prs_werkplek.prs_werkplek_dwgx%TYPE;
      v_dwgy                  prs_werkplek.prs_werkplek_dwgy%TYPE;
      v_dwgz                  prs_werkplek.prs_werkplek_dwgz%TYPE;
      v_pwpvolgnr             prs_perslidwerkplek.prs_perslidwerkplek_volgnr%TYPE;
      v_pwpexternnr           prs_perslidwerkplek.prs_perslidwerkplek_externnr%TYPE;
      v_pwpexternsyncdate     prs_perslidwerkplek.prs_perslidwerkplek_extsyncd%TYPE;
   BEGIN
      IF p_werkplek_key IS NOT NULL
      THEN
         IF p_perslid_key IS NULL
         THEN
              SELECT wp.prs_werkplek_key,
                     SUM (pwp.prs_perslidwerkplek_bezetting),
                     wp.prs_werkplek_volgnr,
                     wp.prs_werkplek_omschrijving,
                     wp.prs_werkplek_vastopp,
                     wp.prs_werkplek_opp,
                     wp.prs_werkplek_virtueel,
                     wp.prs_alg_ruimte_key,
                     wp.prs_werkplek_externnr,
                     wp.prs_werkplek_externsyncdate,
                     wp.prs_werkplek_dwgx,
                     wp.prs_werkplek_dwgy,
                     wp.prs_werkplek_dwgz,
                     NULL,
                     pwp.prs_perslidwerkplek_externnr,
                     pwp.prs_perslidwerkplek_extsyncd
                INTO v_prs_werkplek_key,
                     v_bezetting,
                     v_volgnr,
                     v_omschrijving,
                     v_vastopp,
                     v_opp,
                     v_virtueel,
                     v_alg_ruimte_key,
                     v_externnr,
                     v_externsyncdate,
                     v_dwgx,
                     v_dwgy,
                     v_dwgz,
                     v_pwpvolgnr,
                     v_pwpexternnr,
                     v_pwpexternsyncdate
                FROM prs_perslidwerkplek pwp, prs_werkplek wp
               WHERE pwp.prs_werkplek_key(+) = wp.prs_werkplek_key
                     AND wp.prs_werkplek_key = p_werkplek_key
            GROUP BY wp.prs_werkplek_key,
                     wp.prs_werkplek_volgnr,
                     wp.prs_werkplek_omschrijving,
                     wp.prs_werkplek_vastopp,
                     wp.prs_werkplek_opp,
                     wp.prs_werkplek_virtueel,
                     wp.prs_alg_ruimte_key,
                     wp.prs_werkplek_externnr,
                     wp.prs_werkplek_externsyncdate,
                     wp.prs_werkplek_dwgx,
                     wp.prs_werkplek_dwgy,
                     wp.prs_werkplek_dwgz,
                     pwp.prs_perslidwerkplek_externnr,
                     pwp.prs_perslidwerkplek_extsyncd;
         ELSE
            SELECT wp.prs_werkplek_key,
                   pwp.prs_perslidwerkplek_bezetting,
                   wp.prs_werkplek_volgnr,
                   wp.prs_werkplek_omschrijving,
                   wp.prs_werkplek_vastopp,
                   wp.prs_werkplek_opp,
                   wp.prs_werkplek_virtueel,
                   wp.prs_alg_ruimte_key,
                   wp.prs_werkplek_externnr,
                   wp.prs_werkplek_externsyncdate,
                   wp.prs_werkplek_dwgx,
                   wp.prs_werkplek_dwgy,
                   wp.prs_werkplek_dwgz,
                   pwp.prs_perslidwerkplek_volgnr,
                   pwp.prs_perslidwerkplek_externnr,
                   pwp.prs_perslidwerkplek_extsyncd
              INTO v_prs_werkplek_key,
                   v_bezetting,
                   v_volgnr,
                   v_omschrijving,
                   v_vastopp,
                   v_opp,
                   v_virtueel,
                   v_alg_ruimte_key,
                   v_externnr,
                   v_externsyncdate,
                   v_dwgx,
                   v_dwgy,
                   v_dwgz,
                   v_pwpvolgnr,
                   v_pwpexternnr,
                   v_pwpexternsyncdate
              FROM prs_perslidwerkplek pwp, prs_werkplek wp
             WHERE     pwp.prs_werkplek_key = wp.prs_werkplek_key
                   AND wp.prs_werkplek_key = p_werkplek_key
                   AND pwp.prs_perslid_key = p_perslid_key;
         END IF;

         IF p_concise
         THEN
            createconciseopentag ('werkplek');
         ELSE
            createopentag ('werkplek');
         END IF;

         createxmltagvalue ('key', v_prs_werkplek_key);
         createxmltagvalue ('bezetting', v_bezetting);
         createxmltagvalue ('volgnr', v_volgnr);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('vastopp', v_vastopp);
         createxmltagvalue ('opp', v_opp);
         createxmltagvalue ('virtueel', v_virtueel);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);
         createxmltagvalue ('dwgx', v_dwgx);
         createxmltagvalue ('dwgy', v_dwgy);
         createxmltagvalue ('dwgz', v_dwgz);
         createxmltagvalue ('myvolgnr', v_pwpvolgnr);
         createxmltagvalue ('pwpexternnr', v_pwpexternnr);
         mydatetochar ('pwpexternsyncdate', v_pwpexternsyncdate);

         create_alg_onroerendgoed_node (v_alg_ruimte_key,
                                        'plaats',
                                        NULL,
                                        p_concise,
                                        FALSE);
         createclosetag ('werkplek');
      END IF;
   END;

   -- * create_PRS_DIENST_node
   -- *
   --

   PROCEDURE create_prs_dienst_node (p_key IN NUMBER)
   AS
      v_omschrijving   prs_dienst.prs_dienst_omschrijving%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('dienst');
         SELECT
           lcl.x ('prs_dienst_omschrijving',
                   prs_dienst_key,
                   prs_dienst_omschrijving) prs_dienst_omschrijving
           INTO v_omschrijving
           FROM prs_dienst
          WHERE prs_dienst_key = p_key;

         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('omschrijving', v_omschrijving);
         createclosetag ('dienst');
      END IF;
   END;


   -- *
   -- * ALG
   -- *

   PROCEDURE create_alg_srtgebouw_node (p_key IN NUMBER)
   AS
      v_omschrijving     alg_srtgebouw.alg_srtgebouw_omschrijving%TYPE;
      v_passief          alg_srtgebouw.alg_srtgebouw_passief%TYPE;
      v_verwijder        alg_srtgebouw.alg_srtgebouw_verwijder%TYPE;
      v_uitvoertijd_td   alg_srtgebouw.alg_srtgebouw_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd_e    alg_srtgebouw.alg_srtgebouw_t_uitvoertijd.eenheid%TYPE;
      v_uitvoertijd_td1  alg_srtgebouw.alg_srtgebouw_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd_e1   alg_srtgebouw.alg_srtgebouw_t_uitvoertijd.eenheid%TYPE;
      v_uitvoertijd_td2  alg_srtgebouw.alg_srtgebouw_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd_e2   alg_srtgebouw.alg_srtgebouw_t_uitvoertijd.eenheid%TYPE;
      v_uitvoertijd_td4  alg_srtgebouw.alg_srtgebouw_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd_e4   alg_srtgebouw.alg_srtgebouw_t_uitvoertijd.eenheid%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         SELECT lcl.x ('alg_srtgebouw_omschrijving',
                       alg_srtgebouw_key,
                       alg_srtgebouw_omschrijving)
                   alg_srtgebouw_omschrijving,
                alg_srtgebouw_passief,
                sg.alg_srtgebouw_t_uitvoertijd.tijdsduur,
                sg.alg_srtgebouw_t_uitvoertijd.eenheid,
                sg.alg_srtgebouw_t_uitvoer_pr1.tijdsduur,
                sg.alg_srtgebouw_t_uitvoer_pr1.eenheid,
                sg.alg_srtgebouw_t_uitvoer_pr2.tijdsduur,
                sg.alg_srtgebouw_t_uitvoer_pr2.eenheid,
                sg.alg_srtgebouw_t_uitvoer_pr4.tijdsduur,
                sg.alg_srtgebouw_t_uitvoer_pr4.eenheid,
                sg.alg_srtgebouw_verwijder
           INTO v_omschrijving,
                v_passief,
                v_uitvoertijd_td,
                v_uitvoertijd_e,
                v_uitvoertijd_td1,
                v_uitvoertijd_e1,
                v_uitvoertijd_td2,
                v_uitvoertijd_e2,
                v_uitvoertijd_td4,
                v_uitvoertijd_e4,
                v_verwijder
           FROM alg_srtgebouw sg
          WHERE alg_srtgebouw_key = p_key;

         createopentag ('srtgebouw');
         createxmltagvalue ('key', p_key);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('passief', v_passief);
         mydatetochar ('verwijder', v_verwijder);
         createxmltagvalueattributes ('uitvoertijd',
                                      'eenheid',
                                      v_uitvoertijd_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td));
         createxmltagvalueattributes ('uitvoertijd_pr1',
                                      'eenheid',
                                      v_uitvoertijd_e1,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td1));
         createxmltagvalueattributes ('uitvoertijd_pr2',
                                      'eenheid',
                                      v_uitvoertijd_e2,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td2));
         createxmltagvalueattributes ('uitvoertijd_pr4',
                                      'eenheid',
                                      v_uitvoertijd_e4,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td4));
         createclosetag ('srtgebouw');
      END IF;
   END;

   PROCEDURE create_alg_srtterreinsec_node (p_key IN NUMBER)
   AS
      v_omschrijving     alg_srtterreinsector.alg_srtterreinsec_omschrijving%TYPE;
      v_prijs            alg_srtterreinsector.alg_srtterreinsector_prijs%TYPE;
      v_verwijder        alg_srtterreinsector.alg_srtterreinsector_verwijder%TYPE;
      v_verhuurbaar      alg_srtterreinsector.prs_verhuurbaar%TYPE;
      v_code             alg_srtterreinsector.alg_srtterreinsector_code%TYPE;
      v_uitvoertijd_td   alg_srtterreinsector.alg_srtterreinsec_t_uitvtijd.tijdsduur%TYPE;
      v_uitvoertijd_e    alg_srtterreinsector.alg_srtterreinsec_t_uitvtijd.eenheid%TYPE;
      v_uitvoertijd_td1  alg_srtterreinsector.alg_srtterreinsec_t_uitvtijd.tijdsduur%TYPE;
      v_uitvoertijd_e1   alg_srtterreinsector.alg_srtterreinsec_t_uitvtijd.eenheid%TYPE;
      v_uitvoertijd_td2  alg_srtterreinsector.alg_srtterreinsec_t_uitvtijd.tijdsduur%TYPE;
      v_uitvoertijd_e2   alg_srtterreinsector.alg_srtterreinsec_t_uitvtijd.eenheid%TYPE;
      v_uitvoertijd_td4  alg_srtterreinsector.alg_srtterreinsec_t_uitvtijd.tijdsduur%TYPE;
      v_uitvoertijd_e4   alg_srtterreinsector.alg_srtterreinsec_t_uitvtijd.eenheid%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         SELECT lcl.x ('alg_srtterreinsec_omschrijving',
                       alg_srtterreinsector_key,
                       alg_srtterreinsec_omschrijving)
                   alg_srtterreinsec_omschrijving,
                alg_srtterreinsector_prijs,
                alg_srtterreinsector_verwijder,
                prs_verhuurbaar,
                st.alg_srtterreinsector_code,
                st.alg_srtterreinsec_t_uitvtijd.tijdsduur,
                st.alg_srtterreinsec_t_uitvtijd.eenheid,
                st.alg_srtterreinsec_t_uitv_pr1.tijdsduur,
                st.alg_srtterreinsec_t_uitv_pr1.eenheid,
                st.alg_srtterreinsec_t_uitv_pr2.tijdsduur,
                st.alg_srtterreinsec_t_uitv_pr2.eenheid,
                st.alg_srtterreinsec_t_uitv_pr4.tijdsduur,
                st.alg_srtterreinsec_t_uitv_pr4.eenheid
           INTO v_omschrijving,
                v_prijs,
                v_verwijder,
                v_verhuurbaar,
                v_code,
                v_uitvoertijd_td,
                v_uitvoertijd_e,
                v_uitvoertijd_td1,
                v_uitvoertijd_e1,
                v_uitvoertijd_td2,
                v_uitvoertijd_e2,
                v_uitvoertijd_td4,
                v_uitvoertijd_e4
           FROM alg_srtterreinsector st
          WHERE alg_srtterreinsector_key = p_key;

         createopentag ('srtterreinsector');
         createxmltagvalue ('key', p_key);
         createxmltagvalue ('code', v_code);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('prijs', v_prijs);
         mydatetochar ('verwijder', v_verwijder);
         createxmltagvalue ('verhuurbaar', v_verhuurbaar);
         createxmltagvalueattributes ('uitvoertijd',
                                      'eenheid',
                                      v_uitvoertijd_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td));
         createxmltagvalueattributes ('uitvoertijd_pr1',
                                      'eenheid',
                                      v_uitvoertijd_e1,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td1));
         createxmltagvalueattributes ('uitvoertijd_pr2',
                                      'eenheid',
                                      v_uitvoertijd_e2,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td2));
         createxmltagvalueattributes ('uitvoertijd_pr4',
                                      'eenheid',
                                      v_uitvoertijd_e4,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td4));
         createclosetag ('srtterreinsector');
      END IF;
   END;

   PROCEDURE create_alg_srtruimte_node (p_key IN NUMBER)
   AS
      v_omschrijving     alg_srtruimte.alg_srtruimte_omschrijving%TYPE;
      v_prijs            alg_srtruimte.alg_srtruimte_prijs%TYPE;
      v_verwijder        alg_srtruimte.alg_srtruimte_verwijder%TYPE;
      v_verhuurbaar      alg_srtruimte.prs_verhuurbaar%TYPE;
      v_code             alg_srtruimte.alg_srtruimte_code%TYPE;
      v_bevat_werkplek   alg_srtruimte.prs_bevat_werkplek%TYPE;
      v_uitvoertijd_td   alg_srtruimte.alg_srtruimte_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd_e    alg_srtruimte.alg_srtruimte_t_uitvoertijd.eenheid%TYPE;
      v_uitvoertijd_td1  alg_srtruimte.alg_srtruimte_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd_e1   alg_srtruimte.alg_srtruimte_t_uitvoertijd.eenheid%TYPE;
      v_uitvoertijd_td2  alg_srtruimte.alg_srtruimte_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd_e2   alg_srtruimte.alg_srtruimte_t_uitvoertijd.eenheid%TYPE;
      v_uitvoertijd_td4  alg_srtruimte.alg_srtruimte_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd_e4   alg_srtruimte.alg_srtruimte_t_uitvoertijd.eenheid%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         SELECT lcl.x ('alg_srtruimte_omschrijving',
                       alg_srtruimte_key,
                       alg_srtruimte_omschrijving)
                   alg_srtruimte_omschrijving,
                alg_srtruimte_prijs,
                alg_srtruimte_verwijder,
                prs_verhuurbaar,
                alg_srtruimte_code,
                prs_bevat_werkplek,
                srt.alg_srtruimte_t_uitvoertijd.tijdsduur,
                srt.alg_srtruimte_t_uitvoertijd.eenheid,
                srt.alg_srtruimte_t_uitvoer_pr1.tijdsduur,
                srt.alg_srtruimte_t_uitvoer_pr1.eenheid,
                srt.alg_srtruimte_t_uitvoer_pr2.tijdsduur,
                srt.alg_srtruimte_t_uitvoer_pr2.eenheid,
                srt.alg_srtruimte_t_uitvoer_pr4.tijdsduur,
                srt.alg_srtruimte_t_uitvoer_pr4.eenheid
           INTO v_omschrijving,
                v_prijs,
                v_verwijder,
                v_verhuurbaar,
                v_code,
                v_bevat_werkplek,
                v_uitvoertijd_td,
                v_uitvoertijd_e,
                v_uitvoertijd_td1,
                v_uitvoertijd_e1,
                v_uitvoertijd_td2,
                v_uitvoertijd_e2,
                v_uitvoertijd_td4,
                v_uitvoertijd_e4
           FROM alg_srtruimte srt
          WHERE alg_srtruimte_key = p_key;

         createopentag ('srtruimte');
         createxmltagvalue ('key', p_key);
         createxmltagvalue ('code', v_code);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('prijs', v_prijs);
         mydatetochar ('verwijder', v_verwijder);
         createxmltagvalue ('verhuurbaar', v_verhuurbaar);
         createxmltagvalue ('bevat_werkplek', v_bevat_werkplek);
         createxmltagvalueattributes ('uitvoertijd',
                                      'eenheid',
                                      v_uitvoertijd_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td));
         createxmltagvalueattributes ('uitvoertijd_pr1',
                                      'eenheid',
                                      v_uitvoertijd_e1,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td1));
         createxmltagvalueattributes ('uitvoertijd_pr2',
                                      'eenheid',
                                      v_uitvoertijd_e2,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td2));
         createxmltagvalueattributes ('uitvoertijd_pr4',
                                      'eenheid',
                                      v_uitvoertijd_e4,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td4));
         createclosetag ('srtruimte');
      END IF;
   END;

   -- *
   -- * ALG kenmerken
   -- *

   PROCEDURE create_alg_kenmerken (p_key IN NUMBER, p_niveau IN VARCHAR2)
   AS
      CURSOR c1
      IS
           SELECT k.alg_kenmerk_key,
                  k.alg_kenmerk_code,
                  lcl.x ('alg_kenmerk_omschrijving',
                         k.alg_kenmerk_key,
                         alg_kenmerk_omschrijving)
                     alg_kenmerk_omschrijving,
                  k.alg_kenmerk_kenmerktype,
                  k.fac_kenmerkdomein_key,
                  k.alg_kenmerk_lengte,
                  k.alg_kenmerk_dec,
                  k.alg_kenmerk_nmin,
                  k.alg_kenmerk_nmax,
                  k.alg_kenmerk_default,
                  NVL (k.alg_kenmerk_volgnr, 0) volgnummer,
                  lcl.x ('alg_kenmerk_dimensie',
                         k.alg_kenmerk_key,
                         alg_kenmerk_dimensie)
                     dimensie,
                  lcl.x ('alg_kenmerk_hint',
                         k.alg_kenmerk_key,
                         alg_kenmerk_hint)
                     hint,
                  v.alg_onrgoedkenmerk_waarde
             FROM alg_kenmerk k,
                  (SELECT v.alg_kenmerk_key, v.alg_onrgoedkenmerk_waarde
                     FROM alg_onrgoedkenmerk v
                    WHERE     v.alg_onrgoed_key = p_key
                          AND v.alg_onrgoed_niveau = p_niveau
                          AND v.alg_onrgoedkenmerk_verwijder IS NULL) v
            WHERE     k.alg_kenmerk_niveau = p_niveau
                  AND k.alg_kenmerk_verwijder IS NULL
                  AND v.alg_kenmerk_key(+) = k.alg_kenmerk_key
         ORDER BY k.alg_kenmerk_volgnr;

      v_kenmerk_waarde       alg_onrgoedkenmerk.alg_onrgoedkenmerk_waarde%TYPE;
      v_FCLT62916 BOOLEAN := FALSE;
   BEGIN
      -- // Openen van deze cursor duurt @UVW soms relatief lang.
      -- // Timing statements komen in de XML
      createxmltagvalueattributes ('FCLT62916opening',
                                  'p_key',
                                  p_key,
                                  'p_niveau',
                                  p_niveau,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  TO_CHAR(SYSTIMESTAMP, 'HH24:MI:SS.FF'));
      FOR rec1 IN c1
      LOOP
         IF (NOT v_FCLT62916) THEN
             createxmltagvalue ('FCLT62916isopen',
                                     TO_CHAR(SYSTIMESTAMP, 'HH24:MI:SS.FF'));
            v_FCLT62916 := TRUE;
         END IF;
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.alg_onrgoedkenmerk_waarde,
                                 rec1.alg_kenmerk_default,
                                 rec1.alg_kenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.alg_kenmerk_nmin,
                                 rec1.alg_kenmerk_nmax,
                                 p_key,
                                 rec1.alg_kenmerk_key);

         createxmltagvalueattributes9 ('kenmerk',
                                       'kenmerkcode',  rec1.alg_kenmerk_code,
                                       'naam',         rec1.alg_kenmerk_omschrijving,
                                       'type',         rec1.alg_kenmerk_kenmerktype,
                                       'volgnummer',   rec1.volgnummer,
                                       'key',          rec1.alg_kenmerk_key,
                                       'dimensie',     rec1.dimensie,
                                       NULL,           NULL,
                                       NULL,           NULL,
                                       NULL,           NULL,
                                       rec1.fac_kenmerkdomein_key,
                                       v_kenmerk_waarde
                                     );
      END LOOP;
   END;

   -- * create_ALG_TERREINSECTOR_node
   -- *
   --

   PROCEDURE create_alg_terreinsector_node (p_terreinsector_key IN NUMBER)
   AS
      v_omschrijving           alg_terreinsector.alg_terreinsector_omschrijving%TYPE;
      v_code                   alg_terreinsector.alg_terreinsector_code%TYPE;
      v_naam                   alg_terreinsector.alg_terreinsector_naam%TYPE;
      v_oppervlak              alg_terreinsector.alg_terreinsector_oppervlak%TYPE;
      v_omtrek                 alg_terreinsector.alg_terreinsector_omtrek%TYPE;
      v_prs_kostenplaats_key   alg_terreinsector.prs_kostenplaats_key%TYPE;
      v_verantw_key            alg_terreinsector.prs_perslid_key_verantw%TYPE;
      v_verantw_key2           alg_terreinsector.prs_perslid_key_verantw2%TYPE;
      v_srtterreinsector_key   alg_terreinsector.alg_srtterreinsector_key%TYPE;
      v_ordernr                alg_terreinsector.alg_terreinsector_ordernr%TYPE;
      v_image                  alg_terreinsector.alg_terreinsector_image%TYPE;
      v_vervaldatum            alg_terreinsector.alg_terreinsector_vervaldatum%TYPE;
      v_externnr               alg_terreinsector.alg_terreinsector_externnr%TYPE;
      v_externsyncdate         alg_terreinsector.alg_terreinsector_extsyncdate%TYPE;
   BEGIN
      IF p_terreinsector_key IS NOT NULL
      THEN
         SELECT alg_terreinsector_omschrijving,
                alg_terreinsector_code,
                alg_terreinsector_naam,
                alg_terreinsector_oppervlak,
                alg_terreinsector_omtrek,
                prs_kostenplaats_key,
                prs_perslid_key_verantw,
                prs_perslid_key_verantw2,
                alg_srtterreinsector_key,
                alg_terreinsector_ordernr,
                alg_terreinsector_image,
                alg_terreinsector_vervaldatum,
                alg_terreinsector_externnr,
                alg_terreinsector_extsyncdate
           INTO v_omschrijving,
                v_code,
                v_naam,
                v_oppervlak,
                v_omtrek,
                v_prs_kostenplaats_key,
                v_verantw_key,
                v_verantw_key2,
                v_srtterreinsector_key,
                v_ordernr,
                v_image,
                v_vervaldatum,
                v_externnr,
                v_externsyncdate
           FROM alg_terreinsector
          WHERE alg_terreinsector_key = p_terreinsector_key;

         createopentag ('terreinsector');
         createxmltagvalue ('key', p_terreinsector_key);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('code', v_code);
         createxmltagvalue ('naam', v_naam);
         createxmltagvalue ('oppervlak', v_oppervlak);
         createxmltagvalue ('omtrek', v_omtrek);
         createxmltagvalue ('ordernr', v_ordernr);
         createxmltagvalue ('image', v_image);
         mydatetochar ('vervaldatum', v_vervaldatum);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);
         create_alg_kenmerken (p_terreinsector_key, 'T');
         create_alg_srtterreinsec_node (v_srtterreinsector_key);
         create_prs_kostenplaats_node (v_prs_kostenplaats_key, TRUE);
         create_prs_perslid_node (v_verantw_key, 'verantwoordelijke', TRUE);
         create_prs_perslid_node (v_verantw_key2, 'verantwoordelijke2', TRUE);
         createclosetag ('terreinsector');
      END IF;
   END;

   -- * create_ALG_RUIMTE_node
   -- *
   --

   PROCEDURE create_alg_ruimte_node (p_ruimte_key IN NUMBER)
   AS
      v_nr                     alg_ruimte.alg_ruimte_nr%TYPE;
      v_omschrijving           alg_ruimte.alg_ruimte_omschrijving%TYPE;
      v_bruto_vloeropp         alg_ruimte.alg_ruimte_bruto_vloeropp%TYPE;
      v_omtrek                 alg_ruimte.alg_ruimte_nr%TYPE;
      v_inhoud                 alg_ruimte.alg_ruimte_inhoud%TYPE;
      v_opmerking              alg_ruimte.alg_ruimte_opmerking%TYPE;
      v_vloer_omschrijving     alg_ruimte.alg_ruimte_vloer_omschrijving%TYPE;
      v_opp_gevelglas          alg_ruimte.alg_ruimte_opp_gevelglas%TYPE;
      v_opp_separatieglas      alg_ruimte.alg_ruimte_opp_separatieglas%TYPE;
      v_opp_gevelbekleding     alg_ruimte.alg_ruimte_opp_gevelbekleding%TYPE;
      v_srtruimte_key          alg_ruimte.alg_srtruimte_key%TYPE;
      v_opp_alt1               alg_ruimte.alg_ruimte_opp_alt1%TYPE;
      v_opp_alt2               alg_ruimte.alg_ruimte_opp_alt2%TYPE;
      v_dienstniveau_key       alg_ruimte.mld_dienstniveau_key%TYPE;
      v_mld_dienstniveau_oms   mld_dienstniveau.mld_dienstniveau_omschr%TYPE;
      v_beginuur               alg_ruimte.alg_ruimte_beginuur%TYPE;
      v_einduur                alg_ruimte.alg_ruimte_einduur%TYPE;
      v_werkdagen              alg_ruimte.alg_ruimte_werkdagen%TYPE;
      v_externnr               alg_ruimte.alg_ruimte_externnr%TYPE;
      v_externsyncdate         alg_ruimte.alg_ruimte_externsyncdate%TYPE;

   BEGIN
      IF p_ruimte_key IS NOT NULL
      THEN
         SELECT alg_ruimte_nr,
                alg_ruimte_omschrijving,
                alg_ruimte_bruto_vloeropp,
                alg_ruimte_omtrek,
                alg_ruimte_inhoud,
                alg_ruimte_opmerking,
                alg_ruimte_vloer_omschrijving,
                alg_ruimte_opp_gevelglas,
                alg_ruimte_opp_separatieglas,
                alg_ruimte_opp_gevelbekleding,
                alg_srtruimte_key,
                alg_ruimte_opp_alt1,
                alg_ruimte_opp_alt2,
                mld_dienstniveau_key,
                alg_ruimte_beginuur,
                alg_ruimte_einduur,
                alg_ruimte_werkdagen,
                alg_ruimte_externnr,
                alg_ruimte_externsyncdate
           INTO v_nr,
                v_omschrijving,
                v_bruto_vloeropp,
                v_omtrek,
                v_inhoud,
                v_opmerking,
                v_vloer_omschrijving,
                v_opp_gevelglas,
                v_opp_separatieglas,
                v_opp_gevelbekleding,
                v_srtruimte_key,
                v_opp_alt1,
                v_opp_alt2,
                v_dienstniveau_key,
                v_beginuur,
                v_einduur,
                v_werkdagen,
                v_externnr,
                v_externsyncdate
           FROM alg_ruimte
          WHERE alg_ruimte_key = p_ruimte_key;

         createopentag ('ruimte');
         createxmltagvalue ('key', p_ruimte_key);
         createxmltagvalue ('nr', v_nr);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('bruto_vloeropp', v_bruto_vloeropp);
         createxmltagvalue ('opp_alt1', v_opp_alt1);
         createxmltagvalue ('opp_alt2', v_opp_alt2);
         createxmltagvalue ('omtrek', v_omtrek);
         createxmltagvalue ('inhoud', v_inhoud);
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('vloer_omschrijving', v_vloer_omschrijving);
         createxmltagvalue ('opp_gevelglas', v_opp_gevelglas);
         createxmltagvalue ('opp_separatieglas', v_opp_separatieglas);
         createxmltagvalue ('opp_gevelbekleding', v_opp_gevelbekleding);
         createxmltagvalue ('beginuur', v_beginuur);
         createxmltagvalue ('einduur', v_einduur);
         createxmltagvalue ('werkdagen', v_werkdagen);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);

         IF v_dienstniveau_key IS NOT NULL
         THEN
            SELECT mld_dienstniveau_omschr
              INTO v_mld_dienstniveau_oms
              FROM mld_dienstniveau
             WHERE mld_dienstniveau_key = v_dienstniveau_key;

            createxmltagvalue ('mld_dienstniveau', v_mld_dienstniveau_oms);
         END IF;

         create_alg_kenmerken (p_ruimte_key, 'R');
         create_alg_srtruimte_node (v_srtruimte_key);
         createclosetag ('ruimte');
      END IF;
   END;

   -- * create_ALG_VERDIEPING_node
   -- *
   -- * Indien p_withchildren TRUE is, dan worden zo mogelijk ook alle childrecords ingevoegd. Dat wordt groot!

   PROCEDURE create_alg_verdieping_node (p_verdieping_key   IN NUMBER,
                                         p_ruimte_key       IN NUMBER,
                                         p_withchildren     IN BOOLEAN)
   AS
      v_omschrijving   alg_verdieping.alg_verdieping_omschrijving%TYPE;
      v_volgnr         alg_verdieping.alg_verdieping_volgnr%TYPE;
      v_tekening       cad_tekening.cad_tekening_filenaam%TYPE;
      v_oppervlak      alg_verdieping.alg_verdieping_bruto_vloeropp%TYPE;
      v_in_bewerking   alg_verdieping.alg_verdieping_in_bewerking%TYPE;
      v_code           alg_verdieping.alg_verdieping_code%TYPE;
      v_externnr       alg_verdieping.alg_verdieping_externnr%TYPE;
      v_externsyncdate alg_verdieping.alg_verdieping_externsyncdate%TYPE;

      CURSOR c1
      IS
           SELECT r.alg_ruimte_key
             FROM alg_ruimte r
            WHERE alg_verdieping_key = p_verdieping_key
                  AND r.alg_ruimte_verwijder IS NULL
         ORDER BY r.alg_ruimte_nr;
   BEGIN
      IF p_verdieping_key IS NOT NULL
      THEN
         SELECT alg_verdieping_omschrijving,
                alg_verdieping_volgnr,
                t.cad_tekening_filenaam,
                alg_verdieping_bruto_vloeropp,
                alg_verdieping_in_bewerking,
                alg_verdieping_code,
                alg_verdieping_externnr,
                alg_verdieping_externsyncdate
           INTO v_omschrijving,
                v_volgnr,
                v_tekening,
                v_oppervlak,
                v_in_bewerking,
                v_code,
                v_externnr,
                v_externsyncdate
           FROM alg_verdieping v, cad_tekening t
          WHERE v.alg_verdieping_key = p_verdieping_key
            AND t.alg_verdieping_key(+) = v.alg_verdieping_key;

         createopentag ('verdieping');
         createxmltagvalue ('key', p_verdieping_key);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('volgnr', v_volgnr);
         createxmltagvalue ('tekening', v_tekening);
         createxmltagvalue ('oppervlak', v_oppervlak);
         createxmltagvalue ('in_bewerking', v_in_bewerking);
         createxmltagvalue ('code', v_code);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);
         create_alg_kenmerken (p_verdieping_key, 'V');

         IF p_ruimte_key IS NOT NULL
         THEN
            create_alg_ruimte_node (p_ruimte_key);
         ELSIF p_withchildren
         THEN
            -- Maak dan een node aan voor ELKE ruimte in deze verdieping
            FOR rec1 IN c1
            LOOP
               create_alg_ruimte_node (rec1.alg_ruimte_key);
            END LOOP;
         END IF;

         createclosetag ('verdieping');
      END IF;
   END;

   -- * create_ALG_GEBOUW_node
   -- *
   --

   PROCEDURE create_alg_gebouw_node (p_gebouw_key       IN NUMBER,
                                     p_verdieping_key   IN NUMBER,
                                     p_ruimte_key       IN NUMBER,
                                     p_withchildren     IN BOOLEAN)
   AS
      v_naam              alg_gebouw.alg_gebouw_naam%TYPE;
      v_code              alg_gebouw.alg_gebouw_code%TYPE;
      v_adres             alg_gebouw.alg_gebouw_adres%TYPE;
      v_postcode          alg_gebouw.alg_gebouw_postcode%TYPE;
      v_omschrijving      alg_gebouw.alg_gebouw_omschrijving%TYPE;
      v_bruto_vloeropp    alg_gebouw.alg_gebouw_bruto_vloeropp%TYPE;
      v_omtrek            alg_gebouw.alg_gebouw_omtrek%TYPE;
      v_inhoud            alg_gebouw.alg_gebouw_inhoud%TYPE;
      v_opmerking         alg_gebouw.alg_gebouw_opmerking%TYPE;
      v_srtgebouw_key     alg_gebouw.alg_srtgebouw_key%TYPE;
      v_ordernr           alg_gebouw.alg_gebouw_ordernr%TYPE;
      v_adres_key         alg_gebouw.mld_adres_key%TYPE;
      v_dwgx              alg_gebouw.alg_gebouw_dwgx%TYPE;
      v_dwgy              alg_gebouw.alg_gebouw_dwgy%TYPE;
      v_x                 alg_gebouw.alg_gebouw_x%TYPE;
      v_y                 alg_gebouw.alg_gebouw_y%TYPE;
      v_kostenplaats_key  alg_gebouw.prs_kostenplaats_key%TYPE;
      v_beginuur          alg_gebouw.alg_gebouw_beginuur%TYPE;
      v_einduur           alg_gebouw.alg_gebouw_einduur%TYPE;
      v_werkdagen         alg_gebouw.alg_gebouw_werkdagen%TYPE;
      v_verantw_key       alg_gebouw.prs_perslid_key_verantw%TYPE;
      v_verantw_key2      alg_gebouw.prs_perslid_key_verantw2%TYPE;
      v_image             alg_gebouw.alg_gebouw_image%TYPE;
      v_vervaldatum       alg_gebouw.alg_gebouw_vervaldatum%TYPE;
      v_mjb_score1        alg_gebouw.alg_gebouw_mjb_score1%TYPE;
      v_externnr          alg_gebouw.alg_gebouw_externnr%TYPE;
      v_externsyncdate    alg_gebouw.alg_gebouw_externsyncdate%TYPE;

      CURSOR c1
      IS
           SELECT alg_verdieping_key
             FROM alg_verdieping
            WHERE alg_gebouw_key = p_gebouw_key
                  AND alg_verdieping_verwijder IS NULL
         ORDER BY alg_verdieping_volgnr;
   BEGIN
      IF p_gebouw_key IS NOT NULL
      THEN
         SELECT alg_gebouw_naam,
                alg_gebouw_code,
                alg_gebouw_adres,
                alg_gebouw_postcode,
                alg_gebouw_omschrijving,
                alg_gebouw_bruto_vloeropp,
                alg_gebouw_omtrek,
                alg_gebouw_inhoud,
                alg_gebouw_opmerking,
                alg_srtgebouw_key,
                alg_gebouw_ordernr,
                mld_adres_key,
                alg_gebouw_dwgx,
                alg_gebouw_dwgy,
                alg_gebouw_x,
                alg_gebouw_y,
                prs_kostenplaats_key,
                alg_gebouw_beginuur,
                alg_gebouw_einduur,
                alg_gebouw_werkdagen,
                prs_perslid_key_verantw,
                prs_perslid_key_verantw2,
                alg_gebouw_image,
                alg_gebouw_vervaldatum,
                alg_gebouw_mjb_score1,
                alg_gebouw_externnr,
                alg_gebouw_externsyncdate
           INTO v_naam,
                v_code,
                v_adres,
                v_postcode,
                v_omschrijving,
                v_bruto_vloeropp,
                v_omtrek,
                v_inhoud,
                v_opmerking,
                v_srtgebouw_key,
                v_ordernr,
                v_adres_key,
                v_dwgx,
                v_dwgy,
                v_x,
                v_y,
                v_kostenplaats_key,
                v_beginuur,
                v_einduur,
                v_werkdagen,
                v_verantw_key,
                v_verantw_key2,
                v_image,
                v_vervaldatum,
                v_mjb_score1,
                v_externnr,
                v_externsyncdate
           FROM alg_gebouw
          WHERE alg_gebouw_key = p_gebouw_key;

         createopentag ('gebouw');
         createxmltagvalue ('key', p_gebouw_key);
         createxmltagvalue ('naam', v_naam);
         createxmltagvalue ('code', v_code);
         createxmltagvalue ('adres', v_adres);
         createxmltagvalue ('postcode', v_postcode);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('bruto_vloeropp', v_bruto_vloeropp);
         createxmltagvalue ('omtrek', v_omtrek);
         createxmltagvalue ('inhoud', v_inhoud);
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('ordernr', v_ordernr);
         create_prs_perslid_node (v_verantw_key, 'verantwoordelijke', TRUE);
         create_prs_perslid_node (v_verantw_key2, 'verantwoordelijke2', TRUE);
         create_prs_kostenplaats_node (v_kostenplaats_key, TRUE);
         create_mld_adres_node (v_adres_key, 'afleveradres', TRUE);
         create_alg_kenmerken (p_gebouw_key, 'G');
         create_alg_srtgebouw_node (v_srtgebouw_key);
         mydatetochar ('vervaldatum', v_vervaldatum);
         createxmltagvalue ('beginuur', v_beginuur);
         createxmltagvalue ('einduur', v_einduur);
         createxmltagvalue ('werkdagen', v_werkdagen);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);

         IF p_verdieping_key IS NOT NULL
         THEN
            create_alg_verdieping_node (p_verdieping_key,
                                        p_ruimte_key,
                                        p_withchildren);
         ELSIF p_withchildren
         THEN
            FOR rec1 IN c1
            LOOP
               create_alg_verdieping_node (rec1.alg_verdieping_key,
                                           p_ruimte_key,
                                           p_withchildren);
            END LOOP;
         END IF;

         createxmltagvalue ('dwgx', v_dwgx);
         createxmltagvalue ('dwgy', v_dwgy);
         createxmltagvalue ('x', v_x);
         createxmltagvalue ('y', v_y);
         createxmltagvalue ('image', v_image);
         createxmltagvalue ('mjb_score1', v_mjb_score1);
         createclosetag ('gebouw');
      END IF;
   END;

   -- * create_ALG_LOCATIE_node
   -- *
   --

   PROCEDURE create_alg_locatie_node (p_locatie_key         IN NUMBER,
                                      p_gebouw_key          IN NUMBER,
                                      p_verdieping_key      IN NUMBER,
                                      p_ruimte_key          IN NUMBER,
                                      p_terreinsector_key   IN NUMBER,
                                      p_withchildren        IN BOOLEAN,
                                      p_concise             IN BOOLEAN)
   AS
      v_code            alg_locatie.alg_locatie_code%TYPE;
      v_omschrijving    alg_locatie.alg_locatie_omschrijving%TYPE;
      v_adres           alg_locatie.alg_locatie_adres%TYPE;
      v_postcode        alg_locatie.alg_locatie_postcode%TYPE;
      v_plaats          alg_locatie.alg_locatie_plaats%TYPE;
      v_land            alg_locatie.alg_locatie_land%TYPE;
      v_post_adres      alg_locatie.alg_locatie_post_adres%TYPE;
      v_post_postcode   alg_locatie.alg_locatie_post_postcode%TYPE;
      v_post_plaats     alg_locatie.alg_locatie_post_plaats%TYPE;
      v_post_land       alg_locatie.alg_locatie_post_land%TYPE;
      v_tekening        cad_tekening.cad_tekening_filenaam%TYPE;
      v_verantw         alg_locatie.alg_locatie_verantw%TYPE;
      v_verantw_tel     alg_locatie.alg_locatie_verantw_tel%TYPE;
      v_x               alg_locatie.alg_locatie_x%TYPE;
      v_y               alg_locatie.alg_locatie_y%TYPE;
      v_image           alg_locatie.alg_locatie_image%TYPE;
      v_mjb_score1      alg_locatie.alg_locatie_mjb_score1%TYPE;
      v_vervaldatum     alg_locatie.alg_locatie_vervaldatum%TYPE;
      v_externnr        alg_locatie.alg_locatie_externnr%TYPE;
      v_externsyncdate  alg_locatie.alg_locatie_externsyncdate%TYPE;
      CURSOR c1
      IS
           SELECT alg_gebouw_key
             FROM alg_gebouw
            WHERE alg_locatie_key = p_locatie_key
                  AND alg_gebouw_verwijder IS NULL
         ORDER BY alg_gebouw_upper;

      CURSOR c2
      IS
           SELECT alg_terreinsector_key
             FROM alg_terreinsector
            WHERE alg_locatie_key = p_locatie_key
                  AND alg_terreinsector_verwijder IS NULL
         ORDER BY alg_terreinsector_code;
   BEGIN
      IF p_locatie_key IS NOT NULL
      THEN
         SELECT alg_locatie_code,
                alg_locatie_omschrijving,
                alg_locatie_adres,
                alg_locatie_postcode,
                alg_locatie_plaats,
                alg_locatie_land,
                alg_locatie_post_adres,
                alg_locatie_post_postcode,
                alg_locatie_post_plaats,
                alg_locatie_post_land,
                cad_tekening_filenaam,
                alg_locatie_verantw,
                alg_locatie_verantw_tel,
                alg_locatie_x,
                alg_locatie_y,
                alg_locatie_image,
                alg_locatie_mjb_score1,
                alg_locatie_vervaldatum,
                alg_locatie_externnr,
                alg_locatie_externsyncdate
           INTO v_code,
                v_omschrijving,
                v_adres,
                v_postcode,
                v_plaats,
                v_land,
                v_post_adres,
                v_post_postcode,
                v_post_plaats,
                v_post_land,
                v_tekening,
                v_verantw,
                v_verantw_tel,
                v_x,
                v_y,
                v_image,
                v_mjb_score1,
                v_vervaldatum,
                v_externnr,
                v_externsyncdate
           FROM alg_locatie l, cad_tekening t
          WHERE l.alg_locatie_key = p_locatie_key
            AND t.alg_verdieping_key(+) = l.alg_locatie_key;

         createopentag ('locatie');
         createxmltagvalue ('key', p_locatie_key);
         createxmltagvalue ('code', v_code);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('adres', v_adres);
         createxmltagvalue ('postcode', v_postcode);
         createxmltagvalue ('plaats', v_plaats);
         createxmltagvalue ('post_land', v_land);
         createxmltagvalue ('post_adres', v_post_adres);
         createxmltagvalue ('post_postcode', v_post_postcode);
         createxmltagvalue ('post_plaats', v_post_plaats);
         createxmltagvalue ('post_land', v_post_land);
         createxmltagvalue ('tekening', v_tekening);
         createxmltagvalue ('verantw', v_verantw);
         createxmltagvalue ('verantw_tel', v_verantw_tel);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);
         IF NOT p_concise THEN
            create_alg_kenmerken (p_locatie_key, 'L');
         END IF;

         IF p_gebouw_key IS NOT NULL
         THEN
            create_alg_gebouw_node (p_gebouw_key,
                                    p_verdieping_key,
                                    p_ruimte_key,
                                    p_withchildren);
         ELSE
            IF p_terreinsector_key IS NOT NULL
            THEN
               create_alg_terreinsector_node (p_terreinsector_key);
            ELSIF p_withchildren
            THEN
               FOR rec2 IN c2
               LOOP
                  create_alg_terreinsector_node (rec2.alg_terreinsector_key);
               END LOOP;

               FOR rec1 IN c1
               LOOP
                  create_alg_gebouw_node (rec1.alg_gebouw_key,
                                          p_verdieping_key,
                                          p_ruimte_key,
                                          p_withchildren);
               END LOOP;
            END IF;
         END IF;

         createxmltagvalue ('x', v_x);
         createxmltagvalue ('y', v_y);
         createxmltagvalue ('image', v_image);
         createxmltagvalue ('mjb_score1', v_mjb_score1);
         mydatetochar ('vervaldatum', v_vervaldatum);
         createclosetag ('locatie');
      END IF;
   END;

   -- * create_ALG_DISTRICT_node
   -- *
   --

   PROCEDURE create_alg_district_node (p_district_key        IN NUMBER,
                                       p_locatie_key         IN NUMBER,
                                       p_gebouw_key          IN NUMBER,
                                       p_verdieping_key      IN NUMBER,
                                       p_ruimte_key          IN NUMBER,
                                       p_terreinsector_key   IN NUMBER,
                                       p_withchildren        IN BOOLEAN)
   AS
      v_omschrijving   alg_district.alg_district_omschrijving%TYPE;
      v_externnr       alg_district.alg_district_externnr%TYPE;
      v_externsyncdate alg_district.alg_district_externsyncdate%TYPE;

      CURSOR c1
      IS
           SELECT alg_locatie_key
             FROM alg_locatie
            WHERE alg_district_key = p_district_key
                  AND alg_locatie_verwijder IS NULL
         ORDER BY alg_locatie_code;
   BEGIN
      IF p_district_key IS NOT NULL
      THEN
         SELECT alg_district_omschrijving
              , alg_district_externnr
              , alg_district_externsyncdate
           INTO v_omschrijving
              , v_externnr
              , v_externsyncdate
           FROM alg_district
          WHERE alg_district_key = p_district_key;

         createopentag ('district');
         createxmltagvalue ('key', p_district_key);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);
         create_alg_kenmerken (p_district_key, 'D');

         IF p_locatie_key IS NOT NULL
         THEN
            create_alg_locatie_node (p_locatie_key,
                                     p_gebouw_key,
                                     p_verdieping_key,
                                     p_ruimte_key,
                                     p_terreinsector_key,
                                     p_withchildren,
                                     FALSE);
         ELSIF p_withchildren
         THEN
            FOR rec1 IN c1
            LOOP
               create_alg_locatie_node (rec1.alg_locatie_key,
                                        p_gebouw_key,
                                        p_verdieping_key,
                                        p_ruimte_key,
                                        p_terreinsector_key,
                                        p_withchildren,
                                        TRUE);
            END LOOP;
         END IF;

         createclosetag ('district');
      END IF;
   END;

   -- * create_ALG_REGIO_node
   -- *
   --

   PROCEDURE create_alg_regio_node (p_regio_key           IN NUMBER,
                                    p_district_key        IN NUMBER,
                                    p_locatie_key         IN NUMBER,
                                    p_gebouw_key          IN NUMBER,
                                    p_verdieping_key      IN NUMBER,
                                    p_ruimte_key          IN NUMBER,
                                    p_terreinsector_key   IN NUMBER,
                                    p_withchildren        IN BOOLEAN)
   AS
      v_omschrijving   alg_regio.alg_regio_omschrijving%TYPE;
      v_externnr       alg_regio.alg_regio_externnr%TYPE;
      v_externsyncdate alg_regio.alg_regio_externsyncdate%TYPE;

      CURSOR c1
      IS
           SELECT alg_district_key
             FROM alg_district
            WHERE alg_regio_key = p_regio_key
                  AND alg_district_verwijder IS NULL
         ORDER BY alg_district_upper;
   BEGIN
      IF p_regio_key IS NOT NULL
      THEN
         SELECT alg_regio_omschrijving
              , alg_regio_externnr
              , alg_regio_externsyncdate
           INTO v_omschrijving
              , v_externnr
              , v_externsyncdate
           FROM alg_regio
          WHERE alg_regio_key = p_regio_key;

         createopentag ('regio');
         createxmltagvalue ('key', p_regio_key);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);

         IF p_district_key IS NOT NULL
         THEN
            create_alg_district_node (p_district_key,
                                      p_locatie_key,
                                      p_gebouw_key,
                                      p_verdieping_key,
                                      p_ruimte_key,
                                      p_terreinsector_key,
                                      p_withchildren);
         ELSIF p_withchildren
         THEN
            FOR rec1 IN c1
            LOOP
               create_alg_district_node (rec1.alg_district_key,
                                         p_locatie_key,
                                         p_gebouw_key,
                                         p_verdieping_key,
                                         p_ruimte_key,
                                         p_terreinsector_key,
                                         p_withchildren);
            END LOOP;
         END IF;

         createclosetag ('regio');
      END IF;
   END;

   -- * create_ALG_ONRGOED_node
   -- *
   --

   PROCEDURE create_alg_onroerendgoed_node (p_key            IN NUMBER,
                                            p_nodename       IN VARCHAR2,
                                            p_lockey         IN NUMBER,
                                            p_concise        IN BOOLEAN,
                                            p_withchildren   IN BOOLEAN)
   AS
      v_terreinsector_key   alg_terreinsector.alg_terreinsector_key%TYPE;
      v_ruimte_key          alg_ruimte.alg_ruimte_key%TYPE;
      v_verdieping_key      alg_verdieping.alg_verdieping_key%TYPE;
      v_gebouw_key          alg_gebouw.alg_gebouw_key%TYPE;
      v_locatie_key         alg_locatie.alg_locatie_key%TYPE;
      v_district_key        alg_district.alg_district_key%TYPE;
      v_regio_key           alg_regio.alg_regio_key%TYPE;
      v_type                VARCHAR2 (1);
      v_plaatsaanduiding    alg_v_plaatsaanduiding.alg_plaatsaanduiding%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         IF p_lockey IS NOT NULL
         THEN
            SELECT alg_locatie_code, 'L'
              INTO v_plaatsaanduiding, v_type
              FROM alg_locatie
             WHERE alg_locatie_key = p_lockey;
         ELSE
            SELECT alg_plaatsaanduiding, alg_onroerendgoed_type
              INTO v_plaatsaanduiding, v_type
              FROM alg_v_plaatsaanduiding_all
             WHERE alg_onroerendgoed_keys = p_key
                   AND alg_onroerendgoed_type <> 'L';
         END IF;

         IF NOT p_concise
         THEN
            BEGIN
               IF p_lockey IS NOT NULL
               THEN
                  SELECT NULL,
                         NULL,
                         NULL,
                         NULL,
                         l.alg_locatie_key,
                         d.alg_district_key,
                         d.alg_regio_key,
                         'L'
                    INTO v_terreinsector_key,
                         v_ruimte_key,
                         v_verdieping_key,
                         v_gebouw_key,
                         v_locatie_key,
                         v_district_key,
                         v_regio_key,
                         v_type
                    FROM alg_locatie l, alg_district d
                   WHERE p_lockey = l.alg_locatie_key
                         AND l.alg_district_key = d.alg_district_key;
               ELSE
                  SELECT aog.alg_terreinsector_key,
                         aog.alg_ruimte_key,
                         aog.alg_verdieping_key,
                         aog.alg_gebouw_key,
                         aog.alg_locatie_key,
                         d.alg_district_key,
                         d.alg_regio_key,
                         aog.alg_type
                    INTO v_terreinsector_key,
                         v_ruimte_key,
                         v_verdieping_key,
                         v_gebouw_key,
                         v_locatie_key,
                         v_district_key,
                         v_regio_key,
                         v_type
                    FROM alg_v_allonroerendgoed aog,
                         alg_locatie l,
                         alg_district d
                   WHERE     p_key = aog.alg_onroerendgoed_keys
                         AND aog.alg_locatie_key = l.alg_locatie_key
                         AND l.alg_district_key = d.alg_district_key;
               END IF;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  SELECT NULL,
                         NULL,
                         NULL,
                         NULL,
                         l.alg_locatie_key,
                         d.alg_district_key,
                         d.alg_regio_key,
                         'L'
                    INTO v_terreinsector_key,
                         v_ruimte_key,
                         v_verdieping_key,
                         v_gebouw_key,
                         v_locatie_key,
                         v_district_key,
                         v_regio_key,
                         v_type
                    FROM alg_locatie l, alg_district d
                   WHERE p_key = l.alg_locatie_key
                         AND l.alg_district_key = d.alg_district_key;
            END;
         END IF;

         IF p_concise
         THEN
            createopentagattributes (p_nodename,
                                     'type',
                                     v_type,
                                     'mode',
                                     'concise',
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL);
         ELSE
            createopentagattributes (p_nodename,
                                     'type',
                                     v_type,
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL);
         END IF;

         createxmltagvalue ('plaatsaanduiding', v_plaatsaanduiding);
         createxmltagvalue ('key', p_key);

         IF NOT p_concise
         THEN
            create_alg_regio_node (v_regio_key,
                                   v_district_key,
                                   v_locatie_key,
                                   v_gebouw_key,
                                   v_verdieping_key,
                                   v_ruimte_key,
                                   v_terreinsector_key,
                                   p_withchildren);
         END IF;

         createclosetag (p_nodename);
      END IF;
   END;

   -- *
   -- * INS kenmerken
   -- *

   PROCEDURE create_ins_kenmerken (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT k.ins_kenmerk_key,
                  k.ins_kenmerk_code,
                  s.ins_srtkenmerk_code,
                  COALESCE (
                      lcl.x ('ins_kenmerk_omschrijving', k.ins_kenmerk_key, ins_kenmerk_omschrijving),
                      lcl.x ('ins_srtkenmerk_omschrijving', s.ins_srtkenmerk_key, ins_srtkenmerk_omschrijving)) ins_kenmerk_omschrijving,
                  s.ins_srtkenmerk_kenmerktype,
                  s.fac_kenmerkdomein_key,
                  s.ins_srtkenmerk_lengte,
                  s.ins_srtkenmerk_dec,
                  s.ins_srtkenmerk_nmin,
                  s.ins_srtkenmerk_nmax,
                  k.ins_kenmerk_default,
                  NVL (k.ins_kenmerk_volgnummer, 0) volgnummer,
                  lcl.x ('ins_srtkenmerk_dimensie',
                         s.ins_srtkenmerk_key,
                         ins_srtkenmerk_dimensie)
                     dimensie,
                  lcl.x ('ins_kenmerk_hint',
                         k.ins_kenmerk_key,
                         ins_kenmerk_hint)
                     hint,
                  v.ins_kenmerkdeel_waarde,
                  v.ins_kenmerkdeel_aanmaak,
                  v.ins_kenmerkdeel_verwijder
             FROM ins_kenmerk k,
                  ins_srtkenmerk s,
                  ins_deel d,
                  ins_srtgroep sg,
                  ins_srtdeel sd,
                  (SELECT v.ins_kenmerk_key,
                          v.ins_kenmerkdeel_waarde,
                          v.ins_kenmerkdeel_aanmaak,
                          v.ins_kenmerkdeel_verwijder
                     FROM ins_kenmerkdeel v
                    WHERE v.ins_deel_key = p_key) v
            WHERE ( (k.ins_srtinstallatie_key IS NULL
                     AND k.ins_kenmerk_niveau = 'D')
                   OR (d.ins_discipline_key = k.ins_srtinstallatie_key
                       AND k.ins_kenmerk_niveau = 'D')
                   OR (d.ins_srtdeel_key = k.ins_srtinstallatie_key
                       AND k.ins_kenmerk_niveau = 'S')
                   OR (sg.ins_srtgroep_key = k.ins_srtinstallatie_key
                       AND k.ins_kenmerk_niveau = 'G'))
                  AND d.ins_deel_key = p_key
                  AND k.ins_kenmerk_verwijder IS NULL
                  AND ins_kenmerk_bewerkniveau = 'D'
                  AND s.ins_srtkenmerk_verwijder IS NULL
                  AND d.ins_srtdeel_key = sd.ins_srtdeel_key
                  AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
                  AND k.ins_srtkenmerk_key = s.ins_srtkenmerk_key
                  AND v.ins_kenmerk_key(+) = k.ins_kenmerk_key
         ORDER BY k.ins_kenmerk_volgnummer;

      v_kenmerk_waarde       ins_kenmerkdeel.ins_kenmerkdeel_waarde%TYPE;
      v_kenmerk_aanmaak      ins_kenmerkdeel.ins_kenmerkdeel_aanmaak%TYPE;
      v_kenmerk_verwijder    ins_kenmerkdeel.ins_kenmerkdeel_verwijder%TYPE;
   BEGIN
      FOR rec1 IN c1
      LOOP
         v_kenmerk_aanmaak := rec1.ins_kenmerkdeel_aanmaak;
         v_kenmerk_verwijder := rec1.ins_kenmerkdeel_verwijder;
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.ins_kenmerkdeel_waarde,
                                 rec1.ins_kenmerk_default,
                                 rec1.ins_srtkenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.ins_srtkenmerk_nmin,
                                 rec1.ins_srtkenmerk_nmax,
                                 p_key,
                                 rec1.ins_kenmerk_key);

         createxmltagvalueattributes9('kenmerk',
                                      'kenmerkcode',     rec1.ins_kenmerk_code,
                                      'srtkenmerkcode',  rec1.ins_srtkenmerk_code,
                                      'naam',            rec1.ins_kenmerk_omschrijving,
                                      'type',            rec1.ins_srtkenmerk_kenmerktype,
                                      'volgnummer',      rec1.volgnummer,
                                      'key',             rec1.ins_kenmerk_key,
                                      'aanmaak',         TO_CHAR (v_kenmerk_aanmaak, 'YYYYMMDD HH24:MI'),
                                      NULL,              NULL,
                                      NULL,              NULL,
                                      rec1.fac_kenmerkdomein_key,
                                      v_kenmerk_waarde
                                     );
      END LOOP;
   END;

   -- INSPECTIES
   PROCEDURE create_ins_srtcontrole_node (p_key IN NUMBER, p_deel_key IN NUMBER)
   AS
      v_srtcontrole_omschrijving    ins_srtcontrole.ins_srtcontrole_omschrijving%TYPE;
      v_srtcontrole_info            ins_srtcontrole.ins_srtcontrole_info%TYPE;
      v_srtcontrole_periode         ins_srtcontrole.ins_srtcontrole_periode%TYPE;
      v_srtcontrole_eenheid         ins_srtcontrole.ins_srtcontrole_eenheid%TYPE;
      v_srtcontrole_bits            ins_srtcontrole.ins_srtcontrole_bits%TYPE;
      v_srtcontrole_mode            ins_srtcontrole.ins_srtcontrole_mode%TYPE;
      v_srtcontrole_groep           ins_srtcontrole.ins_srtcontrole_groep%TYPE;
      v_srtcontrole_level           ins_srtcontrole.ins_srtcontrole_level%TYPE;
      v_srtcontrole_kosten          ins_srtcontrole.ins_srtcontrole_kosten%TYPE;
      v_srtcontrole_kosten2         ins_srtcontrole.ins_srtcontrole_kosten%TYPE;
      v_srtcontrole_kosten3         ins_srtcontrole.ins_srtcontrole_kosten%TYPE;
      v_srtcontrole_uren            ins_srtcontrole.ins_srtcontrole_uren%TYPE;
      v_srtcontrole_materiaal       ins_srtcontrole.ins_srtcontrole_materiaal%TYPE;
      v_srtcontrole_opmerking       ins_srtcontrole.ins_srtcontrole_opmerking%TYPE;
      v_srtcontrole_eind            ins_srtcontrole.ins_srtcontrole_eind%TYPE;
      v_srtcontrole_type            ctr_disc_params.ctr_disc_params_controle_type%TYPE;
      v_srtcontroledl_xcp_key       ins_srtcontroledl_xcp.ins_srtcontroledl_xcp_key%TYPE;
      v_srtcontroledl_xcp_eind      ins_srtcontroledl_xcp.ins_srtcontroledl_xcp_eind%TYPE;
      l_typetext                    fac_locale.fac_locale_tekst%TYPE;
      v_kostenplaats_key            ins_srtcontrole.prs_kostenplaats_key%TYPE;
   BEGIN
      DBMS_OUTPUT.put_line (p_key);
      DBMS_OUTPUT.put_line (p_deel_key);

      IF p_key IS NOT NULL
      THEN
         createopentag ('srtcontrole');

         SELECT ins_srtcontrole_omschrijving,
                ins_srtcontrole_info,
                ins_srtcontrole_periode,
                ins_srtcontrole_eenheid,
                ins_srtcontrole_bits,
                ins_srtcontrole_mode,
                ins_srtcontrole_groep,
                ins_srtcontrole_level,
                ins_srtcontrole_kosten,
                ins_srtcontrole_kosten2,
                ins_srtcontrole_kosten3,
                ins_srtcontrole_uren,
                ins_srtcontrole_materiaal,
                ins_srtcontrole_opmerking,
                ins_srtcontrole_eind,
                ctr_disc_params_controle_type,
                prs_kostenplaats_key
           INTO v_srtcontrole_omschrijving,
                v_srtcontrole_info,
                v_srtcontrole_periode,
                v_srtcontrole_eenheid,
                v_srtcontrole_bits,
                v_srtcontrole_mode,
                v_srtcontrole_groep,
                v_srtcontrole_level,
                v_srtcontrole_kosten,
                v_srtcontrole_kosten2,
                v_srtcontrole_kosten3,
                v_srtcontrole_uren,
                v_srtcontrole_materiaal,
                v_srtcontrole_opmerking,
                v_srtcontrole_eind,
                v_srtcontrole_type,
                v_kostenplaats_key
           FROM ins_srtcontrole isc,
                ctr_disc_params cdp
          WHERE ins_srtcontrole_key = p_key
            AND isc.ctr_discipline_key = cdp.ctr_ins_discipline_key;

         -- check for effective exceptions and use those if overruled
         IF p_deel_key IS NOT NULL
         THEN
            BEGIN
               SELECT ins_srtcontroledl_xcp_key,
                      COALESCE(ins_srtcontroledl_xcp_periode, v_srtcontrole_periode),
                      COALESCE(ins_srtcontroledl_xcp_eenheid, v_srtcontrole_eenheid),
                      COALESCE(ins_srtcontroledl_xcp_bits, v_srtcontrole_bits),
                      COALESCE(ins_srtcontroledl_xcp_groep, v_srtcontrole_groep),
                      COALESCE(ins_srtcontroledl_xcp_eind, v_srtcontrole_eind),
                      COALESCE(ins_srtcontroledl_xcp_kosten, v_srtcontrole_kosten),
                      COALESCE(ins_srtcontroledl_xcp_kosten2, v_srtcontrole_kosten2),
                      COALESCE(ins_srtcontroledl_xcp_kosten3, v_srtcontrole_kosten3),
                      COALESCE(ins_srtcontroledl_xcp_uren, v_srtcontrole_uren),
                      COALESCE(ins_srtcontroledl_xcp_materia, v_srtcontrole_materiaal),
                      COALESCE(prs_kostenplaats_key, v_kostenplaats_key)
                 INTO v_srtcontroledl_xcp_key,
                      v_srtcontrole_periode,
                      v_srtcontrole_eenheid,
                      v_srtcontrole_bits,
                      v_srtcontrole_groep,
                      v_srtcontroledl_xcp_eind,
                      v_srtcontrole_kosten,
                      v_srtcontrole_kosten2,
                      v_srtcontrole_kosten3,
                      v_srtcontrole_uren,
                      v_srtcontrole_materiaal,
                      v_kostenplaats_key
                 FROM ins_srtcontroledl_xcp
                WHERE ins_deel_key = p_deel_key AND ins_srtcontrole_key = p_key;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  NULL;
            END;
         END IF;
      END IF;

      createxmltagvalue ('key', p_key);
      createxmltagvalue ('omschrijving', v_srtcontrole_omschrijving);

      IF v_srtcontroledl_xcp_key IS NOT NULL
      THEN
         createxmltagvalue ('isexception', 1);
      END IF;

      createxmltagvalue ('periode', v_srtcontrole_periode);
      createxmltagvalue ('eenheid', v_srtcontrole_eenheid);
      createxmltagvalue ('bits', v_srtcontrole_bits);
      createxmltagvalue ('mode', v_srtcontrole_mode);
      createxmltagvalue ('groep', v_srtcontrole_groep);
      createxmltagvalue ('level', v_srtcontrole_level);
      createxmltagvalue ('kosten', v_srtcontrole_kosten);
      createxmltagvalue ('kosten2', v_srtcontrole_kosten2);
      createxmltagvalue ('kosten3', v_srtcontrole_kosten3);
      createxmltagvalue ('uren', v_srtcontrole_uren);
      createxmltagvalue ('materiaal', v_srtcontrole_materiaal);
      createxmltagvalue ('opmerking', v_srtcontrole_opmerking);
      mydatetochar ('einddatum', v_srtcontrole_eind);

      SELECT DECODE (v_srtcontrole_type,
                     1, lcl.l ('lcl_ins_srtcontrole_insp'),
                     2, lcl.l ('lcl_ins_srtcontrole_repl'),
                     3, lcl.l ('lcl_ins_srtcontrole_cert'),
                     '')
        INTO l_typetext
        FROM DUAL;

      createxmltagvalue ('type', l_typetext);
      createxmltagvalue ('type_code', v_srtcontrole_type);
      create_prs_kostenplaats_node (v_kostenplaats_key, TRUE);

      createclosetag ('srtcontrole');
   END;

   PROCEDURE create_controle_kenmerken (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT k.ins_kenmerk_key,
                  k.ins_kenmerk_code,
                  s.ins_srtkenmerk_code,
                  COALESCE (
                      lcl.x ('ins_kenmerk_omschrijving', k.ins_kenmerk_key, ins_kenmerk_omschrijving),
                      lcl.x ('ins_srtkenmerk_omschrijving', s.ins_srtkenmerk_key, ins_srtkenmerk_omschrijving)) ins_kenmerk_omschrijving,
                  s.ins_srtkenmerk_kenmerktype,
                  s.fac_kenmerkdomein_key,
                  s.ins_srtkenmerk_lengte,
                  s.ins_srtkenmerk_dec,
                  s.ins_srtkenmerk_nmin,
                  s.ins_srtkenmerk_nmax,
                  k.ins_kenmerk_default,
                  NVL (k.ins_kenmerk_volgnummer, 0) volgnummer,
                  lcl.x ('ins_srtkenmerk_dimensie', s.ins_srtkenmerk_key, ins_srtkenmerk_dimensie)
                     dimensie,
                  lcl.x ('ins_kenmerk_hint', k.ins_kenmerk_key, ins_kenmerk_hint) hint,
                  v.ins_kmdeelsrtcontr_waarde,
                  v.ins_kmdeelsrtcontr_aanmaak,
                  v.ins_kmdeelsrtcontr_verwijder
             FROM ins_kenmerk k,
                  ins_srtkenmerk s,
                  ins_deelsrtcontrole d,
                  (SELECT v.ins_kenmerk_key,
                          v.ins_kmdeelsrtcontr_waarde,
                          v.ins_kmdeelsrtcontr_aanmaak,
                          v.ins_kmdeelsrtcontr_verwijder
                     FROM ins_kmdeelsrtcontr v
                    WHERE v.ins_deelsrtcontrole_key = p_key) v
            WHERE     k.ins_kenmerk_niveau = 'C'
                  AND (k.ins_srtinstallatie_key = d.ins_srtcontrole_key OR k.ins_srtinstallatie_key IS NULL)
                  AND d.ins_deelsrtcontrole_key = p_key
                  AND k.ins_kenmerk_verwijder IS NULL
                  AND ins_kenmerk_bewerkniveau = 'D'
                  AND s.ins_srtkenmerk_verwijder IS NULL
                  AND k.ins_srtkenmerk_key = s.ins_srtkenmerk_key
                  AND v.ins_kenmerk_key(+) = k.ins_kenmerk_key
         ORDER BY k.ins_kenmerk_volgnummer;

      v_kenmerk_waarde      ins_kmdeelsrtcontr.ins_kmdeelsrtcontr_waarde%TYPE;
      v_kenmerk_aanmaak     ins_kmdeelsrtcontr.ins_kmdeelsrtcontr_aanmaak%TYPE;
      v_kenmerk_verwijder   ins_kmdeelsrtcontr.ins_kmdeelsrtcontr_verwijder%TYPE;
   BEGIN
      FOR rec1 IN c1 LOOP
         v_kenmerk_aanmaak := rec1.ins_kmdeelsrtcontr_aanmaak;
         v_kenmerk_verwijder := rec1.ins_kmdeelsrtcontr_verwijder;
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.ins_kmdeelsrtcontr_waarde,
                                 rec1.ins_kenmerk_default,
                                 rec1.ins_srtkenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.ins_srtkenmerk_nmin,
                                 rec1.ins_srtkenmerk_nmax,
                                 p_key,
                                 rec1.ins_kenmerk_key);

         createxmltagvalueattributes9('kenmerk',
                                      'kenmerkcode',     rec1.ins_kenmerk_code,
                                      'srtkenmerkcode',  rec1.ins_srtkenmerk_code,
                                      'naam',            rec1.ins_kenmerk_omschrijving,
                                      'type',            rec1.ins_srtkenmerk_kenmerktype,
                                      'volgnummer',      rec1.volgnummer,
                                      'key',             rec1.ins_kenmerk_key,
                                      'aanmaak',         TO_CHAR (v_kenmerk_aanmaak, 'YYYYMMDD HH24:MI'),
                                      NULL,              NULL,
                                      NULL,              NULL,
                                      rec1.fac_kenmerkdomein_key,
                                      v_kenmerk_waarde
                                     );
      END LOOP;
   END;


   PROCEDURE create_ins_deelsrtcontr_node (p_key IN NUMBER, p_concise IN BOOLEAN)
   AS
      v_deel_key                    ins_deelsrtcontrole.ins_deel_key%TYPE;
      v_srtcontrole_key             ins_deelsrtcontrole.ins_srtcontrole_key%TYPE;
      v_deelsrtcontrole_datum       ins_deelsrtcontrole.ins_deelsrtcontrole_datum%TYPE;
      v_deelsrtcontrole_datum_org   ins_deelsrtcontrole.ins_deelsrtcontrole_datum_org%TYPE;
      v_controlemode_key            ins_deelsrtcontrole.ins_controlemode_key%TYPE;
      v_deelsrtcontrole_opmerking   ins_deelsrtcontrole.ins_deelsrtcontrole_opmerking%TYPE;
      v_deelsrtcontrole_plan_opm    ins_deelsrtcontrole.ins_deelsrtcontrole_plan_opm%TYPE;
      v_deelsrtcontrole_plandatum   ins_deelsrtcontrole.ins_deelsrtcontrole_plandatum%TYPE;
      v_deelsrtcontrole_status      ins_deelsrtcontrole.ins_deelsrtcontrole_status%TYPE;
      v_perslid_key                 ins_deelsrtcontrole.prs_perslid_key%TYPE;
      v_controlemode_oms            ins_controlemode.ins_controlemode_oms%TYPE;
      v_controlemode_opmerking      ins_controlemode.ins_controlemode_opmerking%TYPE;
      v_controlemode_success        ins_controlemode.ins_controlemode_success%TYPE;
      v_controlestatus_omschr       ins_controlestatuses.ins_controlestatus_omschr%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         IF p_concise
         THEN
            createconciseopentag ('controle');
         ELSE
            createopentag ('controle');
         END IF;

         SELECT ins_deel_key,
                ins_srtcontrole_key,
                ins_deelsrtcontrole_datum,
                ins_deelsrtcontrole_datum_org,
                dsc.ins_controlemode_key,
                ins_deelsrtcontrole_opmerking,
                ins_deelsrtcontrole_plan_opm,
                ins_deelsrtcontrole_plandatum,
                ins_deelsrtcontrole_status,
                prs_perslid_key,
                ins_controlemode_oms,
                ins_controlemode_opmerking,
                ins_controlemode_success,
                ins_controlestatus_omschr
           INTO v_deel_key,
                v_srtcontrole_key,
                v_deelsrtcontrole_datum,
                v_deelsrtcontrole_datum_org,
                v_controlemode_key,
                v_deelsrtcontrole_opmerking,
                v_deelsrtcontrole_plan_opm,
                v_deelsrtcontrole_plandatum,
                v_deelsrtcontrole_status,
                v_perslid_key,
                v_controlemode_oms,
                v_controlemode_opmerking,
                v_controlemode_success,
                v_controlestatus_omschr
           FROM ins_deelsrtcontrole dsc, ins_controlemode cm, ins_controlestatuses cs
          WHERE     dsc.ins_controlemode_key = cm.ins_controlemode_key(+)
                AND cs.ins_controlestatus_key = dsc.ins_deelsrtcontrole_status
                AND ins_deelsrtcontrole_key = p_key;

         createxmltagvalue ('key', p_key);
         createxmltagvalue ('status_key', v_deelsrtcontrole_status);
         createxmltagvalue ('status', v_controlestatus_omschr);

         create_ins_srtcontrole_node (v_srtcontrole_key, v_deel_key);
         --createxmltagvalue ('controlemode', v_controlemode_key);
         createxmltagvalue ('controle_omschrijving', v_controlemode_oms);
         createxmltagvalue ('controle_opmerking', v_controlemode_opmerking);
         createxmltagvalue ('controle_succes', v_controlemode_success);

         mydatetochar ('datum', v_deelsrtcontrole_datum);
         mydatetochar ('orgdatum', v_deelsrtcontrole_datum_org);
         mydatetochar ('plandatum', v_deelsrtcontrole_plandatum);
         createxmltagvalue ('opmerking', v_deelsrtcontrole_opmerking);
         createxmltagvalue ('plan_opm', v_deelsrtcontrole_plan_opm);

         IF NOT p_concise
         THEN
             create_ins_deel_node (v_deel_key, null, TRUE);
         END IF;

         create_prs_perslid_node (v_perslid_key, 'inspector', TRUE);
         create_controle_kenmerken (p_key);
         create_fac_tracking_node ('controle', p_key);
         createclosetag ('controle');
      END IF;
   END;


   PROCEDURE create_ins_taak_node (p_key IN NUMBER)
   AS
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('taak');
         createxmltagvalue ('key', p_key);
         create_ins_srtcontrole_node (p_key, NULL);
         create_fac_tracking_node ('taak', p_key);
         createclosetag ('taak');
      END IF;
   END;

   -- * create_INS_DEEL_node

   PROCEDURE create_ins_deel_node (p_key IN NUMBER, p_deelsrtcontrole_key IN NUMBER, p_concise IN BOOLEAN)
   AS
      v_ins_srtdeel_key           ins_deel.ins_srtdeel_key%TYPE;
      v_ins_alg_ruimte_key        ins_deel.ins_alg_ruimte_key%TYPE;
      v_ins_alg_ruimte_type       ins_deel.ins_alg_ruimte_type%TYPE;
      v_ins_alg_ruimte_key_org    ins_deel.ins_alg_ruimte_key_org%TYPE;
      v_ins_alg_ruimte_type_org   ins_deel.ins_alg_ruimte_type_org%TYPE;
      v_aantal                    ins_deel.ins_deel_aantal%TYPE;
      v_omschrijving              ins_deel.ins_deel_omschrijving%TYPE;
      v_opmerking                 ins_deel.ins_deel_opmerking%TYPE;
      v_ins_discipline_key        ins_deel.ins_discipline_key%TYPE;
      v_ins_alg_locatie_key       ins_deel.ins_alg_locatie_key%TYPE;
      v_parent_key                ins_deel.ins_deel_parent_key%TYPE;
      v_omtrek                    ins_deel.ins_deel_omtrek%TYPE;
      v_oppervlak                 ins_deel.ins_deel_oppervlak%TYPE;
      v_dwgx                      ins_deel.ins_deel_dwgx%TYPE;
      v_dwgy                      ins_deel.ins_deel_dwgy%TYPE;
      v_dwgz                      ins_deel.ins_deel_dwgz%TYPE;
      v_dwgrotatie                ins_deel.ins_deel_dwgrotatie%TYPE;
      v_dwgschaal                 ins_deel.ins_deel_dwgschaal%TYPE;
      v_x                         ins_deel.ins_deel_x%TYPE;
      v_y                         ins_deel.ins_deel_y%TYPE;
      v_mjb_score1                ins_deel.ins_deel_mjb_score1%TYPE;
      v_mjb_score2                ins_deel.ins_deel_mjb_score2%TYPE;
      v_vervaldatum               ins_deel.ins_deel_vervaldatum%TYPE;
      v_uitvoertijd_td            ins_deel.ins_deel_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd_e             ins_deel.ins_deel_t_uitvoertijd.eenheid%TYPE;
      v_perslid_key_beh           ins_deel.prs_perslid_key_beh%TYPE;
      v_externnr                  ins_deel.ins_deel_externnr%TYPE;
      v_externsyncdate            ins_deel.ins_deel_externsyncdate%TYPE;
      v_flag                      ins_deel.ins_deel_flag%TYPE;

      CURSOR c1
      IS
           SELECT ins_deel_key, ins_deel_omschrijving
             FROM ins_deel
            WHERE ins_deel_parent_key = p_key AND ins_deel_verwijder IS NULL
         ORDER BY ins_deel_upper;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('deel');

         SELECT ins_srtdeel_key,
                ins_alg_ruimte_key,
                ins_alg_ruimte_type,
                ins_alg_ruimte_key_org,
                ins_alg_ruimte_type_org,
                ins_deel_aantal,
                ins_deel_omschrijving,
                ins_deel_opmerking,
                ins_discipline_key,
                ins_alg_locatie_key,
                ins_deel_parent_key,
                ins_deel_omtrek,
                ins_deel_oppervlak,
                ins_deel_dwgx,
                ins_deel_dwgy,
                ins_deel_dwgz,
                ins_deel_dwgrotatie,
                ins_deel_dwgschaal,
                ins_deel_x,
                ins_deel_y,
                ins_deel_mjb_score1,
                ins_deel_mjb_score2,
                ins_deel_vervaldatum,
                id.ins_deel_t_uitvoertijd.tijdsduur,
                id.ins_deel_t_uitvoertijd.eenheid,
                prs_perslid_key_beh,
                ins_deel_externnr,
                ins_deel_externsyncdate,
                ins_deel_flag
           INTO v_ins_srtdeel_key,
                v_ins_alg_ruimte_key,
                v_ins_alg_ruimte_type,
                v_ins_alg_ruimte_key_org,
                v_ins_alg_ruimte_type_org,
                v_aantal,
                v_omschrijving,
                v_opmerking,
                v_ins_discipline_key,
                v_ins_alg_locatie_key,
                v_parent_key,
                v_omtrek,
                v_oppervlak,
                v_dwgx,
                v_dwgy,
                v_dwgz,
                v_dwgrotatie,
                v_dwgschaal,
                v_x,
                v_y,
                v_mjb_score1,
                v_mjb_score2,
                v_vervaldatum,
                v_uitvoertijd_td,
                v_uitvoertijd_e,
                v_perslid_key_beh,
                v_externnr,
                v_externsyncdate,
                v_flag
           FROM ins_deel id
          WHERE ins_deel_key = p_key;

         createxmltagvalue ('key', p_key);
         createxmltagvalue ('binding', v_ins_alg_ruimte_type);

         IF v_ins_alg_ruimte_type = 'R'
         THEN
            create_alg_onroerendgoed_node (v_ins_alg_ruimte_key,
                                           'plaats',
                                           NULL,
                                           p_concise,
                                           FALSE);
         ELSIF v_ins_alg_ruimte_type = 'P'
         THEN
            create_prs_perslid_node (v_ins_alg_ruimte_key, 'persoon', p_concise);
         ELSIF v_ins_alg_ruimte_type = 'A'
         THEN
            create_prs_afdeling_node (v_ins_alg_ruimte_key, 'afdeling');
         ELSIF v_ins_alg_ruimte_type = 'W'
         THEN
            create_prs_werkplek_node (v_ins_alg_ruimte_key, NULL, p_concise);
         ELSIF v_ins_alg_ruimte_type = 'T'
         THEN
            create_alg_terreinsector_node (v_ins_alg_ruimte_key);
         END IF;

         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);
         createxmltagvalue ('flag', v_flag);

         IF p_deelsrtcontrole_key IS NOT NULL
         THEN
             create_ins_deelsrtcontr_node (p_deelsrtcontrole_key, TRUE);
         END IF;

         IF NOT p_concise
         THEN
             create_prs_perslid_node (v_perslid_key_beh, 'beheerder', TRUE);
             createxmltagvalue ('aantal', v_aantal);
             createxmltagvalue ('uitgeleend', v_ins_alg_ruimte_type_org);
             createxmltagvalue ('omtrek', v_omtrek);
             createxmltagvalue ('oppervlak', v_oppervlak);
             createxmltagvalue ('dwgx', v_dwgx);
             createxmltagvalue ('dwgy', v_dwgy);
             createxmltagvalue ('dwgz', v_dwgz);
             createxmltagvalue ('dwgrotatie', v_dwgrotatie);
             createxmltagvalue ('dwgschaal', v_dwgschaal);
             createxmltagvalue ('x', v_x);
             createxmltagvalue ('y', v_y);
             createxmltagvalue ('mjb_score1', v_mjb_score1);
             createxmltagvalue ('mjb_score2', v_mjb_score2);
             mydatetochar ('vervaldatum', v_vervaldatum);
             createxmltagvalueattributes ('uitvoertijd',
                                          'eenheid',
                                          v_uitvoertijd_e,
                                          NULL, NULL,
                                          NULL, NULL,
                                          NULL, NULL,
                                          NULL, NULL,
                                          NULL,
                                          mynumbertochar (v_uitvoertijd_td));
             create_ins_kenmerken (p_key);
             create_ins_srtdeel_node (v_ins_srtdeel_key, p_concise);

             FOR rec1 IN c1
             LOOP
                create_ins_deel_node (rec1.ins_deel_key, null, FALSE);
             END LOOP;
             create_fac_tracking_node ('deel', p_key);
             -- TER OVERWEGING: loop voor Create_Ins_Deelsrtcontr_Node()
         END IF;
         createclosetag ('deel');
      END IF;
   END;

   -- *
   -- * MLD zaken
   -- *

   PROCEDURE create_mld_melding_note_node (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT mld_melding_note_key,
                  mld_melding_note_aanmaak,
                  prs_perslid_key,
                  mld_melding_note_parent_key,
                  mld_melding_note_omschrijving,
                  mld_melding_note_flag,
                  mld_melding_note_wijzigdatum,
                  fac_note_group_key
             FROM mld_melding_note
            WHERE mld_melding_key = p_key
         ORDER BY mld_melding_note_key;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('notes');

         FOR rec1 IN c1
         LOOP
            createopentag ('note');
            createxmltagvalue ('key', rec1.mld_melding_note_key);
            createxmltagvalue ('parent_key', rec1.mld_melding_note_parent_key);
            createxmltagvalue ('flag', BITAND(rec1.mld_melding_note_flag, 191)); -- reset de hier irrelevante 64-bit om compatibel te blijven
            mydatetochar ('aanmaak', rec1.mld_melding_note_aanmaak);
            mydatetochar ('wijzigdatum', rec1.mld_melding_note_wijzigdatum);
            createxmltagvalue ('omschrijving',
                               rec1.mld_melding_note_omschrijving);
            create_prs_perslid_node (rec1.prs_perslid_key, 'noteur', TRUE);
            create_fac_note_group_node(rec1.fac_note_group_key);
            createclosetag ('note');
         END LOOP;

         createclosetag ('notes');
      END IF;
   END;

   PROCEDURE create_mld_kenmerken (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT DISTINCT
                  k.mld_kenmerk_key,
                  k.mld_kenmerk_code,
                  s.mld_srtkenmerk_code,
                  COALESCE (
                      lcl.x ('mld_kenmerk_omschrijving', k.mld_kenmerk_key, mld_kenmerk_omschrijving),
                      lcl.x ('mld_srtkenmerk_omschrijving', s.mld_srtkenmerk_key, mld_srtkenmerk_omschrijving)) mld_kenmerk_omschrijving,
                  s.mld_srtkenmerk_kenmerktype,
                  s.mld_srtkenmerk_systeem,
                  s.fac_kenmerkdomein_key,
                  s.mld_srtkenmerk_lengte,
                  s.mld_srtkenmerk_dec,
                  s.mld_srtkenmerk_nmin,
                  s.mld_srtkenmerk_nmax,
                  k.mld_kenmerk_default,
                  k.mld_kenmerk_wissen,
                  NVL (k.mld_kenmerk_volgnummer, 0) volgnummer,
                  lcl.x ('mld_srtkenmerk_dimensie',
                         s.mld_srtkenmerk_key,
                         mld_srtkenmerk_dimensie)
                     dimensie,
                  lcl.x ('mld_kenmerk_hint',
                         k.mld_kenmerk_key,
                         mld_kenmerk_hint)
                     hint,
                  (SELECT v.mld_kenmerkmelding_waarde
                     FROM mld_kenmerkmelding v, mld_kenmerk vk
                    WHERE vk.mld_kenmerk_key = k.mld_kenmerk_key
                      AND v.mld_kenmerk_key = vk.mld_kenmerk_key
                      AND v.mld_melding_key = m.mld_melding_key
                      AND v.mld_kenmerkmelding_verwijder IS NULL
                  ) mld_kenmerkmelding_waarde
              FROM mld_kenmerk k,
                  mld_srtkenmerk s,
                  mld_melding m,
                  mld_stdmelding stdm,
                  mld_discipline d
            WHERE ((k.mld_kenmerk_niveau = 'A' AND k.mld_stdmelding_key IS NULL)
                OR (k.mld_kenmerk_niveau = 'D' AND k.mld_stdmelding_key = stdm.mld_ins_discipline_key)
                OR (k.mld_kenmerk_niveau = 'S' AND k.mld_stdmelding_key = m.mld_stdmelding_key)
                OR (k.mld_kenmerk_niveau = 'T' AND k.mld_stdmelding_key = d.ins_srtdiscipline_key))
              AND m.mld_melding_key = p_key
              AND m.mld_stdmelding_key = stdm.mld_stdmelding_key
              AND stdm.mld_ins_discipline_key = d.ins_discipline_key
              AND k.mld_kenmerk_verwijder IS NULL
              AND s.mld_srtkenmerk_verwijder IS NULL
              AND k.mld_srtkenmerk_key = s.mld_srtkenmerk_key
         ORDER BY volgnummer;

      v_kenmerk_waarde       mld_kenmerkmelding.mld_kenmerkmelding_waarde%TYPE;
   BEGIN
      FOR rec1 IN c1
      LOOP
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.mld_kenmerkmelding_waarde,
                                 rec1.mld_kenmerk_default,
                                 rec1.mld_srtkenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.mld_srtkenmerk_nmin,
                                 rec1.mld_srtkenmerk_nmax,
                                 p_key,
                                 rec1.mld_kenmerk_key);

         createxmltagvalueattributes9('kenmerk',
                                      'kenmerkcode',     rec1.mld_kenmerk_code,
                                      'srtkenmerkcode',  rec1.mld_srtkenmerk_code,
                                      'naam',            rec1.mld_kenmerk_omschrijving,
                                      'type',            rec1.mld_srtkenmerk_kenmerktype,
                                      'volgnummer',      rec1.volgnummer,
                                      'key',             rec1.mld_kenmerk_key,
                                      'dimensie',        rec1.dimensie,
                                      'systeem',         rec1.mld_srtkenmerk_systeem,
                                      'wissen',          rec1.mld_kenmerk_wissen,
                                      rec1.fac_kenmerkdomein_key,
                                      v_kenmerk_waarde
                                     );
      END LOOP;
   END;

   -- *
   -- * MLD OPDRACHT stuff
   -- *
   PROCEDURE create_mld_opdr_note_node (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT mld_opdr_note_key,
                  mld_opdr_note_aanmaak,
                  prs_perslid_key,
                  mld_opdr_note_parent_key,
                  mld_opdr_note_flag,
                  mld_opdr_note_omschrijving,
                  mld_opdr_note_wijzigdatum,
                  fac_note_group_key
             FROM mld_opdr_note
            WHERE mld_opdr_key = p_key
         ORDER BY mld_opdr_note_key;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('notes');
         FOR rec1 IN c1
         LOOP
            createopentag ('note');
            createxmltagvalue ('key', rec1.mld_opdr_note_key);
            mydatetochar ('aanmaak', rec1.mld_opdr_note_aanmaak);
            createxmltagvalue ('parent_key', rec1.mld_opdr_note_parent_key);
            mydatetochar ('wijzigdatum', rec1.mld_opdr_note_wijzigdatum);
            createxmltagvalue ('flag', BITAND(rec1.mld_opdr_note_flag, 127));
            createxmltagvalue ('omschrijving',
                               rec1.mld_opdr_note_omschrijving);
            create_prs_perslid_node (rec1.prs_perslid_key, 'noteur', TRUE);
            create_fac_note_group_node(rec1.fac_note_group_key);
            createclosetag ('note');
         END LOOP;
         createclosetag ('notes');
      END IF;
   END;

   PROCEDURE create_mld_opdr_kenmerken (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT k.mld_kenmerk_key,
                  k.mld_kenmerk_code,
                  s.mld_srtkenmerk_code,
                  COALESCE (
                      lcl.x ('mld_kenmerk_omschrijving', k.mld_kenmerk_key, mld_kenmerk_omschrijving),
                      lcl.x ('mld_srtkenmerk_omschrijving', s.mld_srtkenmerk_key, mld_srtkenmerk_omschrijving)) mld_kenmerk_omschrijving,
                  s.mld_srtkenmerk_kenmerktype,
                  s.mld_srtkenmerk_systeem,
                  s.fac_kenmerkdomein_key,
                  s.mld_srtkenmerk_lengte,
                  s.mld_srtkenmerk_dec,
                  s.mld_srtkenmerk_nmin,
                  s.mld_srtkenmerk_nmax,
                  k.mld_kenmerk_default,
                  NVL (k.mld_kenmerk_volgnummer, 0) volgnummer,
                  lcl.x ('mld_srtkenmerk_dimensie',
                         s.mld_srtkenmerk_key,
                         mld_srtkenmerk_dimensie)
                     dimensie,
                  lcl.x ('mld_kenmerk_hint',
                         k.mld_kenmerk_key,
                         mld_kenmerk_hint)
                     hint,
                  mld_kenmerkopdr_waarde
             FROM mld_kenmerk k,
                  mld_srtkenmerk s,
                  mld_opdr o,
                  (SELECT v.mld_kenmerk_key, v.mld_kenmerkopdr_waarde
                     FROM mld_kenmerkopdr v
                    WHERE v.mld_opdr_key = p_key
                          AND v.mld_kenmerkopdr_verwijder IS NULL) v
            WHERE (o.mld_typeopdr_key = k.mld_typeopdr_key OR k.mld_typeopdr_key IS NULL)
              AND k.mld_kenmerk_niveau IN ('P', 'O')
              AND o.mld_opdr_key = p_key
              AND k.mld_kenmerk_verwijder IS NULL
              AND s.mld_srtkenmerk_verwijder IS NULL
              AND k.mld_srtkenmerk_key = s.mld_srtkenmerk_key
              AND v.mld_kenmerk_key(+) = k.mld_kenmerk_key
         ORDER BY k.mld_kenmerk_volgnummer;

      rec1                   c1%ROWTYPE;
      v_kenmerk_waarde       mld_kenmerkopdr.mld_kenmerkopdr_waarde%TYPE;
   BEGIN
      FOR rec1 IN c1
      LOOP
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.mld_kenmerkopdr_waarde,
                                 rec1.mld_kenmerk_default,
                                 rec1.mld_srtkenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.mld_srtkenmerk_nmin,
                                 rec1.mld_srtkenmerk_nmax,
                                 p_key,
                                 rec1.mld_kenmerk_key);

         createxmltagvalueattributes9('kenmerk',
                                      'kenmerkcode',     rec1.mld_kenmerk_code,
                                      'srtkenmerkcode',  rec1.mld_srtkenmerk_code,
                                      'naam',            rec1.mld_kenmerk_omschrijving,
                                      'type',            rec1.mld_srtkenmerk_kenmerktype,
                                      'volgnummer',      rec1.volgnummer,
                                      'key',             rec1.mld_kenmerk_key,
                                      'dimensie',        rec1.dimensie,
                                      'systeem',         rec1.mld_srtkenmerk_systeem,
                                      NULL,              NULL,
                                      rec1.fac_kenmerkdomein_key,
                                      v_kenmerk_waarde
                                     );
      END LOOP;
   END;

   -- * create_MLD_UITVOERENDE_node

   PROCEDURE create_mld_uitvoerende_node (p_uitvoerende_key   IN NUMBER,
                                          p_nodename          IN VARCHAR2)
   AS
      v_isbedrijf   NUMBER (10);
   BEGIN
      IF p_uitvoerende_key IS NOT NULL
      THEN
         SELECT COUNT (prs_bedrijf_key)
           INTO v_isbedrijf
           FROM prs_bedrijf
          WHERE prs_bedrijf_key = p_uitvoerende_key;

         IF v_isbedrijf = 0
         THEN
            createopentagattributes (p_nodename,
                                     'niveau',
                                     'P',
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL);
            create_prs_perslid_node (p_uitvoerende_key, 'persoon', FALSE);
         ELSE
            createopentagattributes (p_nodename,
                                     'niveau',
                                     'B',
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL,
                                     NULL);
            create_prs_bedrijf_node (p_uitvoerende_key, 'bedrijf', FALSE); -- niet concise zodat bedrijfadressen meekomen
         END IF;

         createclosetag (p_nodename);
      END IF;
   END;

   -- * create_MLD_TYPEOPDR_node

   PROCEDURE create_mld_typeopdr_node (p_key IN NUMBER)
   AS
      v_omschrijving      mld_typeopdr.mld_typeopdr_omschrijving%TYPE;
      v_decentraal        mld_typeopdr.mld_typeopdr_decentraal%TYPE;
      v_afmeldmarge       mld_typeopdr.mld_typeopdr_afmeldmarge%TYPE;
      v_kosten            mld_typeopdr.mld_typeopdr_kosten%TYPE;
      v_sluitmelding      mld_typeopdr.mld_typeopdr_sluitmelding%TYPE;
      v_uren              mld_typeopdr.mld_typeopdr_uren%TYPE;
      v_materiaal         mld_typeopdr.mld_typeopdr_materiaal%TYPE;
      v_totaal            mld_typeopdr.mld_typeopdr_totaal%TYPE;
      v_factuur           mld_typeopdr.mld_typeopdr_factuur%TYPE;
      v_zichtbaarfe       mld_typeopdr.mld_typeopdr_zichtbaarfe%TYPE;
      v_afmelden_extern   mld_typeopdr.mld_typeopdr_afmelden_extern%TYPE;
      v_isofferte         mld_typeopdr.mld_typeopdr_isofferte%TYPE;
      v_gvs               mld_typeopdr.mld_typeopdr_gvs%TYPE;
      v_bez               mld_typeopdr.mld_typeopdr_bez%TYPE;
      v_image             mld_typeopdr.mld_typeopdr_image%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('opdrachttype');

         SELECT lcl.x ('mld_typeopdr_omschrijving',
                       mld_typeopdr_key,
                       mld_typeopdr_omschrijving)
                   mld_typeopdr_omschrijving,
                mld_typeopdr_decentraal,
                mld_typeopdr_kosten,
                mld_typeopdr_sluitmelding,
                mld_typeopdr_uren,
                mld_typeopdr_materiaal,
                mld_typeopdr_totaal,
                mld_typeopdr_factuur,
                mld_typeopdr_afmeldmarge,
                mld_typeopdr_zichtbaarfe,
                mld_typeopdr_afmelden_extern,
                mld_typeopdr_isofferte,
                mld_typeopdr_gvs,
                mld_typeopdr_bez,
                mld_typeopdr_image
           INTO v_omschrijving,
                v_decentraal,
                v_kosten,
                v_sluitmelding,
                v_uren,
                v_materiaal,
                v_totaal,
                v_factuur,
                v_afmeldmarge,
                v_zichtbaarfe,
                v_afmelden_extern,
                v_isofferte,
                v_gvs,
                v_bez,
                v_image
           FROM mld_typeopdr
          WHERE mld_typeopdr_key = p_key;

         createxmltagvalue ('key', p_key);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('decentraal', v_decentraal);
         createxmltagvalue ('kosten', v_kosten);
         createxmltagvalue ('sluitmelding', v_sluitmelding);
         createxmltagvalue ('uren', v_uren);
         createxmltagvalue ('materiaal', v_materiaal);
         createxmltagvalue ('totaal', v_totaal);
         createxmltagvalue ('factuur', v_factuur);
         createxmltagvalue ('afmeldmarge', v_afmeldmarge);
         createxmltagvalue ('zichtbaarfe', v_zichtbaarfe);
         createxmltagvalue ('afmelden_extern', v_afmelden_extern);
         createxmltagvalue ('isofferte', v_isofferte);
         createxmltagvalue ('gvs', v_gvs);
         createxmltagvalue ('bez', v_bez);
         createxmltagvalue ('image', v_image);
         createclosetag ('opdrachttype');
      END IF;
   END;

   -- * create_RES_DISC_PARAMS_node

   PROCEDURE create_res_disc_params_node (p_discipline_key IN NUMBER)
   AS
      v_key           res_disc_params.res_disc_params_key%TYPE;
      v_preposttime   res_disc_params.res_disc_params_preposttime%TYPE;
      v_notify        res_disc_params.res_disc_params_notify%TYPE;
   BEGIN
      IF p_discipline_key IS NOT NULL
      THEN
         BEGIN
            SELECT res_disc_params_key,
                   res_disc_params_preposttime,
                   res_disc_params_notify
              INTO v_key, v_preposttime, v_notify
              FROM res_disc_params
             WHERE res_ins_discipline_key = p_discipline_key;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_key := NULL;
         END;

         IF v_key IS NOT NULL
         THEN
            createopentag ('res');
            createxmltagvalue ('key', v_key);
            createxmltagvalue ('preposttime', v_preposttime);
            createxmltagvalue ('notify', v_notify);
            createclosetag ('res');
         END IF;
      END IF;
   END;

   -- * create_CNT_DISC_PARAMS_node

   PROCEDURE create_cnt_disc_params_node (p_discipline_key IN NUMBER)
   AS
      v_key                cnt_disc_params.cnt_disc_params_key%TYPE;
      v_srtcontract_type   cnt_disc_params.cnt_srtcontract_type%TYPE;
      v_opmerking          cnt_disc_params.cnt_disc_params_opmerking%TYPE;
      v_verkoopcontr       cnt_disc_params.cnt_disc_params_verkoopcontr%TYPE;
      v_factuurschema      cnt_disc_params.cnt_disc_params_factuurschema%TYPE;
      v_factuurmarge       cnt_disc_params.cnt_disc_params_factuurmarge%TYPE;
      v_factuurappr        cnt_disc_params.cnt_disc_params_factuurappr%TYPE;
      v_factuurpct         cnt_disc_params.cnt_disc_params_factuurpct%TYPE;
      v_factuurgrens       cnt_disc_params.cnt_disc_params_factuurgrens%TYPE;
      v_fin                cnt_disc_params.cnt_disc_params_fin%TYPE;
   BEGIN
      IF p_discipline_key IS NOT NULL
      THEN
         BEGIN
            SELECT cnt_disc_params_key,
                   cnt_srtcontract_type,
                   cnt_disc_params_opmerking,
                   cnt_disc_params_verkoopcontr,
                   cnt_disc_params_factuurschema,
                   cnt_disc_params_factuurmarge,
                   cnt_disc_params_factuurappr,
                   cnt_disc_params_factuurpct,
                   cnt_disc_params_factuurgrens,
                   cnt_disc_params_fin
              INTO v_key,
                   v_srtcontract_type,
                   v_opmerking,
                   v_verkoopcontr,
                   v_factuurschema,
                   v_factuurmarge,
                   v_factuurappr,
                   v_factuurpct,
                   v_factuurgrens,
                   v_fin
              FROM cnt_disc_params
             WHERE cnt_ins_discipline_key = p_discipline_key;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_key := NULL;
         END;

         IF v_key IS NOT NULL
         THEN
            createopentag ('cnt');
            createxmltagvalue ('key', v_key);
            createxmltagvalue ('srtcontract_type', v_srtcontract_type);
            createxmltagvalue ('opmerking', v_opmerking);
            createxmltagvalue ('verkoopcontract', v_verkoopcontr);
            createxmltagvalue ('factuurschema', v_factuurschema);
            createxmltagvalue ('factuurmarge', v_factuurmarge);
            createxmltagvalue ('factuurappr', v_factuurappr);
            createxmltagvalue ('factuurpct', v_factuurpct);
            createxmltagvalue ('factuurgrens', v_factuurgrens);
            createxmltagvalue ('fin', v_fin);
            createclosetag ('cnt');
         END IF;
      END IF;
   END;

   -- * create_BES_DISC_PARAMS_node

   PROCEDURE create_bes_disc_params_node (p_discipline_key IN NUMBER)
   AS
      v_key             bes_disc_params.bes_disc_params_key%TYPE;
      v_bestellimiet    bes_disc_params.bes_disc_params_bestellimiet%TYPE;
      v_bestellimiet2   bes_disc_params.bes_disc_params_bestellimiet2%TYPE;
      v_bestellimiet3   bes_disc_params.bes_disc_params_bestellimiet3%TYPE;
      v_bestellimiet4   bes_disc_params.bes_disc_params_bestellimiet4%TYPE;
      v_bestellimiet5   bes_disc_params.bes_disc_params_bestellimiet5%TYPE;
      v_min_bedrag      bes_disc_params.bes_disc_params_min_bedrag%TYPE;
      v_auto_order      bes_disc_params.bes_disc_params_auto_order%TYPE;
      v_autoacceptrfo   bes_disc_params.bes_disc_params_autoacceptrfo%TYPE;
      v_leverdagen      bes_disc_params.bes_disc_params_leverdagen%TYPE;
      v_factuurpct      bes_disc_params.bes_disc_params_factuurpct%TYPE;
      v_factuurmarge    bes_disc_params.bes_disc_params_factuurmarge%TYPE;
      v_factuurappr     bes_disc_params.bes_disc_params_factuurappr%TYPE;
      v_logo_url        bes_disc_params.bes_disc_params_logo_url%TYPE;
      v_retour_url      bes_disc_params.bes_disc_params_retour_url%TYPE;
      v_levopm_url      bes_disc_params.bes_disc_params_levopm_url%TYPE;
   BEGIN
      IF p_discipline_key IS NOT NULL
      THEN
         BEGIN
            SELECT bes_disc_params_key,
                   bes_disc_params_bestellimiet,
                   bes_disc_params_bestellimiet2,
                   bes_disc_params_bestellimiet3,
                   bes_disc_params_bestellimiet4,
                   bes_disc_params_bestellimiet5,
                   bes_disc_params_min_bedrag,
                   bes_disc_params_auto_order,
                   bes_disc_params_autoacceptrfo,
                   bes_disc_params_leverdagen,
                   bes_disc_params_factuurpct,
                   bes_disc_params_factuurmarge,
                   bes_disc_params_factuurappr,
                   bes_disc_params_logo_url,
                   bes_disc_params_retour_url,
                   bes_disc_params_levopm_url
              INTO v_key,
                   v_bestellimiet,
                   v_bestellimiet2,
                   v_bestellimiet3,
                   v_bestellimiet4,
                   v_bestellimiet5,
                   v_min_bedrag,
                   v_auto_order,
                   v_autoacceptrfo,
                   v_leverdagen,
                   v_factuurpct,
                   v_factuurmarge,
                   v_factuurappr,
                   v_logo_url,
                   v_retour_url,
                   v_levopm_url
              FROM bes_disc_params
             WHERE bes_ins_discipline_key = p_discipline_key;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_key := NULL;
         END;

         IF v_key IS NOT NULL
         THEN
            createopentag ('bes');
            createxmltagvalue ('key', v_key);
            createxmltagvalue ('bestellimiet', v_bestellimiet);
            createxmltagvalue ('bestellimiet2', v_bestellimiet2);
            createxmltagvalue ('bestellimiet3', v_bestellimiet3);
            createxmltagvalue ('bestellimiet4', v_bestellimiet4);
            createxmltagvalue ('bestellimiet5', v_bestellimiet5);
            createxmltagvalue ('min_bedrag', v_min_bedrag);
            createxmltagvalue ('auto_order', v_auto_order);
            createxmltagvalue ('autoacceptrfo', v_autoacceptrfo);
            createxmltagvalue ('leverdagen', v_leverdagen);
            createxmltagvalue ('factuurpct', v_factuurpct);
            createxmltagvalue ('factuurmarge', v_factuurmarge);
            createxmltagvalue ('factuurappr', v_factuurappr);
            createxmltagvalue ('logo_url', v_logo_url);
            createxmltagvalue ('retour_url', v_retour_url);
            createxmltagvalue ('levopm_url', v_levopm_url);
            createclosetag ('bes');
         END IF;
      END IF;
   END;

   -- * create_INS_DISC_PARAMS_node

   PROCEDURE create_ins_disc_params_node (p_discipline_key IN NUMBER)
   AS
      v_key         ins_disc_params.ins_disc_params_key%TYPE;
      v_cadlayers   ins_disc_params.ins_disc_params_cadlayers%TYPE;
      v_type        ins_disc_params.ins_disc_params_type%TYPE;
   BEGIN
      IF p_discipline_key IS NOT NULL
      THEN
         BEGIN
            SELECT ins_disc_params_key,
                   ins_disc_params_cadlayers,
                   ins_disc_params_type
              INTO v_key, v_cadlayers, v_type
              FROM ins_disc_params
             WHERE ins_discipline_key = p_discipline_key;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_key := NULL;
         END;

         IF v_key IS NOT NULL
         THEN
            createopentag ('ins');
            createxmltagvalue ('key', v_key);
            createxmltagvalue ('cadlayers', v_cadlayers);
            createxmltagvalue ('type', v_type);
            createclosetag ('ins');
         END IF;
      END IF;
   END;

   -- * create_INS_SRTDISCIPLINE_node

   PROCEDURE create_ins_srtdiscipline_node (p_key IN NUMBER)
   AS
      v_module         ins_srtdiscipline.ins_srtdiscipline_module%TYPE;
      v_omschrijving   ins_srtdiscipline.ins_srtdiscipline_omschrijving%TYPE;
      v_prefix         ins_srtdiscipline.ins_srtdiscipline_prefix%TYPE;
      v_alg            ins_srtdiscipline.ins_srtdiscipline_alg%TYPE;
      v_ins            ins_srtdiscipline.ins_srtdiscipline_ins%TYPE;
      v_mld            ins_srtdiscipline.ins_srtdiscipline_mld%TYPE;
      v_bes            ins_srtdiscipline.ins_srtdiscipline_bes%TYPE;
      v_prs            ins_srtdiscipline.ins_srtdiscipline_prs%TYPE;
      v_res            ins_srtdiscipline.ins_srtdiscipline_res%TYPE;
      v_cnt            ins_srtdiscipline.ins_srtdiscipline_cnt%TYPE;
      v_kostenklant    ins_srtdiscipline.ins_srtdiscipline_kostenklant%TYPE;
      v_mldgroup       ins_srtdiscipline.ins_srtdiscipline_mldgroup%TYPE;
      v_image          ins_srtdiscipline.ins_srtdiscipline_image%TYPE;
      v_externnr       ins_srtdiscipline.ins_srtdiscipline_externnr%TYPE;
      v_externsyncdate ins_srtdiscipline.ins_srtdiscipline_extsyncdate%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('srtdiscipline');

         SELECT ins_srtdiscipline_module,
                lcl.x ('ins_srtdiscipline_omschrijving',
                       ins_srtdiscipline_key,
                       ins_srtdiscipline_omschrijving)
                   ins_srtdiscipline_omschrijving,
                ins_srtdiscipline_prefix,
                ins_srtdiscipline_alg,
                ins_srtdiscipline_ins,
                ins_srtdiscipline_mld,
                ins_srtdiscipline_bes,
                ins_srtdiscipline_prs,
                ins_srtdiscipline_res,
                ins_srtdiscipline_cnt,
                ins_srtdiscipline_kostenklant,
                ins_srtdiscipline_mldgroup,
                ins_srtdiscipline_image,
                ins_srtdiscipline_externnr,
                ins_srtdiscipline_extsyncdate
           INTO v_module,
                v_omschrijving,
                v_prefix,
                v_alg,
                v_ins,
                v_mld,
                v_bes,
                v_prs,
                v_res,
                v_cnt,
                v_kostenklant,
                v_mldgroup,
                v_image,
                v_externnr,
                v_externsyncdate
           FROM ins_srtdiscipline
          WHERE ins_srtdiscipline_key = p_key;

         createxmltagvalue ('key', p_key);
         createxmltagvalue ('module', v_module);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('prefix', v_prefix);
         createxmltagvalue ('alg', v_alg);
         createxmltagvalue ('ins', v_ins);
         createxmltagvalue ('mld', v_mld);
         createxmltagvalue ('bes', v_bes);
         createxmltagvalue ('prs', v_prs);
         createxmltagvalue ('res', v_res);
         createxmltagvalue ('cnt', v_cnt);
         createxmltagvalue ('kostenklant', v_kostenklant);
         createxmltagvalue ('mldgroup', v_mldgroup);
         createxmltagvalue ('image', v_image);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);
         createclosetag ('srtdiscipline');
      END IF;
   END;

   -- * create_MLD_ADRES_node
   -- Als fysieke locatiegegevens nodig zijn, moet concise FALSE zijn.

   PROCEDURE create_mld_adres_node (p_key        IN NUMBER,
                                    p_nodename   IN VARCHAR2,
                                    p_concise    IN BOOLEAN)
   AS
      v_naam                   mld_adres.mld_adres_naam%TYPE;
      v_bezoek_adres           mld_adres.mld_adres_bezoek_adres%TYPE;
      v_bezoek_postcode        mld_adres.mld_adres_bezoek_postcode%TYPE;
      v_bezoek_plaats          mld_adres.mld_adres_bezoek_plaats%TYPE;
      v_bezoek_land            mld_adres.mld_adres_bezoek_land%TYPE;
      v_post_adres             mld_adres.mld_adres_post_adres%TYPE;
      v_post_postcode          mld_adres.mld_adres_post_postcode%TYPE;
      v_post_plaats            mld_adres.mld_adres_post_plaats%TYPE;
      v_post_land              mld_adres.mld_adres_post_land%TYPE;
      v_gebouw_ruimte          mld_adres.mld_adres_gebouw_ruimte%TYPE;
      v_contactpersoon         mld_adres.mld_adres_contactpersoon%TYPE;
      v_contactpers_telefoon   mld_adres.mld_adres_contactpers_telefoon%TYPE;
      v_contactpers_email      mld_adres.mld_adres_contactpers_email%TYPE;
      v_contactpers_bureau     mld_adres.mld_adres_contactpers_bureau%TYPE;
      v_telefoon               mld_adres.mld_adres_telefoon%TYPE;
      v_email                  mld_adres.mld_adres_email%TYPE;
      v_factuuradres           mld_adres.mld_adres_factuuradres%TYPE;
      v_opdractadres           mld_adres.mld_adres_factuuradres%TYPE;
      v_afleveradres           mld_adres.mld_adres_factuuradres%TYPE;
      v_locatie_key            mld_adres.alg_locatie_key%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         IF p_concise
         THEN
            createconciseopentag (p_nodename);
         ELSE
            createopentag (p_nodename);
         END IF;

         SELECT mld_adres.mld_adres_naam,
                mld_adres.mld_adres_bezoek_adres,
                mld_adres.mld_adres_bezoek_postcode,
                mld_adres.mld_adres_bezoek_plaats,
                mld_adres.mld_adres_bezoek_land,
                mld_adres.mld_adres_post_adres,
                mld_adres.mld_adres_post_postcode,
                mld_adres.mld_adres_post_plaats,
                mld_adres.mld_adres_post_land,
                mld_adres.mld_adres_gebouw_ruimte,
                mld_adres.mld_adres_contactpersoon,
                mld_adres.mld_adres_contactpers_telefoon,
                mld_adres.mld_adres_contactpers_email,
                mld_adres.mld_adres_contactpers_bureau,
                mld_adres.mld_adres_telefoon,
                mld_adres.mld_adres_email,
                mld_adres.mld_adres_factuuradres,
                mld_adres.mld_adres_factuuradres,
                mld_adres.mld_adres_factuuradres,
                alg_locatie_key
           INTO v_naam,
                v_bezoek_adres,
                v_bezoek_postcode,
                v_bezoek_plaats,
                v_bezoek_land,
                v_post_adres,
                v_post_postcode,
                v_post_plaats,
                v_post_land,
                v_gebouw_ruimte,
                v_contactpersoon,
                v_contactpers_telefoon,
                v_contactpers_email,
                v_contactpers_bureau,
                v_telefoon,
                v_email,
                v_factuuradres,
                v_opdractadres,
                v_afleveradres,
                v_locatie_key
           FROM mld_adres
          WHERE mld_adres_key = p_key;

         createxmltagvalue ('key', p_key);
         createxmltagvalue ('naam', v_naam);
         createxmltagvalue ('bezoek_adres', v_bezoek_adres);
         createxmltagvalue ('bezoek_postcode', v_bezoek_postcode);
         createxmltagvalue ('bezoek_plaats', v_bezoek_plaats);
         createxmltagvalue ('bezoek_land', v_bezoek_land);
         createxmltagvalue ('post_adres', v_post_adres);
         createxmltagvalue ('post_postcode', v_post_postcode);
         createxmltagvalue ('post_plaats', v_post_plaats);
         createxmltagvalue ('post_land', v_post_land);
         createxmltagvalue ('gebouw_ruimte', v_gebouw_ruimte);
         createxmltagvalue ('contactpersoon', v_contactpersoon);
         createxmltagvalue ('contactpers_telefoon', v_contactpers_telefoon);
         createxmltagvalue ('contactpers_email', v_contactpers_email);
         createxmltagvalue ('contactpers_bureau', v_contactpers_bureau);
         createxmltagvalue ('telefoon', v_telefoon);
         createxmltagvalue ('email', v_email);
         createxmltagvalue ('factuuradres', v_factuuradres);
         createxmltagvalue ('opdrachtadres', v_opdractadres);
         createxmltagvalue ('afleveradres', v_afleveradres);
         createxmltagvalue ('locatie_key', v_locatie_key);

         IF NOT p_concise
         THEN
            create_alg_onroerendgoed_node (v_locatie_key,
                                           'plaats',
                                           v_locatie_key,
                                           FALSE,
                                           FALSE);
         END IF;

         createclosetag (p_nodename);
      END IF;
   END;

   -- * create_INS_DISCIPLINE_node

   PROCEDURE create_ins_discipline_node (p_key IN NUMBER, p_nodename IN VARCHAR2 DEFAULT 'discipline')
   AS
      v_module                  ins_tab_discipline.ins_discipline_module%TYPE;
      v_omschrijving            ins_tab_discipline.ins_discipline_omschrijving%TYPE;
      v_min_level               ins_tab_discipline.ins_discipline_min_level%TYPE;
      v_prs_kostensoort_key     ins_tab_discipline.prs_kostensoort_key%TYPE;
      v_ins_srtdiscipline_key   ins_tab_discipline.ins_srtdiscipline_key%TYPE;
      v_email                   ins_tab_discipline.ins_discipline_email%TYPE;
      v_code                    ins_tab_discipline.ins_discipline_code%TYPE;
      v_image                   ins_tab_discipline.ins_discipline_image%TYPE;
      v_externnr                ins_tab_discipline.ins_discipline_externnr%TYPE;
      v_externsyncdate          ins_tab_discipline.ins_discipline_externsyncdate%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag (p_nodename);

         SELECT ins_discipline_module,
                lcl.x ('ins_discipline_omschrijving',
                       ins_discipline_key,
                       ins_discipline_omschrijving)
                   ins_discipline_omschrijving,
                ins_discipline_min_level,
                prs_kostensoort_key,
                ins_srtdiscipline_key,
                ins_discipline_email,
                ins_discipline_code,
                ins_discipline_image,
                ins_discipline_externnr,
                ins_discipline_externsyncdate
           INTO v_module,
                v_omschrijving,
                v_min_level,
                v_prs_kostensoort_key,
                v_ins_srtdiscipline_key,
                v_email,
                v_code,
                v_image,
                v_externnr,
                v_externsyncdate
           FROM ins_tab_discipline
          WHERE ins_discipline_key = p_key;

         createxmltagvalue ('key', p_key);
         createxmltagvalue ('module', v_module);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('min_level', v_min_level);
         createxmltagvalue ('email', v_email);
         createxmltagvalue ('code', v_code);
         createxmltagvalue ('image', v_image);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);

         IF v_ins_srtdiscipline_key IS NOT NULL
         THEN
            create_ins_srtdiscipline_node (v_ins_srtdiscipline_key);
         END IF;

         create_prs_kostensoort_node (v_prs_kostensoort_key);
         create_bes_disc_params_node (p_key);
         create_res_disc_params_node (p_key);
         create_ins_disc_params_node (p_key);
         create_cnt_disc_params_node (p_key);
         createclosetag (p_nodename);
      END IF;
   END;

   -- * create_mld_disc_params_node
   PROCEDURE create_mld_disc_params_node (p_key IN NUMBER)
   AS
      v_reminderdays  mld_disc_params.mld_disc_params_noti_dagen%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         SELECT mld_disc_params_noti_dagen
           INTO v_reminderdays
           FROM mld_disc_params
          WHERE mld_ins_discipline_key = p_key;

         createopentag ('mld_disc_params');
         createxmltagvalue ('reminderdays', v_reminderdays);
         createclosetag ('mld_disc_params');
      END IF;
   END;

   -- * create_MLD_STDMELDING_node

   PROCEDURE create_mld_stdmelding_node (p_key IN NUMBER)
   AS
      v_omschrijving          mld_stdmelding.mld_stdmelding_omschrijving%TYPE;
      v_accepttijd_td         mld_stdmelding.mld_stdmelding_t_accepttijd.tijdsduur%TYPE;
      v_accepttijd_e          mld_stdmelding.mld_stdmelding_t_accepttijd.eenheid%TYPE;
      v_accepttijd1_td        mld_stdmelding.mld_stdmelding_t_accepttijd.tijdsduur%TYPE;
      v_accepttijd1_e         mld_stdmelding.mld_stdmelding_t_accepttijd.eenheid%TYPE;
      v_accepttijd2_td        mld_stdmelding.mld_stdmelding_t_accepttijd.tijdsduur%TYPE;
      v_accepttijd2_e         mld_stdmelding.mld_stdmelding_t_accepttijd.eenheid%TYPE;
      v_accepttijd4_td        mld_stdmelding.mld_stdmelding_t_accepttijd.tijdsduur%TYPE;
      v_accepttijd4_e         mld_stdmelding.mld_stdmelding_t_accepttijd.eenheid%TYPE;
      v_uitvoertijd_td        mld_stdmelding.mld_stdmelding_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd_e         mld_stdmelding.mld_stdmelding_t_uitvoertijd.eenheid%TYPE;
      v_uitvoertijd1_td       mld_stdmelding.mld_stdmelding_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd1_e        mld_stdmelding.mld_stdmelding_t_uitvoertijd.eenheid%TYPE;
      v_uitvoertijd2_td       mld_stdmelding.mld_stdmelding_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd2_e        mld_stdmelding.mld_stdmelding_t_uitvoertijd.eenheid%TYPE;
      v_uitvoertijd4_td       mld_stdmelding.mld_stdmelding_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd4_e        mld_stdmelding.mld_stdmelding_t_uitvoertijd.eenheid%TYPE;
      v_notfrontend           mld_stdmelding.mld_stdmelding_notfrontend%TYPE;
      v_notes                 mld_stdmelding.mld_stdmelding_notes%TYPE;
      v_prs_kostensoort_key   mld_stdmelding.prs_kostensoort_key%TYPE;
      v_verwijder             mld_stdmelding.mld_stdmelding_verwijder%TYPE;
      v_groep                 mld_stdmeldinggroep.mld_stdmeldinggroep_naam%TYPE;
      v_groepoms              mld_stdmeldinggroep.mld_stdmeldinggroep_oms%TYPE;
      v_discipline_key        mld_stdmelding.mld_ins_discipline_key%TYPE;
      v_slabewaken            mld_stdmelding.mld_stdmelding_slabewaken%TYPE;
      v_image                 mld_stdmelding.mld_stdmelding_image%TYPE;
      v_code                  mld_stdmelding.mld_stdmelding_code%TYPE;
      v_thirdparty            mld_stdmelding.mld_stdmelding_thirdparty%TYPE;
      v_externnr              mld_stdmelding.mld_stdmelding_externnr%TYPE;
      v_externsyncdate        mld_stdmelding.mld_stdmelding_externsyncdate%TYPE;
      v_malus                 mld_stdmelding.mld_stdmelding_malus%TYPE;
      v_malusbasis            mld_stdmelding.mld_stdmelding_malusbasis%TYPE;
      v_malusmax              mld_stdmelding.mld_stdmelding_malusmax%TYPE;
      v_autoorder             mld_stdmelding.mld_stdmelding_autoorder%TYPE;
      v_cad_thema_key         mld_stdmelding.cad_thema_key%TYPE;
      v_color                 mld_stdmelding.mld_stdmelding_color%TYPE;
      v_prs_dienst_key        mld_stdmelding.prs_dienst_key%TYPE;
      v_regime                mld_stdmelding.mld_stdmelding_regime%TYPE;
      v_typeopdr_key          mld_stdmelding.mld_typeopdr_key%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('stdmelding');

         SELECT lcl.x ('mld_stdmelding_omschrijving',
                       mld_stdmelding_key,
                       mld_stdmelding_omschrijving)
                   mld_stdmelding_omschrijving,
                stdm.mld_stdmelding_t_accepttijd.tijdsduur,
                stdm.mld_stdmelding_t_accepttijd.eenheid,
                stdm.mld_stdmelding_t_accept_pr1.tijdsduur,
                stdm.mld_stdmelding_t_accept_pr1.eenheid,
                stdm.mld_stdmelding_t_accept_pr2.tijdsduur,
                stdm.mld_stdmelding_t_accept_pr2.eenheid,
                stdm.mld_stdmelding_t_accept_pr4.tijdsduur,
                stdm.mld_stdmelding_t_accept_pr4.eenheid,
                stdm.mld_stdmelding_t_uitvoertijd.tijdsduur,
                stdm.mld_stdmelding_t_uitvoertijd.eenheid,
                stdm.mld_stdmelding_t_uitvtijd_pr1.tijdsduur,
                stdm.mld_stdmelding_t_uitvtijd_pr1.eenheid,
                stdm.mld_stdmelding_t_uitvtijd_pr2.tijdsduur,
                stdm.mld_stdmelding_t_uitvtijd_pr2.eenheid,
                stdm.mld_stdmelding_t_uitvtijd_pr4.tijdsduur,
                stdm.mld_stdmelding_t_uitvtijd_pr4.eenheid,
                mld_stdmelding_notfrontend,
                mld_stdmelding_notes,
                prs_kostensoort_key,
                mld_stdmelding_verwijder,
                lcl.x ('mld_stdmeldinggroep_naam',
                       smg.mld_stdmeldinggroep_key,
                       mld_stdmeldinggroep_naam)
                   mld_stdmelding_groep,
                lcl.x ('mld_stdmeldinggroep_oms',
                       smg.mld_stdmeldinggroep_key,
                       mld_stdmeldinggroep_oms)
                   mld_stdmelding_groep,
                mld_ins_discipline_key,
                mld_stdmelding_slabewaken,
                mld_stdmelding_image,
                mld_stdmelding_code,
                mld_stdmelding_thirdparty,
                mld_stdmelding_externnr,
                mld_stdmelding_externsyncdate,
                mld_stdmelding_malus,
                mld_stdmelding_malusbasis,
                mld_stdmelding_malusmax,
                mld_stdmelding_autoorder,
                cad_thema_key,
                mld_stdmelding_color,
                prs_dienst_key,
                mld_stdmelding_regime,
                mld_typeopdr_key
           INTO v_omschrijving,
                v_accepttijd_td,
                v_accepttijd_e,
                v_accepttijd1_td,
                v_accepttijd1_e,
                v_accepttijd2_td,
                v_accepttijd2_e,
                v_accepttijd4_td,
                v_accepttijd4_e,
                v_uitvoertijd_td,
                v_uitvoertijd_e,
                v_uitvoertijd1_td,
                v_uitvoertijd1_e,
                v_uitvoertijd2_td,
                v_uitvoertijd2_e,
                v_uitvoertijd4_td,
                v_uitvoertijd4_e,
                v_notfrontend,
                v_notes,
                v_prs_kostensoort_key,
                v_verwijder,
                v_groep,
                v_groepoms,
                v_discipline_key,
                v_slabewaken,
                v_image,
                v_code,
                v_thirdparty,
                v_externnr,
                v_externsyncdate,
                v_malus,
                v_malusbasis,
                v_malusmax,
                v_autoorder,
                v_cad_thema_key,
                v_color,
                v_prs_dienst_key,
                v_regime,
                v_typeopdr_key
           FROM mld_stdmelding stdm, mld_stdmeldinggroep smg
          WHERE stdm.mld_stdmeldinggroep_key = smg.mld_stdmeldinggroep_key(+)
            AND mld_stdmelding_key = p_key;

         createxmltagvalue ('key', p_key);
         createxmltagvalue ('omschrijving', v_omschrijving);
         create_ins_discipline_node (v_discipline_key);
         create_mld_disc_params_node (v_discipline_key);
         createxmltagvalue ('urgentie', mynumbertochar (v_accepttijd_td));  /* COMPATIBILITY ONLY */
         createxmltagvalueattributes ('accepttijd',
                                      'eenheid',
                                      v_accepttijd_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_accepttijd_td));
         createxmltagvalueattributes ('accepttijd_pr1',
                                      'eenheid',
                                      v_accepttijd1_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_accepttijd1_td));
         createxmltagvalueattributes ('accepttijd_pr2',
                                      'eenheid',
                                      v_accepttijd2_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_accepttijd2_td));
         createxmltagvalueattributes ('accepttijd_pr4',
                                      'eenheid',
                                      v_accepttijd4_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_accepttijd4_td));
         createxmltagvalueattributes ('uitvoertijd',
                                      'eenheid',
                                      v_uitvoertijd_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td));
         createxmltagvalueattributes ('uitvoertijd_pr1',
                                      'eenheid',
                                      v_uitvoertijd1_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd1_td));
         createxmltagvalueattributes ('uitvoertijd_pr2',
                                      'eenheid',
                                      v_uitvoertijd2_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd2_td));
         createxmltagvalueattributes ('uitvoertijd_pr4',
                                      'eenheid',
                                      v_uitvoertijd4_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd4_td));
         -- historisch zo en geen stdmeldinggroepnode
         createxmltagvalue ('groep', v_groep);
         createxmltagvalue ('groepomschrijving', v_groepoms);
         createxmltagvalue ('notfrontend', v_notfrontend);
         createxmltagvalue ('notes_deelnemers', v_notes);
         createxmltagvalue ('slabewaken', v_slabewaken);
         createxmltagvalue ('regime', v_regime);
         createxmltagvalue ('autoorder', v_autoorder);
         create_mld_typeopdr_node (v_typeopdr_key);
         createxmltagvalue ('image', v_image);
         createxmltagvalue ('color', v_color);
         createxmltagvalue ('code', v_code);
         createxmltagvalue ('cad_thema', v_cad_thema_key);
         createxmltagvalue ('thirdparty', v_thirdparty);
         createxmltagvalue ('externnr', v_externnr);
         create_prs_dienst_node(v_prs_dienst_key);
         mydatetochar ('externsyncdate', v_externsyncdate);
         create_prs_kostensoort_node (v_prs_kostensoort_key);
         createxmltagvalue ('malus', v_malus);
         createxmltagvalue ('malusbasis', 'v_malusbasis');
         createxmltagvalue ('malusmax', 'v_malusmax');
         createxmltagvalue ('verwijder', v_verwijder);
         createclosetag ('stdmelding');
      END IF;
   END;

   -- * create_MLD_MELDING_node

   PROCEDURE create_mld_melding_node (p_key            IN NUMBER,
                                      p_extra_key      IN NUMBER,
                                      p_withchildren   IN BOOLEAN,
                                      p_withrelated    IN NUMBER DEFAULT 0)
   AS
      v_meldbron_nr              mld_melding.mld_meldbron_nr%TYPE;
      v_datum                    mld_melding.mld_melding_datum%TYPE;
      v_onderwerp                mld_melding.mld_melding_onderwerp%TYPE;
      v_actiecode                mld_melding.mld_melding_actiecode%TYPE;
      v_publiek                  mld_melding.mld_melding_publiek%TYPE;
      v_omschrijving             mld_melding.mld_melding_omschrijving%TYPE;
      v_opmerking                mld_melding.mld_melding_opmerking%TYPE;
      v_geprint                  mld_melding.mld_melding_geprint%TYPE;
      v_prs_afdeling_key         mld_melding.prs_afdeling_key%TYPE;
      v_kosten_klant             mld_melding.mld_kosten_klant%TYPE;
      v_prs_kostenplaats_key     mld_melding.prs_kostenplaats_key%TYPE;
      v_status_key               mld_melding.mld_melding_status%TYPE;
      v_status                   mld_statuses.mld_statuses_omschrijving%TYPE;
      v_spoed                    mld_melding.mld_melding_spoed%TYPE;
      v_discipline_key           mld_stdmelding.mld_ins_discipline_key%TYPE;
      v_meldbron_key             mld_melding.mld_meldbron_key%TYPE;
      v_oorzaak_key              mld_melding.mld_oorzaak_key%TYPE;
      v_alg_onroerendgoed_keys   mld_melding.mld_alg_onroerendgoed_keys%TYPE;
      v_alg_locatie_key          mld_melding.mld_alg_locatie_key%TYPE;
      v_mld_stdmelding_key       mld_melding.mld_stdmelding_key%TYPE;
      v_prs_perslid_key          mld_melding.prs_perslid_key%TYPE;
      v_prs_perslid_key_voor     mld_melding.prs_perslid_key_voor%TYPE;
      v_adres_key                mld_melding.mld_adres_key%TYPE;
      v_uitvoertijd_td           mld_melding.mld_melding_t_uitvoertijd.tijdsduur%TYPE;
      v_uitvoertijd_e            mld_melding.mld_melding_t_uitvoertijd.eenheid%TYPE;
      v_uitvoertijdactual_td     NUMBER(10,5); -- Kan groter zijn dan mld_melding.mld_melding_t_uitvoertijd%TYPE (nu NUMBER(8,5));
      v_uitvoertijdactual_e      mld_melding.mld_melding_t_uitvoertijd.eenheid%TYPE;
      v_respijt_td               mld_melding.mld_melding_t_respijt.tijdsduur%TYPE;
      v_respijt_e                mld_melding.mld_melding_t_respijt.eenheid%TYPE;
      v_indult                   mld_melding.mld_melding_indult%TYPE;
      v_afgerond                 mld_melding.mld_melding_afgerond%TYPE;
      v_accepttijd_td            mld_melding.mld_melding_t_accepttijd.tijdsduur%TYPE;
      v_accepttijd_e             mld_melding.mld_melding_t_accepttijd.eenheid%TYPE;
      v_datum_gepland            mld_melding.mld_melding_einddatum%TYPE;
      v_actiedatum               mld_melding.mld_melding_actiedatum%TYPE;
      v_ordernr                  mld_melding.mld_melding_ordernr%TYPE;
      v_activiteit_key           mld_melding.fac_activiteit_key%TYPE;
      v_behandelaar_key          mld_melding.mld_melding_behandelaar_key%TYPE;
      v_mld_ins_disc_key         mld_melding.mld_ins_discipline_key%TYPE;
      v_behandelaar2_key         mld_melding.mld_melding_behandelaar2_key%TYPE;
      v_parentkey                mld_melding.mld_melding_parentkey%TYPE;
      v_mldgroupkey              mld_melding.mld_melding_mldgroup_key%TYPE;
      v_start_key                mld_melding.mld_melding_start_key%TYPE;
      v_workflowstep_key         mld_melding.mld_workflowstep_key%TYPE;
      v_externnr                 mld_melding.mld_melding_externnr%TYPE;
      v_externsyncdate           mld_melding.mld_melding_externsyncdate%TYPE;
      v_kto_verstuurd            mld_melding.mld_melding_kto_verstuurd%TYPE;
      v_flag                     mld_melding.mld_melding_flag%TYPE;
      v_rsv_ruimte_key           mld_melding.res_rsv_ruimte_key%TYPE;
      v_kto_type                 mld_melding.mld_melding_kto_type%TYPE;
      v_kto_key                  mld_melding.mld_melding_kto_key%TYPE;
      v_naam_ext                 mld_melding.mld_melding_naam_ext%TYPE;
      v_email_ext                mld_melding.mld_melding_email_ext%TYPE;
      v_tel_ext                  mld_melding.mld_melding_tel_ext%TYPE;
      v_dwgx                     mld_melding.mld_melding_dwgx%TYPE;
      v_dwgy                     mld_melding.mld_melding_dwgy%TYPE;
      v_dwgz                     mld_melding.mld_melding_dwgz%TYPE;
      v_x                        mld_melding.mld_melding_x%TYPE;
      v_y                        mld_melding.mld_melding_y%TYPE;
      v_z                        mld_melding.mld_melding_z%TYPE;
      l_isrootmelding            NUMBER(1);

      CURSOR c1
      IS
         SELECT ins_deel_key,
                ins_deelsrtcontrole_key
           FROM mld_melding_object
          WHERE mld_melding_key = p_key;
      CURSOR c2
      IS
         SELECT mld_opdr_key
           FROM mld_opdr
          WHERE mld_melding_key = p_key;
      CURSOR c3
      IS
         SELECT bes_bestelling_key
           FROM bes_bestelling
          WHERE mld_melding_key = p_key;
      -- De andere workflowstappen in deze workflow (if any)
      CURSOR c4
      IS
         SELECT ms.mld_melding_key,
                ms.mld_melding_start_key,
                ms.mld_workflowstep_key
           FROM mld_melding ms, mld_melding m1
          WHERE ms.mld_workflowstep_key IS NOT NULL
            AND ms.mld_melding_start_key = m1.mld_melding_start_key
            AND ms.mld_melding_key <> p_key
            AND m1.mld_melding_key = p_key;
      CURSOR c5
      IS
         SELECT res_reservering_key
           FROM res_reservering
          WHERE mld_melding_key = p_key;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('melding');

         SELECT NVL (mld_meldbron_nr, ''),
                NVL (mld_melding_datum, ''),
                NVL (mld_melding_onderwerp, ''),
                mld_melding_actiecode,
                mld_melding_publiek,
                NVL (mld_melding_omschrijving, ''),
                NVL (mld_melding_opmerking, ''),
                NVL (mld_melding_geprint, 0),
                prs_afdeling_key,
                NVL (mld_kosten_klant, 0),
                m.prs_kostenplaats_key,
                NVL (mld_melding_status, ''),
                NVL (s.mld_statuses_omschrijving, ''),
                NVL (mld_melding_spoed, 0),
                mld_meldbron_key,
                mld_oorzaak_key,
                mld_alg_onroerendgoed_keys,
                mld_alg_locatie_key,
                m.mld_stdmelding_key,
                stdm.mld_ins_discipline_key,
                prs_perslid_key,
                prs_perslid_key_voor,
                mld_adres_key,
                m.mld_melding_t_uitvoertijd.tijdsduur,
                m.mld_melding_t_uitvoertijd.eenheid,
                m.mld_melding_t_respijt.tijdsduur,
                m.mld_melding_t_respijt.eenheid,
                mld_melding_indult,
                mld_melding_afgerond,
                m.mld_melding_t_accepttijd.tijdsduur,
                m.mld_melding_t_accepttijd.eenheid,
                mld_melding_einddatum,
                mld_melding_actiedatum,
                NVL (mld_melding_ordernr, ''),
                mld_melding_behandelaar_key,
                m.mld_ins_discipline_key,
                mld_melding_behandelaar2_key,
                mld_melding_parentkey,
                mld_melding_mldgroup_key,
                mld_melding_start_key,
                mld_workflowstep_key,
                mld_melding_externnr,
                mld_melding_externsyncdate,
                mld_melding_kto_verstuurd,
                mld_melding_flag,
                res_rsv_ruimte_key,
                mld_melding_kto_type,
                mld_melding_kto_key,
                mld_melding_naam_ext,
                mld_melding_email_ext,
                mld_melding_tel_ext,
                mld_melding_dwgx,
                mld_melding_dwgy,
                mld_melding_dwgz,
                mld_melding_x,
                mld_melding_y,
                mld_melding_z
           INTO v_meldbron_nr,
                v_datum,
                v_onderwerp,
                v_actiecode,
                v_publiek,
                v_omschrijving,
                v_opmerking,
                v_geprint,
                v_prs_afdeling_key,
                v_kosten_klant,
                v_prs_kostenplaats_key,
                v_status_key,
                v_status,
                v_spoed,
                v_meldbron_key,
                v_oorzaak_key,
                v_alg_onroerendgoed_keys,
                v_alg_locatie_key,
                v_mld_stdmelding_key,
                v_discipline_key,
                v_prs_perslid_key,
                v_prs_perslid_key_voor,
                v_adres_key,
                v_uitvoertijd_td,
                v_uitvoertijd_e,
                v_respijt_td,
                v_respijt_e,
                v_indult,
                v_afgerond,
                v_accepttijd_td,
                v_accepttijd_e,
                v_datum_gepland,
                v_actiedatum,
                v_ordernr,
                v_behandelaar_key,
                v_mld_ins_disc_key,
                v_behandelaar2_key,
                v_parentkey,
                v_mldgroupkey,
                v_start_key,
                v_workflowstep_key,
                v_externnr,
                v_externsyncdate,
                v_kto_verstuurd,
                v_flag,
                v_rsv_ruimte_key,
                v_kto_type,
                v_kto_key,
                v_naam_ext,
                v_email_ext,
                v_tel_ext,
                v_dwgx,
                v_dwgy,
                v_dwgz,
                v_x,
                v_y,
                v_z
           FROM mld_melding m, mld_statuses s, mld_stdmelding stdm
          WHERE     m.mld_melding_status = s.mld_statuses_key
                AND m.mld_stdmelding_key = stdm.mld_stdmelding_key
                AND mld_melding_key = p_key;

         createxmltagvalue ('key', p_key);
         createxmltagvalue ('extra_key', p_extra_key);
         createxmltagvalue ('meldbron_nr', v_meldbron_nr);
         mydatetochar ('gemeld', v_datum);         -- deprecated, see tracking
         mydatetochar ('begindatum', v_datum);
         createxmltagvalue ('onderwerp', v_onderwerp);
         createxmltagvalue ('actiecode', v_actiecode);
         createxmltagvalue ('publiek', v_publiek);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('behandelwijze', 2);  -- was fac.getsetting('mld_note_mode') deprecated but used
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('geprint', v_geprint);
         create_prs_afdeling_node (v_prs_afdeling_key, 'afdeling');
         createxmltagvalue ('kosten_klant', v_kosten_klant);
         createxmltagvalue ('ordernr', v_ordernr);
         createxmltagvalue ('status_key', v_status_key);
         createxmltagvalue ('status', v_status);
         createxmltagvalue ('spoed', v_spoed);
         createxmltagvalueattributes ('uitvoertijd',
                                      'eenheid',
                                      v_uitvoertijd_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijd_td));
         createxmltagvalueattributes ('respijt',
                                      'eenheid',
                                      v_respijt_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_respijt_td));
         createxmltagvalue ('indult', v_indult);
         createxmltagvalue ('afgerond', v_afgerond);
         v_uitvoertijdactual_td := mld.getactualuitvoer(p_key).tijdsduur;
         v_uitvoertijdactual_e := mld.getactualuitvoer(p_key).eenheid;
         createxmltagvalueattributes ('uitvoertijdactual',
                                      'eenheid',
                                      v_uitvoertijdactual_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_uitvoertijdactual_td));
         createxmltagvalueattributes ('accepttijd',
                                      'eenheid',
                                      v_accepttijd_e,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL, NULL,
                                      NULL,
                                      mynumbertochar (v_accepttijd_td));
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);
         createxmltagvalue ('flag', v_flag);
         mydatetochar ('datum_gepland', v_datum_gepland);        -- deprecated
         mydatetochar ('einddatum', v_datum_gepland);              -- voorkeur
         mydatetochar ('actiedatum', v_actiedatum);
         create_mld_kenmerken (p_key);
         create_prs_kostenplaats_node (v_prs_kostenplaats_key, FALSE);
         create_ins_discipline_node (v_discipline_key); -- deprecated, maar tbv compatibility; gebruik stdmelding/discipline
         create_mld_stdmelding_node (v_mld_stdmelding_key);
         create_mld_adres_node (v_adres_key, 'aflever_adres', FALSE);

         IF (v_alg_onroerendgoed_keys IS NOT NULL
             AND v_alg_onroerendgoed_keys <> 0)
         THEN
            create_alg_onroerendgoed_node (v_alg_onroerendgoed_keys,
                                           'plaats',
                                           NULL,
                                           FALSE,
                                           FALSE);
         ELSE
            create_alg_onroerendgoed_node (v_alg_locatie_key,
                                           'plaats',
                                           v_alg_locatie_key,
                                           FALSE,
                                           FALSE);
         END IF;
         createxmltagvalue ('dwgx', v_dwgx);
         createxmltagvalue ('dwgy', v_dwgy);
         createxmltagvalue ('dwgz', v_dwgz);
         createxmltagvalue ('x', v_x);
         createxmltagvalue ('y', v_y);
         createxmltagvalue ('z', v_z);

         FOR rec1 IN c1
         LOOP
            create_ins_deel_node (rec1.ins_deel_key, rec1.ins_deelsrtcontrole_key, FALSE);
         END LOOP;

         create_prs_perslid_node (v_prs_perslid_key, 'melder', TRUE);
         create_prs_perslid_node (v_prs_perslid_key_voor, 'voor', FALSE);
         create_prs_perslid_node (v_behandelaar_key, 'behandelaar', TRUE);
         create_ins_discipline_node (v_mld_ins_disc_key, 'behandelgroep');
         create_prs_perslid_node (v_behandelaar2_key, 'actieve_behandelaar', TRUE);
         create_fac_activiteit_node (v_activiteit_key);
         mydatetochar ('kto_verstuurd', v_kto_verstuurd);
         create_mld_melding_note_node (p_key);
         create_fac_tracking_node ('melding', p_key);

         IF p_withchildren AND p_withrelated < 5 -- p_withchildren is misleidende naam: meldingen waarvan wij de parent zijn worden nooit opgenomen
         THEN
            FOR rec2 IN c2
            LOOP
               create_mld_opdr_node (rec2.mld_opdr_key, NULL, TRUE);
            END LOOP;
            FOR rec3 IN c3
            LOOP
               create_bes_bestelling_node (rec3.bes_bestelling_key, FALSE);  -- concise bevat geen artikelen
            END LOOP;
            FOR rec5 IN c5
            LOOP
               create_res_reservering_node (rec5.res_reservering_key, NULL);
            END LOOP;
            FOR grp IN (SELECT mld_melding_key
                          FROM mld_melding
                         WHERE mld_melding_mldgroup_key = p_key)
            LOOP
                create_mld_melding_node (grp.mld_melding_key, p_extra_key, FALSE, p_withrelated + 1);
            END LOOP;
            -- Voor een workflow kunnen de andere stappen ook interessant zijn
            -- Dit doen we niet voor adhoc vervolgmeldingen (daarom v_workflowstep_key is not null)
            -- We nemen alle *andere* stappen hier op, afhankelijk van het moment kunnen daar ook
            -- toekomstige meldingen bij zijn, het zijn alle meldingen met dezelfde root (incl. de root zelf).
            -- Omdat dit tot veel balast kan leiden wat jammer is als je deze info toch niet
            -- in je bonnen oid gebruikt, gebruiken we een setting die default uit staat(!).
            -- We doen dit alleen indien p_withchildren anders worden we oneindig groot.
            IF v_workflowstep_key IS NOT NULL AND fac.getsetting('mld_workflowstep_in_xml')= '1'
            THEN
               createopentag ('workflowsteps');
               FOR rec4 IN c4
               LOOP
                   IF rec4.mld_melding_start_key = rec4.mld_melding_key
                   THEN
                       l_isrootmelding := 1;
                   ELSE
                       l_isrootmelding := 0;
                   END IF;
                   createopentagattributes ('workflowstep',
                                            'stepkey',
                                            rec4.mld_workflowstep_key,
                                            'root',
                                            l_isrootmelding,
                                            NULL,
                                            NULL,
                                            NULL,
                                            NULL);
                   create_mld_melding_node (rec4.mld_melding_key, p_extra_key, FALSE, p_withrelated + 1);  -- is die p_extra_key hier nog van belang??
                   createclosetag ('workflowstep');
               END LOOP;
               createclosetag ('workflowsteps');
            END IF;
         END IF;

         IF  p_withrelated < 5
         THEN
            create_mld_melding_node (v_parentkey, p_extra_key, p_withchildren, p_withrelated + 1); --Zou zomaar NULL kunnen zijn, geeft niks.
            create_mld_melding_node (v_mldgroupkey, p_extra_key, p_withchildren, p_withrelated + 1); --Zou zomaar NULL kunnen zijn, geeft niks.
         END IF;

         IF v_rsv_ruimte_key IS NOT NULL
         THEN
            create_res_rsv_ruimte_node (v_rsv_ruimte_key, TRUE);
         END IF;

         -- Deze melding kan betrekking hebben op een (andere) BROC
         -- Dan zal het wenselijk zijn daarvan hier ook info op te nemen
         -- Om oneindigheid te voorkomen doen we dat een maximaal aantal keer voor meldingen
         IF v_kto_key IS NOT NULL AND p_withrelated < 5
         THEN
           createopentag ('referentie');
           -- Weet niet wat je hier mee zou willen, maar het kost ook niks en biedt helderheid
           createxmltagvalue ('referencelevel', p_withrelated+1);
           CASE v_kto_type
             WHEN 'B'
             THEN
                create_bes_bestelling_node (v_kto_key, TRUE);
             WHEN 'R'
             THEN
                create_res_rsv_ruimte_node (v_kto_key, TRUE);
             WHEN 'O'
             THEN
                create_mld_opdr_node (v_kto_key, NULL, TRUE);
             WHEN 'C'
             THEN
                create_cnt_contract_node (v_kto_key, TRUE);
             WHEN 'M'
             THEN
                create_mld_melding_node (v_kto_key, p_extra_key, FALSE, p_withrelated + 1);
             WHEN 'X'
             THEN
                create_bes_bestelopdr_node (v_kto_key, TRUE);
             WHEN 'F'
             THEN
                create_fin_factuur_node (v_kto_key, TRUE);
             ELSE
                NULL;
            END CASE;
            createclosetag ('referentie');
         END IF;
         createxmltagvalue ('naam_ext', v_naam_ext);
         createxmltagvalue ('email_ext', v_email_ext);
         createxmltagvalue ('tel_ext', v_tel_ext);
         createclosetag ('melding');
      END IF;
   END;

   PROCEDURE create_mld_opdr_mater_node (p_key IN NUMBER)
   AS
      v_aantal       mld_opdr_materiaal.mld_opdr_materiaal_aantal%TYPE;
      v_code         fac_usrdata.fac_usrdata_code%TYPE;
      v_groep        mld_opdr_materiaal.mld_opdr_materiaal_groep%TYPE;
      v_id           mld_opdr_materiaal.mld_opdr_materiaal_id%TYPE;
      v_extra1       mld_opdr_materiaal.mld_opdr_materiaal_extra1%TYPE;
      v_extra2       mld_opdr_materiaal.mld_opdr_materiaal_extra2%TYPE;
      v_extra3       mld_opdr_materiaal.mld_opdr_materiaal_extra3%TYPE;
      v_extra4       mld_opdr_materiaal.mld_opdr_materiaal_extra4%TYPE;
      v_omschr       mld_opdr_materiaal.mld_opdr_materiaal_omschr%TYPE;
      v_stuksprijs   mld_opdr_materiaal.mld_opdr_materiaal_prijs%TYPE;
      v_volgnr       mld_opdr_materiaal.mld_opdr_materiaal_key%TYPE;
      v_verwijder    fac_usrdata.fac_usrdata_verwijder%TYPE;
      v_eenheid      mld_opdr_materiaal.mld_opdr_materiaal_eenheid%TYPE;
      v_eenheidcode  mld_opdr_materiaal.mld_opdr_materiaal_eenheidcode%TYPE;
      v_info         mld_opdr_materiaal.mld_opdr_materiaal_info%TYPE;
      v_btwcode      fin_btwtabelwaarde.fin_btwtabelwaarde_code%TYPE;
      v_btwperc      fin_btwtabelwaarde.fin_btwtabelwaarde_perc%TYPE;
      v_btwverlegd   fin_btwtabelwaarde.fin_btwtabelwaarde_verlegd%TYPE;
      v_externnr     mld_opdr_materiaal.mld_opdr_materiaal_externnr%TYPE;
      v_externsyncdate mld_opdr_materiaal.mld_opdr_materiaal_extsyncdate%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('materialen');

         SELECT ma.mld_opdr_materiaal_aantal,
                ma.mld_opdr_materiaal_prijs,
                COALESCE(d.fac_usrdata_code, ma.mld_opdr_materiaal_code),
                COALESCE(d.fac_usrdata_omschr, ma.mld_opdr_materiaal_omschr),
                COALESCE(d.fac_usrdata_volgnr, ma.mld_opdr_materiaal_key),
                d.fac_usrdata_verwijder,
                mld_opdr_materiaal_eenheid,
                mld_opdr_materiaal_eenheidcode,
                mld_opdr_materiaal_info,
                fin_btwtabelwaarde_code,
                COALESCE(fin_btwtabelwaarde_perc, 0),
                fin_btwtabelwaarde_verlegd,
                mld_opdr_materiaal_groep,
                mld_opdr_materiaal_id,
                mld_opdr_materiaal_extra1,
                mld_opdr_materiaal_extra2,
                mld_opdr_materiaal_extra3,
                mld_opdr_materiaal_extra4,
                mld_opdr_materiaal_externnr,
                mld_opdr_materiaal_extsyncdate
           INTO v_aantal,
                v_stuksprijs,
                v_code,
                v_omschr,
                v_volgnr,
                v_verwijder,
                v_eenheid,
                v_eenheidcode,
                v_info,
                v_btwcode,
                v_btwperc,
                v_btwverlegd,
                v_groep,
                v_id,
                v_extra1,
                v_extra2,
                v_extra3,
                v_extra4,
                v_externnr,
                v_externsyncdate
           FROM mld_opdr_materiaal ma, fac_usrdata d, fin_btwtabelwaarde b
          WHERE d.fac_usrdata_key (+) = ma.fac_usrdata_key
            AND b.fin_btwtabelwaarde_key (+) = ma.fin_btwtabelwaarde_key
                AND ma.mld_opdr_materiaal_key = p_key;

         createxmltagvalue ('code', v_code);
         createxmltagvalue ('volgnr', v_volgnr);
         createxmltagvalue ('omschrijving', v_omschr);
         createxmltagvalue ('groep', v_groep);
         createxmltagvalue ('id', v_id);
         createxmltagvalue ('extra1', v_extra1);
         createxmltagvalue ('extra2', v_extra2);
         createxmltagvalue ('extra3', v_extra3);
         createxmltagvalue ('extra4', v_extra4);
         createxmltagvalue ('info', v_info);
         createxmltagvalue ('aantal', v_aantal);
         createxmltagvalue ('eenheid', v_eenheid);
         createxmltagvalue ('eenheidcode', v_eenheidcode);
         createxmltagvalue ('stuksprijs', v_stuksprijs);
         createxmltagvalue ('totaalprijs', v_aantal * v_stuksprijs);
         createxmltagvalue ('btwbedrag', mynumbertochar (v_aantal * v_stuksprijs * v_btwperc/100 ));
         createxmltagvalue ('btwcode', v_btwcode);
         createxmltagvalue ('btwpercentage', mynumbertochar (v_btwperc));
         createxmltagvalue ('btwverlegd', mynumbertochar (v_btwverlegd));
         mydatetochar ('verwijder', v_verwijder);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);
         createclosetag ('materialen');
      END IF;
   END;

   -- * create_MLD_OPDR_node
   -- select xml.create_MLD_OPDR_node(7120) FROM DUAL

   PROCEDURE create_mld_opdr_node (p_key IN NUMBER, p_extra_key IN NUMBER, p_concise IN BOOLEAN, p_bgtmode IN BOOLEAN DEFAULT FALSE)
   AS
      v_mld_melding_key           mld_opdr.mld_melding_key%TYPE;
      v_mld_uitvoerende_keys      mld_opdr.mld_uitvoerende_keys%TYPE;
      v_typeopdr_key              mld_opdr.mld_typeopdr_key%TYPE;
      v_statusopdr_key            mld_opdr.mld_statusopdr_key%TYPE;
      v_statusopdr                mld_statusopdr.mld_statusopdr_omschrijving%TYPE;
      v_actiecode                 mld_opdr.mld_opdr_actiecode%TYPE;
      v_mld_standaardopdr_key     mld_opdr.mld_standaardopdr_key%TYPE;
      v_omschrijving              mld_opdr.mld_opdr_omschrijving%TYPE;
      v_datumbegin                mld_opdr.mld_opdr_datumbegin%TYPE;
      v_einddatum                 mld_opdr.mld_opdr_einddatum%TYPE;
      v_plandatum                 mld_opdr.mld_opdr_plandatum%TYPE;
      v_plandatum2                mld_opdr.mld_opdr_plandatum2%TYPE;
      v_dagen                     NUMBER;
      v_werkzaamheden             mld_opdr.mld_opdr_werkzaamheden%TYPE;
      v_uren                      mld_opdr.mld_opdr_uren%TYPE;
      v_materiaal                 mld_opdr.mld_opdr_materiaal%TYPE;
      v_kosten                    mld_opdr.mld_opdr_kosten%TYPE;
      v_contactpersoon            mld_opdr.mld_opdr_contactpersoon%TYPE;
      v_geprint                   mld_opdr.mld_opdr_geprint%TYPE;
      v_teverzenden               mld_opdr.mld_opdr_teverzenden%TYPE;
      v_bedrijfopdr_volgnr        mld_opdr.mld_opdr_bedrijfopdr_volgnr%TYPE;
      v_uurloon                   mld_opdr.mld_opdr_uurloon%TYPE;
      v_cnt_contract_key          mld_opdr.cnt_contract_key%TYPE;
      v_cnt_contract_dienst_key   mld_opdr.cnt_contract_dienst_key%TYPE;
      v_prs_perslid_key           mld_opdr.prs_perslid_key%TYPE;
      v_prs_contactpersoon_key    mld_opdr.prs_contactpersoon_key%TYPE;
      v_prs_kostenplaats_key      mld_opdr.prs_kostenplaats_key%TYPE;
      v_prs_kostensoort_key       mld_opdr.prs_kostensoort_key%TYPE;
      v_ordernr                   mld_opdr.mld_opdr_ordernr%TYPE;
      v_mld_opdr_opmerking_fiat   mld_opdr.mld_opdr_opmerking_fiat%TYPE;
      v_datumgereed               DATE;
      v_discipline_key            mld_opdr.mld_opdr_discipline_key%TYPE;
      v_activiteit_key            mld_opdr.fac_activiteit_key%TYPE;
      v_opmerking                 mld_opdr.mld_opdr_opmerking%TYPE;
      v_flag                      mld_opdr.mld_opdr_flag%TYPE;
      v_approved                  mld_opdr.mld_opdr_approved%TYPE;
      v_uren_refiat               mld_opdr.mld_opdr_uren_refiat%TYPE;
      v_uurloon_refiat            mld_opdr.mld_opdr_uurloon_refiat%TYPE;
      v_materiaal_refiat          mld_opdr.mld_opdr_materiaal_refiat%TYPE;
      v_kosten_refiat             mld_opdr.mld_opdr_kosten_refiat%TYPE;
      v_statusopdr_key_refiat     mld_opdr.mld_statusopdr_key_refiat%TYPE;
      v_approved_refiat           mld_opdr.mld_opdr_approved_refiat%TYPE;
      v_opdr_id                   mld_opdr.mld_opdr_id%TYPE;
      v_opdr_parent_key           mld_opdr.mld_opdr_parent_key%TYPE;
      v_mld_opdr_externnr         mld_opdr.mld_opdr_externnr%TYPE;
      v_mld_opdr_externsyncdate   mld_opdr.mld_opdr_externsyncdate%TYPE;

      CURSOR c1
      IS
         SELECT ma.mld_opdr_materiaal_key
           FROM mld_opdr_materiaal ma
          WHERE ma.mld_opdr_key = p_key;

      CURSOR c2
      IS
        SELECT fin_factuur_key
          FROM fin_factuur
         WHERE mld_opdr_key = p_key;

      CURSOR c3
      IS
         SELECT ba.bez_afspraak_key
           FROM bez_afspraak ba
          WHERE ba.mld_opdr_key = p_key;

   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('opdracht');

         SELECT mld_melding_key,
                mld_uitvoerende_keys,
                mld_typeopdr_key,
                o.mld_statusopdr_key,
                o.mld_opdr_actiecode,
                s.mld_statusopdr_omschrijving,
                mld_standaardopdr_key,
                mld_opdr_omschrijving,
                mld_opdr_datumbegin,
                fac.count_Work_Days (mld_opdr_datumbegin, mld_opdr_einddatum)
                   mld_opdr_dagen,
                mld_opdr_einddatum,
                mld_opdr_plandatum,
                mld_opdr_plandatum2,
                mld_opdr_discipline_key,
                mld_opdr_werkzaamheden,
                mld_opdr_uren,
                mld_opdr_materiaal,
                mld_opdr_kosten,
                mld_opdr_contactpersoon,
                mld_opdr_geprint,
                mld_opdr_teverzenden,
                mld_opdr_bedrijfopdr_volgnr,
                mld_opdr_uurloon,
                cnt_contract_key,
                cnt_contract_dienst_key,
                prs_perslid_key,
                prs_contactpersoon_key,
                prs_kostenplaats_key,
                prs_kostensoort_key,
                mld_opdr_ordernr,
                mld_opdr_opmerking_fiat,
                fac_activiteit_key,
                mld_opdr_opmerking,
                mld_opdr_flag,
                mld_opdr_approved,
                mld_opdr_uren_refiat,
                mld_opdr_uurloon_refiat,
                mld_opdr_materiaal_refiat,
                mld_opdr_kosten_refiat,
                mld_statusopdr_key_refiat,
                mld_opdr_approved_refiat,
                mld_opdr_id,
                mld_opdr_parent_key,
                mld_opdr_externnr,
                mld_opdr_externsyncdate
           INTO v_mld_melding_key,
                v_mld_uitvoerende_keys,
                v_typeopdr_key,
                v_statusopdr_key,
                v_actiecode,
                v_statusopdr,
                v_mld_standaardopdr_key,
                v_omschrijving,
                v_datumbegin,
                v_dagen,
                v_einddatum,
                v_plandatum,
                v_plandatum2,
                v_discipline_key,
                v_werkzaamheden,
                v_uren,
                v_materiaal,
                v_kosten,
                v_contactpersoon,
                v_geprint,
                v_teverzenden,
                v_bedrijfopdr_volgnr,
                v_uurloon,
                v_cnt_contract_key,
                v_cnt_contract_dienst_key,
                v_prs_perslid_key,
                v_prs_contactpersoon_key,
                v_prs_kostenplaats_key,
                v_prs_kostensoort_key,
                v_ordernr,
                v_mld_opdr_opmerking_fiat,
                v_activiteit_key,
                v_opmerking,
                v_flag,
                v_approved,
                v_uren_refiat,
                v_uurloon_refiat,
                v_materiaal_refiat,
                v_kosten_refiat,
                v_statusopdr_key_refiat,
                v_approved_refiat,
                v_opdr_id,
                v_opdr_parent_key,
                v_mld_opdr_externnr,
                v_mld_opdr_externsyncdate
           FROM mld_opdr o, mld_statusopdr s
          WHERE o.mld_statusopdr_key = s.mld_statusopdr_key
                AND mld_opdr_key = p_key;

         createxmltagvalue ('key', p_key);
         createxmltagvalue ('extra_key', p_extra_key);
         createxmltagvalue ('melding_key', v_mld_melding_key);
         createxmltagvalue ('uitvoerende_keys', v_mld_uitvoerende_keys);
         createxmltagvalue ('statusopdr_key', v_statusopdr_key);
         createxmltagvalue ('actiecode', v_actiecode);
         createxmltagvalue ('status', v_statusopdr);
         createxmltagvalue ('standaardopdr_key', v_mld_standaardopdr_key);
         createxmltagvalue ('omschrijving', v_omschrijving);
         mydatetochar ('datumbegin', v_datumbegin);
         createxmltagvalue ('dagen', v_dagen);
         mydatetochar ('einddatum', v_einddatum);
         mydatetochar ('datumgereed', v_einddatum);
         mydatetochar ('plandatum', v_plandatum);
         mydatetochar ('plandatum2', v_plandatum2);
         create_ins_discipline_node (v_discipline_key);
         createxmltagvalue ('werkzaamheden', v_werkzaamheden);
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('uren', mynumbertochar (v_uren));
         createxmltagvalue ('materiaal', mynumbertochar (v_materiaal));
         createxmltagvalue ('kosten', mynumbertochar (v_kosten));
         createxmltagvalue ('geprint', v_geprint);
         createxmltagvalue ('teverzenden', v_teverzenden);
         createxmltagvalue ('bedrijfopdr_volgnr', v_bedrijfopdr_volgnr);
         createxmltagvalue ('uurloon', mynumbertochar (v_uurloon));
         createxmltagvalue ('opmerking_fiat', v_mld_opdr_opmerking_fiat);
         createxmltagvalue ('flag', v_flag);
         createxmltagvalue ('approved', v_approved);
         createxmltagvalue ('uren_refiat', mynumbertochar (v_uren_refiat));
         createxmltagvalue ('uurloon_refiat', mynumbertochar (v_uurloon_refiat));
         createxmltagvalue ('materiaal_refiat', mynumbertochar (v_materiaal_refiat));
         createxmltagvalue ('kosten_refiat', mynumbertochar (v_kosten_refiat));
         createxmltagvalue ('statusopdr_key_refiat', v_statusopdr_key_refiat);
         createxmltagvalue ('approved_refiat', v_approved_refiat);
         createxmltagvalue ('externnr', v_mld_opdr_externnr);
         mydatetochar ('externsyncdate', v_mld_opdr_externsyncdate);
         create_mld_opdr_kenmerken (p_key);
         create_prs_kostenplaats_node (v_prs_kostenplaats_key, FALSE);
         create_prs_kostensoort_node (v_prs_kostensoort_key);
         createxmltagvalue ('ordernr', v_ordernr);
         create_mld_typeopdr_node (v_typeopdr_key);

         IF v_opdr_parent_key IS NOT NULL THEN
            createopentag ('offerte');
            create_mld_opdr_node (v_opdr_parent_key, p_extra_key, TRUE, FALSE);
            createclosetag ('offerte');
         END IF;

         IF p_bgtmode THEN
            FOR rec2 IN c2
            LOOP
               create_fin_factuur_node (rec2.fin_factuur_key, TRUE, TRUE);
            END LOOP;
         ELSE
            create_prs_dienst_node (v_cnt_contract_dienst_key);
            create_prs_perslid_node (v_prs_perslid_key,
                                     'backoffice_contact',
                                     FALSE);
         END IF;

         create_mld_uitvoerende_node (v_mld_uitvoerende_keys, 'uitvoerende');
         create_cnt_contract_node (v_cnt_contract_key, TRUE);
         create_prs_contactpersoon_node (v_prs_contactpersoon_key, FALSE);
         create_factuuradres_node (p_key);
         createxmltagvalue ('opdr_id', v_opdr_id);

         FOR rec1 IN c1
         LOOP
            create_mld_opdr_mater_node (rec1.mld_opdr_materiaal_key);
         END LOOP;

         FOR rec3 IN c3
         LOOP
            create_bez_afspraak_node (rec3.bez_afspraak_key, NULL, TRUE);
         END LOOP;

         IF NOT p_concise
         THEN
            create_mld_melding_node (v_mld_melding_key, p_extra_key, FALSE);
         END IF;

         create_fac_activiteit_node (v_activiteit_key);
         create_mld_opdr_note_node (p_key);
         create_fac_tracking_node ('opdracht', p_key);
         createclosetag ('opdracht');
      END IF;
   END;

   -----------------------------------------------------
   -----------------------------------------------------
   --                           PRJ module related nodes
   -----------------------------------------------------
   -----------------------------------------------------

   PROCEDURE create_prj_ruimteafd_node (p_ruimte_key IN NUMBER)
   AS
      CURSOR c1
      IS
         SELECT prj_ruimteafdeling_key,
                prj_ruimteafdeling_bezetting,
                prs_afdeling_key
           FROM prj_ruimteafdeling ra
          WHERE ra.prj_ruimteafdeling_verwijder IS NULL
                AND ra.prj_ruimteafdeling_key = p_ruimte_key;
   BEGIN
      IF p_ruimte_key IS NOT NULL
      THEN
         FOR rec1 IN c1
         LOOP
            createopentag ('prjruimteafdeling');
            createxmltagvalue ('key', rec1.prj_ruimteafdeling_key);
            createxmltagvalue ('bezetting',
                               rec1.prj_ruimteafdeling_bezetting);
            create_prs_afdeling_node (rec1.prs_afdeling_key,
                                      'bezetter_afdeling');
            createclosetag ('prjruimteafdeling');
         END LOOP;
      END IF;
   END;

   PROCEDURE create_prj_perslidwp_node (p_werkplek_key IN NUMBER)
   AS
      CURSOR c1
      IS
         SELECT prj_perslidwerkplek_key,
                prj_perslidwerkplek_bezetting,
                prs_perslid_key,
                wpopp
           FROM prj_perslidwerkplek pwp, prj_v_werkplek_oppervlakte pwo
          WHERE     pwp.prj_perslidwerkplek_verwijder IS NULL
                AND pwp.prj_werkplek_key = pwo.prj_werkplek_key
                AND pwp.prj_werkplek_key = p_werkplek_key;
   BEGIN
      IF p_werkplek_key IS NOT NULL
      THEN
         FOR rec1 IN c1
         LOOP
            createopentag ('prjperslidwerkplek');
            createxmltagvalue ('key', rec1.prj_perslidwerkplek_key);
            createxmltagvalue ('bezetting',
                               rec1.prj_perslidwerkplek_bezetting);
            createxmltagvalue ('wpopp', rec1.wpopp);
            create_prs_perslid_node (rec1.prs_perslid_key, 'bezetter', FALSE);
            createclosetag ('prjperslidwerkplek');
         END LOOP;
      END IF;
   END;

   PROCEDURE create_prj_deel_node (p_deel_key IN NUMBER)
   AS
      v_ins_deel_key   prj_deel.ins_deel_key%TYPE;
      v_srtdeel_key    prj_deel.ins_srtdeel_key%TYPE;
      v_ruimte_key     prj_deel.prj_ruimte_key%TYPE;
      v_werkplek_key   prj_deel.prj_werkplek_key%TYPE;
      v_omschrijving   prj_deel.prj_deel_omschrijving%TYPE;
      v_aanmaak        prj_deel.prj_deel_aanmaak%TYPE;
      v_verwijder      prj_deel.prj_deel_verwijder%TYPE;
      v_dwgx           prj_deel.prj_deel_dwgx%TYPE;
      v_dwgy           prj_deel.prj_deel_dwgy%TYPE;
      v_dwgz           prj_deel.prj_deel_dwgz%TYPE;
      v_dwgrotatie     prj_deel.prj_deel_dwgrotatie%TYPE;
      v_dwgschaal      prj_deel.prj_deel_dwgschaal%TYPE;
   BEGIN
      IF p_deel_key IS NOT NULL
      THEN
         SELECT ins_deel_key,
                ins_srtdeel_key,
                prj_ruimte_key,
                prj_werkplek_key,
                prj_deel_omschrijving,
                prj_deel_aanmaak,
                prj_deel_verwijder,
                prj_deel_dwgx,
                prj_deel_dwgy,
                prj_deel_dwgz,
                prj_deel_dwgrotatie,
                prj_deel_dwgschaal
           INTO v_ins_deel_key,
                v_srtdeel_key,
                v_ruimte_key,
                v_werkplek_key,
                v_omschrijving,
                v_aanmaak,
                v_verwijder,
                v_dwgx,
                v_dwgy,
                v_dwgz,
                v_dwgrotatie,
                v_dwgschaal
           FROM prj_deel pd
          WHERE pd.prj_deel_key = p_deel_key;

         createopentag ('prjdeel');
         createxmltagvalue ('key', p_deel_key);
         createxmltagvalue ('omschrijving', v_omschrijving);
         create_ins_deel_node (v_ins_deel_key, null, TRUE);
         -- stdeel zit in deel, maar als het een projectnieuw deel is niet.
         create_ins_srtdeel_node (v_srtdeel_key, TRUE);
         mydatetochar ('aanmaak', v_aanmaak);
         mydatetochar ('verwijder', v_verwijder);
         -- Te overwegen is om deze NIET mee te nemen:
         createxmltagvalue ('dwgx', v_dwgx);
         createxmltagvalue ('dwgy', v_dwgy);
         createxmltagvalue ('dwgz', v_dwgz);
         createxmltagvalue ('dwgrotatie', v_dwgrotatie);
         createxmltagvalue ('dwgschaal', v_dwgschaal);
         createclosetag ('prjdeel');
      END IF;
   END;

   PROCEDURE create_prj_werkplek_node (p_werkplek_key IN NUMBER)
   AS
      CURSOR c1
      IS
         SELECT prj_deel_key
           FROM prj_deel pd
          WHERE pd.prj_werkplek_key = p_werkplek_key;

      v_volgnr         prj_werkplek.prj_werkplek_volgnr%TYPE;
      v_omschrijving   prj_werkplek.prj_werkplek_omschrijving%TYPE;
      v_vastopp        prj_werkplek.prj_werkplek_vastopp%TYPE;
      v_opp            prj_werkplek.prj_werkplek_opp%TYPE;
      v_aanmaak        prj_werkplek.prj_werkplek_aanmaak%TYPE;
      v_verwijder      prj_werkplek.prj_werkplek_verwijder%TYPE;
      v_dwgx           prj_werkplek.prj_werkplek_dwgx%TYPE;
      v_dwgy           prj_werkplek.prj_werkplek_dwgy%TYPE;
      v_dwgz           prj_werkplek.prj_werkplek_dwgz%TYPE;
      v_dwgrotatie     prj_werkplek.prj_werkplek_dwgrotatie%TYPE;
      v_dwgschaal      prj_werkplek.prj_werkplek_dwgschaal%TYPE;
   BEGIN
      IF p_werkplek_key IS NOT NULL
      THEN
         SELECT prj_werkplek_volgnr,
                prj_werkplek_omschrijving,
                prj_werkplek_vastopp,
                prj_werkplek_opp,
                prj_werkplek_aanmaak,
                prj_werkplek_verwijder,
                prj_werkplek_dwgx,
                prj_werkplek_dwgy,
                prj_werkplek_dwgz,
                prj_werkplek_dwgrotatie,
                prj_werkplek_dwgschaal
           INTO v_volgnr,
                v_omschrijving,
                v_vastopp,
                v_opp,
                v_aanmaak,
                v_verwijder,
                v_dwgx,
                v_dwgy,
                v_dwgz,
                v_dwgrotatie,
                v_dwgschaal
           FROM prj_werkplek wp
          WHERE wp.prj_werkplek_key = p_werkplek_key;

         createopentag ('prjwerkplek');
         createxmltagvalue ('key', p_werkplek_key);
         createxmltagvalue ('volgnr', v_volgnr);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('vastopp', v_vastopp);
         createxmltagvalue ('opp', v_opp);
         mydatetochar ('aanmaak', v_aanmaak);
         mydatetochar ('verwijder', v_verwijder);
         createxmltagvalue ('dwgx', v_dwgx);
         createxmltagvalue ('dwgy', v_dwgy);
         createxmltagvalue ('dwgz', v_dwgz);
         createxmltagvalue ('dwgrotatie', v_dwgrotatie);
         createxmltagvalue ('dwgschaal', v_dwgschaal);
         create_prj_perslidwp_node (p_werkplek_key);

         FOR rec1 IN c1
         LOOP
            create_prj_deel_node (rec1.prj_deel_key);
         END LOOP;

         createclosetag ('prjwerkplek');
      END IF;
   END;

   PROCEDURE create_prj_ruimte_node (p_ruimte_key IN NUMBER)
   AS
      CURSOR c1
      IS
         SELECT prj_werkplek_key
           FROM prj_werkplek pw
          WHERE pw.prj_ruimte_key = p_ruimte_key;

      CURSOR c2
      IS
         SELECT prj_deel_key
           FROM prj_deel pd
          WHERE pd.prj_ruimte_key = p_ruimte_key;

      v_nr               prj_ruimte.prj_ruimte_nr%TYPE;
      v_omschrijving     prj_ruimte.prj_ruimte_omschrijving%TYPE;
      v_bruto_vloeropp   prj_ruimte.prj_ruimte_bruto_vloeropp%TYPE;
      v_omtrek           prj_ruimte.prj_ruimte_nr%TYPE;
      v_inhoud           prj_ruimte.prj_ruimte_inhoud%TYPE;
      v_opmerking        prj_ruimte.prj_ruimte_opmerking%TYPE;
      v_srtruimte_key    prj_ruimte.alg_srtruimte_key%TYPE;
      v_alg_ruimte_key   prj_ruimte.alg_ruimte_key%TYPE;
   BEGIN
      IF p_ruimte_key IS NOT NULL
      THEN
         SELECT prj_ruimte_nr,
                prj_ruimte_omschrijving,
                prj_ruimte_bruto_vloeropp,
                prj_ruimte_omtrek,
                prj_ruimte_inhoud,
                prj_ruimte_opmerking,
                alg_srtruimte_key,
                alg_ruimte_key
           INTO v_nr,
                v_omschrijving,
                v_bruto_vloeropp,
                v_omtrek,
                v_inhoud,
                v_opmerking,
                v_srtruimte_key,
                v_alg_ruimte_key
           FROM prj_ruimte
          WHERE prj_ruimte_verwijder IS NULL
                AND prj_ruimte_key = p_ruimte_key;

         createopentag ('prjruimte');
         createxmltagvalue ('key', p_ruimte_key);
         createxmltagvalue ('nr', v_nr);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('bruto_vloeropp', v_bruto_vloeropp);
         createxmltagvalue ('omtrek', v_omtrek);
         createxmltagvalue ('inhoud', v_inhoud);
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('algruimtekey', v_alg_ruimte_key);
         -- * Herkomst gegevens (teveel van het goede?)
         create_alg_ruimte_node (v_alg_ruimte_key);
         --  *create_ALG_SRTRUIMTE_node(v_srtruimte_key);
         create_prj_ruimteafd_node (p_ruimte_key);

         FOR rec1 IN c1
         LOOP
            create_prj_werkplek_node (rec1.prj_werkplek_key);
         END LOOP;

         FOR rec2 IN c2
         LOOP
            create_prj_deel_node (rec2.prj_deel_key);
         END LOOP;

         createclosetag ('prjruimte');
      END IF;
   END;

   PROCEDURE create_prj_verdieping_node (p_scenario_key     IN NUMBER,
                                         p_verdieping_key   IN NUMBER,
                                         p_ruimte_key       IN NUMBER)
   AS
      v_omschrijving   alg_verdieping.alg_verdieping_omschrijving%TYPE;
      v_volgnr         alg_verdieping.alg_verdieping_volgnr%TYPE;
      v_tekening       cad_tekening.cad_tekening_filenaam%TYPE;
      v_in_bewerking   alg_verdieping.alg_verdieping_in_bewerking%TYPE;
      v_code           alg_verdieping.alg_verdieping_code%TYPE;

      CURSOR c1
      IS
           SELECT r.prj_ruimte_key
             FROM prj_ruimte r
            WHERE     alg_verdieping_key = p_verdieping_key
                  AND r.prj_ruimte_verwijder IS NULL
                  AND r.prj_scenario_key = p_scenario_key
         ORDER BY r.prj_ruimte_nr;

      CURSOR c2
      IS
         SELECT *
           FROM prj_scenario_note
          WHERE alg_verdieping_key = p_verdieping_key
                AND prj_scenario_key = p_scenario_key;
   BEGIN
      IF p_verdieping_key IS NOT NULL
      THEN
         SELECT alg_verdieping_omschrijving,
                alg_verdieping_volgnr,
                t.cad_tekening_filenaam,
                alg_verdieping_in_bewerking,
                alg_verdieping_code
           INTO v_omschrijving,
                v_volgnr,
                v_tekening,
                v_in_bewerking,
                v_code
           FROM alg_verdieping v, cad_tekening t
          WHERE t.alg_verdieping_key(+) = v.alg_verdieping_key
                AND v.alg_verdieping_key = p_verdieping_key;

         -- Eerst alle ALG-info (oude situatie)
         createopentag ('prjverdieping');
         create_alg_onroerendgoed_node (p_verdieping_key,
                                        'plaats',
                                        NULL,
                                        FALSE,
                                        TRUE);

         --createxmltagvalue ('key', p_verdieping_key);
         --createxmltagvalue ('omschrijving', v_omschrijving);
         --createxmltagvalue ('volgnr', v_volgnr);
         --createxmltagvalue ('tekening', v_tekening);
         --createxmltagvalue ('in_bewerking', v_in_bewerking);
         --createxmltagvalue ('code', v_code);
         --create_alg_kenmerken (p_verdieping_key, 'V');
         IF p_ruimte_key IS NOT NULL
         THEN
            create_prj_ruimte_node (p_ruimte_key);
         ELSE
            -- Maak dan een node aan voor ELKE prjruimte in deze verdieping
            FOR rec1 IN c1
            LOOP
               create_prj_ruimte_node (rec1.prj_ruimte_key);
            END LOOP;
         END IF;

         FOR rec2 IN c2
         LOOP
            createopentag ('note');
            createxmltagvalue ('key',          rec2.prj_scenario_note_key);
            createxmltagvalue ('nr',           rec2.prj_scenario_note_nr);
            createxmltagvalue ('omschrijving', rec2.prj_scenario_note_omschrijving);
            createxmltagvalue ('dwgx',         rec2.prj_scenario_note_dwgx);
            createxmltagvalue ('dwgy',         rec2.prj_scenario_note_dwgy);
            create_prs_perslid_node (rec2.prs_perslid_key, 'noteur', TRUE);
            createxmltagvalue ('aanmaak',      rec2.prj_scenario_note_aanmaak);
            createclosetag ('note');
         END LOOP;

         createclosetag ('prjverdieping');
      END IF;
   END;

   PROCEDURE create_prj_scenario_node (p_key IN NUMBER)
   AS
      v_omschrijving      prj_scenario.prj_scenario_omschrijving%TYPE;
      v_opmerking         prj_scenario.prj_scenario_opmerking%TYPE;
      v_aanmaak           prj_scenario.prj_scenario_aanmaak%TYPE;
      v_mld_melding_key   prj_scenario.mld_melding_key%TYPE;
      v_prs_perslid_key   prj_scenario.prs_perslid_key%TYPE;
      v_status            prj_scenario.prj_scenario_status%TYPE;
      v_datum             prj_scenario.prj_scenario_datum%TYPE;
      v_raming            prj_scenario.prj_scenario_raming%TYPE;

      CURSOR c1
      IS
           SELECT DISTINCT pr.alg_verdieping_key, alg_verdieping_volgnr
             FROM prj_ruimte pr, alg_verdieping av
            WHERE pr.alg_verdieping_key = av.alg_verdieping_key
                  AND prj_scenario_key = p_key
         ORDER BY alg_verdieping_volgnr;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('scenario');

         SELECT prj_scenario_omschrijving,
                prj_scenario_opmerking,
                prj_scenario_aanmaak,
                mld_melding_key,
                prs_perslid_key,
                prj_scenario_status,
                prj_scenario_datum,
                prj_scenario_raming
           INTO v_omschrijving,
                v_opmerking,
                v_aanmaak,
                v_mld_melding_key,
                v_prs_perslid_key,
                v_status,
                v_datum,
                v_raming
           FROM prj_scenario
          WHERE prj_scenario_key = p_key;

         createxmltagvalue ('key', p_key);
         mydatetochar ('aanmaak', v_aanmaak);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('status', v_status);
         createxmltagvalue ('datum', v_datum);
         createxmltagvalue ('raming', v_raming);
         create_mld_melding_node (v_mld_melding_key, NULL, FALSE);
         create_prs_perslid_node (v_prs_perslid_key, 'behandelaar', TRUE);

         FOR rec1 IN c1
         LOOP
            create_prj_verdieping_node (p_key, rec1.alg_verdieping_key, NULL);
         END LOOP;

         createclosetag ('scenario');
      END IF;
   END;

   -- *
   -- * BES bestelling_item kenmerken
   -- * Alleen ingevulde waarden en van type label (AAIT#22925)

   PROCEDURE create_bes_item_kenmerken (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT k.bes_kenmerk_key,
                  k.bes_kenmerk_code,
                  s.bes_srtkenmerk_code,
                  COALESCE (
                      lcl.x ('bes_kenmerk_omschrijving', k.bes_kenmerk_key, bes_kenmerk_omschrijving),
                      lcl.x ('bes_srtkenmerk_omschrijving', s.bes_srtkenmerk_key, bes_srtkenmerk_omschrijving)) bes_kenmerk_omschrijving,
                  s.bes_srtkenmerk_kenmerktype,
                  s.fac_kenmerkdomein_key,
                  s.bes_srtkenmerk_lengte,
                  s.bes_srtkenmerk_dec,
                  s.bes_srtkenmerk_nmin,
                  s.bes_srtkenmerk_nmax,
                  k.bes_kenmerk_default,
                  NVL (k.bes_kenmerk_volgnummer, 0) volgnummer,
                  lcl.x ('bes_srtkenmerk_dimensie',
                         s.bes_srtkenmerk_key,
                         bes_srtkenmerk_dimensie)
                     dimensie,
                  lcl.x ('bes_kenmerk_hint',
                         k.bes_kenmerk_key,
                         bes_kenmerk_hint)
                     hint,
                  bki.bes_kenmerkbesteli_waarde
             FROM bes_kenmerk k,
                  bes_srtkenmerk s,
                  bes_kenmerkbesteli bki,
                  bes_bestelling_item d,
                  bes_srtgroep sg,
                  bes_srtdeel sd
            WHERE ( (k.bes_srtinstallatie_key IS NULL
                     AND k.bes_kenmerk_niveau = 'D')
                   OR (sg.ins_discipline_key = k.bes_srtinstallatie_key
                       AND k.bes_kenmerk_niveau = 'D')
                   OR (d.bes_srtdeel_key = k.bes_srtinstallatie_key
                       AND k.bes_kenmerk_niveau = 'S')
                   OR (sg.bes_srtgroep_key = k.bes_srtinstallatie_key
                       AND k.bes_kenmerk_niveau = 'G'))
                  AND d.bes_bestelling_item_key = p_key
                  AND k.bes_kenmerk_verwijder IS NULL
                  AND s.bes_srtkenmerk_verwijder IS NULL
                  AND d.bes_srtdeel_key = sd.bes_srtdeel_key
                  AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
                  AND k.bes_srtkenmerk_key = s.bes_srtkenmerk_key
                  AND k.bes_kenmerk_key = bki.bes_kenmerk_key(+)
                  AND bki.bes_bestelling_item_key(+) = p_key
                  AND k.bes_srtkenmerk_key = s.bes_srtkenmerk_key
                  AND (bki.bes_kenmerkbesteli_waarde IS NOT NULL OR s.bes_srtkenmerk_kenmerktype IN ('L', 'l', 'M'))
                  AND k.bes_kenmerk_type = 'I'
         ORDER BY k.bes_kenmerk_volgnummer;

      v_kenmerk_waarde       bes_kenmerkbesteli.bes_kenmerkbesteli_waarde%TYPE;
   BEGIN
      FOR rec1 IN c1
      LOOP
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.bes_kenmerkbesteli_waarde,
                                 rec1.bes_kenmerk_default,
                                 rec1.bes_srtkenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.bes_srtkenmerk_nmin,
                                 rec1.bes_srtkenmerk_nmax,
                                 p_key,
                                 rec1.bes_kenmerk_key);

         createxmltagvalueattributes9('kenmerk',
                                      'kenmerkcode',    rec1.bes_kenmerk_code,
                                      'srtkenmerkcode', rec1.bes_srtkenmerk_code,
                                      'naam',           rec1.bes_kenmerk_omschrijving,
                                      'type',           rec1.bes_srtkenmerk_kenmerktype,
                                      'volgnummer',     rec1.volgnummer,
                                      'key',            rec1.bes_kenmerk_key,
                                      'dimensie',       rec1.dimensie,
                                      NULL, NULL,
                                      NULL, NULL,
                                      rec1.fac_kenmerkdomein_key,
                                      v_kenmerk_waarde
                                     );
      END LOOP;
   END;

   -- *
   -- * BES bestelling kenmerken
   -- * Alleen ingevulde waarden en van type label (AAIT#22925) en Multifile (FSN#31711)

   PROCEDURE create_bes_bestell_kenmerken (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT k.bes_kenmerk_key,
                  COALESCE (
                      lcl.x ('bes_kenmerk_omschrijving', k.bes_kenmerk_key, bes_kenmerk_omschrijving),
                      lcl.x ('bes_srtkenmerk_omschrijving', s.bes_srtkenmerk_key, bes_srtkenmerk_omschrijving)) bes_kenmerk_omschrijving,
                  s.bes_srtkenmerk_kenmerktype,
                  s.fac_kenmerkdomein_key,
                  s.bes_srtkenmerk_lengte,
                  s.bes_srtkenmerk_dec,
                  s.bes_srtkenmerk_nmin,
                  s.bes_srtkenmerk_nmax,
                  k.bes_kenmerk_default,
                  NVL (k.bes_kenmerk_volgnummer, 0) volgnummer,
                  lcl.x ('bes_srtkenmerk_dimensie',
                         s.bes_srtkenmerk_key,
                         bes_srtkenmerk_dimensie)
                     dimensie,
                  lcl.x ('bes_kenmerk_hint',
                         k.bes_kenmerk_key,
                         bes_kenmerk_hint)
                     hint,
                  bkb.bes_kenmerkbestell_waarde
             FROM bes_kenmerk k,
                  bes_srtkenmerk s,
                  bes_kenmerkbestell bkb
            WHERE     k.bes_kenmerk_verwijder IS NULL
                  AND k.bes_kenmerk_key = bkb.bes_kenmerk_key(+)
                  AND bkb.bes_bestelling_key(+) = p_key
                  AND k.bes_srtkenmerk_key = s.bes_srtkenmerk_key
                  AND k.bes_srtinstallatie_key = (SELECT MAX (bsg.ins_discipline_key) ins_discipline_key
                                                    FROM bes_bestelling_item bi, bes_srtdeel bsd, bes_srtgroep bsg
                                                   WHERE bi.bes_srtdeel_key = bsd.bes_srtdeel_key
                                                     AND bsd.bes_srtgroep_key = bsg.bes_srtgroep_key
                                                     AND bes_bestelling_key = p_key)
                  AND (bkb.bes_kenmerkbestell_waarde IS NOT NULL OR s.bes_srtkenmerk_kenmerktype IN ('L', 'l', 'M'))
                  AND k.bes_kenmerk_type = 'B'
         ORDER BY k.bes_kenmerk_volgnummer;

      v_kenmerk_waarde       bes_kenmerkbestell.bes_kenmerkbestell_waarde%TYPE;
   BEGIN
      FOR rec1 IN c1
      LOOP
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.bes_kenmerkbestell_waarde,
                                 rec1.bes_kenmerk_default,
                                 rec1.bes_srtkenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.bes_srtkenmerk_nmin,
                                 rec1.bes_srtkenmerk_nmax,
                                 p_key,
                                 rec1.bes_kenmerk_key);

         createxmltagvalueattributes ('kenmerk',
                                      'naam',
                                      rec1.bes_kenmerk_omschrijving,
                                      'type',
                                      rec1.bes_srtkenmerk_kenmerktype,
                                      'volgnummer',
                                      rec1.volgnummer,
                                      'key',
                                      rec1.bes_kenmerk_key,
                                      'dimensie',
                                      rec1.dimensie,
                                      rec1.fac_kenmerkdomein_key,
                                      v_kenmerk_waarde);
      END LOOP;
   END;

   PROCEDURE create_ins_srtgroep_node (p_key IN NUMBER, p_concise BOOLEAN)
   AS
      v_discipline_key   ins_srtgroep.ins_discipline_key%TYPE;
      v_omschrijving     ins_srtgroep.ins_srtgroep_omschrijving%TYPE;
      v_externnr         ins_srtgroep.ins_srtgroep_externnr%TYPE;
      v_externsyncdate   ins_srtgroep.ins_srtgroep_externsyncdate%TYPE;
   BEGIN
      IF p_concise
      THEN
         createopentagattributes ('srtgroep',
                                  'type',
                                  'INS',
                                  'mode',
                                  'concise',
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL);
      ELSE
         createopentagattributes ('srtgroep',
                                  'type',
                                  'INS',
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL);
      END IF;

      SELECT ins_discipline_key,
             lcl.x ('ins_srtgroep_omschrijving',
                    ins_srtgroep_key,
                    ins_srtgroep_omschrijving)
                ins_srtgroep_omschrijving,
             ins_srtgroep_externnr,
             ins_srtgroep_externsyncdate
        INTO v_discipline_key
           , v_omschrijving
           , v_externnr
           , v_externsyncdate
        FROM ins_srtgroep
       WHERE ins_srtgroep_key = p_key;

      createxmltagvalue ('key', p_key);
      createxmltagvalue ('omschrijving', v_omschrijving);
      createxmltagvalue ('externnr', v_externnr);
      mydatetochar ('externsyncdate', v_externsyncdate);

      IF NOT p_concise
      THEN
         create_ins_discipline_node (v_discipline_key);
      END IF;

      createclosetag ('srtgroep');
   END;

   PROCEDURE create_ins_srtkenmerken (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT k.ins_kenmerk_key,
                  k.ins_kenmerk_code,
                  s.ins_srtkenmerk_code,
                  COALESCE (
                      lcl.x ('ins_kenmerk_omschrijving', k.ins_kenmerk_key, ins_kenmerk_omschrijving),
                      lcl.x ('ins_srtkenmerk_omschrijving', s.ins_srtkenmerk_key, ins_srtkenmerk_omschrijving)) ins_kenmerk_omschrijving,
                  s.ins_srtkenmerk_kenmerktype,
                  s.fac_kenmerkdomein_key,
                  s.ins_srtkenmerk_lengte,
                  s.ins_srtkenmerk_dec,
                  s.ins_srtkenmerk_nmin,
                  s.ins_srtkenmerk_nmax,
                  k.ins_kenmerk_default,
                  NVL (k.ins_kenmerk_volgnummer, 0) volgnummer,
                  lcl.x ('ins_srtkenmerk_dimensie',
                         s.ins_srtkenmerk_key,
                         ins_srtkenmerk_dimensie)
                     dimensie,
                  lcl.x ('ins_kenmerk_hint',
                         k.ins_kenmerk_key,
                         ins_kenmerk_hint)
                     hint,
                  v.ins_kenmerkdeel_waarde,
                  v.ins_kenmerkdeel_aanmaak,
                  v.ins_kenmerkdeel_verwijder
             FROM ins_kenmerk k,
                  ins_srtkenmerk s,
                  ins_srtgroep sg,
                  ins_srtdeel sd,
                  (SELECT v.ins_kenmerk_key,
                          v.ins_kenmerkdeel_waarde,
                          v.ins_kenmerkdeel_aanmaak,
                          v.ins_kenmerkdeel_verwijder
                     FROM ins_kenmerkdeel v
                    WHERE v.ins_deel_key = p_key) v
            WHERE ( (k.ins_srtinstallatie_key IS NULL
                     AND k.ins_kenmerk_niveau = 'D')
                   OR (sg.ins_discipline_key = k.ins_srtinstallatie_key
                       AND k.ins_kenmerk_niveau = 'D')
                   OR (sd.ins_srtdeel_key = k.ins_srtinstallatie_key
                       AND k.ins_kenmerk_niveau = 'S')
                   OR (sg.ins_srtgroep_key = k.ins_srtinstallatie_key
                       AND k.ins_kenmerk_niveau = 'G'))
                  AND sd.ins_srtdeel_key = p_key
                  AND k.ins_kenmerk_verwijder IS NULL
                  AND ins_kenmerk_bewerkniveau = 'S'
                  AND s.ins_srtkenmerk_verwijder IS NULL
                  AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
                  AND k.ins_srtkenmerk_key = s.ins_srtkenmerk_key
                  AND v.ins_kenmerk_key(+) = k.ins_kenmerk_key
         ORDER BY k.ins_kenmerk_volgnummer;

      v_kenmerk_waarde       ins_kenmerkdeel.ins_kenmerkdeel_waarde%TYPE;
      v_kenmerk_aanmaak      ins_kenmerkdeel.ins_kenmerkdeel_aanmaak%TYPE;
      v_kenmerk_verwijder    ins_kenmerkdeel.ins_kenmerkdeel_verwijder%TYPE;
   BEGIN
      FOR rec1 IN c1
      LOOP
         v_kenmerk_aanmaak := rec1.ins_kenmerkdeel_aanmaak;
         v_kenmerk_verwijder := rec1.ins_kenmerkdeel_verwijder;
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.ins_kenmerkdeel_waarde,
                                 rec1.ins_kenmerk_default,
                                 rec1.ins_srtkenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.ins_srtkenmerk_nmin,
                                 rec1.ins_srtkenmerk_nmax,
                                 p_key,
                                 rec1.ins_kenmerk_key);

         createxmltagvalueattributes9('kenmerk',
                                      'kenmerkcode',     rec1.ins_kenmerk_code,
                                      'srtkenmerkcode',  rec1.ins_srtkenmerk_code,
                                      'naam',            rec1.ins_kenmerk_omschrijving,
                                      'type',            rec1.ins_srtkenmerk_kenmerktype,
                                      'volgnummer',      rec1.volgnummer,
                                      'key',             rec1.ins_kenmerk_key,
                                      'aanmaak',         TO_CHAR (v_kenmerk_aanmaak, 'YYYYMMDD HH24:MI'),
                                      NULL,              NULL,
                                      NULL,              NULL,
                                      rec1.fac_kenmerkdomein_key,
                                      v_kenmerk_waarde
                                     );
      END LOOP;
   END;

   PROCEDURE create_ins_srtdeel_node (p_key IN NUMBER, p_concise BOOLEAN)
   AS
      v_groep_key         ins_srtgroep.ins_srtgroep_key%TYPE;
      v_omschrijving      ins_srtdeel.ins_srtdeel_omschrijving%TYPE;
      v_code              ins_srtdeel.ins_srtdeel_code%TYPE;
      v_prijs             ins_srtdeel.ins_srtdeel_prijs%TYPE;
      v_inkprijs          ins_srtdeel.ins_srtdeel_inkprijs%TYPE;
      v_eenheid           ins_srtdeel.ins_srtdeel_eenheid%TYPE;
      v_artikel_nummer    ins_srtdeel.ins_srtdeel_nr%TYPE;
      v_leverancier_key   ins_srtdeel.prs_bedrijf_key%TYPE;
      v_vervaldatum       ins_srtdeel.ins_srtdeel_vervaldatum%TYPE;
      v_image             ins_srtdeel.ins_srtdeel_image%TYPE;
      v_veelvoud          ins_srtdeel.ins_srtdeel_veelvoud%TYPE;
      v_prsflex           ins_srtdeel.ins_srtdeel_prsflex%TYPE;
      v_binding           ins_srtdeel.ins_srtdeel_binding%TYPE;
      v_opmerking         ins_srtdeel.ins_srtdeel_opmerking%TYPE;
      v_minimum           ins_srtdeel.ins_srtdeel_minimum%TYPE;
      v_mjb_grensscore1   ins_srtdeel.ins_srtdeel_mjb_grensscore1%TYPE;
      v_externnr          ins_srtdeel.ins_srtdeel_externnr%TYPE;
      v_externsyncdate    ins_srtdeel.ins_srtdeel_externsyncdate%TYPE;
      v_sensortype        ins_srtdeel.ins_srtdeel_sensortype%TYPE;
      v_acad_dwgx         ins_srtdeel.ins_srtdeel_acadsymbol_dwgx%TYPE;
      v_acad_dwgy         ins_srtdeel.ins_srtdeel_acadsymbol_dwgy%TYPE;
   BEGIN
      IF p_concise
      THEN
         createopentagattributes ('srtdeel',
                                  'type',
                                  'INS',
                                  'mode',
                                  'concise',
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL);
      ELSE
         createopentagattributes ('srtdeel',
                                  'type',
                                  'INS',
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL);
      END IF;

      SELECT ins_srtgroep_key,
             lcl.x ('ins_srtdeel_omschrijving',
                    ins_srtdeel_key,
                    ins_srtdeel_omschrijving)
                ins_srtdeel_omschrijving,
             ins_srtdeel_code,
             ins_srtdeel_prijs,
             ins_srtdeel_inkprijs,
             lcl.x ('ins_srtdeel_eenheid',
                    ins_srtdeel_key,
                    ins_srtdeel_eenheid)
                ins_srtdeel_eenheid,
             NVL (ins_srtdeel_nr, ' '),
             prs_bedrijf_key,
             ins_srtdeel_vervaldatum,
             ins_srtdeel_image,
             ins_srtdeel_veelvoud,
             ins_srtdeel_prsflex,
             ins_srtdeel_binding,
             lcl.x ('ins_srtdeel_opmerking',
                    ins_srtdeel_key,
                    ins_srtdeel_opmerking)
                ins_srtdeel_opmerking,
             ins_srtdeel_minimum,
             ins_srtdeel_mjb_grensscore1,
             ins_srtdeel_externnr,
             ins_srtdeel_externsyncdate,
             ins_srtdeel_sensortype,
             ins_srtdeel_acadsymbol_dwgx,
             ins_srtdeel_acadsymbol_dwgy
        INTO v_groep_key,
             v_omschrijving,
             v_code,
             v_prijs,
             v_inkprijs,
             v_eenheid,
             v_artikel_nummer,
             v_leverancier_key,
             v_vervaldatum,
             v_image,
             v_veelvoud,
             v_prsflex,
             v_binding,
             v_opmerking,
             v_minimum,
             v_mjb_grensscore1,
             v_externnr,
             v_externsyncdate,
             v_sensortype,
             v_acad_dwgx,
             v_acad_dwgy
        FROM ins_srtdeel
       WHERE ins_srtdeel_key = p_key;

      createxmltagvalue ('key', p_key);
      createxmltagvalue ('omschrijving', v_omschrijving);
      createxmltagvalue ('code', v_code);

      IF NOT p_concise
      THEN
         createxmltagvalue ('prijs', v_prijs);
         createxmltagvalue ('inkprijs', v_inkprijs);
         createxmltagvalue ('eenheid', v_eenheid);
         createxmltagvalue ('artikel_nummer', v_artikel_nummer);
         createxmltagvalue ('leverancier_key', v_leverancier_key);
         createxmltagvalue ('vervaldatum', v_vervaldatum);
         createxmltagvalue ('image', v_image);
         createxmltagvalue ('veelvoud', v_veelvoud);
         createxmltagvalue ('prsflex', v_prsflex);
         createxmltagvalue ('binding', v_binding);
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('minimum', v_minimum);
         createxmltagvalue ('mjb_grenscore1', v_mjb_grensscore1);
      END IF;
      createxmltagvalue ('externnr', v_externnr);
      mydatetochar ('externsyncdate', v_externsyncdate);
      createxmltagvalue ('sensortype', v_sensortype);
      createxmltagvalue ('dwgx', v_acad_dwgx);
      createxmltagvalue ('dwgy', v_acad_dwgy);
      -- He, kenmerken ook bij concise? Ja!
      create_ins_srtkenmerken(p_key);
      create_ins_srtgroep_node (v_groep_key, p_concise);          -- dus false
      createclosetag ('srtdeel');
   END;

   PROCEDURE create_bes_srtgroep_node (p_key IN NUMBER, p_concise BOOLEAN)
   AS
      v_discipline_key   bes_srtgroep.ins_discipline_key%TYPE;
      v_omschrijving     bes_srtgroep.bes_srtgroep_omschrijving%TYPE;
      v_kostensoort_key  bes_srtgroep.prs_kostensoort_key%TYPE;
   BEGIN
      IF p_concise
      THEN
         createopentagattributes ('srtgroep',
                                  'type',
                                  'BES',
                                  'mode',
                                  'concise',
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL);
      ELSE
         createopentagattributes ('srtgroep',
                                  'type',
                                  'BES',
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL);
      END IF;

      SELECT ins_discipline_key,
             lcl.x ('bes_srtgroep_omschrijving',
                    bes_srtgroep_key,
                    bes_srtgroep_omschrijving)
                bes_srtgroep_omschrijving,
                prs_kostensoort_key
        INTO v_discipline_key, v_omschrijving, v_kostensoort_key
        FROM bes_srtgroep
       WHERE bes_srtgroep_key = p_key;

      createxmltagvalue ('key', p_key);
      createxmltagvalue ('omschrijving', v_omschrijving);
      create_prs_kostensoort_node (v_kostensoort_key);

      IF NOT p_concise
      THEN
         create_ins_discipline_node (v_discipline_key);
      END IF;

      createclosetag ('srtgroep');
   END;

   PROCEDURE create_bes_srtdeel_node (p_key IN NUMBER, p_concise BOOLEAN)
   AS
      v_groep_key         bes_srtgroep.bes_srtgroep_key%TYPE;
      v_omschrijving      bes_srtdeel.bes_srtdeel_omschrijving%TYPE;
      v_prijs             bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE;
      v_inkprijs          bes_srtdeel_prijs.bes_srtdeel_prijs_inkprijs%TYPE;
      v_eenheid           bes_srtdeel.bes_srtdeel_eenheid%TYPE;
      v_artikel_nummer    bes_srtdeel.bes_srtdeel_nr%TYPE;
      v_leverancier_key   bes_srtdeel.prs_bedrijf_key%TYPE;
      v_vervaldatum       bes_srtdeel.bes_srtdeel_vervaldatum%TYPE;
      v_image             bes_srtdeel.bes_srtdeel_image%TYPE;
      v_veelvoud          bes_srtdeel.bes_srtdeel_veelvoud%TYPE;
      v_prsflex           bes_srtdeel.bes_srtdeel_prsflex%TYPE;
      v_preview           bes_srtdeel.bes_srtdeel_preview%TYPE;
      v_opmerking         bes_srtdeel.bes_srtdeel_opmerking%TYPE;
      v_minimum           bes_srtdeel.bes_srtdeel_minimum%TYPE;
      v_maximum           bes_srtdeel.bes_srtdeel_maximum%TYPE;
      v_notitie           bes_srtdeel.bes_srtdeel_notitie%TYPE;
      v_btw               bes_srtdeel.bes_srtdeel_btw%TYPE;

   BEGIN
      IF p_concise
      THEN
         createopentagattributes ('srtdeel',
                                  'type',
                                  'BES',
                                  'mode',
                                  'concise',
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL);
      ELSE
         createopentagattributes ('srtdeel',
                                  'type',
                                  'BES',
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL);
      END IF;

      SELECT bes_srtgroep_key,
             lcl.x ('bes_srtdeel_omschrijving',
                    bes_srtdeel_key,
                    bes_srtdeel_omschrijving)
                bes_srtdeel_omschrijving,
             bes.getsrtdeelprijs (bes_srtdeel_key, NULL) bes_srtdeel_prijs,
             bes.getsrtdeelinkprijs (bes_srtdeel_key, NULL)
                bes_srtdeel_inkprijs,
             lcl.x ('bes_srtdeel_eenheid',
                    bes_srtdeel_key,
                    bes_srtdeel_eenheid)
                bes_srtdeel_eenheid,
             NVL (bes_srtdeel_nr, ' '),
             prs_bedrijf_key,
             bes_srtdeel_vervaldatum,
             bes_srtdeel_image,
             bes_srtdeel_veelvoud,
             bes_srtdeel_prsflex,
             bes_srtdeel_preview,
             lcl.x ('bes_srtdeel_opmerking',
                    bes_srtdeel_key,
                    bes_srtdeel_opmerking)
                bes_srtdeel_opmerking,
             bes_srtdeel_minimum,
             bes_srtdeel_maximum,
             bes_srtdeel_notitie,
             bes_srtdeel_btw
        INTO v_groep_key,
             v_omschrijving,
             v_prijs,
             v_inkprijs,
             v_eenheid,
             v_artikel_nummer,
             v_leverancier_key,
             v_vervaldatum,
             v_image,
             v_veelvoud,
             v_prsflex,
             v_preview,
             v_opmerking,
             v_minimum,
             v_maximum,
             v_notitie,
             v_btw
        FROM bes_srtdeel
       WHERE bes_srtdeel_key = p_key;

      createxmltagvalue ('key', p_key);
      createxmltagvalue ('omschrijving', v_omschrijving);

      IF NOT p_concise
      THEN
         createxmltagvalue ('prijs', v_prijs);
         createxmltagvalue ('inkprijs', v_inkprijs);
         createxmltagvalue ('eenheid', v_eenheid);
         createxmltagvalue ('artikel_nummer', v_artikel_nummer);
         createxmltagvalue ('leverancier_key', v_leverancier_key);
         createxmltagvalue ('vervaldatum', v_vervaldatum);
         createxmltagvalue ('image', v_image);
         createxmltagvalue ('veelvoud', v_veelvoud);
         createxmltagvalue ('prsflex', v_prsflex);
         createxmltagvalue ('preview', v_preview);
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('minimum', v_minimum);
         createxmltagvalue ('maximum', v_maximum);
         createxmltagvalue ('notitie', v_notitie);
         createxmltagvalue ('btw', v_btw);
      END IF;

      create_bes_srtgroep_node (v_groep_key, p_concise);          -- dus false
      createclosetag ('srtdeel');
   END;

   PROCEDURE create_bes_besteli_node (p_key IN NUMBER)
   AS
      v_srtdeel_key           bes_srtdeel.bes_srtdeel_key%TYPE;
      v_aantal                bes_bestelling_item.bes_bestelling_item_aantal%TYPE;
      v_bestelopdr_item_key   bes_bestelopdr_item.bes_bestelopdr_item_key%TYPE;
      v_aantalontv            bes_bestelling_item.bes_bestelling_item_aantalontv%TYPE;
      v_status                bes_bestellingstatuses.bes_bestellingstatuses_omschr%TYPE;
      v_status_key            bes_bestelling_item.bes_bestelling_item_status%TYPE;
      v_brutoprijs            bes_bestelling_item.bes_bestelling_item_brutoprijs%TYPE;
      v_prijs                 bes_bestelling_item.bes_bestelling_item_prijs%TYPE;
      v_inkprijs              bes_bestelling_item.bes_bestelling_item_inkprijs%TYPE;
   BEGIN
      createopentag ('bestelitem');

      SELECT bes_srtdeel_key,
             bes_bestelling_item_aantal,
             bes_bestelopdr_item_key,
             bes_bestelling_item_aantalontv,
             NVL (bes_bestellingstatuses_omschr, ''),
             NVL (bes_bestelling_item_status, ''),
             bes_bestelling_item_prijs,
             bes_bestelling_item_brutoprijs,
             bes_bestelling_item_inkprijs
        INTO v_srtdeel_key,
             v_aantal,
             v_bestelopdr_item_key,
             v_aantalontv,
             v_status,
             v_status_key,
             v_prijs,
             v_brutoprijs,
             v_inkprijs
        FROM bes_bestelling_item bi, bes_bestellingstatuses s
       WHERE bi.bes_bestelling_item_status = s.bes_bestellingstatuses_key(+)
             AND bi.bes_bestelling_item_key = p_key;

      createxmltagvalue ('key', p_key);
      createxmltagvalue ('aantal', v_aantal);
      createxmltagvalue ('opdrachtitem_key', v_bestelopdr_item_key);
      createxmltagvalue ('aantalontv', v_aantalontv);
      createxmltagvalue ('status_key', v_status_key);
      createxmltagvalue ('status', v_status);
      createxmltagvalue ('prijs', v_prijs);
      createxmltagvalue ('inkprijs', v_inkprijs);
      createxmltagvalue ('brutoprijs', v_brutoprijs);
      createxmltagvalue ('totaal', v_aantal * v_prijs);
      createxmltagvalue ('inktotaal', v_aantal * v_inkprijs);
      create_bes_item_kenmerken (p_key);
      create_bes_srtdeel_node (v_srtdeel_key, FALSE);
      createclosetag ('bestelitem');
   END;

   PROCEDURE create_bes_bestelopdri_node (p_key IN NUMBER)
   AS
      v_bestelopdr_item_key          bes_bestelopdr_item.bes_bestelopdr_item_key%TYPE;
      v_bestelopdr_key               bes_bestelopdr_item.bes_bestelopdr_key%TYPE;
      v_bestelopdr_item_aantal       bes_bestelopdr_item.bes_bestelopdr_item_aantal%TYPE;
      v_bestelopdr_item_aantalontv   bes_bestelopdr_item.bes_bestelopdr_item_aantalontv%TYPE;
      v_bestelopdr_item_aantalexp    bes_bestelopdr_item.bes_bestelopdr_item_aantalexp%TYPE;
      v_bestelopdr_item_omschrijv    bes_bestelopdr_item.bes_bestelopdr_item_omschrijv%TYPE;
      v_bestelopdr_item_prijs        bes_bestelopdr_item.bes_bestelopdr_item_prijs%TYPE;
      v_bestelopdr_item_ontvangen    bes_bestelopdr_item.bes_bestelopdr_item_ontvangen%TYPE;
      v_bestelopdr_item_status       bes_bestelopdr_item.bes_bestelopdr_item_status%TYPE;
      v_bestelopdr_item_verwerkt     bes_bestelopdr_item.bes_bestelopdr_item_verwerkt%TYPE;
      v_status                       bes_bestelopdrstatuses.bes_bestelopdrstatuses_omschr%TYPE;
      v_bestelopdr_item_posnr        bes_bestelopdr_item.bes_bestelopdr_item_posnr%TYPE;
      v_bestelopdr_item_brutoprijs   bes_bestelopdr_item.bes_bestelopdr_item_brutoprijs%TYPE;
      v_bestelopdr_item_inkprijs     bes_bestelopdr_item.bes_bestelopdr_item_inkprijs%TYPE;
      v_bestelopdr_item_opmerking    bes_bestelopdr_item.bes_bestelopdr_item_opmerking%TYPE;

      CURSOR c1
      IS
         SELECT bes_bestelling_item_key
           FROM bes_bestelling_item
          WHERE bes_bestelopdr_item_key = p_key;
   BEGIN
      createopentag ('bestelopdrachtitem');

      SELECT bes_bestelopdr_item_key,
             bes_bestelopdr_key,
             bes_bestelopdr_item_aantal,
             bes_bestelopdr_item_aantalontv,
             bes_bestelopdr_item_aantalexp,
             bes_bestelopdr_item_omschrijv,
             bes_bestelopdr_item_prijs,
             bes_bestelopdr_item_ontvangen,
             bes_bestelopdr_item_status,
             bes_bestelopdr_item_verwerkt,
             bes_bestelopdr_item_posnr,
             bes_bestelopdr_item_brutoprijs,
             bes_bestelopdr_item_inkprijs,
             bes_bestelopdr_item_opmerking
        INTO v_bestelopdr_item_key,
             v_bestelopdr_key,
             v_bestelopdr_item_aantal,
             v_bestelopdr_item_aantalontv,
             v_bestelopdr_item_aantalexp,
             v_bestelopdr_item_omschrijv,
             v_bestelopdr_item_prijs,
             v_bestelopdr_item_ontvangen,
             v_bestelopdr_item_status,
             v_bestelopdr_item_verwerkt,
             v_bestelopdr_item_posnr,
             v_bestelopdr_item_brutoprijs,
             v_bestelopdr_item_inkprijs,
             v_bestelopdr_item_opmerking
        FROM bes_bestelopdr_item bi, bes_bestelopdrstatuses s
       WHERE bi.bes_bestelopdr_item_status = s.bes_bestelopdrstatuses_key(+)
             AND bi.bes_bestelopdr_item_key = p_key;

      createxmltagvalue ('key', v_bestelopdr_item_key);
      createxmltagvalue ('posnr', v_bestelopdr_item_posnr);
      createxmltagvalue ('statuskey', v_bestelopdr_item_status);
      createxmltagvalue ('status', v_status);
      createxmltagvalue ('aantal', v_bestelopdr_item_aantal);
      createxmltagvalue ('aantalontv', v_bestelopdr_item_aantalontv);
      createxmltagvalue ('aantalexp', v_bestelopdr_item_aantalexp);
      -- De omschrijving is een snapshotje. Gebruik normaliter de gegevens van de subnode bestelitem
      createxmltagvalue ('omschrijving', v_bestelopdr_item_omschrijv);
      createxmltagvalue ('prijs', v_bestelopdr_item_prijs);
      createxmltagvalue ('totaal',
                         v_bestelopdr_item_prijs * v_bestelopdr_item_aantal);
      createxmltagvalue (
         'inktotaal',
         v_bestelopdr_item_inkprijs * v_bestelopdr_item_aantal);
      mydatetochar ('ontvangen', v_bestelopdr_item_ontvangen);
      mydatetochar ('verwerkt', v_bestelopdr_item_verwerkt);
      createxmltagvalue ('brutoprijs', v_bestelopdr_item_brutoprijs);
      createxmltagvalue ('inkprijs', v_bestelopdr_item_inkprijs);
      createxmltagvalue ('opmerking', v_bestelopdr_item_opmerking);

      FOR rec1 IN c1
      LOOP
         create_bes_besteli_node (rec1.bes_bestelling_item_key);
      END LOOP;
      -- we zouden hier een loopje met create_bes_bestellevri_node kunnen doen
      -- we ondersteunen echter (nog) alleen de route create_bes_bestellevr_node --> create_bes_bestellevri_node

      createclosetag ('bestelopdrachtitem');
   END;

   PROCEDURE create_bes_bestelling_node (p_key       IN NUMBER,
                                         p_concise   IN BOOLEAN)
   AS
      v_module             bes_bestelling.bes_bestelling_module%TYPE;
      v_statuskey          bes_bestelling.bes_bestelling_status%TYPE;
      v_datum              bes_bestelling.bes_bestelling_datum%TYPE;
      v_perslid_key        bes_bestelling.prs_perslid_key%TYPE;
      v_perslid_key_voor   bes_bestelling.prs_perslid_key_voor%TYPE;
      v_opmerking          bes_bestelling.bes_bestelling_opmerking%TYPE;
      v_ordernr            bes_bestelling.bes_bestelling_ordernr%TYPE;
      v_plaats             bes_bestelling.bes_bestelling_plaats%TYPE;
      v_fiat_user          bes_bestelling.bes_bestelling_fiat_user%TYPE;
      v_adres_key_lev      bes_bestelling.mld_adres_key_lev%TYPE;
      v_kostenplaats_key   bes_bestelling.prs_kostenplaats_key%TYPE;
      v_status             bes_bestellingstatuses.bes_bestellingstatuses_omschr%TYPE;
      v_leverdatum         bes_bestelling.bes_bestelling_leverdatum%TYPE;
      v_kosten_klant       bes_bestelling.bes_bestelling_kosten_klant%TYPE;
      v_activiteit_key     bes_bestelling.fac_activiteit_key%TYPE;
      v_retourvan_key      bes_bestelling.bes_bestelling_retourvan_key%TYPE;
      v_levkosten          bes_bestelling.bes_bestelling_levkosten%TYPE;
      v_korting            bes_bestelling.bes_bestelling_korting%TYPE;
      v_parentkey          bes_bestelling.bes_bestelling_parentkey%TYPE;
      v_approved           bes_bestelling.bes_bestelling_approved%TYPE;
      v_lev_opm            bes_bestelling.bes_bestelling_lev_opm%TYPE;
      v_externnr           bes_bestelling.bes_bestelling_externnr%TYPE;
      v_externsyncdate     bes_bestelling.bes_bestelling_externsyncdate%TYPE;
      CURSOR c1
      IS
         SELECT bes_bestelling_item_key
           FROM bes_bestelling_item
          WHERE bes_bestelling_key = p_key;

      -- Met welke opdracht(en) wordt deze aanvraag afgehandeld?
      CURSOR c2
      IS
         SELECT DISTINCT boi.bes_bestelopdr_key
           FROM bes_bestelling_item bi, bes_bestelopdr_item boi
          WHERE boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
            AND bi.bes_bestelling_key = p_key;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         IF p_concise
         THEN
            createconciseopentag ('bestelling');
         ELSE
            createopentag ('bestelling');
         END IF;

         SELECT bes_bestelling_module,
                bes_bestelling_status,
                bes_bestelling_datum,
                prs_perslid_key,
                prs_perslid_key_voor,
                bes_bestelling_opmerking,
                bes_bestelling_ordernr,
                bes_bestelling_plaats,
                bes_bestelling_fiat_user,
                mld_adres_key_lev,
                prs_kostenplaats_key,
                bes_bestellingstatuses_omschr,
                bes_bestelling_leverdatum,
                bes_bestelling_kosten_klant,
                fac_activiteit_key,
                bes_bestelling_retourvan_key,
                bes_bestelling_levkosten,
                bes_bestelling_korting,
                bes_bestelling_parentkey,
                bes_bestelling_approved,
                bes_bestelling_lev_opm,
                bes_bestelling_externnr,
                bes_bestelling_externsyncdate
           INTO v_module,
                v_statuskey,
                v_datum,
                v_perslid_key,
                v_perslid_key_voor,
                v_opmerking,
                v_ordernr,
                v_plaats,
                v_fiat_user,
                v_adres_key_lev,
                v_kostenplaats_key,
                v_status,
                v_leverdatum,
                v_kosten_klant,
                v_activiteit_key,
                v_retourvan_key,
                v_levkosten,
                v_korting,
                v_parentkey,
                v_approved,
                v_lev_opm,
                v_externnr,
                v_externsyncdate
           FROM bes_bestelling b, bes_bestellingstatuses s
          WHERE b.bes_bestelling_status = s.bes_bestellingstatuses_key
                AND bes_bestelling_key = p_key;

         createxmltagvalue ('key', p_key);
         createxmltagvalue ('module', v_module);
         mydatetochar ('datum', v_datum);
         mydatetochar ('leverdatum', v_leverdatum);
         createxmltagvalue ('status_key', v_statuskey);
         createxmltagvalue ('status', v_status);
         create_prs_perslid_node (v_perslid_key, 'aanvrager', TRUE);
         create_prs_perslid_node (v_perslid_key_voor, 'voor', FALSE);
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('bestel_opm', v_lev_opm);
         createxmltagvalue ('ordernr', v_ordernr);
         createxmltagvalue ('plaats', v_plaats);
         create_prs_perslid_node (v_fiat_user, 'fiatteur', TRUE);
         create_mld_adres_node (v_adres_key_lev, 'afleveradres', FALSE);
         createxmltagvalue ('kosten_klant', v_kosten_klant);
         create_prs_kostenplaats_node (v_kostenplaats_key, FALSE);
         create_fac_activiteit_node (v_activiteit_key);
         create_bes_bestell_kenmerken (p_key);

         IF v_retourvan_key IS NOT NULL               -- Dan is dit een retour
         THEN
            createxmltagvalue ('isretour', 1);               -- Might be handy
            create_bes_bestelling_node (v_retourvan_key, p_concise);
         END IF;

         createxmltagvalue ('levkosten', v_levkosten);
         createxmltagvalue ('korting', v_korting);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);

         IF NOT p_concise
         THEN
            FOR rec1 IN c1
            LOOP
               create_bes_besteli_node (rec1.bes_bestelling_item_key);
            END LOOP;
            FOR rec2 IN c2
            LOOP
               create_bes_bestelopdr_node (rec2.bes_bestelopdr_key, TRUE);
            END LOOP;
         END IF;

         IF v_parentkey IS NOT NULL                  -- Dan is dit een mutatie
         THEN
            createxmltagvalue ('ismutatie', 1);              -- Might be handy
            create_bes_bestelling_node (v_parentkey, TRUE);
         END IF;
         createxmltagvalue ('approved', v_approved);

         create_fac_tracking_node ('bestelling', p_key);
         createclosetag ('bestelling');
      END IF;
   END;

   PROCEDURE create_bes_bestelopdr_node (p_key IN NUMBER, p_concise IN BOOLEAN)
   AS
      v_bestelopdr_key               bes_bestelopdr.bes_bestelopdr_key%TYPE;
      v_bestelopdr_id                bes_bestelopdr.bes_bestelopdr_id%TYPE;
      v_module                       bes_bestelopdr.bes_bestelopdr_module%TYPE;
      v_bestelopdr_status            bes_bestelopdr.bes_bestelopdr_status%TYPE;
      v_bedrijf_key                  bes_bestelopdr.prs_bedrijf_key%TYPE;
      v_bestelopdr_datum             bes_bestelopdr.bes_bestelopdr_datum%TYPE;
      v_adres_key_lev                bes_bestelopdr.mld_adres_key_lev%TYPE;
      v_adres_key_fac                bes_bestelopdr.mld_adres_key_fac%TYPE;
      v_bestelopdr_leverdatum        bes_bestelopdr.bes_bestelopdr_leverdatum%TYPE;
      v_bestelopdr_opmerking         bes_bestelopdr.bes_bestelopdr_opmerking%TYPE;
      v_contract_key                 bes_bestelopdr.cnt_contract_key%TYPE;
      v_perslid_key                  bes_bestelopdr.prs_perslid_key%TYPE;
      v_bestelopdr_delivery_opmerk   bes_bestelopdr.bes_bestelopdr_delivery_opmerk%TYPE;
      v_status                       bes_bestelopdrstatuses.bes_bestelopdrstatuses_omschr%TYPE;
      v_levkosten                    bes_bestelopdr.bes_bestelopdr_levkosten%TYPE;
      v_korting                      bes_bestelopdr.bes_bestelopdr_korting%TYPE;
      v_externnr                     bes_bestelopdr.bes_bestelopdr_externnr%TYPE;
      v_externsyncdate               bes_bestelopdr.bes_bestelopdr_externsyncdate%TYPE;

      CURSOR c1
      IS
         SELECT bes_bestelopdr_item_key
           FROM bes_bestelopdr_item
          WHERE bes_bestelopdr_key = p_key;

      CURSOR c2
      IS
         SELECT DISTINCT bi.bes_bestelling_key
           FROM bes_bestelling_item bi, bes_bestelopdr_item boi
          WHERE boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
                AND boi.bes_bestelopdr_key = p_key;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('bestelopdracht');

         SELECT bes_bestelopdr_module,
                bes_bestelopdr_status,
                prs_bedrijf_key,
                bes_bestelopdr_datum,
                mld_adres_key_lev,
                mld_adres_key_fac,
                bes_bestelopdr_leverdatum,
                bes_bestelopdr_opmerking,
                cnt_contract_key,
                prs_perslid_key,
                bes_bestelopdr_delivery_opmerk,
                bes_bestelopdrstatuses_omschr,
                bes_bestelopdr_id,
                bes_bestelopdr_levkosten,
                bes_bestelopdr_korting,
                bes_bestelopdr_externnr,
                bes_bestelopdr_externsyncdate
           INTO v_module,
                v_bestelopdr_status,
                v_bedrijf_key,
                v_bestelopdr_datum,
                v_adres_key_lev,
                v_adres_key_fac,
                v_bestelopdr_leverdatum,
                v_bestelopdr_opmerking,
                v_contract_key,
                v_perslid_key,
                v_bestelopdr_delivery_opmerk,
                v_status,
                v_bestelopdr_id,
                v_levkosten,
                v_korting,
                v_externnr,
                v_externsyncdate
           FROM bes_bestelopdr b, bes_bestelopdrstatuses s
          WHERE b.bes_bestelopdr_status = s.bes_bestelopdrstatuses_key
                AND bes_bestelopdr_key = p_key;

         createxmltagvalue ('key', p_key);
         createxmltagvalue ('id', v_bestelopdr_id);
         createxmltagvalue ('module', v_module);
         mydatetochar ('datum', v_bestelopdr_datum);
         mydatetochar ('leverdatum', v_bestelopdr_leverdatum);
         createxmltagvalue ('status_key', v_bestelopdr_status);
         createxmltagvalue ('status', v_status);
         create_prs_bedrijf_node (v_bedrijf_key, 'bedrijf', FALSE); -- niet concise zodat bedrijfadressen meekomen
         createxmltagvalue ('opmerking', v_bestelopdr_opmerking);
         createxmltagvalue ('leveringopmerking',
                            v_bestelopdr_delivery_opmerk);
         --Deze persoon is degene die de MakeOrders veroorzaakte (hoe relevant..)
         create_prs_perslid_node (v_perslid_key, 'besteller', TRUE);
         create_mld_adres_node (v_adres_key_lev, 'afleveradres', p_concise);
         create_mld_adres_node (v_adres_key_fac, 'factuuradres', TRUE);
         createxmltagvalue ('levkosten', v_levkosten);
         createxmltagvalue ('korting', v_korting);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);

         IF NOT p_concise
         THEN
             FOR rec1 IN c1
             LOOP
                create_bes_bestelopdri_node (rec1.bes_bestelopdr_item_key);
             END LOOP;

             -- welke pakbonnen zeggen iets over deze opdrachtregels van opdracht
             FOR rec3 IN (SELECT DISTINCT bli.bes_bestellevr_key
                            FROM bes_bestellevr_item bli, bes_bestelopdr_item boi
                           WHERE boi.bes_bestelopdr_item_key = bli.bes_bestelopdr_item_key
                             AND boi.bes_bestelopdr_key = p_key)
             LOOP
                create_bes_bestellevr_node (rec3.bes_bestellevr_key, FALSE);
             END LOOP;

             -- Er is nogal wat info te behalen bij de bestelaanvraag; deze includen we hier integraal vooralsnog
             -- Welke aanvraag hoort hier bij? Dat kunnen er theoretisch meer zijn (bundeling)
             FOR rec2 IN c2
             LOOP
                create_bes_bestelling_node (rec2.bes_bestelling_key, TRUE);
             END LOOP;
         END IF;

         create_fac_tracking_node ('bestelopdr', p_key);
         createclosetag ('bestelopdracht');
      END IF;
   END;


   PROCEDURE create_bes_bestellevri_node (p_key IN NUMBER)
   AS
   BEGIN
      createopentag ('bestelleveringitem');

      FOR rec in (
                  SELECT bli.bes_bestellevr_item_key,
                         bli.bes_bestellevr_item_aantal,
                         bli.bes_bestelopdr_item_key,
                         bi.bes_bestelopdr_item_omschrijv -- ter info
                    FROM bes_bestelopdr_item bi, bes_bestellevr_item bli
                   WHERE bi.bes_bestelopdr_item_key = bli.bes_bestelopdr_item_key
                     AND bli.bes_bestellevr_item_key = p_key)
      LOOP
          createxmltagvalue ('key', p_key);
          createxmltagvalue ('aantal', rec.bes_bestellevr_item_aantal);
          createxmltagvalue ('levertitem', rec.bes_bestelopdr_item_key); -- concessie: hier moet eigenlijk bes_bestelopdr_item
          createxmltagvalue ('omschrijving', rec.bes_bestelopdr_item_omschrijv);

      END LOOP;

      createclosetag ('bestelleveringitem');
   END;


   PROCEDURE create_bes_bestellevr_node (p_key IN NUMBER, p_concise IN BOOLEAN)
   AS
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('bestellevering');

         FOR rec0 IN (SELECT bes_bestellevr_pakbon,
                             bes_bestellevr_datum,
                             bes_bestellevr_opmerk,
                             prs_perslid_key
                        FROM bes_bestellevr
                       WHERE bes_bestellevr_key = p_key)
         LOOP
             createxmltagvalue ('key', p_key);
             createxmltagvalue ('pakbon', rec0.bes_bestellevr_pakbon);
             mydatetochar ('leverdatum', rec0.bes_bestellevr_datum);
             createxmltagvalue ('opmerking', rec0.bes_bestellevr_opmerk);
             create_prs_perslid_node (rec0.prs_perslid_key, 'inboeker', TRUE);
         END LOOP;

         IF NOT p_concise
         THEN
             FOR rec1 IN (SELECT bes_bestellevr_item_key
                            FROM bes_bestellevr_item
                           WHERE bes_bestellevr_key = p_key)
             LOOP
                create_bes_bestellevri_node (rec1.bes_bestellevr_item_key);
             END LOOP;
         END IF;

         createclosetag ('bestellevering');
      END IF;
   END;

   --
   --
   -- BEZOEKERS
   --
   --
   -- *
   -- * BEZ kenmerken
   -- *

   PROCEDURE create_bez_kenmerken (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT k.bez_kenmerk_key,
                  k.bez_kenmerk_code,
                  lcl.x ('bez_kenmerk_omschrijving', k.bez_kenmerk_key, bez_kenmerk_omschrijving) bez_kenmerk_omschrijving,
                  k.bez_kenmerk_kenmerktype,
                  k.bez_kenmerk_systeem,
                  k.fac_kenmerkdomein_key,
                  k.bez_kenmerk_lengte,
                  k.bez_kenmerk_dec,
                  k.bez_kenmerk_nmin,
                  k.bez_kenmerk_nmax,
                  k.bez_kenmerk_default,
                  NVL (k.bez_kenmerk_volgnr, 0) volgnummer,
                  lcl.x ('bez_kenmerk_dimensie',
                         k.bez_kenmerk_key,
                         bez_kenmerk_dimensie)
                     dimensie,
                  lcl.x ('bez_kenmerk_hint',
                         k.bez_kenmerk_key,
                         bez_kenmerk_hint)
                     hint,
                  v.bez_kenmerkwaarde_waarde
             FROM bez_kenmerk k,
                  (SELECT v.bez_kenmerk_key, v.bez_kenmerkwaarde_waarde
                     FROM bez_kenmerkwaarde v
                    WHERE v.bez_bezoekers_key = p_key
                          AND v.bez_kenmerkwaarde_verwijder IS NULL) v
            WHERE     k.bez_kenmerk_verwijder IS NULL
                  AND v.bez_kenmerk_key(+) = k.bez_kenmerk_key
         ORDER BY k.bez_kenmerk_volgnr;

      v_kenmerk_waarde       bez_kenmerkwaarde.bez_kenmerkwaarde_waarde%TYPE;
   BEGIN
      FOR rec1 IN c1
      LOOP
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.bez_kenmerkwaarde_waarde,
                                 rec1.bez_kenmerk_default,
                                 rec1.bez_kenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.bez_kenmerk_nmin,
                                 rec1.bez_kenmerk_nmax,
                                 p_key,
                                 rec1.bez_kenmerk_key);

         createxmltagvalueattributes9 ('kenmerk',
                                       'kenmerkcode', rec1.bez_kenmerk_code,
                                       'naam',        rec1.bez_kenmerk_omschrijving,
                                       'type',        rec1.bez_kenmerk_kenmerktype,
                                       'volgnummer',  rec1.volgnummer,
                                       'key',         rec1.bez_kenmerk_key,
                                       'dimensie',    rec1.dimensie,
                                       'systeem',     rec1.bez_kenmerk_systeem,
                                       NULL,          NULL,
                                       NULL,          NULL,
                                       rec1.fac_kenmerkdomein_key,
                                       v_kenmerk_waarde
                                      );
      END LOOP;
   END;

   PROCEDURE create_bez_bezoeker_node (p_key IN NUMBER)
   AS
      v_afspraak_key         bez_bezoekers.bez_afspraak_key%TYPE;
      v_afspraak_naam        bez_bezoekers.bez_afspraak_naam%TYPE;
      v_afspraak_bedrijf     bez_bezoekers.bez_afspraak_bedrijf%TYPE;
      v_contactpersoon_key   bez_bezoekers.prs_contactpersoon_key%TYPE;
      v_perslid_key          bez_bezoekers.prs_perslid_key%TYPE;
      v_afspraak_opmerking   bez_bezoekers.bez_bezoekers_opmerking%TYPE;
      v_done                 bez_bezoekers.bez_bezoekers_done%TYPE;
      v_out                  bez_bezoekers.bez_bezoekers_out%TYPE;
      v_done_actual          bez_bezoekers.bez_bezoekers_done_actual%TYPE;
      v_out_actual           bez_bezoekers.bez_bezoekers_out_actual%TYPE;
      v_pasnr                bez_bezoekers.bez_bezoekers_pasnr%TYPE;
      v_aanmaak              bez_bezoekers.bez_bezoekers_aanmaak%TYPE;
      v_telefoon             bez_bezoekers.bez_bezoekers_telefoon%TYPE;
      v_email                bez_bezoekers.bez_bezoekers_email%TYPE;
      v_kenteken             bez_bezoekers.bez_bezoekers_kenteken%TYPE;
      v_parkeerplaats_key    res_rsv_deel.res_deel_key%TYPE;
      v_parkeer_prijs        res_deel.res_deel_prijs%TYPE;
      v_parkeer_prijs_vast   res_deel.res_deel_prijs_vast%TYPE;
      v_parkeer_key          ins_deel.ins_deel_key%TYPE;
      v_parkeer_omschr       res_deel.res_deel_omschrijving%TYPE;
      v_externnr             bez_bezoekers.bez_bezoekers_externnr%TYPE;
      v_externsyncdate       bez_bezoekers.bez_bezoekers_externsyncdate%TYPE;
   BEGIN
      IF p_key = -1
      THEN
        RETURN;
      END IF;

      createopentag ('bezoeker');

      -- bezoekers met evt. parkeerplaats
      SELECT bez_afspraak_key,
             bez_afspraak_naam,
             bez_afspraak_bedrijf,
             bez_bezoekers_opmerking,
             bez_bezoekers_done,
             bez_bezoekers_out,
             bez_bezoekers_done_actual,
             bez_bezoekers_out_actual,
             bez_bezoekers_pasnr,
             bez_bezoekers_aanmaak,
             prs_perslid_key,
             prs_contactpersoon_key,
             bez_bezoekers_telefoon,
             bez_bezoekers_email,
             bez_bezoekers_kenteken,
             bez_bezoekers_externnr,
             bez_bezoekers_externsyncdate
        INTO v_afspraak_key,
             v_afspraak_naam,
             v_afspraak_bedrijf,
             v_afspraak_opmerking,
             v_done,
             v_out,
             v_done_actual,
             v_out_actual,
             v_pasnr,
             v_aanmaak,
             v_perslid_key,
             v_contactpersoon_key,
             v_telefoon,
             v_email,
             v_kenteken,
             v_externnr,
             v_externsyncdate
        FROM bez_bezoekers b
       WHERE b.bez_bezoekers_key = p_key;

      createxmltagvalue ('key', p_key);
      createxmltagvalue ('naam', v_afspraak_naam);
      createxmltagvalue ('bedrijf', v_afspraak_bedrijf);
      createxmltagvalue ('opmerking', v_afspraak_opmerking);
      create_prs_perslid_node (v_perslid_key, 'intern_user', TRUE);
      create_prs_contactpersoon_node (v_contactpersoon_key, FALSE);
      mydatetochar ('done', v_done);
      mydatetochar ('out', v_out);
      mydatetochar ('gearriveerd', v_done_actual);
      mydatetochar ('vertrokken', v_out_actual);
      create_bez_kenmerken (p_key);
      createxmltagvalue ('pasnr', v_pasnr);
      createxmltagvalue ('telefoon', v_telefoon);
      createxmltagvalue ('email', v_email);
      createxmltagvalue ('kenteken', v_kenteken);
      mydatetochar ('aanmaak', v_aanmaak);
      createxmltagvalue ('externnr', v_externnr);
      mydatetochar ('syncdate', v_externsyncdate);
      -- als zelfstandig aangeroepen, dan moet er nog wel iets van de afspraak bij
      create_bez_afspraak_node (v_afspraak_key, -1, TRUE);

      BEGIN
         SELECT rd.res_deel_prijs,
                rd.res_deel_prijs_vast,
                d.ins_deel_key,
                rd.res_deel_omschrijving
           INTO v_parkeer_prijs,
                v_parkeer_prijs_vast,
                v_parkeer_key,
                v_parkeer_omschr
           FROM res_rsv_deel rrd, res_deel rd, ins_deel d
          WHERE     d.ins_deel_key = rd.res_ins_deel_key
                AND rd.res_deel_key = rrd.res_deel_key
                AND rrd.bez_bezoekers_key = p_key;

         -- misschien maar 1 van de 2 doen?
         createxmltagvalue ('parkeerplaats', v_parkeer_omschr);
         create_ins_deel_node (v_parkeer_key, null, TRUE);
      EXCEPTION
         WHEN OTHERS
         THEN
            -- meerdere parkeerplaatsen per bezoeker doen we niet aan.
            NULL;
      END;

      createclosetag ('bezoeker');
   END;

   PROCEDURE create_bez_afspraak_node (p_key       IN NUMBER,
                                       p_extra     IN NUMBER,
                                       p_concise   IN BOOLEAN)
   AS
      v_perslid_key         bez_afspraak.prs_perslid_key%TYPE;
      v_host_key            bez_afspraak.bez_afspraak_host_key%TYPE;
      v_contact_key         bez_afspraak.bez_afspraak_contact_key%TYPE;
      v_gastheer            bez_afspraak.bez_afspraak_gastheer%TYPE;
      v_telefoonnr          bez_afspraak.bez_afspraak_telefoonnr%TYPE;
      v_datum               bez_afspraak.bez_afspraak_datum%TYPE;
      v_actie_key           bez_afspraak.bez_actie_key%TYPE;
      v_locatie_key         bez_afspraak.alg_locatie_key%TYPE;
      v_rsv_ruimte_key      bez_afspraak.res_rsv_ruimte_key%TYPE;
      v_onrgoed_keys        bez_afspraak.alg_onrgoed_keys%TYPE;
      v_ruimte              bez_afspraak.bez_afspraak_ruimte%TYPE;
      v_opmerking           bez_afspraak.bez_afspraak_opmerking%TYPE;
      v_eind                bez_afspraak.bez_afspraak_eind%TYPE;
      v_aanmaak             bez_afspraak.bez_afspraak_aanmaak%TYPE;
      v_actie_omschr        bez_actie.bez_actie_omschrijving%TYPE;
      v_actie_groep_key     bez_actie_groep.bez_actie_groep_key%TYPE;
      v_actie_groep_omschr  bez_actie_groep.bez_actie_groep_omschrijving%TYPE;
      v_externnr            bez_afspraak.bez_afspraak_externnr%TYPE;
      v_externsyncdate      bez_afspraak.bez_afspraak_externsyncdate%TYPE;

      CURSOR c1
      IS
         SELECT bez_bezoekers_key
           FROM bez_bezoekers
          WHERE bez_afspraak_key = p_key;
   BEGIN
      IF p_concise
      THEN
         createconciseopentag ('afspraak');
      ELSE
         createopentag ('afspraak');
      END IF;

      SELECT prs_perslid_key,
             bez_afspraak_host_key,
             bez_afspraak_contact_key,
             bez_afspraak_gastheer,
             bez_afspraak_telefoonnr,
             bez_afspraak_datum,
             ba.bez_actie_key,
             alg_locatie_key,
             res_rsv_ruimte_key,
             alg_onrgoed_keys,
             bez_afspraak_ruimte,
             bez_afspraak_opmerking,
             bez_afspraak_eind,
             bez_afspraak_aanmaak,
             lcl.x ('bez_actie_omschrijving',
                    ac.bez_actie_key,
                    bez_actie_omschrijving)
                bez_actie_omschrijving,
             ag.bez_actie_groep_key,
             ag.bez_actie_groep_omschrijving,
             bez_afspraak_externnr,
             bez_afspraak_externsyncdate
        INTO v_perslid_key,
             v_host_key,
             v_contact_key,
             v_gastheer,
             v_telefoonnr,
             v_datum,
             v_actie_key,
             v_locatie_key,
             v_rsv_ruimte_key,
             v_onrgoed_keys,
             v_ruimte,
             v_opmerking,
             v_eind,
             v_aanmaak,
             v_actie_omschr,
             v_actie_groep_key,
             v_actie_groep_omschr,
             v_externnr,
             v_externsyncdate
        FROM bez_afspraak ba, bez_actie ac, bez_actie_groep ag
       WHERE ba.bez_actie_key = ac.bez_actie_key(+)
             AND ac.bez_actie_groep_key = ag.bez_actie_groep_key(+)
             AND bez_afspraak_key = p_key;

      -- bezoekers met evt. parkeerplaats
      createxmltagvalue ('key', p_key);

      -- als 1 specifieke bezoeker meegegeven, dan alleen die opnemen
      -- Bij -1 is de bezoekernode leeg (anders oneindig)
      IF p_extra IS NOT NULL
      THEN
         create_bez_bezoeker_node (p_extra);
      ELSE
         FOR rec1 IN c1
         LOOP
            create_bez_bezoeker_node (rec1.bez_bezoekers_key);
         END LOOP;
      END IF;

      create_prs_perslid_node (v_host_key, 'host_user', p_concise);
      createxmltagvalue ('gastheer', v_gastheer);
      create_prs_perslid_node (v_contact_key, 'contact_user', p_concise);
      createxmltagvalue ('telefoonnr', v_telefoonnr);
      mydatetochar ('datum', v_datum);
      mydatetochar ('eind', v_eind);
      mydatetochar ('aanmaak', v_aanmaak);
      createxmltagvalue ('actiekey', v_actie_key);
      createxmltagvalue ('actie', v_actie_omschr);
      createxmltagvalue ('actiegroepkey', v_actie_groep_key);
      createxmltagvalue ('actiegroep', v_actie_groep_omschr);
      createxmltagvalue ('ruimte', v_ruimte); -- de stringvariant van alg_ruimte_key?
      createxmltagvalue ('opmerking', v_opmerking);
      createxmltagvalue ('externnr', v_externnr);
      mydatetochar ('externsyncdate', v_externsyncdate);

      IF NOT p_concise
      THEN
         create_prs_perslid_node (v_perslid_key, 'ingevoerd_user', TRUE);

         IF v_onrgoed_keys IS NULL
         THEN
            create_alg_onroerendgoed_node (v_locatie_key,
                                           'plaats',
                                           v_locatie_key,
                                           p_concise,
                                           FALSE);
         ELSE
            create_alg_onroerendgoed_node (v_onrgoed_keys,
                                           'plaats',
                                           NULL,
                                           p_concise,
                                           FALSE);
         END IF;

         -- rsv_ruimte? Als deze afspraak binnen een reservering valt, dan is die ook bij die reservering genest
         -- als ik dan alleen de afspraak beschouw, is slechts  beperkte info van de res_rsv_ruimte hier nodig.
         -- De afspraakgegevens zijn hier bekend, deze link is alleen om ze (reservering en afspraak) bij elkaar te houden
         -- Hoedan ook: toch een korte vermelding van de bijbehorendende reservering als die er is
         IF v_rsv_ruimte_key IS NOT NULL
         THEN
            create_res_rsv_ruimte_node (v_rsv_ruimte_key, TRUE);
         END IF;

      END IF;

      createclosetag ('afspraak');
   END;

   --
   --
   -- RESERVERINGEN
   --
   --

   PROCEDURE create_res_kenmerken (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT k.res_kenmerk_key,
                  k.res_kenmerk_code,
                  s.res_srtkenmerk_code,
                  COALESCE (
                      lcl.x ('res_kenmerk_omschrijving', k.res_kenmerk_key, res_kenmerk_omschrijving),
                      lcl.x ('res_srtkenmerk_omschrijving', s.res_srtkenmerk_key, res_srtkenmerk_omschrijving)) res_kenmerk_omschrijving,
                  s.res_srtkenmerk_kenmerktype,
                  s.fac_kenmerkdomein_key,
                  s.res_srtkenmerk_lengte,
                  s.res_srtkenmerk_dec,
                  s.res_srtkenmerk_nmin,
                  s.res_srtkenmerk_nmax,
                  k.res_kenmerk_default,
                  NVL (k.res_kenmerk_volgnummer, 0) volgnummer,
                  lcl.x ('res_srtkenmerk_dimensie',
                         s.res_srtkenmerk_key,
                         res_srtkenmerk_dimensie)
                     dimensie,
                  lcl.x ('res_kenmerk_hint',
                         k.res_kenmerk_key,
                         res_kenmerk_hint)
                     hint,
                  v.res_kenmerkreservering_waarde
             FROM res_kenmerk k,
                  res_srtkenmerk s,
                  res_rsv_ruimte rr,
                  (SELECT v.res_kenmerk_key, v.res_kenmerkreservering_waarde
                     FROM res_kenmerkwaarde v
                    WHERE v.res_rsv_ruimte_key = p_key
                          AND v.res_kenmerkwaarde_verwijder IS NULL) v
            WHERE     rr.res_activiteit_key = k.res_activiteit_key
                  AND rr.res_rsv_ruimte_key = p_key
                  AND k.res_kenmerk_verwijder IS NULL
                  AND k.res_srtkenmerk_key = s.res_srtkenmerk_key
                  AND v.res_kenmerk_key(+) = k.res_kenmerk_key
         ORDER BY k.res_kenmerk_volgnummer;

      v_kenmerk_waarde       res_kenmerkwaarde.res_kenmerkreservering_waarde%TYPE;
   BEGIN
      FOR rec1 IN c1
      LOOP
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.res_kenmerkreservering_waarde,
                                 rec1.res_kenmerk_default,
                                 rec1.res_srtkenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.res_srtkenmerk_nmin,
                                 rec1.res_srtkenmerk_nmax,
                                 p_key,
                                 rec1.res_kenmerk_key);

         createxmltagvalueattributes9('kenmerk',
                                      'kenmerkcode',     rec1.res_kenmerk_code,
                                      'srtkenmerkcode',  rec1.res_srtkenmerk_code,
                                      'naam',            rec1.res_kenmerk_omschrijving,
                                      'type',            rec1.res_srtkenmerk_kenmerktype,
                                      'volgnummer',      rec1.volgnummer,
                                      'key',             rec1.res_kenmerk_key,
                                      'dimensie',        rec1.dimensie,
                                      NULL,              NULL,
                                      NULL,              NULL,
                                      rec1.fac_kenmerkdomein_key,
                                      v_kenmerk_waarde
                                     );
      END LOOP;
   END;

   PROCEDURE create_res_kenmerken_rsv_art (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT k.res_kenmerk_key,
                  k.res_kenmerk_code,
                  s.res_srtkenmerk_code,
                  COALESCE (
                      lcl.x ('res_kenmerk_omschrijving', k.res_kenmerk_key, res_kenmerk_omschrijving),
                      lcl.x ('res_srtkenmerk_omschrijving', s.res_srtkenmerk_key, res_srtkenmerk_omschrijving)) res_kenmerk_omschrijving,
                  s.res_srtkenmerk_kenmerktype,
                  s.fac_kenmerkdomein_key,
                  s.res_srtkenmerk_lengte,
                  s.res_srtkenmerk_dec,
                  s.res_srtkenmerk_nmin,
                  s.res_srtkenmerk_nmax,
                  k.res_kenmerk_default,
                  NVL (k.res_kenmerk_volgnummer, 0) volgnummer,
                  lcl.x ('res_srtkenmerk_dimensie',
                         s.res_srtkenmerk_key,
                         res_srtkenmerk_dimensie)
                     dimensie,
                  lcl.x ('res_kenmerk_hint',
                         k.res_kenmerk_key,
                         res_kenmerk_hint)
                     hint,
                  v.res_kenmerkartikel_waarde
             FROM res_kenmerk k,
                  res_srtkenmerk s,
                  res_rsv_artikel a,
                  res_artikel ra,
                  (SELECT v.res_kenmerk_key, v.res_kenmerkartikel_waarde
                     FROM res_kenmerkartikel v
                    WHERE v.res_rsv_artikel_key = p_key
                      AND v.res_kenmerkartikel_verwijder IS NULL) v
            WHERE (k.res_artikel_key = a.res_artikel_key OR k.res_discipline_key = ra.res_discipline_key)
              AND a.res_rsv_artikel_key = p_key
              AND a.res_artikel_key = ra.res_artikel_key
              AND k.res_activiteit_key IS NULL
              AND k.res_kenmerk_verwijder IS NULL
              AND k.res_srtkenmerk_key = s.res_srtkenmerk_key
              AND v.res_kenmerk_key(+) = k.res_kenmerk_key
         ORDER BY k.res_kenmerk_volgnummer;

      v_kenmerk_waarde       res_kenmerkartikel.res_kenmerkartikel_waarde%TYPE;
   BEGIN
      FOR rec1 IN c1
      LOOP
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.res_kenmerkartikel_waarde,
                                 rec1.res_kenmerk_default,
                                 rec1.res_srtkenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.res_srtkenmerk_nmin,
                                 rec1.res_srtkenmerk_nmax,
                                 p_key,
                                 rec1.res_kenmerk_key);

         createxmltagvalueattributes9('kenmerk',
                                      'kenmerkcode',     rec1.res_kenmerk_code,
                                      'srtkenmerkcode',  rec1.res_srtkenmerk_code,
                                      'naam',            rec1.res_kenmerk_omschrijving,
                                      'type',            rec1.res_srtkenmerk_kenmerktype,
                                      'volgnummer',      rec1.volgnummer,
                                      'key',             rec1.res_kenmerk_key,
                                      'dimensie',        rec1.dimensie,
                                      NULL,              NULL,
                                      NULL,              NULL,
                                      rec1.fac_kenmerkdomein_key,
                                      v_kenmerk_waarde
                                     );
      END LOOP;
   END;

   PROCEDURE create_res_ruimte_node (p_opstelkey IN NUMBER)
   AS
      v_bezoekers        res_ruimte_opstelling.res_ruimte_opstel_bezoekers%TYPE;
      v_opstelling       res_opstelling.res_opstelling_omschrijving%TYPE;
      v_res_ruimte_key   res_ruimte_opstelling.res_ruimte_key%TYPE;
      v_resruimte        res_ruimte.res_ruimte_omschrijving%TYPE;
      v_volgnummer       res_ruimte.res_ruimte_volgnummer%TYPE;
      v_minbezoekers     res_ruimte.res_ruimte_minbezoekers%TYPE;
      v_discipline_key   res_ruimte.res_discipline_key%TYPE;
      v_verwijder        res_ruimte.res_ruimte_verwijder%TYPE;
      v_res_ruimte_nr    res_ruimte.res_ruimte_nr%TYPE;
      v_begintijd        res_ruimte.res_ruimte_begintijd%TYPE;
      v_eindtijd         res_ruimte.res_ruimte_eindtijd%TYPE;
      v_prijs_vast       res_ruimte.res_ruimte_prijs_vast%TYPE;
      v_prijs            res_ruimte.res_ruimte_prijs%TYPE;
      v_prijs_ochtend    res_ruimte.res_ruimte_prijs_ochtend%TYPE;
      v_prijs_middag     res_ruimte.res_ruimte_prijs_middag%TYPE;
      v_prijs_avond      res_ruimte.res_ruimte_prijs_avond%TYPE;
      v_prijs_dag        res_ruimte.res_ruimte_prijs_dag%TYPE;
      v_prijsfactor_intern res_ruimte.res_ruimte_prijsfactor_intern%TYPE;
      v_groep            res_ruimte.res_ruimte_groep%TYPE;
      v_extern_id        res_ruimte.res_ruimte_extern_id%TYPE;
      v_externsyncdate   res_ruimte.res_ruimte_externsyncdate%TYPE;
      v_image            res_ruimte.res_ruimte_image%type;
      v_graphhooksecret  res_ruimte.res_ruimte_graphhooksecret%TYPE;

      CURSOR c1 (k IN NUMBER)
      IS
         SELECT alg_ruimte_key
           FROM res_alg_ruimte
          WHERE res_ruimte_key = k AND res_alg_ruimte_verwijder IS NULL;
   BEGIN
      createopentag ('res_ruimte');

      SELECT ro.res_ruimte_opstel_bezoekers,
             lcl.x ('res_opstelling_omschrijving',
                    o.res_opstelling_key,
                    res_opstelling_omschrijving)
                res_opstelling_omschrijving,
             ro.res_ruimte_key,
             lcl.x ('res_ruimte_omschrijving',
                    r.res_ruimte_key,
                    res_ruimte_omschrijving)
                res_ruimte_omschrijving,
             lcl.x ('res_ruimte_nr', r.res_ruimte_key, res_ruimte_nr)
                res_ruimte_nr,
             r.res_discipline_key,
             r.res_ruimte_verwijder,
             res_ruimte_begintijd,
             res_ruimte_eindtijd,
             res_ruimte_prijs_vast,
             res_ruimte_prijs,
             res_ruimte_prijs_ochtend,
             res_ruimte_prijs_middag,
             res_ruimte_prijs_avond,
             res_ruimte_prijs_dag,
             res_ruimte_prijsfactor_intern,
             res_ruimte_groep,
             res_ruimte_extern_id,
             res_ruimte_externsyncdate,
	          COALESCE(res_ruimte_opstel_image, res_ruimte_image),
	          res_ruimte_graphhooksecret,
             res_ruimte_volgnummer,
             res_ruimte_minbezoekers
        INTO v_bezoekers,
             v_opstelling,
             v_res_ruimte_key,
             v_resruimte,
             v_res_ruimte_nr,
             v_discipline_key,
             v_verwijder,
             v_begintijd,
             v_eindtijd,
             v_prijs_vast,
             v_prijs,
             v_prijs_ochtend,
             v_prijs_middag,
             v_prijs_avond,
             v_prijs_dag,
             v_prijsfactor_intern,
             v_groep,
             v_extern_id,
             v_externsyncdate,
             v_image,
             v_graphhooksecret,
             v_volgnummer,
             v_minbezoekers
        FROM res_ruimte_opstelling ro, res_opstelling o, res_ruimte r
       WHERE     o.res_opstelling_key = ro.res_opstelling_key
             AND r.res_ruimte_key = ro.res_ruimte_key
             AND ro.res_ruimte_opstel_key = p_opstelkey;

      createxmltagvalue ('key', p_opstelkey);                       -- pas op!
      create_ins_discipline_node (v_discipline_key);
      createxmltagvalue ('opstelling', v_opstelling);
      createxmltagvalue ('bezoekers', v_bezoekers);
      createxmltagvalue ('omschrijving', v_resruimte);
      createxmltagvalue ('volgnummer', v_volgnummer);
      createxmltagvalue ('minbezoekers', v_minbezoekers);
      createxmltagvalue ('nr', v_res_ruimte_nr);
      mydatetochar ('verwijder', v_verwijder);
      createxmltagvalue ('begintijd', v_begintijd);
      createxmltagvalue ('eindtijd', v_eindtijd);
      createxmltagvalue ('prijs_vast', v_prijs_vast);
      createxmltagvalue ('prijs', v_prijs);
      createxmltagvalue ('prijs_ochtend', v_prijs_ochtend);
      createxmltagvalue ('prijs_middag', v_prijs_middag);
      createxmltagvalue ('prijs_avond', v_prijs_avond);
      createxmltagvalue ('prijs_dag', v_prijs_dag);
      createxmltagvalue ('prijsfactor_intern', v_prijsfactor_intern);
      createxmltagvalue ('groep', v_groep);
      createxmltagvalue ('extern_id', v_extern_id);
      mydatetochar ('externsyncdate', v_externsyncdate);
      createxmltagvalue ('image', v_image);
      createxmltagvalue ('graphhooksecret', v_graphhooksecret);

      FOR rec1 IN c1 (v_res_ruimte_key)
      LOOP
         create_alg_onroerendgoed_node (rec1.alg_ruimte_key,
                                        'plaats',
                                        NULL,
                                        FALSE,
                                        FALSE);
      END LOOP;

      createclosetag ('res_ruimte');
   END;

   PROCEDURE create_res_deel_node (p_key IN NUMBER, p_aantal IN NUMBER)
   AS
      v_key              res_deel.res_deel_key%TYPE;
      v_ins_deel_key     res_deel.res_ins_deel_key%TYPE;
      v_omschrijving     res_deel.res_deel_omschrijving%TYPE;
      v_eenheid          res_deel.res_deel_eenheid%TYPE;
      v_prijs            res_deel.res_deel_prijs%TYPE;
      v_prijs_vast       res_deel.res_deel_prijs_vast%TYPE;
      v_bulkrsvbaar      res_deel.res_deel_bulkreserveerbaar%TYPE;
      v_discipline_key   res_deel.res_discipline_key%TYPE;
      v_opmerking        res_deel.res_deel_opmerking%TYPE;
      v_verwijder        res_deel.res_deel_verwijder%TYPE;
      v_alg_level        res_deel.res_deel_alg_level%TYPE;
      v_prs_perslid_key  res_deel.res_prs_perslid_key%TYPE;
      v_image            res_deel.res_deel_image%TYPE;
      v_externnr         res_deel.res_deel_externnr%TYPE;
      v_externsyncdate   res_deel.res_deel_externsyncdate%TYPE;
   BEGIN
      createopentag ('res_deel');

      SELECT res_ins_deel_key,
             lcl.x ('res_deel_omschrijving', res_deel_key, res_deel_omschrijving)
                res_deel_omschrijving,
             lcl.x ('res_deel_eenheid', res_deel_key, res_deel_eenheid)
                res_deel_eenheid,
             res_deel_prijs,
             res_deel_prijs_vast,
             res_deel_bulkreserveerbaar,
             lcl.x ('res_deel_opmerking', res_deel_key, res_deel_opmerking)
                res_deel_opmerking,
             res_discipline_key,
             res_deel_verwijder,
             res_prs_perslid_key,
             res_deel_alg_level,
             res_deel_image,
             res_deel_externnr,
             res_deel_externsyncdate
        INTO v_ins_deel_key,
             v_omschrijving,
             v_eenheid,
             v_prijs,
             v_prijs_vast,
             v_bulkrsvbaar,
             v_opmerking,
             v_discipline_key,
             v_verwijder,
             v_prs_perslid_key,
             v_alg_level,
             v_image,
             v_externnr,
             v_externsyncdate
        FROM res_deel rd
       WHERE rd.res_deel_key = p_key;

      createxmltagvalue ('key', p_key);
      create_ins_discipline_node (v_discipline_key);
      create_ins_deel_node (v_ins_deel_key, null, TRUE);
      createxmltagvalue ('omschrijving', v_omschrijving);
      createxmltagvalue ('eenheid', v_eenheid);
      createxmltagvalue ('prijs', v_prijs);
      createxmltagvalue ('prijsvast', v_prijs_vast);
      createxmltagvalue ('bulkreserveerbaar', v_bulkrsvbaar);
      createxmltagvalue ('opmerking', v_opmerking);
      mydatetochar ('verwijder', v_verwijder);
      create_prs_perslid_node (v_prs_perslid_key, 'persoon', TRUE);
      createxmltagvalue ('alglevel', v_alg_level);
      createxmltagvalue ('image', v_image);
      createxmltagvalue ('externnr', v_externnr);
      mydatetochar ('externsyncdate', v_externsyncdate);
      createclosetag ('res_deel');
   END;

   PROCEDURE create_res_rsv_deel_node (p_key IN NUMBER, p_aantal IN NUMBER)
   AS
      v_deel_key           res_rsv_deel.res_deel_key%TYPE;
      v_aantal             res_rsv_deel.res_rsv_deel_aantal%TYPE;
      v_status_bo_key      res_rsv_deel.res_status_bo_key%TYPE;
      v_rsv_ruimte_key     res_rsv_deel.res_rsv_ruimte_key%TYPE;
      v_van                res_rsv_deel.res_rsv_deel_van%TYPE;
      v_tot                res_rsv_deel.res_rsv_deel_tot%TYPE;
      v_prijs              res_rsv_deel.res_rsv_deel_prijs%TYPE;
      v_aanmaak            res_rsv_deel.res_rsv_deel_aanmaak%TYPE;
      v_verwijder          res_rsv_deel.res_rsv_deel_verwijder%TYPE;
      bez_bezoekers_key    res_rsv_deel.bez_bezoekers_key%TYPE;
      v_verwerkt           res_rsv_deel.res_rsv_deel_verwerkt%TYPE;
      --      v_user_key           res_rsv_deel.res_rsv_deel_user_key%TYPE;
      v_afgemeld           res_rsv_deel.res_rsv_deel_afgemeld%TYPE;
      --      v_afgemeld_user      res_rsv_deel.res_rsv_deel_afgemeld_user%TYPE;
      v_status_bo_omschr   res_status_bo.res_status_bo_omschrijving%TYPE;
      v_dirtlevel          res_rsv_deel.res_rsv_deel_dirtlevel%TYPE;
      v_geleverd           res_rsv_deel.res_rsv_deel_geleverd%TYPE;
      v_externnr           res_rsv_deel.res_rsv_deel_externnr%TYPE;
      v_externsyncdate     res_rsv_deel.res_rsv_deel_externsyncdate%TYPE;
   BEGIN
      createopentag ('rsv_deel');

      SELECT rd.res_deel_key,
             res_rsv_deel_aantal,
             rd.res_status_bo_key,
             res_rsv_ruimte_key,
             res_rsv_deel_van,
             res_rsv_deel_tot,
             res.getdeelprijs (res_rsv_deel_key),
             res_rsv_deel_aanmaak,
             res_rsv_deel_verwijder,
             bez_bezoekers_key,
             sb.res_status_bo_omschrijving,
             res_rsv_deel_dirtlevel,
             res_rsv_deel_geleverd,
             res_rsv_deel_externnr,
             res_rsv_deel_externsyncdate
        INTO v_deel_key,
             v_aantal,
             v_status_bo_key,
             v_rsv_ruimte_key,
             v_van,
             v_tot,
             v_prijs,
             v_aanmaak,
             v_verwijder,
             bez_bezoekers_key,
             v_status_bo_omschr,
             v_dirtlevel,
             v_geleverd,
             v_externnr,
             v_externsyncdate
        FROM res_rsv_deel rd, res_status_bo sb, res_deel rdd
       WHERE     rd.res_status_bo_key = sb.res_status_bo_key(+)
             AND rd.res_deel_key = rdd.res_deel_key
             AND rd.res_rsv_deel_key = p_key;

      createxmltagvalue ('key', p_key);
      create_res_deel_node (v_deel_key, p_aantal);
      IF p_aantal IS NOT NULL AND p_aantal > 0
      THEN
         createxmltagvalue ('aantal', p_aantal);
          createxmltagvalue ('prijs', p_aantal * v_prijs);
      ELSE
         createxmltagvalue ('aantal', v_aantal);
          createxmltagvalue ('prijs', v_prijs);
      END IF;
      createxmltagvalue ('status_bokey', v_status_bo_key);
      createxmltagvalue ('status_bo', v_status_bo_omschr);
      createxmltagvalue ('dirtlevel', v_dirtlevel);
      createxmltagvalue ('res_ruimte', v_rsv_ruimte_key);
      mydatetochar ('van', v_van);
      mydatetochar ('tot', v_tot);
      mydatetochar ('aanmaak', v_aanmaak);
      mydatetochar ('verwijder', v_verwijder);
      mydatetochar ('geleverd', v_geleverd);
      createxmltagvalue ('bezoeker', bez_bezoekers_key); -- als dit een parkeerplaats is
      createxmltagvalue ('externnr', v_externnr);
      mydatetochar ('externsyncdate', v_externsyncdate);
      -- bezoekersgegevens toevoegen? Die komen ook al via de bovenkant
      createclosetag ('rsv_deel');
   END;

   PROCEDURE create_res_artikel_node (p_key IN NUMBER)
   AS
      v_key               res_artikel.res_artikel_key%TYPE;
      v_discipline_key    res_artikel.res_discipline_key%TYPE;
      v_nr                res_artikel.res_artikel_nr%TYPE;
      v_omschrijving      res_artikel.res_artikel_omschrijving%TYPE;
      v_eenheid           res_artikel.res_artikel_eenheid%TYPE;
      v_prijs             res_artikel.res_artikel_prijs%TYPE;
      v_prijs_vast        res_artikel.res_artikel_prijs_vast%TYPE;
      v_inkoopprijs       res_artikel.res_artikel_inkoopprijs%TYPE;
      v_btw               res_artikel.res_artikel_btw%TYPE;
      v_opmerking         res_artikel.res_artikel_opmerking%TYPE;
      v_default           res_artikel.res_artikel_default%TYPE;
      v_verwijder         res_artikel.res_artikel_verwijder%TYPE;
      v_groep             res_artikel.res_artikel_groep%TYPE;
      v_kostenpersoneel   res_artikel.res_artikel_kostenpersoneel%TYPE;
      v_kostenalgemeen    res_artikel.res_artikel_kostenalgemeen%TYPE;
      v_volgnummer        res_artikel.res_artikel_volgnummer%TYPE;
      v_image             res_artikel.res_artikel_image%TYPE;
      v_externnr          res_artikel.res_artikel_externnr%TYPE;
      v_externsyncdate    res_artikel.res_artikel_externsyncdate%TYPE;
   BEGIN
      createopentag ('res_artikel');

      SELECT res_discipline_key,
             res_artikel_nr,
             lcl.x ('res_artikel_omschrijving',
                    res_artikel_key,
                    res_artikel_omschrijving)
                res_artikel_omschrijving,
             lcl.x ('res_artikel_eenheid',
                    res_artikel_key,
                    res_artikel_eenheid)
                res_artikel_eenheid,
             res_artikel_prijs,
             res_artikel_prijs_vast,
             res_artikel_inkoopprijs,
             res_artikel_btw,
             lcl.x ('res_artikel_opmerking',
                    res_artikel_key,
                    res_artikel_opmerking)
                res_artikel_opmerking,
             res_artikel_default,
             res_artikel_verwijder,
             res_artikel_groep,
             res_artikel_kostenpersoneel,
             res_artikel_kostenalgemeen,
             res_artikel_volgnummer,
             res_artikel_image,
             res_artikel_externnr,
             res_artikel_externsyncdate
        INTO v_discipline_key,
             v_nr,
             v_omschrijving,
             v_eenheid,
             v_prijs,
             v_prijs_vast,
             v_inkoopprijs,
             v_btw,
             v_opmerking,
             v_default,
             v_verwijder,
             v_groep,
             v_kostenpersoneel,
             v_kostenalgemeen,
             v_volgnummer,
             v_image,
             v_externnr,
             v_externsyncdate
        FROM res_artikel ra
       WHERE ra.res_artikel_key = p_key;

      createxmltagvalue ('key', p_key);
      create_ins_discipline_node (v_discipline_key);
      createxmltagvalue ('nr', v_nr);
      createxmltagvalue ('omschrijving', v_omschrijving);
      createxmltagvalue ('eenheid', v_eenheid);
      createxmltagvalue ('prijs', v_prijs);
      createxmltagvalue ('prijsvast', v_prijs_vast);
      createxmltagvalue ('inkoopprijs', v_inkoopprijs);
      createxmltagvalue ('btw', v_btw);
      createxmltagvalue ('volgnummer', v_volgnummer);
      createxmltagvalue ('opmerking', v_opmerking);
      createxmltagvalue ('default', v_default);
      mydatetochar ('verwijder', v_verwijder);
      createxmltagvalue ('groep', v_groep);
      createxmltagvalue ('kostenpersoneel', v_kostenpersoneel);
      createxmltagvalue ('kostenalgemeen', v_kostenalgemeen);
      createxmltagvalue ('image', v_image);
      createxmltagvalue ('externnr', v_externnr);
      mydatetochar ('externsyncdate', v_externsyncdate);
      createclosetag ('res_artikel');
   END;

   PROCEDURE create_res_rsv_artikel_node (p_key IN NUMBER)
   AS
      v_artikel_key        res_rsv_artikel.res_artikel_key%TYPE;
      v_aantal             res_rsv_artikel.res_rsv_artikel_aantal%TYPE;
      v_levering           res_rsv_artikel.res_rsv_artikel_levering%TYPE;
      v_status_bo_key      res_rsv_artikel.res_status_bo_key%TYPE;
      v_rsv_ruimte_key     res_rsv_artikel.res_rsv_ruimte_key%TYPE;
      v_prijs              res_rsv_artikel.res_rsv_artikel_prijs%TYPE;
      v_aanmaak            res_rsv_artikel.res_rsv_artikel_aanmaak%TYPE;
      v_verwijder          res_rsv_artikel.res_rsv_artikel_verwijder%TYPE;
      v_verwerkt           res_rsv_artikel.res_rsv_artikel_verwerkt%TYPE;
      --      v_user_key           res_rsv_artikel.res_rsv_artikel_user_key%TYPE;
      v_afgemeld           res_rsv_artikel.res_rsv_artikel_afgemeld%TYPE;
      --      v_afgemeld_user      res_rsv_artikel.res_rsv_artikel_afgemeld_user%TYPE;
      v_status_bo_omschr   res_status_bo.res_status_bo_omschrijving%TYPE;
      v_dirtlevel          res_rsv_artikel.res_rsv_artikel_dirtlevel%TYPE;
      v_approved           res_rsv_artikel.res_rsv_artikel_approved%TYPE;
      v_geleverd           res_rsv_artikel.res_rsv_artikel_geleverd%TYPE;
      v_afhalen            res_rsv_artikel.res_rsv_artikel_afhalen%TYPE;
      v_externnr           res_rsv_artikel.res_rsv_artikel_externnr%TYPE;
      v_externsyncdate     res_rsv_artikel.res_rsv_artikel_externsyncdate%TYPE;
   BEGIN
      createopentag ('rsv_artikel');

      SELECT ra.res_artikel_key,
             res_rsv_artikel_aantal,
             res_rsv_artikel_levering,
             ra.res_status_bo_key,
             res_rsv_ruimte_key,
             res.getartikelprijs (res_rsv_artikel_key),
             res_rsv_artikel_aanmaak,
             res_rsv_artikel_verwijder,
             sb.res_status_bo_omschrijving,
             res_rsv_artikel_dirtlevel,
             res_rsv_artikel_approved,
             res_rsv_artikel_geleverd,
             res_rsv_artikel_afhalen,
             res_rsv_artikel_externnr,
             res_rsv_artikel_externsyncdate
        INTO v_artikel_key,
             v_aantal,
             v_levering,
             v_status_bo_key,
             v_rsv_ruimte_key,
             v_prijs,
             v_aanmaak,
             v_verwijder,
             v_status_bo_omschr,
             v_dirtlevel,
             v_approved,
             v_geleverd,
             v_afhalen,
             v_externnr,
             v_externsyncdate
        FROM res_rsv_artikel ra, res_status_bo sb, res_artikel raa
       WHERE ra.res_status_bo_key = sb.res_status_bo_key(+)
         AND raa.res_artikel_key = ra.res_artikel_key
         AND res_rsv_artikel_key = p_key;

      createxmltagvalue ('key', p_key);
      create_res_artikel_node (v_artikel_key);
      createxmltagvalue ('aantal', v_aantal);
      mydatetochar ('levering', v_levering);
      createxmltagvalue ('status_bokey', v_status_bo_key);
      createxmltagvalue ('status_bo', v_status_bo_omschr);
      createxmltagvalue ('dirtlevel', v_dirtlevel);
      createxmltagvalue ('approved', v_approved);
      createxmltagvalue ('prijs', v_prijs);
      mydatetochar ('aanmaak', v_aanmaak);
      mydatetochar ('verwijder', v_verwijder);
      mydatetochar ('geleverd', v_geleverd);
      mydatetochar ('afhalen', v_afhalen);
      createxmltagvalue ('externnr', v_externnr);
      mydatetochar ('externsyncdate', v_externsyncdate);
      create_res_kenmerken_rsv_art (p_key);
      createclosetag ('rsv_artikel');
   END;

   PROCEDURE create_res_srtactiviteit_node (p_key IN NUMBER)
   AS
      v_omschrijving   res_srtactiviteit.res_srtactiviteit_omschrijving%TYPE;
      v_soort          res_srtactiviteit.res_srtactiviteit_soort%TYPE;
   BEGIN
      createopentag ('res_srtactiviteit');

      SELECT lcl.x ('res_srtactiviteit_omschrijving',
                    res_srtactiviteit_key,
                    res_srtactiviteit_omschrijving)
                res_srtactiviteit_omschrijving,
             res_srtactiviteit_soort
        INTO v_omschrijving, v_soort
        FROM res_srtactiviteit
       WHERE res_srtactiviteit_key = p_key;

      createxmltagvalue ('key', p_key);
      createxmltagvalue ('omschrijving', v_omschrijving);
      createxmltagvalue ('soort', v_soort);
      createclosetag ('res_srtactiviteit');
   END;

   PROCEDURE create_res_activiteit_node (p_key IN NUMBER)
   AS
   BEGIN
      createopentag ('res_activiteit');

      FOR rec IN (SELECT lcl.x ('res_activiteit_omschrijving',
                                res_activiteit_key,
                                res_activiteit_omschrijving)
                            res_activiteit_omschrijving,
                         res_activiteit_duur,
                         res_srtactiviteit_key,
                         res_activiteit_image,
                         res_activiteit_ismaster,
                         res_activiteit_master_key
                    FROM res_activiteit
                   WHERE res_activiteit_key = p_key)
      LOOP
          createxmltagvalue ('key', p_key);
          createxmltagvalue ('omschrijving', rec.res_activiteit_omschrijving);
          createxmltagvalue ('duur', rec.res_activiteit_duur);
          createxmltagvalue ('image', rec.res_activiteit_image);
          createxmltagvalue ('ismaster', rec.res_activiteit_ismaster);
          createxmltagvalue ('master', rec.res_activiteit_master_key);
          create_res_srtactiviteit_node (rec.res_srtactiviteit_key);
      END LOOP;

      createclosetag ('res_activiteit');
   END;

   PROCEDURE create_res_rsv_ruimte_node (p_key       IN NUMBER,
                                         p_concise   IN BOOLEAN)
   AS
      v_reservering_key        res_rsv_ruimte.res_reservering_key%TYPE;
      v_ruimte_opstel_key      res_rsv_ruimte.res_ruimte_opstel_key%TYPE;
      v_activiteit_key         res_rsv_ruimte.res_activiteit_key%TYPE;
      v_van                    res_rsv_ruimte.res_rsv_ruimte_van%TYPE;
      v_tot                    res_rsv_ruimte.res_rsv_ruimte_tot%TYPE;
      v_van_actual             res_rsv_ruimte.res_rsv_ruimte_van_actual%TYPE;
      v_bezoekers              res_rsv_ruimte.res_rsv_ruimte_bezoekers%TYPE;
      v_ruimteprijs            res_rsv_ruimte.res_rsv_ruimte_prijs%TYPE;
      v_korting                res_rsv_ruimte.res_rsv_ruimte_korting%TYPE;
      v_totaal                 res_rsv_ruimte.res_rsv_ruimte_totaal%TYPE;
      v_status_bo_key          res_rsv_ruimte.res_status_bo_key%TYPE;
      v_status_fo_key          res_rsv_ruimte.res_status_fo_key%TYPE;
      v_noshow                 res_rsv_ruimte.res_rsv_ruimte_noshow%TYPE;
      v_aanmaak                res_rsv_ruimte.res_rsv_ruimte_aanmaak%TYPE;
      v_verwijder              res_rsv_ruimte.res_rsv_ruimte_verwijder%TYPE;
      v_opmerking              res_rsv_ruimte.res_rsv_ruimte_opmerking%TYPE;
      v_omschrijving           res_rsv_ruimte.res_rsv_ruimte_omschrijving%TYPE;
      v_ordernr                res_rsv_ruimte.res_rsv_ruimte_ordernr%TYPE;
      v_prs_kostenplaats_key   res_rsv_ruimte.prs_kostenplaats_key%TYPE;
      v_contact_key            res_rsv_ruimte.res_rsv_ruimte_contact_key%TYPE;
      v_host_key               res_rsv_ruimte.res_rsv_ruimte_host_key%TYPE;
      v_telefoon               res_rsv_ruimte.res_rsv_ruimte_telefoon%TYPE;
      v_alg_ruimte_key         res_rsv_ruimte.alg_ruimte_key%TYPE;
      v_parent_key             res_rsv_ruimte.res_rsv_ruimte_parent_key%TYPE;
      v_volgnr                 res_rsv_ruimte.res_rsv_ruimte_volgnr%TYPE;
      v_kosten_klant           res_rsv_ruimte.res_rsv_ruimte_kosten_klant%TYPE;
      v_status_bo_omschr       res_status_bo.res_status_bo_omschrijving%TYPE;
      v_status_fo_omschr       res_status_fo.res_status_fo_omschrijving%TYPE;
      v_dirtlevel              res_rsv_ruimte.res_rsv_ruimte_dirtlevel%TYPE;
      v_bezoekers_shown        res_rsv_ruimte.res_rsv_ruimte_bezoekers_shown%TYPE;
      v_cvab_mode              res_rsv_ruimte.res_rsv_ruimte_cvab_mode%TYPE;
      v_afgerond               res_rsv_ruimte.res_rsv_ruimte_afgerond%TYPE;
      v_externnr               res_rsv_ruimte.res_rsv_ruimte_externnr%TYPE;
      v_externsyncdate         res_rsv_ruimte.res_rsv_ruimte_externsyncdate%TYPE;
      v_cat_appr               res_rsv_ruimte.res_rsv_ruimte_cat_appr%TYPE;
      v_mld_opdr_key           res_rsv_ruimte.mld_opdr_key%TYPE;

      CURSOR c2d
      IS
         SELECT rd.res_deel_omschrijving, rrd.res_rsv_deel_key, 0 selected
           FROM res_rsv_deel rrd, res_deel  rd
          WHERE rrd.res_rsv_deel_verwijder IS NULL
            AND rrd.res_rsv_ruimte_key = p_key
            AND rrd.res_deel_key = rd.res_deel_key
            AND rd.res_deel_bulkreserveerbaar IS NULL
         UNION ALL -- Van bulk-objecten wordt één 'record' opgeleverd met de laagste res_deel_key
         SELECT res_deel_omschrijving,
                MIN (res_rsv_deel_key) res_rsv_deel_key,
                COUNT (res_deel_omschrijving) selected
           FROM res_deel r1, res_rsv_deel rrd1
          WHERE r1.res_deel_key = rrd1.res_deel_key
            AND rrd1.res_rsv_ruimte_key = p_key
            AND res_deel_bulkreserveerbaar IS NOT NULL
          GROUP BY res_deel_omschrijving;

      CURSOR c2a
      IS
         SELECT ra.res_rsv_artikel_key
           FROM res_rsv_artikel ra
          WHERE ra.res_rsv_artikel_verwijder IS NULL
                AND ra.res_rsv_ruimte_key = p_key;

      CURSOR c3
      IS
         SELECT ba.bez_afspraak_key
           FROM bez_afspraak ba
          WHERE ba.res_rsv_ruimte_key = p_key;

      CURSOR c4
      IS
         SELECT m.mld_melding_key
           FROM mld_melding m
          WHERE m.res_rsv_ruimte_key = p_key;
   BEGIN
      IF p_concise
      THEN
         createconciseopentag ('rsv_ruimte');
      ELSE
         createopentag ('rsv_ruimte');
      END IF;

      SELECT res_reservering_key,
             res_ruimte_opstel_key,
             res_activiteit_key,
             res_rsv_ruimte_van,
             res_rsv_ruimte_tot,
             res_rsv_ruimte_van_actual,
             res_rsv_ruimte_bezoekers,
             res.getruimteprijs (res_rsv_ruimte_key),
             res_rsv_ruimte_korting,
             res_rsv_ruimte_totaal,
             rr.res_status_bo_key,
             rr.res_status_fo_key,
             res_rsv_ruimte_noshow,
             res_rsv_ruimte_aanmaak,
             res_rsv_ruimte_verwijder,
             res_rsv_ruimte_opmerking,
             res_rsv_ruimte_omschrijving,
             res_rsv_ruimte_ordernr,
             prs_kostenplaats_key,
             res_rsv_ruimte_contact_key,
             res_rsv_ruimte_host_key,
             res_rsv_ruimte_telefoon,
             alg_ruimte_key,
             res_rsv_ruimte_parent_key,
             res_rsv_ruimte_volgnr,
             sf.res_status_fo_omschrijving,
             sb.res_status_bo_omschrijving,
             res_rsv_ruimte_kosten_klant,
             res_rsv_ruimte_dirtlevel,
             res_rsv_ruimte_bezoekers_shown,
             res_rsv_ruimte_cvab_mode,
             res_rsv_ruimte_afgerond,
             res_rsv_ruimte_externnr,
             res_rsv_ruimte_externsyncdate,
             res_rsv_ruimte_cat_appr,
             rr.mld_opdr_key
        INTO v_reservering_key,
             v_ruimte_opstel_key,
             v_activiteit_key,
             v_van,
             v_tot,
             v_van_actual,
             v_bezoekers,
             v_ruimteprijs,
             v_korting,
             v_totaal,
             v_status_bo_key,
             v_status_fo_key,
             v_noshow,
             v_aanmaak,
             v_verwijder,
             v_opmerking,
             v_omschrijving,
             v_ordernr,
             v_prs_kostenplaats_key,
             v_contact_key,
             v_host_key,
             v_telefoon,
             v_alg_ruimte_key,
             v_parent_key,
             v_volgnr,
             v_status_fo_omschr,
             v_status_bo_omschr,
             v_kosten_klant,
             v_dirtlevel,
             v_bezoekers_shown,
             v_cvab_mode,
             v_afgerond,
             v_externnr,
             v_externsyncdate,
             v_cat_appr,
             v_mld_opdr_key
        FROM res_rsv_ruimte rr, res_status_fo sf, res_status_bo sb
       WHERE rr.res_status_bo_key = sb.res_status_bo_key(+)
         AND rr.res_status_fo_key = sf.res_status_fo_key(+)
         AND rr.res_rsv_ruimte_key = p_key;

      createxmltagvalue ('key', p_key);
      createxmltagvalue ('volgnr', v_volgnr);
      createxmltagvalue ('id', v_reservering_key||'/'||v_volgnr);
      mydatetochar ('van', v_van);
      mydatetochar ('tot', v_tot);
      mydatetochar ('van_actual', v_van_actual);

      IF v_ruimte_opstel_key IS NOT NULL
      THEN
         create_res_ruimte_node (v_ruimte_opstel_key);
      END IF;

      IF v_activiteit_key IS NOT NULL
      THEN
         create_res_activiteit_node (v_activiteit_key);
      END IF;

      createxmltagvalue ('omschrijving', v_omschrijving);
      createxmltagvalue ('opmerking', v_opmerking);
      IF NOT p_concise
      THEN
         createxmltagvalue ('bezoekers', v_bezoekers);
         createxmltagvalue ('ruimteprijs', v_ruimteprijs);
         createxmltagvalue ('prijs', v_ruimteprijs - COALESCE(v_korting, 0)); -- korting al verwerkt
         createxmltagvalue ('korting', v_korting);
         createxmltagvalue ('afgesprokentotaal', v_totaal);
         createxmltagvalue ('status_bokey', v_status_bo_key);
         createxmltagvalue ('status_bo', v_status_bo_omschr);
         createxmltagvalue ('status_fokey', v_status_fo_key);
         createxmltagvalue ('status_fo', v_status_fo_omschr);
         createxmltagvalue ('noshow', v_noshow);
         createxmltagvalue ('bezoekers_shown', v_bezoekers_shown);
         mydatetochar ('aangemaakt', v_aanmaak);
         mydatetochar ('verwijder', v_verwijder);
         createxmltagvalue ('ordernr', v_ordernr);
         createxmltagvalue ('kosten_klant', v_kosten_klant);
         create_prs_kostenplaats_node (v_prs_kostenplaats_key, FALSE);
         create_prs_perslid_node (v_host_key, 'host_user', FALSE);
         create_prs_perslid_node (v_contact_key, 'contact_user', FALSE);
         createxmltagvalue ('telefoon', v_telefoon);
         create_alg_onroerendgoed_node (v_alg_ruimte_key,
                                        'plaats',
                                        NULL,
                                        p_concise,
                                        FALSE);
         createxmltagvalue ('cvab_mode', v_cvab_mode);
         createxmltagvalue ('afgerond', v_afgerond);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);
         createxmltagvalue ('cat_appr', v_cat_appr);
         createxmltagvalue ('dirtlevel', v_dirtlevel);
         create_mld_opdr_node(v_mld_opdr_key, NULL, TRUE);
         create_res_kenmerken (p_key);
         create_fac_tracking_node ('reservering', p_key);

         FOR rec2a IN c2a
         LOOP
            create_res_rsv_artikel_node (rec2a.res_rsv_artikel_key);
         END LOOP;

         FOR rec2d IN c2d
         LOOP
            create_res_rsv_deel_node (rec2d.res_rsv_deel_key, rec2d.selected);
         END LOOP;

         FOR rec3 IN c3
         LOOP
            create_bez_afspraak_node (rec3.bez_afspraak_key, NULL, TRUE);
         END LOOP;

         FOR rec4 IN c4
         LOOP
            create_mld_melding_node (rec4.mld_melding_key, NULL, TRUE);  -- de opdrachtinfo is ook gewenst
         END LOOP;

         IF (v_parent_key IS NOT NULL)
         THEN
            createopentag ('masterreservering');
            create_res_rsv_ruimte_node(v_parent_key, TRUE);
            createclosetag ('masterreservering');
         END IF;
         createopentag ('subreservering');
         FOR rec IN (SELECT res_rsv_ruimte_key
                       FROM res_rsv_ruimte
                      WHERE res_rsv_ruimte_parent_key = p_key)
         LOOP
            create_res_rsv_ruimte_node(rec.res_rsv_ruimte_key, TRUE);
         END LOOP;
         createclosetag ('subreservering');

      END IF;

      createclosetag ('rsv_ruimte');
   END;

   PROCEDURE create_res_reservering_node (p_key                  IN NUMBER,
                                          p_res_rsv_ruimte_key   IN NUMBER)
   AS
      v_aanmaak            res_reservering.res_reservering_aanmaak%TYPE;
      v_verwijder          res_reservering.res_reservering_verwijder%TYPE;
      v_reservering_key    res_reservering.res_reservering_key%TYPE;
      v_melding_key        res_reservering.mld_melding_key%TYPE;
      v_ispool             res_reservering.res_reservering_ispool%TYPE;
      v_externnr           res_reservering.res_reservering_externnr%TYPE;
      v_externsyncdate     res_reservering.res_reservering_externsyncdate%TYPE;
      v_nrdeelres          NUMBER;
      l_status             VARCHAR2 (7);
      firstres             BOOLEAN := TRUE;
      CURSOR c1(res_key NUMBER)
      IS
           SELECT res_rsv_ruimte_key
             FROM res_rsv_ruimte
            WHERE res_rsv_ruimte_verwijder IS NULL
              AND res_reservering_key = res_key
         ORDER BY res_rsv_ruimte_van;
      CURSOR c2(res_key NUMBER)
      IS
           SELECT res_rsv_ruimte_key
             FROM res_rsv_ruimte
            WHERE res_reservering_key = res_key
         ORDER BY res_rsv_ruimte_van;
   BEGIN
      v_reservering_key := p_key;
      IF (v_reservering_key IS NULL AND p_res_rsv_ruimte_key IS NOT NULL)
       THEN
          SELECT res_reservering_key
            INTO v_reservering_key
            FROM res_rsv_ruimte
           WHERE res_rsv_ruimte_key = p_res_rsv_ruimte_key;
      END IF;
      IF v_reservering_key IS NOT NULL
      THEN

         IF p_res_rsv_ruimte_key IS NULL
         THEN
            SELECT COUNT ( * )
              INTO v_nrdeelres
              FROM res_rsv_ruimte
             WHERE res_reservering_key = v_reservering_key
               AND res_rsv_ruimte_verwijder IS NULL;
         ELSE
            SELECT COUNT ( * )
              INTO v_nrdeelres
              FROM res_rsv_ruimte
             WHERE res_reservering_key = v_reservering_key
               AND res_rsv_ruimte_key = p_res_rsv_ruimte_key
               AND res_rsv_ruimte_verwijder IS NULL;
         END IF;

         IF v_nrdeelres = 0 -- deleted
         THEN
            l_status := 'deleted';
         ELSE
            l_status := NULL;
         END IF;

         IF p_res_rsv_ruimte_key IS NULL
         THEN
            IF v_nrdeelres <= fac.getsetting ('res_xml_max_rsv_ruimte')
            THEN
                createopentagattributes ('reservering',
                                         'content',
                                         'complete',
                                         'total',
                                         v_nrdeelres,
                                         'status',
                                         l_status,
                                         NULL,
                                         NULL);
            ELSE
                createopentagattributes ('reservering',
                                         'content',
                                         'complete',
                                         'total',
                                         v_nrdeelres,
                                         'status',
                                         l_status,
                                         'mode',
                                         'concise');
            END IF;
         ELSE
            createopentagattributes ('reservering',
                                     'content',
                                     'partial',
                                     'total',
                                     v_nrdeelres,
                                     'status',
                                     l_status,
                                     NULL,
                                     NULL);
         END IF;

         SELECT res_reservering_aanmaak
              , res_reservering_verwijder
              , res_reservering_ispool
              , mld_melding_key
              , res_reservering_externnr
              , res_reservering_externsyncdate
           INTO v_aanmaak
              , v_verwijder
              , v_ispool
              , v_melding_key
              , v_externnr
              , v_externsyncdate
           FROM res_reservering r
          WHERE res_reservering_key = v_reservering_key;

         createxmltagvalue ('key', v_reservering_key);
         mydatetochar ('datum', v_aanmaak);
         mydatetochar ('verwijder', v_verwijder);
         createxmltagvalue ('ispool', v_ispool);
         create_mld_melding_node (v_melding_key, NULL, FALSE);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);

         IF v_nrdeelres = 0 -- deleted
         THEN
            FOR rec1 IN c2(v_reservering_key)
            LOOP
               IF p_res_rsv_ruimte_key IS NULL
                  OR (p_res_rsv_ruimte_key IS NOT NULL
                      AND rec1.res_rsv_ruimte_key = p_res_rsv_ruimte_key)
               THEN
                  create_res_rsv_ruimte_node (rec1.res_rsv_ruimte_key, FALSE);
               END IF;
            END LOOP;
         ELSE
            FOR rec1 IN c1(v_reservering_key)
            LOOP
               IF p_res_rsv_ruimte_key IS NULL
                  OR (p_res_rsv_ruimte_key IS NOT NULL
                      AND rec1.res_rsv_ruimte_key = p_res_rsv_ruimte_key)
               THEN
                  IF v_nrdeelres <= fac.getsetting ('res_xml_max_rsv_ruimte') OR firstres
                  THEN
                     create_res_rsv_ruimte_node (rec1.res_rsv_ruimte_key, FALSE);
                     firstres := FALSE;
                  ELSE
                     create_res_rsv_ruimte_node (rec1.res_rsv_ruimte_key, TRUE);
                  END IF;
               END IF;
            END LOOP;
         END IF;

         createclosetag ('reservering');
      END IF;
   END;

   PROCEDURE create_msg_message_node (p_key IN NUMBER)
   AS
      v_prs_perslid_key   msg_message.prs_perslid_key%TYPE;
      v_replykey          msg_message.msg_message_replykey%TYPE;
      v_omschrijving      msg_message.msg_message_oms%TYPE;
      v_aanmaak           msg_message.msg_message_aanmaak%TYPE;
      v_onderwerp         msg_message.msg_message_onderwerp%TYPE;
      v_prioriteit        msg_message.msg_message_prioriteit%TYPE;
      v_url               msg_message.msg_message_url%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('message');

         SELECT prs_perslid_key,
                msg_message_replykey,
                msg_message_oms,
                msg_message_aanmaak,
                msg_message_onderwerp,
                msg_message_prioriteit,
                msg_message_url
           INTO v_prs_perslid_key,
                v_replykey,
                v_omschrijving,
                v_aanmaak,
                v_onderwerp,
                v_prioriteit,
                v_url
           FROM msg_message
          WHERE msg_message_key = p_key;

         createxmltagvalue ('key', p_key);
         mydatetochar ('aanmaak', v_aanmaak);
         createxmltagvalue ('onderwerp', v_onderwerp);
         createxmltagvalue ('prioriteit', v_prioriteit);
         createxmltagvalue ('omschrijving', v_omschrijving);
         createxmltagvalue ('url', v_url);
         create_prs_perslid_node (v_prs_perslid_key, 'afzender', TRUE);

         -- Bij reply ook het oorspronkelijke bericht tonen
         IF v_replykey IS NOT NULL
         THEN
            create_msg_message_node (v_replykey);
         END IF;

         createclosetag ('message');
      END IF;
   END;

    PROCEDURE create_view_node (p_view       IN VARCHAR2,
                                p_oms        IN VARCHAR2,
                                p_info       IN VARCHAR2,
                                p_where      IN VARCHAR2,
                                p_nodename   IN VARCHAR2,
                                p_rowname    IN VARCHAR2,
                                p_rapkey     IN NUMBER,
                                p_xmlnode    IN VARCHAR2)
    AS
        v_xml_clob_length   NUMBER (10);
        v_xml_tag_length    NUMBER (10);
        v_clob_length       NUMBER (10);
        v_aclob_length      NUMBER (10);
        xml                 CLOB;

        CURSOR colsql
        IS
              SELECT column_name, data_type
                FROM user_tab_columns
               WHERE table_name = UPPER (p_view)
            ORDER BY column_id;

        cols                VARCHAR2 (4000);
        nrcols              NUMBER (3);
        ctx                 DBMS_XMLGEN.ctxhandle;
    BEGIN
        IF p_view IS NOT NULL
        THEN
            createopentagattributes (p_xmlnode,
                                     'view',
                                     p_view,
                                     'title',
                                     p_oms,
                                     'info',
                                     p_info,
                                     'usrrap_key',
                                     p_rapkey);
            createxmltagvalue ('where', p_where);
            ctx :=
                DBMS_XMLGEN.newcontext('SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_ID FROM user_tab_columns WHERE table_name = UPPER('''
                                       || p_view
                                       || ''')  ORDER BY COLUMN_ID');
            DBMS_XMLGEN.setrowsettag (ctx, 'rapport_header');
            DBMS_XMLGEN.setrowtag (ctx, 'header_row');
            xml := DBMS_XMLGEN.getxml (ctx);
            DBMS_XMLGEN.closecontext (ctx);
            -- add meta data xml to aclob
            v_aclob_length := DBMS_LOB.getlength (aclob);
            v_xml_clob_length := DBMS_LOB.getlength (xml);
            -- remove xml tag
            v_xml_tag_length := 21;

            IF v_xml_clob_length IS NOT NULL
            THEN
                DBMS_LOB.COPY (aclob,
                               xml,
                               v_xml_clob_length - v_xml_tag_length,
                               v_aclob_length + 1,
                               v_xml_tag_length + 1);
            END IF;

            cols := '';
            nrcols := 0;

            FOR c IN colsql
            LOOP
                IF SUBSTR(c.column_name, 1, 7) <> 'FCLT_3D' THEN -- Die willen we niet in de XML
                    IF nrcols > 0
                    THEN
                        cols := cols || ', ';
                    END IF;

                    IF c.data_type = 'DATE'
                    THEN
                        cols :=
                               cols
                            || 'TO_CHAR('
                            || c.column_name
                            || ',''yyyy-mm-dd"T"hh24:mi:ss'') '
                            || c.column_name;
                    ELSE
                        cols := cols || c.column_name;
                    END IF;

                    nrcols := nrcols + 1;
                END IF;
            END LOOP;

            IF cols IS NULL
            THEN
                cols := '*';
            END IF;

            --DBMS_OUTPUT.put_line (cols);
            ctx :=
                DBMS_XMLGEN.newcontext ('SELECT ' || cols || ' FROM ' || p_view || ' ' || p_where);

            IF p_nodename IS NOT NULL
            THEN
                DBMS_XMLGEN.setrowsettag (ctx, p_nodename);
                DBMS_XMLGEN.setrowtag (ctx, p_rowname);
            ELSE
                DBMS_XMLGEN.setrowsettag (ctx, 'rapport_data');
                DBMS_XMLGEN.setrowtag (ctx, 'data_row');
            END IF;

            xml := DBMS_XMLGEN.getxml (ctx);
            DBMS_XMLGEN.closecontext (ctx);
            -- add data xml to aclob
            v_aclob_length := DBMS_LOB.getlength (aclob);
            v_xml_clob_length := DBMS_LOB.getlength (xml);

            -- remove xml tag
            IF v_xml_clob_length IS NOT NULL
            THEN
                DBMS_LOB.COPY (aclob,
                               xml,
                               v_xml_clob_length - v_xml_tag_length,
                               v_aclob_length + 1,
                               v_xml_tag_length + 1);
            END IF;

            createclosetag (p_xmlnode);
        END IF;
    END;

   PROCEDURE create_fac_usrrap_view_node (p_key     IN NUMBER,
                                          p_where   IN VARCHAR2)
   AS
      view_name      fac_usrrap.fac_usrrap_view_name%TYPE;
      omschrijving   fac_usrrap.fac_usrrap_omschrijving%TYPE;
      rinfo          fac_usrrap.fac_usrrap_info%TYPE;
      xmlnode        VARCHAR2 (20);
   BEGIN
      IF p_key IS NOT NULL
      THEN
         SELECT fac_usrrap_view_name,
                lcl.x ('fac_usrrap_omschrijving',
                       fac_usrrap_key,
                       fac_usrrap_omschrijving)
                   fac_usrrap_omschrijving,
                lcl.x ('fac_usrrap_info', fac_usrrap_key, fac_usrrap_info)
                   fac_usrrap_info,
                CASE
                   WHEN BITAND(fac_usrrap_functie, 4) = 4
                   THEN 'sysrapport'
                   ELSE 'rapport'
                   END xmlnode
           INTO view_name,
                omschrijving,
                rinfo,
                xmlnode
           FROM fac_usrrap
          WHERE fac_usrrap_key = p_key;

         create_view_node (view_name,
                           omschrijving,
                           rinfo,
                           p_where,
                           NULL,
                           NULL,
                           p_key,
                           xmlnode);
      END IF;
   END;

   PROCEDURE create_fac_usrrap_proc_node (p_key     IN NUMBER,
                                          p_where   IN VARCHAR2)
   AS
      proc_name           fac_usrrap.fac_usrrap_view_name%TYPE;
      omschrijving        fac_usrrap.fac_usrrap_omschrijving%TYPE;
      rinfo               fac_usrrap.fac_usrrap_info%TYPE;
      v_xml_clob_length   NUMBER (10);
      v_xml_tag_length    NUMBER (10);
      v_clob_length       NUMBER (10);
      v_aclob_length      NUMBER (10);
      xml                 CLOB;
      ctx                 DBMS_XMLGEN.ctxhandle;
      l_str_pos           INTEGER;
      l_str_pos2          INTEGER;
      l_str_pos3          INTEGER;
      l_user_key          NUMBER;
      l_date1             VARCHAR2 (20);
      l_date2             VARCHAR2 (4000); -- extra lang omdat hij heel even l_extra_where ook bevat
      l_extra_where       VARCHAR2 (4000);
      l_sql_str           VARCHAR2 (4000);
      l_cursor            SYS_REFCURSOR;
      xmlnode             VARCHAR2 (20);
   BEGIN
      IF p_key IS NOT NULL
      THEN
         SELECT fac_usrrap_view_name,
                fac_usrrap_omschrijving,
                fac_usrrap_info,
                CASE
                WHEN BITAND(fac_usrrap.fac_usrrap_functie, 4) = 4
                THEN 'sysrapport'
                ELSE 'rapport'
                END xmlnode
           INTO proc_name,
                omschrijving,
                rinfo,
                xmlnode
           FROM fac_usrrap
          WHERE fac_usrrap_key = p_key;

         -- p_where is: user_key + "#" + dt1 + "#" + dt2
         --         or: user_key + "#" + dt1 + "#" + dt2 + "#" + whereclause
         l_str_pos :=
            INSTR (p_where,
                   '#',
                   1,
                   1);                                   -- 1st occurence of #
         l_user_key := SUBSTR (p_where, 1, l_str_pos - 1);
         l_str_pos2 :=
            INSTR (p_where,
                   '#',
                   1,
                   2);                                   -- 2nd occurence of #
         l_date1 :=
            SUBSTR (p_where, l_str_pos + 1, l_str_pos2 - l_str_pos - 1);
         l_date2 := SUBSTR (p_where, l_str_pos2 + 1);

         l_extra_where := '';
         l_str_pos3 :=
            INSTR (p_where,
                   '#',
                   1,
                   3);                                   -- 3nd occurence of #
        IF (l_str_pos3 > 0) THEN
            l_extra_where  := SUBSTR (p_where, l_str_pos3 + 1);
            l_date2 := SUBSTR (l_date2, 1, INSTR (l_date2, '#') - 1); -- Dan moet hier het where-clause stuk ook af
        END IF;

         -- All these reports are defined as
         -- proc_name (user_key IN NUMBER, p_datum_van IN VARCHAR2, p_datum_tot IN VARCHAR2, p_cursor OUT t_cursor);
         -- or proc_name (user_key IN NUMBER, p_datum_van IN VARCHAR2, p_datum_tot IN VARCHAR2, p_cursor OUT t_cursor, p_where IN VARCHAR2);
         if (l_extra_where IS NOT NULL)
         THEN
             l_sql_str :=
                   'BEGIN '
                || proc_name
                || '('
                || '  :l_user_key'
                || ', :l_date1'
                || ', :l_date2'
                || ', :l_outcursor'
                || ', :l_extrawhere '
                || '); END;';
             EXECUTE IMMEDIATE l_sql_str USING l_user_key, l_date1, l_date2, l_cursor, l_extra_where;
         ELSE
             l_sql_str :=
                   'BEGIN '
                || proc_name
                || '('
                || l_user_key
                || ', '''
                || l_date1
                || ''', '''
                || l_date2
                || ''', '
                || ':l_outcursor'
                || '); END;';
             -- DBMS_OUTPUT.put_line ('l_sql_str: ' || l_sql_str);
             EXECUTE IMMEDIATE l_sql_str USING l_cursor;
         END IF;

         createopentagattributes (xmlnode,
                                  'view',
                                  proc_name,
                                  'title',
                                  omschrijving,
                                  'info',
                                  rinfo,
                                  'type',
                                  'proc');
         createxmltagvalue ('where', p_where);
         createxmltagvalue ('datumbegin', l_date1);
         createxmltagvalue ('datumeind', l_date2);
         createopentagattributes ('rapport_header',
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL);
         createopentagattributes ('header_row',
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL);
         -- We leven vooralsnog zonder headerrow die wordt verondersteld metadata te gaan bevatten
         createclosetag ('header_row');
         createclosetag ('rapport_header');
         ctx := DBMS_XMLGEN.newcontext (l_cursor);
         DBMS_XMLGEN.setrowsettag (ctx, 'rapport_data');
         DBMS_XMLGEN.setrowtag (ctx, 'data_row');
         xml := DBMS_XMLGEN.getxml (ctx);
         DBMS_XMLGEN.closecontext (ctx);
         -- add data xml to aclob
         v_aclob_length := DBMS_LOB.getlength (aclob);
         v_xml_clob_length := DBMS_LOB.getlength (xml);
         -- remove xml tag
         v_xml_tag_length := 21;

         IF v_xml_clob_length IS NOT NULL
         THEN
            DBMS_LOB.COPY (aclob,
                           xml,
                           v_xml_clob_length - v_xml_tag_length,
                           v_aclob_length + 1,
                           v_xml_tag_length + 1);
         END IF;

         createclosetag (xmlnode);
      END IF;
   END;

   PROCEDURE create_fac_usrrap_node (p_key IN NUMBER, p_where IN VARCHAR2)
   AS
      raptype   fac_usrrap.fac_usrrap_functie%TYPE;
   BEGIN
      SELECT fac_usrrap_functie
        INTO raptype
        FROM fac_usrrap
       WHERE fac_usrrap_key = p_key;

      IF BITAND (raptype, 2) = 2
      THEN
         create_fac_usrrap_proc_node (p_key, p_where);
      ELSE
         create_fac_usrrap_view_node (p_key, p_where);
      END IF;
   END;

   PROCEDURE create_cnt_contract_note_node (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT cnt_contract_note_key,
                  cnt_contract_note_aanmaak,
                  prs_perslid_key,
                  cnt_contract_note_omschrijving
             FROM cnt_contract_note
            WHERE cnt_contract_key = p_key
         ORDER BY cnt_contract_note_key;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('notes');

         FOR rec1 IN c1
         LOOP
            createopentag ('note');
            createxmltagvalue ('key', rec1.cnt_contract_note_key);
            mydatetochar ('aanmaak', rec1.cnt_contract_note_aanmaak);
            createxmltagvalue ('omschrijving',
                               rec1.cnt_contract_note_omschrijving);
            create_prs_perslid_node (rec1.prs_perslid_key, 'noteur', TRUE);
            createclosetag ('note');
         END LOOP;

         createclosetag ('notes');
      END IF;
   END;

   PROCEDURE create_cnt_kenmerken (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT k.cnt_kenmerk_key,
                  k.cnt_kenmerk_code,
                  s.cnt_srtkenmerk_code,
                  COALESCE (
                      lcl.x ('cnt_kenmerk_omschrijving', k.cnt_kenmerk_key, cnt_kenmerk_omschrijving),
                      lcl.x ('cnt_srtkenmerk_omschrijving', s.cnt_srtkenmerk_key, cnt_srtkenmerk_omschrijving)) cnt_kenmerk_omschrijving,
                  s.cnt_srtkenmerk_kenmerktype,
                  s.fac_kenmerkdomein_key,
                  s.cnt_srtkenmerk_lengte,
                  s.cnt_srtkenmerk_dec,
                  s.cnt_srtkenmerk_nmin,
                  s.cnt_srtkenmerk_nmax,
                  k.cnt_kenmerk_default,
                  NVL (k.cnt_kenmerk_volgnummer, 0) volgnummer,
                  lcl.x ('cnt_srtkenmerk_dimensie',
                         s.cnt_srtkenmerk_key,
                         cnt_srtkenmerk_dimensie)
                     dimensie,
                  lcl.x ('cnt_kenmerk_hint',
                         k.cnt_kenmerk_key,
                         cnt_kenmerk_hint)
                     hint,
                  cnt_kenmerkcontract_waarde,
                  v.cnt_kenmerkcontract_wijzig
             FROM cnt_kenmerk k,
                  cnt_srtkenmerk s,
                  cnt_contract c,
                  (SELECT v.cnt_kenmerk_key,
                          v.cnt_kenmerkcontract_waarde,
                          v.cnt_kenmerkcontract_wijzig
                     FROM cnt_kenmerkcontract v
                    WHERE v.cnt_contract_key = p_key
                          AND v.cnt_kenmerkcontract_verwijder IS NULL) v
            WHERE     c.ins_discipline_key = k.cnt_srtcontract_key
                  AND c.cnt_contract_key = p_key
                  AND k.cnt_kenmerk_verwijder IS NULL
                  AND k.cnt_srtkenmerk_key = s.cnt_srtkenmerk_key
                  AND v.cnt_kenmerk_key(+) = k.cnt_kenmerk_key
         ORDER BY k.cnt_kenmerk_volgnummer;

      v_kenmerk_waarde       cnt_kenmerkcontract.cnt_kenmerkcontract_waarde%TYPE;
      v_kenmerk_wijzig       cnt_kenmerkcontract.cnt_kenmerkcontract_wijzig%TYPE;
   BEGIN
      FOR rec1 IN c1
      LOOP
         v_kenmerk_wijzig := rec1.cnt_kenmerkcontract_wijzig;
         v_kenmerk_waarde :=
            find_kenmerk_waarde (rec1.cnt_kenmerkcontract_waarde,
                                 rec1.cnt_kenmerk_default,
                                 rec1.cnt_srtkenmerk_kenmerktype,
                                 rec1.fac_kenmerkdomein_key,
                                 rec1.cnt_srtkenmerk_nmin,
                                 rec1.cnt_srtkenmerk_nmax,
                                 p_key,
                                 rec1.cnt_kenmerk_key);


         createxmltagvalueattributes9('kenmerk',
                                      'kenmerkcode',     rec1.cnt_kenmerk_code,
                                      'srtkenmerkcode',  rec1.cnt_srtkenmerk_code,
                                      'naam',            rec1.cnt_kenmerk_omschrijving,
                                      'type',            rec1.cnt_srtkenmerk_kenmerktype,
                                      'volgnummer',      rec1.volgnummer,
                                      'key',             rec1.cnt_kenmerk_key,
                                      'wijzig',          TO_CHAR (v_kenmerk_wijzig, 'YYYYMMDD HH24:MI'),
                                      NULL,              NULL,
                                      NULL,              NULL,
                                      rec1.fac_kenmerkdomein_key,
                                      v_kenmerk_waarde
                                     );
      END LOOP;
   END;

   PROCEDURE create_cnt_contract_node (p_key IN NUMBER, p_concise IN BOOLEAN, p_extra_key IN NUMBER DEFAULT NULL)
   AS
      v_key                  cnt_contract.cnt_contract_key%TYPE;
      v_nummer               cnt_contract.cnt_contract_nummer%TYPE;
      v_omschrijving         cnt_contract.cnt_contract_omschrijving%TYPE;
      v_looptijd_tot         cnt_contract.cnt_contract_looptijd_tot%TYPE;
      v_kosten               cnt_contract.cnt_contract_kosten%TYPE;
      v_uurloon              cnt_contract.cnt_contract_uurloon%TYPE;
      v_bedrijf_key          cnt_contract.cnt_prs_bedrijf_key%TYPE;
      v_afdeling_key         cnt_contract.cnt_prs_afdeling_key%TYPE;
      v_aanmaak              cnt_contract.cnt_contract_aanmaak%TYPE;
      v_verwijder            cnt_contract.cnt_contract_verwijder%TYPE;
      v_nummer_intern        cnt_contract.cnt_contract_nummer_intern%TYPE;
      v_versie               cnt_contract.cnt_contract_versie%TYPE;
      v_verlenging           cnt_contract.cnt_contract_verlenging%TYPE;
      v_dienst_key           cnt_contract.prs_dienst_key%TYPE;
      l_rappeldatum          DATE;
      l_opzegdatum           DATE;
      v_korting              cnt_contract.cnt_contract_korting%TYPE;
      v_contactpersoon_key   cnt_contract.prs_contactpersoon_key%TYPE;
      v_contact_persoon      cnt_contract.cnt_contract_contact_persoon%TYPE;
      v_discipline_key       cnt_contract.ins_discipline_key%TYPE;
      v_document             cnt_contract.cnt_contract_document%TYPE;
      v_perslid_key_eig      cnt_contract.prs_perslid_key_eig%TYPE;
      v_perslid_key_beh      cnt_contract.prs_perslid_key_beh%TYPE;
      v_afdeling_key_eig     cnt_contract.prs_afdeling_key_eig%TYPE;
      v_status               cnt_contract.cnt_contract_status%TYPE;
      v_looptijd_van         cnt_contract.cnt_contract_looptijd_van%TYPE;
      v_kostenplaats_key     cnt_contract.prs_kostenplaats_key%TYPE;
      v_termijnkosten        cnt_contract.cnt_contract_termijnkosten%TYPE;
      v_jaarkosten           cnt_contract.cnt_contract_termijnkosten%TYPE;  -- moet volstaan
      v_kostensoort_key      cnt_contract.prs_kostensoort_key%TYPE;
      v_opmerking            cnt_contract.cnt_contract_opmerking%TYPE;
      v_mantel_key           cnt_contract.cnt_contract_mantel_key%TYPE;
      v_rappeltermijn        cnt_termijn.cnt_termijn_omschrijving%TYPE;
      v_opzegtermijn         cnt_termijn.cnt_termijn_omschrijving%TYPE;
      v_termijntermijn       cnt_termijn.cnt_termijn_omschrijving%TYPE;
      v_termijntermijn_key   cnt_contract.cnt_contract_termijntermijn%TYPE;
      l_totaalgewicht        NUMBER;
      l_totaalkosten         cnt_contract.cnt_contract_kosten%TYPE;
      l_jaarfactor           NUMBER;
      l_locatiekosten        cnt_contract.cnt_contract_kosten%TYPE;
      v_bestelopdr_key       cnt_contract.bes_bestelopdr_key%TYPE;
      CURSOR c1
      IS
         SELECT cnt_contract_object_key,
                cnt_ins_srtdeel_key,
                cnt_ins_deel_key
           FROM cnt_contract_object
          WHERE cnt_contract_object_verwijder IS NULL
                AND cnt_contract_key = p_key;
      CURSOR c2
      IS
         SELECT cnt_contract_plaats_key,
                cnt_alg_plaats_key,
                cnt_alg_plaats_code,
                cnt_contract_plaats_gewicht
           FROM cnt_contract_plaats
          WHERE cnt_contract_plaats_verwijder IS NULL
                AND cnt_contract_key = p_key;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         IF p_concise
         THEN
            createconciseopentag ('contract');
         ELSE
            createopentag ('contract');
         END IF;
         SELECT cnt_contract_nummer,
                cnt_contract_omschrijving,
                cnt_contract_looptijd_tot,
                cnt_contract_kosten,
                cnt_contract_uurloon,
                cnt_prs_bedrijf_key,
                cnt_prs_afdeling_key,
                cnt_contract_aanmaak,
                cnt_contract_verwijder,
                cnt_contract_nummer_intern,
                cnt_contract_korting,
                prs_contactpersoon_key,
                prs_dienst_key,
                cnt_contract_contact_persoon,
                ins_discipline_key,
                cnt_contract_document,
                prs_perslid_key_eig,
                prs_perslid_key_beh,
                prs_afdeling_key_eig,
                cnt_contract_status,
                cnt_contract_looptijd_van,
                prs_kostenplaats_key,
                cnt_contract_termijnkosten,
                prs_kostensoort_key,
                cnt_contract_opmerking,
                cnt_contract_mantel_key,
                lcl.x ('cnt_termijn_omschrijving',
                       t1.cnt_termijn_key,
                       t1.cnt_termijn_omschrijving)
                   cnt_termijn_omschrijving1,
                lcl.x ('cnt_termijn_omschrijving',
                       t2.cnt_termijn_key,
                       t2.cnt_termijn_omschrijving)
                   cnt_termijn_omschrijving2,
                lcl.x ('cnt_termijn_omschrijving',
                       t3.cnt_termijn_key,
                       t3.cnt_termijn_omschrijving)
                   cnt_termijn_omschrijving3,
                c.cnt_contract_termijntermijn,
                cnt_contract_versie,
                cnt_contract_verlenging,
                bes_bestelopdr_key
           INTO v_nummer,
                v_omschrijving,
                v_looptijd_tot,
                v_kosten,
                v_uurloon,
                v_bedrijf_key,
                v_afdeling_key,
                v_aanmaak,
                v_verwijder,
                v_nummer_intern,
                v_korting,
                v_contactpersoon_key,
                v_dienst_key,
                v_contact_persoon,
                v_discipline_key,
                v_document,
                v_perslid_key_eig,
                v_perslid_key_beh,
                v_afdeling_key_eig,
                v_status,
                v_looptijd_van,
                v_kostenplaats_key,
                v_termijnkosten,
                v_kostensoort_key,
                v_opmerking,
                v_mantel_key,
                v_rappeltermijn,
                v_opzegtermijn,
                v_termijntermijn,
                v_termijntermijn_key,
                v_versie,
                v_verlenging,
                v_bestelopdr_key
           FROM cnt_contract c, cnt_termijn t1, cnt_termijn t2, cnt_termijn t3
          WHERE     c.cnt_contract_rappeltermijn = t1.cnt_termijn_key(+)
                AND c.cnt_contract_opzegtermijn = t2.cnt_termijn_key(+)
                AND c.cnt_contract_termijntermijn = t3.cnt_termijn_key(+)
                AND cnt_contract_key = p_key;
         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('extra_key', p_extra_key);
         createxmltagvalue ('nummer', v_nummer);
         createxmltagvalue ('nummer_intern', v_nummer_intern);
         createxmltagvalue ('versie', v_versie);
         createxmltagvalue ('omschrijving', v_omschrijving);
         mydatetochar ('aanmaak', v_aanmaak);
         mydatetochar ('verwijder', v_verwijder);
         mydatetochar ('looptijd_van', v_looptijd_van);
         mydatetochar ('looptijd_tot', v_looptijd_tot);
         -- datum berekenen obv de termijnen
         l_rappeldatum := cnt.cnt_getrappeldatum (p_key);
         l_opzegdatum := cnt.cnt_getopzegdatum (p_key);
         mydatetochar ('rappeldatum', l_rappeldatum);
         mydatetochar ('opzegdatum', l_opzegdatum);
         createxmltagvalue ('rappeltermijn', v_rappeltermijn);
         createxmltagvalue ('opzegtermijn', v_opzegtermijn);
         createxmltagvalue ('verlenging', v_verlenging);
         createxmltagvalue ('kosten', v_kosten);
         createxmltagvalue ('termijnkosten', v_termijnkosten);
         createxmltagvalue ('termijntermijn', v_termijntermijn);
         l_jaarfactor := cnt.termijnjaarfactor(v_termijntermijn_key);
         IF l_jaarfactor <> -1
         THEN
             v_jaarkosten := l_jaarfactor * v_termijnkosten;
             createxmltagvalue ('jaarkosten', v_jaarkosten);
         END IF;
         createxmltagvalue ('uurloon', v_uurloon);
         createxmltagvalue ('korting', v_korting);
         create_prs_bedrijf_node (v_bedrijf_key, 'bedrijf', FALSE); -- uitvoerder/huurder
         create_prs_afdeling_node (v_afdeling_key, 'afdeling');
         create_prs_contactpersoon_node (v_contactpersoon_key, FALSE);
         create_prs_dienst_node (v_dienst_key);
         createxmltagvalue ('contact_persoon', v_contact_persoon);
         create_ins_discipline_node (v_discipline_key);
         createxmltagvalue ('document', v_document);
         create_prs_perslid_node (v_perslid_key_eig, 'eigenaar', p_concise);
         create_prs_afdeling_node (v_afdeling_key_eig, 'eigenaar_afd');   --??
         create_prs_perslid_node (v_perslid_key_beh, 'beheerder', p_concise);
         createxmltagvalue ('status', v_status);
         create_prs_kostenplaats_node (v_kostenplaats_key, FALSE);
         create_prs_kostensoort_node (v_kostensoort_key);
         createxmltagvalue ('opmerking', v_opmerking);
         create_cnt_contract_node (v_mantel_key, p_concise);
         IF NOT p_concise
         THEN
            create_bes_bestelopdr_node (v_bestelopdr_key, FALSE);
            create_cnt_kenmerken (p_key);
            create_fac_tracking_node ('contract', p_key);
            FOR rec1 IN c1
            LOOP
               -- object/objectsoort
               BEGIN
                  createopentag ('contract_object');
                  createxmltagvalue (
                     'key',
                     mynumbertochar (rec1.cnt_contract_object_key));
                  IF rec1.cnt_ins_deel_key IS NOT NULL
                  THEN
                     create_ins_deel_node (rec1.cnt_ins_deel_key, null, TRUE);
                  ELSIF rec1.cnt_ins_srtdeel_key IS NOT NULL
                  THEN
                     create_ins_srtdeel_node (rec1.cnt_ins_srtdeel_key,
                                              FALSE);
                  END IF;
                  createclosetag ('contract_object');
               END;
            END LOOP;
            SELECT SUM (COALESCE (cnt_contract_plaats_gewicht, 0))
              INTO l_totaalgewicht
              FROM cnt_contract_plaats
             WHERE cnt_contract_key = p_key;
            SELECT cnt_contract_kosten
              INTO l_totaalkosten                        -- mag dus null zijn?
              FROM cnt_contract
             WHERE cnt_contract_key = p_key;
            FOR rec2 IN c2
            LOOP
               -- plaats
               BEGIN
                  createopentag ('contract_plaats');
                  createxmltagvalue (
                     'key',
                     mynumbertochar (rec2.cnt_contract_plaats_key));
                  createxmltagvalue (
                     'gewicht',
                     mynumbertochar (rec2.cnt_contract_plaats_gewicht));
                  IF l_totaalgewicht <> 0              -- niet delen door 0 he
                  THEN
                     l_locatiekosten :=
                          l_totaalkosten
                        * rec2.cnt_contract_plaats_gewicht
                        / l_totaalgewicht;
                     createxmltagvalue ('kosten',
                                        mynumbertochar (l_locatiekosten));
                  END IF;
                  IF (rec2.cnt_alg_plaats_code = 'L')
                  THEN
                     create_alg_onroerendgoed_node (rec2.cnt_alg_plaats_key,
                                                    'plaats',
                                                    rec2.cnt_alg_plaats_key,
                                                    p_concise,
                                                    FALSE);
                  ELSE
                     create_alg_onroerendgoed_node (rec2.cnt_alg_plaats_key,
                                                    'plaats',
                                                    NULL,
                                                    FALSE,
                                                    FALSE);
                  END IF;
                  createclosetag ('contract_plaats');
               END;
            END LOOP;
         END IF;
         create_cnt_contract_note_node (p_key);
         createclosetag ('contract');
      END IF;
   END;

   -- *
   -- * FIN zaken
   -- *

   PROCEDURE create_fin_factuur_note_node (p_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT fin_factuur_note_key,
                  fin_factuur_note_aanmaak,
                  prs_perslid_key,
                  fin_factuur_note_omschrijving
             FROM fin_factuur_note
            WHERE fin_factuur_key = p_key
         ORDER BY fin_factuur_note_key;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('notes');

         FOR rec1 IN c1
         LOOP
            createopentag ('note');
            createxmltagvalue ('key', rec1.fin_factuur_note_key);
            mydatetochar ('aanmaak', rec1.fin_factuur_note_aanmaak);
            createxmltagvalue ('omschrijving',
                               rec1.fin_factuur_note_omschrijving);
            create_prs_perslid_node (rec1.prs_perslid_key, 'noteur', TRUE);
            createclosetag ('note');
         END LOOP;

         createclosetag ('notes');
      END IF;
   END;

   PROCEDURE create_fin_kenmerken (p_key IN NUMBER, f_or_r IN VARCHAR2)
   AS
      CURSOR cf
      IS
           SELECT k.fin_kenmerk_key,
                  k.fin_kenmerk_code,
                  lcl.x ('fin_kenmerk_omschrijving', k.fin_kenmerk_key, fin_kenmerk_omschrijving) fin_kenmerk_omschrijving,
                  k.fin_kenmerk_kenmerktype,
                  k.fac_kenmerkdomein_key,
                  k.fin_kenmerk_lengte,
                  k.fin_kenmerk_dec,
                  k.fin_kenmerk_nmin,
                  k.fin_kenmerk_nmax,
                  k.fin_kenmerk_default,
                  NVL (k.fin_kenmerk_volgnr, 0) volgnummer,
                  lcl.x ('fin_kenmerk_dimensie',
                         k.fin_kenmerk_key,
                         fin_kenmerk_dimensie)
                     dimensie,
                  lcl.x ('fin_kenmerk_hint',
                         k.fin_kenmerk_key,
                         fin_kenmerk_hint)
                     hint,
                  v.fin_kenmerkfactuur_waarde
             FROM fin_kenmerk k,
                  (SELECT v.fin_kenmerk_key, v.fin_kenmerkfactuur_waarde
                     FROM fin_kenmerkfactuur v
                    WHERE v.fin_factuur_key = p_key
                          AND v.fin_kenmerkfactuur_verwijder IS NULL) v
            WHERE     k.fin_kenmerk_verwijder IS NULL
                  AND k.fin_kenmerk_type = 'F'
                  AND v.fin_kenmerk_key(+) = k.fin_kenmerk_key
         ORDER BY k.fin_kenmerk_volgnr;

      CURSOR cr
      IS
           SELECT k.fin_kenmerk_key,
                  k.fin_kenmerk_code,
                  lcl.x ('fin_kenmerk_omschrijving', k.fin_kenmerk_key, fin_kenmerk_omschrijving) fin_kenmerk_omschrijving,
                  k.fin_kenmerk_kenmerktype,
                  k.fac_kenmerkdomein_key,
                  k.fin_kenmerk_lengte,
                  k.fin_kenmerk_dec,
                  k.fin_kenmerk_nmin,
                  k.fin_kenmerk_nmax,
                  k.fin_kenmerk_default,
                  NVL (k.fin_kenmerk_volgnr, 0) volgnummer,
                  lcl.x ('fin_kenmerk_dimensie',
                         k.fin_kenmerk_key,
                         fin_kenmerk_dimensie)
                     dimensie,
                  lcl.x ('fin_kenmerk_hint',
                         k.fin_kenmerk_key,
                         fin_kenmerk_hint)
                     hint,
                  v.fin_kenmerkfactregel_waarde
             FROM fin_kenmerk k,
                  (SELECT v.fin_kenmerk_key, v.fin_kenmerkfactregel_waarde
                     FROM fin_kenmerkfactregel v
                    WHERE v.fin_factuurregel_key = p_key
                          AND v.fin_kenmerkfactregel_verwijder IS NULL) v
            WHERE     k.fin_kenmerk_verwijder IS NULL
                  AND k.fin_kenmerk_type = 'R'
                  AND v.fin_kenmerk_key(+) = k.fin_kenmerk_key
         ORDER BY k.fin_kenmerk_volgnr;

      v_kenmerk_waarde       fin_kenmerkfactuur.fin_kenmerkfactuur_waarde%TYPE;
   BEGIN
        IF f_or_r = 'F'
        THEN
            -- factuurkenmerken
            FOR rec1 IN cf
            LOOP
                v_kenmerk_waarde :=
                    find_kenmerk_waarde (rec1.fin_kenmerkfactuur_waarde,
                                         rec1.fin_kenmerk_default,
                                         rec1.fin_kenmerk_kenmerktype,
                                         rec1.fac_kenmerkdomein_key,
                                         rec1.fin_kenmerk_nmin,
                                         rec1.fin_kenmerk_nmax,
                                         p_key,
                                         rec1.fin_kenmerk_key);

                createxmltagvalueattributes9('kenmerk',
                                             'naam',         rec1.fin_kenmerk_omschrijving,
                                             'kenmerkcode',  rec1.fin_kenmerk_code,
                                             'type',         rec1.fin_kenmerk_kenmerktype,
                                             'volgnummer',   rec1.volgnummer,
                                             'key',          rec1.fin_kenmerk_key,
                                             'dimensie',     rec1.dimensie,
                                             NULL,           NULL,
                                             NULL,           NULL,
                                             NULL,           NULL,
                                             rec1.fac_kenmerkdomein_key,
                                             v_kenmerk_waarde
                                            );
            END LOOP;
        ELSE
            -- factuurregelkenmerken
            FOR rec1 IN cr
            LOOP
                v_kenmerk_waarde :=
                    find_kenmerk_waarde (rec1.fin_kenmerkfactregel_waarde,
                                         rec1.fin_kenmerk_default,
                                         rec1.fin_kenmerk_kenmerktype,
                                         rec1.fac_kenmerkdomein_key,
                                         rec1.fin_kenmerk_nmin,
                                         rec1.fin_kenmerk_nmax,
                                         p_key,
                                         rec1.fin_kenmerk_key);

                createxmltagvalueattributes9('kenmerk',
                                             'naam',         rec1.fin_kenmerk_omschrijving,
                                             'kenmerkcode',  rec1.fin_kenmerk_code,
                                             'type',         rec1.fin_kenmerk_kenmerktype,
                                             'volgnummer',   rec1.volgnummer,
                                             'key',          rec1.fin_kenmerk_key,
                                             'dimensie',     rec1.dimensie,
                                             NULL,           NULL,
                                             NULL,           NULL,
                                             NULL,           NULL,
                                             rec1.fac_kenmerkdomein_key,
                                             v_kenmerk_waarde
                                            );
            END LOOP;
        END IF;
   END;

   PROCEDURE create_fin_factuurregel_node (p_key IN NUMBER)
   AS
      v_nr             fin_factuurregel.fin_factuurregel_nr%TYPE;
      v_code           fin_factuurregel.fin_factuurregel_code%TYPE;
      v_aantal         fin_factuurregel.fin_factuurregel_aantal%TYPE;
      v_eenheid        fin_factuurregel.fin_factuurregel_eenheid%TYPE;
      v_id             fin_factuurregel.fin_factuurregel_id%TYPE;
      v_totaal         fin_factuurregel.fin_factuurregel_totaal%TYPE;
      v_btw            fin_factuurregel.fin_factuurregel_btw%TYPE;
      v_referentie     fin_factuurregel.fin_factuurregel_referentie%TYPE;
      v_omschrijving   fin_factuurregel.fin_factuurregel_omschrijving%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         createopentag ('factuurregel');

         SELECT fin_factuurregel_nr,
                fin_factuurregel_code,
                fin_factuurregel_aantal,
                fin_factuurregel_eenheid,
                fin_factuurregel_id,
                fin_factuurregel_totaal,
                fin_factuurregel_btw,
                fin_factuurregel_referentie,
                fin_factuurregel_omschrijving
           INTO v_nr,
                v_code,
                v_aantal,
                v_eenheid,
                v_id,
                v_totaal,
                v_btw,
                v_referentie,
                v_omschrijving
           FROM fin_factuurregel
          WHERE fin_factuurregel_key = p_key;

         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('nr', v_nr);
         createxmltagvalue ('code', v_code);
         createxmltagvalue ('aantal', v_aantal);
         createxmltagvalue ('eenheid', v_eenheid);
         createxmltagvalue ('id', v_id);
         createxmltagvalue ('totaal', v_totaal);
         createxmltagvalue ('btw', v_btw);
         createxmltagvalue ('referentie', v_referentie);
         createxmltagvalue ('omschrijving', v_omschrijving);
         create_fin_kenmerken (p_key, 'R');
         createclosetag ('factuurregel');
      END IF;
   END;

   PROCEDURE create_fin_factuur_node (p_key IN NUMBER, p_concise IN BOOLEAN, p_bgtmode IN BOOLEAN DEFAULT FALSE, p_extra_key IN NUMBER DEFAULT NULL)
   AS
      v_nr                 fin_factuur.fin_factuur_nr%TYPE;
      v_totaal             fin_factuur.fin_factuur_totaal%TYPE;
      v_totaal_btw         fin_factuur.fin_factuur_totaal_btw%TYPE;
      v_opdr_key           fin_factuur.mld_opdr_key%TYPE;
      v_contract_key       fin_factuur.cnt_contract_key%TYPE;
      v_bestelopdr_key     fin_factuur.bes_bestelopdr_key%TYPE;
      v_bestellevr_key     fin_factuur.bes_bestellevr_key%TYPE;
      v_perslid_key_user   fin_factuur.prs_perslid_key_user%TYPE;
      v_datum              fin_factuur.fin_factuur_datum%TYPE;
      v_boekmaand          fin_factuur.fin_factuur_boekmaand%TYPE;
      v_debiteur_nr        fin_factuur.fin_factuur_debiteur_nr%TYPE;
      v_kostensoort_key    fin_factuur.prs_kostensoort_key%TYPE;
      v_opmerking          fin_factuur.fin_factuur_opmerking%TYPE;
      v_status             fin_factuur.fin_factuur_statuses_key%TYPE;
      v_contract_plaats_key fin_factuur.cnt_contract_plaats_key%TYPE;
      v_externnr            fin_factuur.fin_factuur_externnr%TYPE;
      v_externsyncdate      fin_factuur.fin_factuur_externsyncdate%TYPE;

      CURSOR c1
      IS
         SELECT fin_factuurregel_key
           FROM fin_factuurregel
          WHERE fin_factuur_key = p_key;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         IF p_concise
         THEN
            createconciseopentag ('factuur');
         ELSE
            createopentag ('factuur');
         END IF;

         SELECT fin_factuur_nr,
                fin_factuur_totaal,
                fin_factuur_totaal_btw,
                mld_opdr_key,
                cnt_contract_key,
                bes_bestelopdr_key,
                bes_bestellevr_key,
                prs_perslid_key_user,
                fin_factuur_datum,
                fin_factuur_boekmaand,
                fin_factuur_debiteur_nr,
                prs_kostensoort_key,
                fin_factuur_opmerking,
                fin_factuur_statuses_key,
                cnt_contract_plaats_key,
                fin_factuur_externnr,
                fin_factuur_externsyncdate
           INTO v_nr,
                v_totaal,
                v_totaal_btw,
                v_opdr_key,
                v_contract_key,
                v_bestelopdr_key,
                v_bestellevr_key,
                v_perslid_key_user,
                v_datum,
                v_boekmaand,
                v_debiteur_nr,
                v_kostensoort_key,
                v_opmerking,
                v_status,
                v_contract_plaats_key,
                v_externnr,
                v_externsyncdate
           FROM fin_factuur
          WHERE fin_factuur_key = p_key;

         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('extra_key', p_extra_key);
         createxmltagvalue ('nr', v_nr);
         createxmltagvalue ('totaal', v_totaal);
         createxmltagvalue ('totaal_btw', v_totaal_btw);
         mydatetochar ('datum', v_datum);
         createxmltagvalue ('boekmaand', v_boekmaand);
         createxmltagvalue ('debiteurnr', v_debiteur_nr);
         createxmltagvalue ('opmerking', v_opmerking);
         createxmltagvalue ('status', v_status);
         createxmltagvalue ('externnr', v_externnr);
         mydatetochar ('externsyncdate', v_externsyncdate);

         create_fin_kenmerken (p_key, 'F');

         FOR rec1 IN c1
         LOOP
            create_fin_factuurregel_node (rec1.fin_factuurregel_key);
         END LOOP;

         IF NOT p_bgtmode THEN
            create_prs_kostensoort_node (v_kostensoort_key);
            create_mld_opdr_node (v_opdr_key, NULL, FALSE);
            create_cnt_contract_node (v_contract_key, FALSE);
            create_bes_bestelopdr_node (v_bestelopdr_key, FALSE);
            createxmltagvalue ('pakbon', v_bestellevr_key); -- de details zitten wel in de create_bes_bestelopdr_node
         END IF;
         create_prs_perslid_node (v_perslid_key_user, 'invoerder', TRUE);
         create_fin_factuur_note_node (p_key);
         create_fac_tracking_node('factuur', p_key);
         createclosetag ('factuur');
      END IF;
   END;

   -- In komt een fin_verkoopfactuurkop_key waarmee de onderliggende regels gegroepeerd zijn
   PROCEDURE create_fin_verkoopfactuur_node (p_key IN NUMBER)
   AS
      v_id fin_verkoopfactuur.fin_verkoopfactuur_id%TYPE;

      CURSOR c1
      IS
         SELECT fin_verkoopfactuur_key,
                fin_verkoopfactuur_aanmaak,
                fin_verkoopfactuur_id,
                fin_verkoopfactuur_datum,
                fin_verkoopfactuur_omschr,
                fin_verkoopfactuur_xmlnode,
                fin_verkoopfactuur_refkey,
                prs_kostenplaats_key,
                prs_kostenplaats_nr,
                prs_kostenplaats_omschrijving,
                prs_kostenplaatsgrp_oms,
                prs_kostensoort_oms,
                prs_kostensoort_opmerking,
                prs_kostensoort_refcode,
                prs_bedrijf_key,
                prs_debiteur_naam,
                prs_kostensoortgrp_oms,
                fin_verkoopfactuur_bedrag,
                fin_verkoopfactuur_btw,
                fin_btwtabelwaarde_code,
                fin_btwtabelwaarde_oms,
                fin_btwtabelwaarde_perc,
                fin_btwtabelwaarde_verlegd,
                fin_verkoopfactuur_maand,
                fin_verkoopfactuur_n1,
                fin_verkoopfactuur_n2,
                fin_verkoopfactuur_n3,
                fin_verkoopfactuur_n4,
                fin_verkoopfactuur_n5,
                fin_verkoopfactuur_c1,
                fin_verkoopfactuur_c2,
                fin_verkoopfactuur_c3,
                fin_verkoopfactuur_c4,
                fin_verkoopfactuur_c5,
                fin_verkoopfactuur_c6,
                fin_verkoopfactuur_c7,
                fin_verkoopfactuur_c8,
                fin_verkoopfactuur_d1,
                fin_verkoopfactuur_d2,
                fin_verkoopfactuur_d3,
                fin_verkoopfactuur_d4,
                fin_verkoopfactuur_d5
           FROM fin_verkoopfactuur
          WHERE fin_verkoopfactuurkop_key = p_key
            AND ROWNUM <= fac.getsetting ('fac_xml_max_factuur')
       ORDER BY fin_verkoopfactuur_key;

   BEGIN
      IF p_key IS NOT NULL
      THEN

         SELECT fin_verkoopfactuurkop_id
           INTO v_id
           FROM fin_verkoopfactuurkop
          WHERE fin_verkoopfactuurkop_key = p_key;

         createopentag ('verkoopfactuur');
         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('id', v_id);

         FOR rec1 IN c1 LOOP
            createopentag ('verkoopfactuurregel');
            createxmltagvalue ('key', mynumbertochar (rec1.fin_verkoopfactuur_key));
            mydatetochar ('aanmaak', rec1.fin_verkoopfactuur_aanmaak);
            createxmltagvalue ('id', rec1.fin_verkoopfactuur_id);
            mydatetochar ('datum', rec1.fin_verkoopfactuur_datum);
            createxmltagvalue ('omschrijving', rec1.fin_verkoopfactuur_omschr);
            createxmltagvalue ('xmlnode', rec1.fin_verkoopfactuur_xmlnode); --referenced data included later
            createxmltagvalue ('refkey', rec1.fin_verkoopfactuur_refkey); --referenced data included later
            create_prs_kostenplaats_node (rec1.prs_kostenplaats_key, TRUE);
            createxmltagvalue ('kostenplaatsnr', rec1.prs_kostenplaats_nr);
            createxmltagvalue ('kostenplaatsomschrijving', rec1.prs_kostenplaats_omschrijving);
            createxmltagvalue ('kostenplaatsgroep', rec1.prs_kostenplaatsgrp_oms);
            createxmltagvalue ('kostensoort', rec1.prs_kostensoort_oms);
            createxmltagvalue ('kostensoortopmerking', rec1.prs_kostensoort_opmerking);
            createxmltagvalue ('kostensoortrefcode', rec1.prs_kostensoort_refcode);
            create_prs_bedrijf_node (rec1.prs_bedrijf_key, 'bedrijf', TRUE);
            createxmltagvalue ('debiteurnaam', rec1.prs_debiteur_naam);
            createxmltagvalue ('kostensoortgroep', rec1.prs_kostensoortgrp_oms);
            createxmltagvalue ('bedrag', mynumbertochar (rec1.fin_verkoopfactuur_bedrag));
            createxmltagvalue ('btwbedrag', mynumbertochar (rec1.fin_verkoopfactuur_btw));
            createxmltagvalue ('btwcode', rec1.fin_btwtabelwaarde_code);
            createxmltagvalue ('btwomschrijving', rec1.fin_btwtabelwaarde_oms);
            createxmltagvalue ('btwpercentage', mynumbertochar (rec1.fin_btwtabelwaarde_perc));
            createxmltagvalue ('btwverlegd', mynumbertochar (rec1.fin_btwtabelwaarde_verlegd));
            createxmltagvalue ('boekmaand', rec1.fin_verkoopfactuur_maand);
            createxmltagvalue ('getal1', mynumbertochar (rec1.fin_verkoopfactuur_n1));
            createxmltagvalue ('getal2', mynumbertochar (rec1.fin_verkoopfactuur_n2));
            createxmltagvalue ('getal3', mynumbertochar (rec1.fin_verkoopfactuur_n3));
            createxmltagvalue ('getal4', mynumbertochar (rec1.fin_verkoopfactuur_n4));
            createxmltagvalue ('getal5', mynumbertochar (rec1.fin_verkoopfactuur_n5));
            createxmltagvalue ('tekst1', rec1.fin_verkoopfactuur_c1);
            createxmltagvalue ('tekst2', rec1.fin_verkoopfactuur_c2);
            createxmltagvalue ('tekst3', rec1.fin_verkoopfactuur_c3);
            createxmltagvalue ('tekst4', rec1.fin_verkoopfactuur_c4);
            createxmltagvalue ('tekst5', rec1.fin_verkoopfactuur_c5);
            createxmltagvalue ('tekst6', rec1.fin_verkoopfactuur_c6);
            createxmltagvalue ('tekst7', rec1.fin_verkoopfactuur_c7);
            createxmltagvalue ('tekst8', rec1.fin_verkoopfactuur_c8);
            mydatetochar ('datum1', rec1.fin_verkoopfactuur_d1);
            mydatetochar ('datum2', rec1.fin_verkoopfactuur_d2);
            mydatetochar ('datum3', rec1.fin_verkoopfactuur_d3);
            mydatetochar ('datum4', rec1.fin_verkoopfactuur_d4);
            mydatetochar ('datum5', rec1.fin_verkoopfactuur_d5);

            IF rec1.fin_verkoopfactuur_refkey IS NOT NULL
            THEN
               CASE rec1.fin_verkoopfactuur_xmlnode
                  WHEN 'opdracht'
                  THEN
                     create_mld_opdr_node (rec1.fin_verkoopfactuur_refkey, NULL, TRUE);
                  WHEN 'contract'
                  THEN
                     create_cnt_contract_node (rec1.fin_verkoopfactuur_refkey, TRUE);
                  WHEN 'bestelopdr'
                  THEN
                     create_bes_bestelopdr_node (rec1.fin_verkoopfactuur_refkey, TRUE);
                  WHEN 'reservering'
                  THEN
                     create_res_reservering_node (NULL, rec1.fin_verkoopfactuur_refkey);
                  ELSE
                     NULL;
               END CASE;
            END IF;
            createclosetag ('verkoopfactuurregel');
         END LOOP;

         createclosetag ('verkoopfactuur');
      END IF;
   END;

   PROCEDURE create_prs_kostensoortgrp_node (p_key IN NUMBER, p_parent_info BOOLEAN DEFAULT FALSE)
   AS
      CURSOR c_soort
      IS
         SELECT prs_kostensoort_key
           FROM prs_kostensoort
          WHERE prs_kostensoortgrp_key = p_key;
      v_oms      prs_kostensoortgrp.prs_kostensoortgrp_oms%TYPE;
      v_altcode  prs_kostensoortgrp.prs_kostensoortgrp_altcode%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         IF p_parent_info
         THEN
            create_bgt_ancestor_node('groep', p_key);
         END IF;
         --
         SELECT prs_kostensoortgrp_altcode
              , prs_kostensoortgrp_oms
           INTO v_altcode
              , v_oms
           FROM prs_kostensoortgrp
          WHERE prs_kostensoortgrp_key = p_key;
         createopentag ('kostengroep');
         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('code', v_altcode);
         createxmltagvalue ('name', v_oms);
         FOR rec1 IN c_soort
         LOOP
            create_prs_kostensoort_node (rec1.prs_kostensoort_key, TRUE);
         END LOOP;
         createclosetag ('kostengroep');
      END IF;
   END;
   PROCEDURE create_bgt_kostenrubriek_node (p_key IN NUMBER, p_parent_info BOOLEAN DEFAULT FALSE)
   AS
      CURSOR c_groep
      IS
         SELECT prs_kostensoortgrp_key
           FROM prs_kostensoortgrp
          WHERE bgt_kostenrubriek_key = p_key;

      CURSOR c_budget
      IS
         SELECT bgt_budget_key
           FROM bgt_budget
          WHERE bgt_kostenrubriek_key = p_key;

      v_code     bgt_kostenrubriek.bgt_kostenrubriek_code%TYPE;
      v_oms      bgt_kostenrubriek.bgt_kostenrubriek_oms%TYPE;
      v_btwperc  fin_btwtabelwaarde.fin_btwtabelwaarde_perc%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         IF p_parent_info
         THEN
            create_bgt_ancestor_node('rubriek', p_key);
         END IF;
         --
         SELECT r.bgt_kostenrubriek_code
              , r.bgt_kostenrubriek_oms
              , f.fin_btwtabelwaarde_perc
           INTO v_code
              , v_oms
              , v_btwperc
           FROM bgt_kostenrubriek r
              , fin_btwtabelwaarde f
          WHERE r.fin_btwtabelwaarde_key = f.fin_btwtabelwaarde_key(+)
            AND r.bgt_kostenrubriek_key = p_key;
         createopentag ('kostenrubriek');
         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('code', v_code);
         createxmltagvalue ('name', v_oms);
         createxmltagvalue ('btwperc', v_btwperc);
         FOR rec1 IN c_groep
         LOOP
            create_prs_kostensoortgrp_node (rec1.prs_kostensoortgrp_key);
         END LOOP;
         FOR rec2 IN c_budget
         LOOP
            create_bgt_budget_node (rec2.bgt_budget_key);
         END LOOP;
         createclosetag ('kostenrubriek');
      END IF;
   END;
   PROCEDURE create_bgt_project_node (p_key IN NUMBER, p_parent_info BOOLEAN DEFAULT FALSE)
   AS
      CURSOR c_rubriek
      IS
         SELECT bgt_kostenrubriek_key
           FROM bgt_kostenrubriek
          WHERE bgt_project_key = p_key;
      v_code            bgt_project.bgt_project_code%TYPE;
      v_omschrijving    bgt_project.bgt_project_omschrijving%TYPE;
      v_volgnr          bgt_project.bgt_project_volgnr%TYPE;
      v_prijspeildatum  bgt_project.bgt_project_prijspeildatum%TYPE;
      v_info            bgt_project.bgt_project_info%TYPE;
      v_notes           bgt_project.bgt_project_notes%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         IF p_parent_info
         THEN
            create_bgt_ancestor_node('project', p_key);
         END IF;
         --
         SELECT bgt_project_code
              , bgt_project_omschrijving
              , bgt_project_volgnr
              , bgt_project_prijspeildatum
              , bgt_project_info
              , bgt_project_notes
           INTO v_code
              , v_omschrijving
              , v_volgnr
              , v_prijspeildatum
              , v_info
              , v_notes
           FROM bgt_project
          WHERE bgt_project_key = p_key;
         createopentag ('project');
         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('code', v_code);
         createxmltagvalue ('name', v_omschrijving);
         createxmltagvalue ('sequence', mynumbertochar (v_volgnr));
         mydatetochar ('priceleveldate', v_prijspeildatum);
         createxmltagvalue ('info', v_info);
         createxmltagvalue ('notes', v_notes);
         FOR rec1 IN c_rubriek
         LOOP
            create_bgt_kostenrubriek_node (rec1.bgt_kostenrubriek_key);
         END LOOP;
         createclosetag ('project');
      END IF;
   END;
   PROCEDURE create_bgt_discipline_node (p_key IN NUMBER)
   AS
      CURSOR c_project
      IS
         SELECT bgt_project_key
           FROM bgt_project
          WHERE ins_discipline_key = p_key;
      v_omschrijving   ins_tab_discipline.ins_discipline_omschrijving%TYPE;
      v_opmerking      ins_tab_discipline.ins_discipline_opmerking%TYPE;
      v_code           bgt_disc_params.bgt_disc_params_code%TYPE;
      v_opdrachtgever  bgt_disc_params.bgt_disc_params_opdrachtgever%TYPE;
      v_startdatum     bgt_disc_params.bgt_disc_params_startdatum%TYPE;
   BEGIN
      IF p_key IS NOT NULL
      THEN
         SELECT d.ins_discipline_omschrijving
              , d.ins_discipline_opmerking
              , p.bgt_disc_params_code
              , p.bgt_disc_params_opdrachtgever
              , p.bgt_disc_params_startdatum
           INTO v_omschrijving
              , v_opmerking
              , v_code
              , v_opdrachtgever
              , v_startdatum
           FROM ins_tab_discipline d
              , bgt_disc_params p
          WHERE d.ins_discipline_key = p.bgt_ins_discipline_key
            AND d.ins_discipline_key = p_key;
         createopentag ('discipline');
         createxmltagvalue ('key', mynumbertochar (p_key));
         createxmltagvalue ('code', v_code);
         createxmltagvalue ('name', v_omschrijving);
         createxmltagvalue ('remark', v_opmerking);
         createxmltagvalue ('principal', v_opdrachtgever);
         mydatetochar ('startdate', v_startdatum);
         FOR rec1 IN c_project
         LOOP
            create_bgt_project_node (rec1.bgt_project_key);
         END LOOP;
         createclosetag ('discipline');
      END IF;
   END;
   PROCEDURE create_bgt_node (p_key IN NUMBER, p_where IN VARCHAR2)
   AS
   BEGIN
      createopentag('start_in');
      createxmltagvalue ('node', p_where);
      createclosetag('start_in');
      CASE p_where
         WHEN 'discipline'         THEN create_bgt_discipline_node(p_key);
         WHEN 'project'            THEN create_bgt_project_node(p_key, TRUE);
         WHEN 'kostenrubriek'      THEN create_bgt_kostenrubriek_node(p_key, TRUE);
         WHEN 'kostengroep'        THEN create_prs_kostensoortgrp_node(p_key, TRUE);
         WHEN 'kostensoort'        THEN create_prs_kostensoort_node(p_key, TRUE);
         ELSE create_bgt_discipline_node(-1);
      END CASE;
   END;

   PROCEDURE xml_node (p_xmlnode     IN VARCHAR2,
                       p_key         IN NUMBER,
                       p_custid      IN VARCHAR2,
                       p_sessionid   IN VARCHAR2,
                       p_extra       IN NUMBER,
                       p_where       IN VARCHAR2,
                       p_concise     IN BOOLEAN)
   AS
      v_where      VARCHAR2 (4000);
      v_sql_stmt   VARCHAR2 (4000);
   BEGIN
      CASE p_xmlnode
         WHEN 'afspraak'
         THEN
            create_bez_afspraak_node (p_key, p_extra, p_concise);
         WHEN 'bezoeker'
         THEN
            create_bez_bezoeker_node (p_key);
         WHEN 'bestelling'
         THEN
            create_bes_bestelling_node (p_key, p_concise);
         WHEN 'bestelopdr'
         THEN
            create_bes_bestelopdr_node (p_key, FALSE);
         WHEN 'bedrijf'
         THEN
            create_prs_bedrijf_node (p_key, 'bedrijf', FALSE);
         WHEN 'melding'
         THEN
            create_mld_melding_node (p_key, p_extra, TRUE);
         WHEN 'opdracht'
         THEN
            create_mld_opdr_node (p_key, p_extra, p_concise);
         WHEN 'reservering'
         THEN -- Deelreservering
            create_res_reservering_node (p_key, p_extra);
         WHEN 'xreservering'
         THEN -- Hele reservering
            create_res_reservering_node (p_key, NULL);
         WHEN 'scenario'
         THEN
            create_prj_scenario_node (p_key);
         WHEN 'message'
         THEN
            create_msg_message_node (p_key);
         WHEN 'perslid'
         THEN
            create_prs_perslid_node (p_key, 'perslid', p_concise);
         WHEN 'afdeling'
         THEN
            create_prs_afdeling_node (p_key, 'afdeling');
         WHEN 'kostenplaats'
         THEN
            create_prs_kostenplaats_node (p_key, FALSE);
         WHEN 'deel'
         THEN
            create_ins_deel_node (p_key, null, p_concise);
         WHEN 'controle'
         THEN
            create_ins_deelsrtcontr_node (p_key, FALSE);
         WHEN 'taak'
         THEN
            create_ins_taak_node (p_key);
         WHEN 'srtdeel'
         THEN
            create_ins_srtdeel_node (p_key, p_concise);
         WHEN 'rapport'
         THEN
            v_where := p_where;

            IF COALESCE (p_extra, 0) <> 0 AND v_where IS NULL
            THEN
               v_where := 'WHERE extra_key = ' || p_extra;
            END IF;

            create_fac_usrrap_node (p_key, v_where);
         WHEN 'sysrapport'
         THEN
            v_where := p_where;

            IF COALESCE (p_extra, 0) <> 0 AND v_where IS NULL
            THEN
               v_where := 'WHERE extra_key = ' || p_extra;
            END IF;

            create_fac_usrrap_node (p_key, v_where);
         WHEN 'contract'
         THEN
            create_cnt_contract_node (p_key, p_concise, p_extra);
         WHEN 'factuur'
         THEN
            create_fin_factuur_node (p_key, p_concise, FALSE, p_extra);
         WHEN 'verkoopfactuur'
         THEN
            create_fin_verkoopfactuur_node (p_key);
         WHEN 'ruimte'
         THEN
            -- create_alg_ruimte_node (p_key);
            create_alg_onroerendgoed_node (p_key,
                                           'plaats',
                                           NULL,
                                           FALSE,
                                           p_concise);
         WHEN 'verdieping'
         THEN
            create_alg_onroerendgoed_node (p_key,
                                           'plaats',
                                           NULL,
                                           FALSE,
                                           p_concise);
         WHEN 'gebouw'
         THEN
            create_alg_onroerendgoed_node (p_key,
                                           'plaats',
                                           NULL,
                                           FALSE,
                                           p_concise);
         WHEN 'locatie'
         THEN
            create_alg_onroerendgoed_node (p_key,
                                           'plaats',
                                           p_key,
                                           FALSE,
                                           p_concise);
         WHEN 'budget'
         THEN
--            create_bgt_discipline_node (p_key);
            create_bgt_node (p_key, p_where);
         ELSE
            v_sql_stmt :=
                  'BEGIN '
               || p_custid
               || '.create_'
               || p_xmlnode
               || '_node ('
               || p_key
               || ','
               || ''''
               || NVL (p_custid, '')
               || ''''
               || ','
               || ''''
               || NVL (p_sessionid, '')
               || ''''
               || ','
               || NVL (p_extra, -1)
               || ','
               || ''''
               || NVL (p_where, '')
               || ''''
               || '); END; ';

            EXECUTE IMMEDIATE v_sql_stmt;
      END CASE;
   END;

   -- MAIN PROCS --
   FUNCTION make_xml2 (p_xmlnode     IN VARCHAR2,
                       p_key         IN NUMBER,
                       p_custid      IN VARCHAR2,
                       p_sessionid   IN VARCHAR2,
                       p_extra       IN NUMBER,
                       p_where       IN VARCHAR2)
        RETURN CLOB
   AS
   BEGIN
      DBMS_LOB.createtemporary (aclob, TRUE, DBMS_LOB.CALL);
      add_header (p_custid);
      xmlnode_depth := 0;                        -- Set initial depth-level!!!
      xml_node (p_xmlnode,
                p_key,
                p_custid,
                p_sessionid,
                p_extra,
                p_where,
                FALSE);
      create_bookmarks_node (p_xmlnode, p_key);
      add_localisation (p_xmlnode);
      add_footer ('');
      RETURN aclob;
   EXCEPTION WHEN NO_DATA_FOUND THEN
        -- FCLT#58472 Een NO_DATA_FOUND (diep) in een FUNCTION die vanuit een SELECT wordt aangeroepen
        -- wordt *niet* gepropageerd naar de aanroeper. Dat is intens lastig troubleshooten dus daarom
        -- op deze manier raisen als custom error. Die wordt wel gepropageerd.
        raise_application_error (-20001, 'Error in FUNCTION make_xml2' || CHR(13) || DBMS_UTILITY.FORMAT_ERROR_STACK);
   END;

   FUNCTION make_view_xml2 (p_view        IN VARCHAR2,
                            p_key         IN NUMBER,
                            p_custid      IN VARCHAR2,
                            p_sessionid   IN VARCHAR2,
                            p_extra       IN NUMBER,
                            p_where       IN VARCHAR2,
                            p_nodename    IN VARCHAR2,
                            p_rowname     IN VARCHAR2
                            )
        RETURN CLOB
   AS
   BEGIN
      DBMS_LOB.createtemporary (aclob, TRUE, DBMS_LOB.CALL);
      add_header (p_custid);
      --add_localisation (p_xmlnode);
      create_view_node (p_view,
                        NULL,
                        NULL,
                        p_where,
                        p_nodename,
                        p_rowname,
                        NULL,
                        'rapport');
      add_footer ('');
      RETURN aclob;
   EXCEPTION WHEN NO_DATA_FOUND THEN
        -- FCLT#58472 Een NO_DATA_FOUND (diep) in een FUNCTION die vanuit een SELECT wordt aangeroepen
        -- wordt *niet* gepropageerd naar de aanroeper. Dat is intens lastig troubleshooten dus daarom
        -- op deze manier raisen als custom error. Die wordt wel gepropageerd.
        raise_application_error (-20001, 'Error in FUNCTION make_xml2' || CHR(13) || DBMS_UTILITY.FORMAT_ERROR_STACK);
   END;

END xml;
/

REGISTERRUN('$Id$')
