CREATE OR REPLACE PACKAGE BODY AAES_TEST.aaes
AS

   PROCEDURE soap_action (action_name   IN VARCHAR2,
                          soap_seq      IN NUMBER,
                          soap_type     IN VARCHAR2)
    AS
       -- Variabelen waarin attributen worden verzameld
       v_id                VARCHAR2 (80);
       v_prs_perslid_key   NUMBER (10);
       v_prs_afdeling_key  NUMBER (10);

       v_hint              VARCHAR2 (200);
       oracle_err_num      NUMBER;
       oracle_err_mes      VARCHAR2 (200);
       v_count             NUMBER;
       v_count_pa          NUMBER;

       PROCEDURE dolog (status IN VARCHAR2, logregel IN VARCHAR2, hint IN VARCHAR2)
       AS
       BEGIN
          INSERT INTO imp_log (imp_log_applicatie,
                               imp_log_status,
                               imp_log_omschrijving,
                               imp_log_hint)
              VALUES ('SOAP',
                      status,
                      logregel,
                      hint);
       END;

       FUNCTION upsertsrtperslid (p_srtperslidomschrijving IN VARCHAR2)
          RETURN NUMBER
       AS
          l_prs_srtperslid_key   NUMBER (10);
       BEGIN
          IF p_srtperslidomschrijving IS NULL
          THEN
             RETURN 1;  -- key voor functie onbekend.
          END IF;
          SELECT prs_srtperslid_key
            INTO l_prs_srtperslid_key
            FROM prs_srtperslid
           WHERE prs_srtperslid_verwijder IS NULL
             AND UPPER (prs_srtperslid_omschrijving) =
                    UPPER (p_srtperslidomschrijving);

          RETURN l_prs_srtperslid_key;
       EXCEPTION
          WHEN NO_DATA_FOUND
          THEN
             INSERT INTO prs_srtperslid (prs_srtperslid_omschrijving)
                 VALUES (p_srtperslidomschrijving)
              RETURNING prs_srtperslid_key
                   INTO l_prs_srtperslid_key;

             RETURN l_prs_srtperslid_key;
       END;

       FUNCTION findafdeling (p_id IN VARCHAR2)
          RETURN NUMBER
       AS
          l_prs_afdeling_key   NUMBER (10);
       BEGIN
          -- Als er geen afdeling is meegegeven gaan we de persoon maar zolang onder de afdeling Onbekend (key = 1) hangen.
          -- Dit is een tijdelijke situatie. Direct na het aanmaken van de persoon wordt de afdeling dan aangemaakt
          -- en de persoon aangepast waarbij de afdeling wel gevuld is.
          IF p_id IS NULL THEN
             RETURN 1;   -- key voor afdeling onbekend;
          END IF;

          SELECT prs_afdeling_key
            INTO l_prs_afdeling_key
            FROM prs_afdeling
           WHERE prs_afdeling_verwijder IS NULL
             AND prs_afdeling_naam = p_id;

          RETURN l_prs_afdeling_key;
       EXCEPTION
          WHEN OTHERS
          THEN
             RETURN NULL;
       END;

       FUNCTION findkostenplaats (p_id IN VARCHAR2)
          RETURN NUMBER
       AS
          l_prs_kostenplaats_key   NUMBER (10);
       BEGIN
          SELECT prs_kostenplaats_key
            INTO l_prs_kostenplaats_key
            FROM prs_kostenplaats
           WHERE prs_kostenplaats_verwijder IS NULL
             AND prs_kostenplaats_nr = p_id;

          RETURN l_prs_kostenplaats_key;
       EXCEPTION
          WHEN OTHERS
          THEN
             RETURN NULL;
       END;

       FUNCTION findperslid (p_id IN VARCHAR2)
          RETURN NUMBER
       AS
          l_prs_perslid_key   NUMBER (10);
       BEGIN
          SELECT prs_perslid_key
            INTO l_prs_perslid_key
            FROM prs_perslid
           WHERE prs_perslid_verwijder IS NULL
             AND prs_perslid_authenticatie = p_id;

          RETURN l_prs_perslid_key;
       EXCEPTION
          WHEN OTHERS
          THEN
             RETURN NULL;
       END;

       FUNCTION upsertperslid (p_id IN VARCHAR2)
          RETURN NUMBER
       AS
          v_prs_perslid_key      NUMBER (10);
          v_prs_srtperslid_key   NUMBER (10);
          v_prs_afdeling_key     NUMBER (10);
          v_prs_perslid_email    VARCHAR2 (120);

          v_email                VARCHAR2 (120);
          v_loginnaam            VARCHAR2 (80);
          v_voorletters          VARCHAR2 (32);
          v_voornaam             VARCHAR2 (50);
          v_tussenvoegsel        VARCHAR2 (32);
          v_persoonachternaam    VARCHAR2 (50);
          v_personeelsnummer     VARCHAR2 (10);
          v_functie              VARCHAR2 (255);
          v_organisatieid        VARCHAR2 (20);
          v_mobiel               VARCHAR2 (30);
          v_telefoonnummer       VARCHAR2 (30);
          v_isactive             NUMBER (1);
          v_count                NUMBER;
       BEGIN
          v_prs_perslid_key := NULL;
          SELECT SUBSTR (loginnaam, 1, 30),
                 SUBSTR (email, 1, 200),
                 SUBSTR (voorletters, 1, 10),
                 SUBSTR (voornaam, 1, 30),
                 SUBSTR (tussenvoegsel, 1, 15),
                 SUBSTR (persoonachternaam, 1, 60),
                 SUBSTR (personeelsnummer, 1, 16),
                 SUBSTR (functie, 1, 60),
                 SUBSTR (organisatieid, 1, 20),
                 SUBSTR (mobiel, 1, 15),
                 SUBSTR (telefoonnummer, 1, 15)
            INTO v_loginnaam,
                 v_email,
                 v_voorletters,
                 v_voornaam,
                 v_tussenvoegsel,
                 v_persoonachternaam,
                 v_personeelsnummer,
                 v_functie,
                 v_organisatieid,
                 v_mobiel,
                 v_telefoonnummer
            FROM aaes_imp_soap_perslid
           WHERE id = p_id;

          v_prs_srtperslid_key := upsertsrtperslid (v_functie);
          v_prs_afdeling_key := findafdeling (v_organisatieid);

          BEGIN
             SELECT prs_perslid_key, prs_perslid_email
               INTO v_prs_perslid_key, v_prs_perslid_email
               FROM prs_perslid
              WHERE prs_perslid_authenticatie = p_id;
          EXCEPTION
             WHEN NO_DATA_FOUND
             THEN
                IF USER = 'AAES_TEST'
                THEN
                   BEGIN
                      SELECT prs_perslid_key, prs_perslid_email
                        INTO v_prs_perslid_key, v_prs_perslid_email
                        FROM prs_perslid
                       WHERE prs_perslid_verwijder IS NULL
                         AND prs_perslid_nr = v_personeelsnummer;
                       
                      UPDATE prs_perslid SET prs_perslid_authenticatie = p_id
                       WHERE prs_perslid_key = v_prs_perslid_key;
                   EXCEPTION 
                      WHEN NO_DATA_FOUND
                      THEN
                         v_prs_perslid_key := NULL;
                   END;
                
                END IF;
                IF v_prs_perslid_key IS NULL
                THEN
                   dolog ('I', 'Persoon [' || p_id ||'] wordt toegevoegd login:' || v_loginnaam, '');

                   INSERT INTO prs_perslid (prs_perslid_authenticatie,
                                            prs_perslid_oslogin,
                                            prs_perslid_email,
                                            prs_perslid_voorletters,
                                            prs_perslid_voornaam,
                                            prs_perslid_tussenvoegsel,
                                            prs_perslid_naam,
                                            prs_perslid_nr,
                                            prs_srtperslid_key,
                                            prs_afdeling_key,
                                            prs_perslid_mobiel,
                                            prs_perslid_telefoonnr)
                       VALUES (v_id,
                               v_loginnaam,
                               v_email,
                               v_voorletters,
                               v_voornaam,
                               v_tussenvoegsel,
                               v_persoonachternaam,
                               v_personeelsnummer,
                               v_prs_srtperslid_key,
                               v_prs_afdeling_key,
                               v_mobiel,
                               v_telefoonnummer)
                     RETURNING prs_perslid_key
                          INTO v_prs_perslid_key;
                END IF;
          -- persoon moet nog toegevoegd worden.
          END;

          -- controleer of er een persoon is met dezelfde login
          -- dan zijn we waarschijnlijk vergeten deze persoon te verwijderen of wordt dit nog gedaan.
          SELECT count(*) 
            INTO v_count
            FROM prs_perslid
           WHERE prs_perslid_oslogin = UPPER(v_loginnaam)
             AND prs_perslid_key <> v_prs_perslid_key;
             
          IF v_count > 0 
          THEN
             -- reset de login van de persoon met dezelfde login.
             UPDATE prs_perslid SET prs_perslid_oslogin = NULL WHERE prs_perslid_oslogin = UPPER(v_loginnaam);
          END IF;

          -- Het emailadres en organisatie van medewerkers van AAFM mag
          -- niet door de koppeling aangepast worden.
          IF UPPER(v_prs_perslid_email) LIKE '%AA-FM.COM'
          THEN
             v_prs_afdeling_key := 21;
             v_email := v_prs_perslid_email;
          END IF;

          dolog ('I', 'Persoon [' || p_id ||'] wordt aangepast login:' || v_loginnaam, '');
          UPDATE prs_perslid
             SET prs_perslid_oslogin = v_loginnaam,
                 prs_perslid_email = v_email,
                 prs_perslid_voorletters = v_voorletters,
                 prs_perslid_voornaam = v_voornaam,
                 prs_perslid_tussenvoegsel = v_tussenvoegsel,
                 prs_perslid_naam = v_persoonachternaam,
                 prs_perslid_nr = v_personeelsnummer,
                 prs_srtperslid_key = v_prs_srtperslid_key,
                 prs_afdeling_key = v_prs_afdeling_key,
                 prs_perslid_mobiel = v_mobiel,
                 prs_perslid_telefoonnr = v_telefoonnummer,
                 prs_perslid_verwijder = NULL
           WHERE prs_perslid_authenticatie = p_id;


          RETURN v_prs_perslid_key;
       END;

       FUNCTION upsertkostenplaats (p_nr IN VARCHAR2, p_omschrijving IN VARCHAR2)
          RETURN NUMBER
       AS
          v_prs_kostenplaats_key          NUMBER (10);
       BEGIN

          v_prs_kostenplaats_key := findkostenplaats (p_nr);

          -- als de kostenplaats nog niet bestaat maar wel een kostenplaatsnr ingevuld is.
          IF v_prs_kostenplaats_key IS NULL AND p_nr IS NOT NULL
          THEN
             dolog ('I', 'Kostenplaats is niet gevonden', '');

             INSERT INTO prs_kostenplaats (prs_kostenplaats_nr,
                                           prs_kostenplaats_module,
                                           prs_kostenplaats_omschrijving)
                 VALUES (p_nr,
                         'PRS',
                         p_omschrijving)
              RETURNING prs_kostenplaats_key
                   INTO v_prs_kostenplaats_key;
          END IF;

          UPDATE prs_kostenplaats
             SET prs_kostenplaats_omschrijving = p_omschrijving
           WHERE prs_kostenplaats_key = v_prs_kostenplaats_key;

          RETURN v_prs_kostenplaats_key;
       END;

       FUNCTION upsertafdeling (p_id IN VARCHAR2)
          RETURN NUMBER
       AS
          v_prs_perslid_key          NUMBER (10);
          v_prs_bedrijf_key          NUMBER (10);
          v_prs_afdeling_key         NUMBER (10);
          v_prs_afdeling_parentkey   NUMBER (10);
          v_prs_kostenplaats_key     NUMBER (10);

          v_bedrijfsnaam             VARCHAR2 (255);
          v_afdelingsomschrijving    VARCHAR2 (255);
          v_afdelingscode            VARCHAR2 (10);
          v_parentid                 VARCHAR2 (20);
          v_leidinggevende           VARCHAR2 (80);
          v_niveau                   NUMBER;
       BEGIN
          -- Mapping van velden:
          --   afdelingsomschrijving    -> Omschrijving van afdeling en kostenplaats
          --   id                       -> Naam van de afdeling en nummer van de kostenplaats
          --   afdelingscode            -> Waarde van het kenmerk kostenplaats
          --   parentid                 -> Bovenliggende afdeling. Wordt als kenmerk opgeslagen.
          --   leidinggevende           -> Kenmerk bij afdeling. Daily task zorgt er voor dat
          --                               de juiste leidinggevende bij de kostenplaats ingevuld wordt.
          -- het veld id wordt gebruikt als afdelingscode.
          -- Essent kent geen losse afdelingscode. Dit veld wordt alleen gevuld als er een kostenplaats aan
          -- de afdeling gekoppeld is.

          SELECT SUBSTR (bedrijfsnaam, 1, 30),
                 SUBSTR (afdelingsomschrijving, 1, 200),
                 SUBSTR (afdelingscode, 1, 10),
                 SUBSTR (parentid, 1, 20),
                 SUBSTR (leidinggevende, 1, 20)
            INTO v_bedrijfsnaam,
                 v_afdelingsomschrijving,
                 v_afdelingscode,
                 v_parentid,
                 v_leidinggevende
            FROM aaes_imp_soap_afdeling
           WHERE id = p_id;

          SELECT prs_bedrijf_key
            INTO v_prs_bedrijf_key
            FROM prs_v_aanwezigbedrijf
           WHERE UPPER (prs_bedrijf_naam) = 'ESSENT' AND prs_bedrijf_intern = 1;

          v_prs_perslid_key := findperslid (v_leidinggevende);
          v_prs_afdeling_parentkey := findafdeling (v_parentid);
          v_prs_afdeling_key := findafdeling (v_id);
          v_prs_kostenplaats_key := upsertkostenplaats (v_id, v_afdelingsomschrijving);

          IF v_prs_afdeling_key IS NULL
          THEN
             dolog ('I', 'Afdeling is niet gevonden', '');

             INSERT INTO prs_afdeling (prs_afdeling_naam,
                                       prs_afdeling_omschrijving,
                                       prs_afdeling_parentkey,
                                       prs_kostenplaats_key,
                                       prs_bedrijf_key)
                 VALUES (v_id,
                         v_afdelingsomschrijving,
                         NULL,
                         v_prs_kostenplaats_key,
                         v_prs_bedrijf_key)
              RETURNING prs_afdeling_key
                   INTO v_prs_afdeling_key;
          END IF;

          UPDATE prs_afdeling
             SET prs_afdeling_naam = v_id,
                 prs_afdeling_omschrijving = v_afdelingsomschrijving,
                 prs_kostenplaats_key = v_prs_kostenplaats_key,
                 prs_afdeling_parentkey = NULL,
                 prs_bedrijf_key = v_prs_bedrijf_key
           WHERE prs_afdeling_key = v_prs_afdeling_key;

          -- leidinggevende
          aaxx_set_kenmerk ('PRS',
                            1000,
                            v_prs_afdeling_key,
                            v_prs_perslid_key,
                            0);
          -- bovenliggende afdeling
          aaxx_set_kenmerk ('PRS',
                            1020,
                            v_prs_afdeling_key,
                            v_prs_afdeling_parentkey,
                            0);

          -- kostenplaat volgens IAM
          aaxx_set_kenmerk ('PRS',
                            1080,
                            v_prs_afdeling_key,
                            v_afdelingscode,
                            0);

          -- synchroniseer de afdelingsniveau flexkenmerken met de boom. Er kan namelijk een afdeling naar
          -- een ander niveau verplaatst worden. De onderliggende elementen moeten dan ook aangepast worden.
          -- daarom maar in één keer voor de hele afdelingsboom.
          BEGIN
             SELECT fac.safe_to_number (prs_kenmerklink_waarde)
               INTO v_niveau
               FROM prs_kenmerklink kl
              WHERE prs_kenmerk_key = 1060   -- niveau van de afdeling
                AND prs_link_key = v_prs_afdeling_parentkey;
             aaes_set_afd_niveau (v_prs_afdeling_parentkey, v_niveau);
          EXCEPTION WHEN OTHERS
          THEN
             aaes_set_afd_niveau (null, 0);
          END;
          RETURN v_prs_afdeling_key;
       END;
    BEGIN
       dolog (
          'I',
             'Soap request '
          || action_name
          || ' sequence['
          || soap_seq
          || '] type['
          || soap_type
          || ']', '');

       -- Eerst de data uit de fac_soap_data overzetten naar variabelen
       IF UPPER (soap_type) = 'USER'
       THEN
          SELECT fac_soapdata_value
            INTO v_id
            FROM fac_soapdata
           WHERE fac_soapdata_seq = soap_seq
             AND UPPER(fac_soapdata_name) = 'ID';

          SELECT COUNT (id)
            INTO v_count
            FROM aaes_imp_soap_perslid
           WHERE id = v_id;

          IF v_count = 0
          THEN
             INSERT INTO aaes_imp_soap_perslid (id)
                 VALUES (v_id);
          END IF;

          FOR c
             IN (SELECT UPPER (fac_soapdata_name) fac_soapdata_name,
                        fac_soapdata_value
                   FROM fac_soapdata
                  WHERE fac_soapdata_seq = soap_seq
                    AND UPPER( fac_soapdata_name) <> 'ID')
          LOOP
             v_hint := NULL;
             dolog (
                'I',
                   'Soap request '
                || action_name
                || ' sequence['
                || soap_seq
                || '] id['
                || v_id
                || '] name['
                || c.fac_soapdata_name
                || '] value['
                || c.fac_soapdata_value
                || ']', '');


             IF c.fac_soapdata_name = 'LOGINNAAM'
             THEN
                UPDATE aaes_imp_soap_perslid
                   SET loginnaam = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'EMAIL'
             THEN
                UPDATE aaes_imp_soap_perslid
                   SET email = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'VOORLETTERS'
             THEN
                UPDATE aaes_imp_soap_perslid
                   SET voorletters = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'VOORNAAM'
             THEN
                UPDATE aaes_imp_soap_perslid
                   SET voornaam = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'TUSSENVOEGSEL'
             THEN
                UPDATE aaes_imp_soap_perslid
                   SET tussenvoegsel = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'PERSOONACHTERNAAM'
             THEN
                UPDATE aaes_imp_soap_perslid
                   SET persoonachternaam = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'PERSONEELSNUMMER'
             THEN
                UPDATE aaes_imp_soap_perslid
                   SET personeelsnummer = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'FUNCTIE'
             THEN
                UPDATE aaes_imp_soap_perslid
                   SET functie = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'ORGANISATIEID'
             THEN
                UPDATE aaes_imp_soap_perslid
                   SET organisatieid = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'MOBIEL'
             THEN
                UPDATE aaes_imp_soap_perslid
                   SET mobiel = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'TELEFOONNUMMER'
             THEN
                UPDATE aaes_imp_soap_perslid
                   SET telefoonnummer = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'ISACTIVE'
             THEN
                UPDATE aaes_imp_soap_perslid
                   SET isactive = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSE                                   -- negeer onbekende attributen
                NULL;
             END IF;
          END LOOP;

          IF UPPER (action_name) = 'INSERT'
          THEN
             v_prs_perslid_key := upsertperslid (v_id);
          ELSIF UPPER (action_name) = 'UPDATE'
          THEN
             v_prs_perslid_key := upsertperslid (v_id);
          ELSIF UPPER (action_name) = 'DELETE'
          THEN                   -- TODO: Aan de hand van de variabelen een DELETE
             SELECT COUNT ( * )
               INTO v_count
               FROM prs_perslid p, prs_v_verplichting v
              WHERE p.prs_perslid_key = v.prs_perslid_key
                AND p.prs_perslid_verwijder IS NULL
                AND p.prs_perslid_authenticatie = v_id;

             IF v_count = 0
             THEN
                UPDATE prs_perslid
                   SET prs_perslid_verwijder = SYSDATE
                 WHERE prs_perslid_authenticatie = v_id;

                DELETE aaes_imp_soap_perslid
                 WHERE id = v_id;
             ELSE
                UPDATE prs_perslid
                   SET prs_perslid_oslogin = NULL,
                       prs_perslid_naam =
                          SUBSTR ('Inactief: ' || prs_perslid_naam, 1, 60)
                 WHERE prs_perslid_authenticatie = v_id
                   AND prs_perslid_naam NOT LIKE 'Inactief: %';
             END IF;
          ELSE                                          -- negeer onbekende action
             NULL;
          END IF;
       ELSIF UPPER (soap_type) = 'ORGANIZATIONUNIT'
       THEN
          FOR c
             IN (SELECT UPPER (fac_soapdata_name) fac_soapdata_name,
                        fac_soapdata_value
                   FROM fac_soapdata
                  WHERE fac_soapdata_seq = soap_seq)
          LOOP
             dolog (
                'I',
                   'Soap request '
                || action_name
                || ' sequence['
                || soap_seq
                || '] name['
                || c.fac_soapdata_name
                || '] value['
                || c.fac_soapdata_value
                || ']', '');

             -- we gebruiken nu nog prs_afdeling_key maar dit moet nog aangepast worden.
             IF c.fac_soapdata_name = 'ID'
             THEN
                v_id := c.fac_soapdata_value;

                SELECT COUNT (id)
                  INTO v_count
                  FROM aaes_imp_soap_afdeling
                 WHERE id = v_id;

                IF v_count = 0
                THEN
                   INSERT INTO aaes_imp_soap_afdeling (id)
                       VALUES (v_id);
                END IF;
             ELSIF c.fac_soapdata_name = 'BEDRIJFSNAAM'
             THEN
                UPDATE aaes_imp_soap_afdeling
                   SET bedrijfsnaam = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'AFDELINGSOMSCHRIJVING'
             THEN
                UPDATE aaes_imp_soap_afdeling
                   SET afdelingsomschrijving = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'AFDELINGSCODE'
             THEN
                UPDATE aaes_imp_soap_afdeling
                   SET afdelingscode = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'PARENTID'
             THEN
                UPDATE aaes_imp_soap_afdeling
                   SET parentid = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSIF c.fac_soapdata_name = 'LEIDINGGEVENDE'
             THEN
                UPDATE aaes_imp_soap_afdeling
                   SET leidinggevende = c.fac_soapdata_value
                 WHERE id = v_id;
             ELSE                                   -- negeer onbekende attributen
                NULL;
             END IF;
          END LOOP;

          IF UPPER (action_name) = 'INSERT'
          THEN
             v_prs_perslid_key := upsertafdeling (v_id);
          ELSIF UPPER (action_name) = 'UPDATE'
          THEN
             v_prs_perslid_key := upsertafdeling (v_id);
          ELSIF UPPER (action_name) = 'DELETE'
          THEN
             v_hint := 'Tel het aantal verplichtingen voor: ' || v_id;
             v_prs_afdeling_key := findafdeling(v_id);
             SELECT COUNT ( * )
               INTO v_count
               FROM prs_v_afd_verplichting v
              WHERE v.prs_afdeling_key = v_prs_afdeling_key;

             SELECT COUNT ( * )
               INTO v_count_pa
               FROM prs_v_aanwezigperslid p
              WHERE p.prs_afdeling_key = v_prs_afdeling_key;

             IF v_count = 0 AND v_count_pa = 0
             THEN
                v_hint := 'Set het verwijderveld voor afdeling met key: ' || v_prs_afdeling_key;
                UPDATE prs_afdeling
                   SET prs_afdeling_verwijder = SYSDATE
                 WHERE prs_afdeling_key = v_prs_afdeling_key;

                v_hint := 'Verwijder afdeling met id: ' || v_id || ' uit de tabel aaes_imp_soap_afdeling';
                DELETE aaes_imp_soap_afdeling
                 WHERE id = v_id;
             ELSE
                v_hint := 'Markeer de afdeling met key: ' || v_prs_afdeling_key || ' als inactief';
                UPDATE prs_afdeling
                   SET prs_afdeling_omschrijving =
                          SUBSTR ('Inactief: ' || prs_afdeling_omschrijving,
                                  1,
                                  60)
                 WHERE prs_afdeling_key = v_prs_afdeling_key
                   AND prs_afdeling_omschrijving NOT LIKE 'Inactief: %';
             END IF;

             -- set in ieder geval de verwijdervlag voor de kostenplaats
             v_hint := 'Verwijder kostenplaats behorend bij afdeling met key: ' || v_prs_afdeling_key;
             UPDATE prs_kostenplaats
                SET prs_kostenplaats_verwijder = SYSDATE
              WHERE prs_kostenplaats_key in (SELECT prs_kostenplaats_key
                                               FROM prs_afdeling
                                              WHERE prs_afdeling_key = v_prs_afdeling_key);

          ELSE                                          -- negeer onbekende action
             NULL;
          END IF;
       END IF;
    EXCEPTION
       WHEN OTHERS
       THEN
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
          dolog ('E', '[' || v_id || ']  sequence[' || soap_seq || ']error ' || oracle_err_num || '/' || oracle_err_mes, v_hint);
          COMMIT;
    END soap_action;
END;
/

