--
-- $Id$
--
-- Script om alle voorwaarden voor Uitvoerende en Contactanten goed te zetten als vaste bijlage in technisch kanaal.
-- Onder ticket 62728 en 69749 is dit in 2020 en 2021 al voor heel HEYDAY/breed uitgevoerd. Voor AAES gelden nu net wat andere condities omdat ze alleen nog maar conform CP werken
---- Allen voor Projectorders + ProjectRFQ op 1-10 doorgevoerd. In kader van 69749 deze opnieuw gedraaid, dit maal voor alle CP-kanalen
---- Voor alle CP-Relaties (ook al heeft men via 'Overeenkomstnr' andere overeenkomst) de Heyday_algemene_voorwaarden koppelen

DEFINE thisfile = 'AAES#68038.SQL'
DEFINE dbuser   = 'AAES'

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

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

-- Hulpview
CREATE OR REPLACE VIEW aaxx_v_bedradres_voorwaarden
AS
  SELECT t.prs_relatietype_omschrijving,
         b.prs_bedrijf_key,
         b.prs_bedrijf_naam,
         b.prs_bedrijf_uitvoerende,
         b.prs_bedrijf_contract,
         b.prs_overeenkomst_nr,
         (SELECT kw.prs_kenmerklink_waarde
            FROM prs_kenmerk k, prs_kenmerklink kw
           WHERE     kw.prs_link_key = b.prs_bedrijf_key
                 AND kw.prs_kenmerk_key = k.prs_kenmerk_key
                 AND k.prs_kenmerk_upper = 'OVEREENKOMST'
                 AND k.prs_kenmerk_niveau = 'B'
                 AND kw.prs_kenmerklink_verwijder IS NULL)
             AS overeenkomst,
         a.prs_bedrijfadres_key,
         a.mld_typeopdr_key,
         a.prs_bedrijfadres_type,                                    -- O of C
         DECODE (
             a.prs_bedrijfadres_type,
             'C', 'Contracten',
             'O', COALESCE (o.mld_typeopdr_omschrijving,
                            'Geen/Overige opdrachten'),
             '<?>')
             AS Opdrachttype,
         a.prs_bedrijfadres_flexfiles
             AS BijlageMeesturen, -- 0 of 1 is JA , 2 = NEE  -- ECHTER deze nemen we niet als voorwaarde mee in de bepaling of er wel/geen vaste bijlage mee moet. Staat daar namelijk los van...
         a.prs_bedrijfadres_attachfile,
         a.prs_bedrijfadres_url,
         a.prs_bedrijfadres_lockuser_key,
         p.prs_perslid_naam,
         a.prs_bedrijfadres_locksecret,
         CASE WHEN a.prs_bedrijfadres_type = 'O' 
              THEN COALESCE(t.totaal, 0)
              ELSE NULL
              END
              totaal,
         CASE WHEN a.prs_bedrijfadres_type = 'O' 
              THEN
              DECODE(a.mld_typeopdr_key, NULL, NULL, COALESCE(st.subtotaal, 0))   
              ELSE NULL
              END
              subtotaal
    FROM prs_bedrijf     b,
         prs_bedrijfadres a,
         prs_relatietype t,
         mld_typeopdr    o,
         prs_perslid     p,
        (SELECT mld_uitvoerende_keys, COUNT (*) totaal
            FROM mld_opdr
           WHERE mld_statusopdr_key IN (3, 4, 5, 8, 10) -- lopende opdrachten
        GROUP BY mld_uitvoerende_keys) t, -- totaal         
         (SELECT mld_uitvoerende_keys, mld_typeopdr_key, COUNT (*) subtotaal
            FROM mld_opdr
           WHERE mld_statusopdr_key IN (3, 4, 5, 8, 10) -- lopende opdrachten
        GROUP BY mld_uitvoerende_keys, mld_typeopdr_key) st -- subtotaal
   WHERE     b.prs_relatietype_key = t.prs_relatietype_key
         AND a.mld_typeopdr_key = o.mld_typeopdr_key(+)
         AND b.prs_bedrijf_key = a.prs_bedrijf_key
         AND b.prs_bedrijf_verwijder IS NULL
         AND b.prs_bedrijf_intern IS NULL
         AND (b.prs_bedrijf_uitvoerende = 1 OR b.prs_bedrijf_contract = 1)         
         AND a.prs_bedrijfadres_type in ('C','O')    -- Dus alle relaties zonder kanalen op O en C worden niet meegenomen (er vanuitgaande dat dit ook geen actuele relaties zijn... 
         AND a.prs_bedrijfadres_lockuser_key = p.prs_perslid_key (+)
         AND b.prs_bedrijf_key = t.mld_uitvoerende_keys (+)
         AND (b.prs_bedrijf_key = st.mld_uitvoerende_keys (+) AND o.mld_typeopdr_key = st.mld_typeopdr_key (+) )
ORDER BY b.prs_bedrijf_key, a.prs_bedrijfadres_key  ;


-- PROCEDURE om:
---- 0. Te checken en corrigeren dat op elk Opdracht-kanaal ook de afmelder1 en uniek lock_secret is aangemaakt
---- 1. De juiste bestanden als vaste bijlage te koppelen
---- 2. Projectkanaal aan te maken

CREATE OR REPLACE PROCEDURE aaxx_update_voorwaarden (p_applname   IN VARCHAR2,
                                             p_applrun    IN VARCHAR2)
AS
    v_aanduiding                   VARCHAR2 (1000);
    v_errorhint                    VARCHAR2 (1000);
    v_errormsg                     VARCHAR2 (1000);
    oracle_err_num                 NUMBER;
    oracle_err_mes                 VARCHAR2 (200);

    -- Per klantomgeving te vullen
    v_cp_voorwaarden               VARCHAR2 (1000) := 'HEYDAY_Algemene Inkoopvoorwaarden_Versie november 2021.pdf' ;
    v_ma_voorwaarden               VARCHAR2 (1000) :=  NULL ; -- Uit 2020 - 'RWE Algemene Technische Inkoopvoorwaarden 2017 v1.3.pdf' ;
    v_projecttype_1                VARCHAR2 (1000) := 'Project RFQ' ;
    v_projecttype_2                VARCHAR2 (1000) := 'Projectorder' ;
    v_gedeeld_geheim               VARCHAR2 (1000) := '45CfjXHOCDdhedyMNdDEzkVsN8QvHXcg' ; 
    -- v_gedeeld_geheim_2             VARCHAR2 (1000) := '' ;
    
    --- Overige
    v_mld_typeopdr_key             NUMBER (10);
    v_custcode                     VARCHAR2 (10);
    v_afmelder1_key                NUMBER (10);
    v_email_url                    VARCHAR2 (1000);

 CURSOR ch  -- Voor check en herstel van opdrachtkanalen. Moeten gevuld zijn met afmelder1 en gevuld met uniek gedeeld geheim
 IS
   SELECT *
    FROM
    aaxx_v_bedradres_voorwaarden v
    WHERE v.prs_bedrijfadres_type = 'O' ;

 CURSOR cp
 IS
   SELECT *
    FROM
    aaxx_v_bedradres_voorwaarden v
    WHERE v.prs_relatietype_omschrijving = 'Contracting party' ;
    
 CURSOR ma
 IS
   SELECT *
    FROM
    aaxx_v_bedradres_voorwaarden v
    WHERE v.prs_relatietype_omschrijving = 'Managing agent' ;

 CURSOR pr
 IS
  SELECT b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_bedrijf_email, v_projecttype_1 as projecttype
    FROM prs_bedrijf b, aaxx_v_bedradres_voorwaarden v
   WHERE     b.prs_bedrijf_key = v.prs_bedrijf_key
         AND b.prs_bedrijf_uitvoerende = 1
         -- AND b.prs_bedrijf_email IS NOT NULL
         AND NOT EXISTS
                 (SELECT v.prs_bedrijf_key
                    FROM aaxx_v_bedradres_voorwaarden v
                   WHERE     v.prs_bedrijf_key = b.prs_bedrijf_key
                         AND v.opdrachttype = v_projecttype_1)
    GROUP BY b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_bedrijf_email
  UNION
  SELECT b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_bedrijf_email, v_projecttype_2 as projecttype
    FROM prs_bedrijf b, aaxx_v_bedradres_voorwaarden v
   WHERE     b.prs_bedrijf_key = v.prs_bedrijf_key
         AND b.prs_bedrijf_uitvoerende = 1
         -- AND b.prs_bedrijf_email IS NOT NULL
         AND NOT EXISTS
                 (SELECT v.prs_bedrijf_key
                    FROM aaxx_v_bedradres_voorwaarden v
                   WHERE     v.prs_bedrijf_key = b.prs_bedrijf_key
                         AND v.opdrachttype = v_projecttype_2)
    GROUP BY b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_bedrijf_email  ;

BEGIN
  
    -- Algemene waarden ophalen
    SELECT fac_version_cust 
    INTO v_custcode
    FROM fac_version ;
    
    SELECT max(prs_perslid_key)
    INTO v_afmelder1_key
    FROM prs_perslid
    WHERE prs_perslid_naam = 'Afmelder1' AND prs_perslid_verwijder IS NULL ;

    FOR rec IN ch
    LOOP

     v_errorhint := 'Check en herstel: ' || rec.prs_bedrijf_key || ' ' || rec.prs_bedrijfadres_key;

    -- gedeeld geheim op projectkanaal 2020 aangemaakt - vullen met random-waarde
    IF (rec.opdrachttype = v_projecttype_1 OR rec.opdrachttype = v_projecttype_2) AND rec.prs_bedrijfadres_locksecret = v_gedeeld_geheim AND rec.SUBTOTAAL = 0 -- Geen lopende opdrachten op!!
    THEN
    
    UPDATE prs_bedrijfadres
    SET prs_bedrijfadres_locksecret = DBMS_RANDOM.string('a', 32)
    WHERE prs_bedrijfadres_key = rec.prs_bedrijfadres_key ;
    
    END IF;
    
    -- afmelder1 vullen waar nodig
    IF v_afmelder1_key IS NOT NULL AND rec.prs_bedrijfadres_lockuser_key IS NULL
    THEN

    UPDATE prs_bedrijfadres
    SET prs_bedrijfadres_lockuser_key = v_afmelder1_key, 
        prs_bedrijfadres_locksecret = DBMS_RANDOM.string('a', 32)
    WHERE prs_bedrijfadres_key = rec.prs_bedrijfadres_key ;
    
    END IF; 
    
    END LOOP;


    FOR rec IN cp
    LOOP

     v_errorhint := 'Update prs_bedrijfadres CP: ' || rec.prs_bedrijf_key || ' ' || rec.prs_bedrijfadres_key;
    
    -- standaard voorwaarden voor cp
    IF v_cp_voorwaarden IS NULL  -- Indien ze er niet zijn, dan leegmaken..
    THEN

      UPDATE prs_bedrijfadres
      SET prs_bedrijfadres_attachfile = ''
      WHERE prs_bedrijfadres_key = rec.prs_bedrijfadres_key AND rec.prs_bedrijfadres_attachfile IS NOT NULL
           ;

    
    ELSE -- indien ze er wel zijn dan koppelen waar nodig..
        --- WAS 2020: IF rec.prs_overeenkomst_nr IS NULL AND rec.overeenkomst IS NULL AND INSTR(upper(rec.opdrachttype),'PROJECT')=0
        --- WORDT NU - voor ALLE KANALEN
        -- IF INSTR(upper(rec.opdrachttype),'PROJECT')>0
        -- THEN
    
          UPDATE prs_bedrijfadres
          SET prs_bedrijfadres_attachfile = v_cp_voorwaarden
          WHERE prs_bedrijfadres_key = rec.prs_bedrijfadres_key AND (rec.prs_bedrijfadres_attachfile <>v_cp_voorwaarden OR rec.prs_bedrijfadres_attachfile IS NULL)
           ;
    
        --- WAS 2020:  ELSE -- en anders weghalen
        --- WORDT: Verder laten we alles zo staan
          /*
          UPDATE prs_bedrijfadres
          SET prs_bedrijfadres_attachfile = ''
          WHERE prs_bedrijfadres_key = rec.prs_bedrijfadres_key AND rec.prs_bedrijfadres_attachfile IS NOT NULL
          ;
          */
    
         --  END IF;

    END IF;        
    
    END LOOP;


    FOR rec IN ma
    LOOP

     v_errorhint := 'Update prs_bedrijfadres MA: ' || rec.prs_bedrijf_key || ' ' || rec.prs_bedrijfadres_key;
    
    -- standaard voorwaarden voor ma
    ---- 2020  - toen was er nog een MA-voorwaarden-PDF. 
    ---- Nu niet meer dus we gaan voor volledigheid voor alle MA-leveranciers overal waar nog zo'n document gekoppeld is, deze verwijderen.
    IF v_ma_voorwaarden IS NULL  -- Indien ze er niet zijn, dan leegmaken..
    THEN

      UPDATE prs_bedrijfadres
      SET prs_bedrijfadres_attachfile = ''
      WHERE prs_bedrijfadres_key = rec.prs_bedrijfadres_key AND rec.prs_bedrijfadres_attachfile IS NOT NULL
           ;

    
    ELSE -- indien ze er wel zijn dan koppelen waar nodig..
        IF rec.prs_overeenkomst_nr IS NULL AND rec.overeenkomst IS NULL AND INSTR(upper(rec.opdrachttype),'PROJECT')=0
        THEN
    
          UPDATE prs_bedrijfadres
          SET prs_bedrijfadres_attachfile = v_ma_voorwaarden
          WHERE prs_bedrijfadres_key = rec.prs_bedrijfadres_key AND (rec.prs_bedrijfadres_attachfile <>v_ma_voorwaarden OR rec.prs_bedrijfadres_attachfile IS NULL)
           ;
    
        ELSE -- en anders weghalen
    
          UPDATE prs_bedrijfadres
          SET prs_bedrijfadres_attachfile = ''
          WHERE prs_bedrijfadres_key = rec.prs_bedrijfadres_key AND rec.prs_bedrijfadres_attachfile IS NOT NULL
           ;
    
        END IF;
    END IF;        
    
    END LOOP;

    -- WAS 2020 - Vervolgens nog voor alle uitvoerders waar nog geen projectkanaal op aangemaakt is nog de projectkanalen toevoegen (zonder attachement)
    -- WORDT - Toevoegen inclusief Attachment v_cp_voorwaarden 
    FOR rec IN pr
    LOOP

     v_errorhint := 'Insert projectkanalen: ' || rec.prs_bedrijf_key;

       SELECT mld_typeopdr_key
       INTO v_mld_typeopdr_key
       FROM mld_typeopdr
       WHERE mld_typeopdr_omschrijving = rec.projecttype ;

       -- url voor projectkanaal bepalen: Gelijk aan 'Geen/Overige opdrachten' (mits mailto:..). Anders pakken we (mits gevuld) emailadres uit bedrijf
       SELECT max(a.prs_bedrijfadres_url)
       INTO v_email_url
       FROM aaxx_v_bedradres_voorwaarden v, prs_bedrijfadres a
         WHERE     v.prs_bedrijf_key = rec.prs_bedrijf_key
              AND v.prs_bedrijfadres_key = a.prs_bedrijfadres_key
              AND v.opdrachttype = 'Geen/Overige opdrachten'
              AND INSTR (a.PRS_BEDRIJFADRES_URL, 'mailto:') > 0  ;
       
       IF v_email_url IS NULL AND rec.prs_bedrijf_email IS NOT NULL
       THEN
       v_email_url := 'mailto:' || rec.prs_bedrijf_email ;
       
       END IF;
       
       -- Toevoegen kanaal
       -- als email gevuld.... + afmelder 1 bekend
       IF v_email_url IS NOT NULL AND v_afmelder1_key IS NOT NULL
       THEN
         INSERT INTO prs_bedrijfadres (prs_bedrijfadres_type,
                              mld_typeopdr_key,
                              alg_district_key,
                              alg_locatie_key,
                              prs_bedrijfadres_url,
                              prs_bedrijfadres_sender,
                              prs_bedrijfadres_replyaddress,
                              prs_bedrijfadres_username,
                              prs_bedrijfadres_password,
                              prs_bedrijfadres_authmethod,
                              prs_bedrijfadres_ordermode,
                              prs_bedrijfadres_soapaction,
                              prs_bedrijfadres_certificate,
                              prs_bedrijfadres_xsl,
                              prs_bedrijfadres_error_handler,
                              prs_bedrijfadres_ext,
                              prs_bedrijfadres_lockuser_key,
                              prs_bedrijfadres_locksecret,
                              prs_bedrijfadres_lockexpire,
                              prs_bedrijfadres_loglevel,
                              prs_bedrijfadres_attachfile,
                              prs_bedrijfadres_flexfiles,
                              prs_bedrijfadres_encoding,
                              prs_bedrijfadres_charset,
                              prs_bedrijf_key)
         VALUES ('O',
             v_mld_typeopdr_key,
             NULL,
             NULL,
             v_email_url,
             NULL,
             NULL,
             NULL,
             NULL,
             0,
             0,
             NULL,
             NULL,
             'xsl/' || v_custcode || '.xsl',
             0,
             NULL,
             v_afmelder1_key,
             DBMS_RANDOM.string('a', 32),
             30,
             0,
             v_cp_voorwaarden,   -- Was: NULL,
             0,
             0,
             NULL,
             rec.prs_bedrijf_key)       ;

       END IF;
    
    END LOOP;
   
    

EXCEPTION
    WHEN OTHERS
    THEN

        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
        v_errormsg :=
            'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes;
       fac.writelog (p_applname,
                          'E',
                          v_errormsg,
                          v_errorhint);
   
END aaxx_update_voorwaarden;
/


-- Procedure uitvoeren
begin aaxx_update_voorwaarden ('update_voorwaarden',null);
end;
/


                   
-- Alles weer droppen                   
DROP VIEW aaxx_v_bedradres_voorwaarden ;                   
DROP PROCEDURE aaxx_update_voorwaarden ;



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

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

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