SET ECHO ON
SPOOL xAKZA_KPI.lst
SET DEFINE OFF;

----- Views voor berekenen KPI's -----------------------------------------------

-- Views voor berekening (genormeerde) KPI-scores o.b.v. handmatig/automatisch ingevulde KPI-meldingen.
-- Eén view per melding. Nummering is gelijk aan die van de de standaardmeldingen.

-- mld_stdmelding 1. Kosten budget                 1281  A
-- mld_kenmerk    Locatie                           838  A
-- mld_kenmerk    Periode                           865  A
-- mld_kenmerk    Catering^                         803
-- mld_kenmerk    Werkelijke kosten                 892  A
-- mld_kenmerk    Extra kosten Facilitor            820  A
-- mld_kenmerk    Extra kosten                      816  A
-- mld_kenmerk    Opmerking                         848
-- mld_kenmerk    Receptie^                         869
-- mld_kenmerk    Werkelijke kosten                 893  A
-- mld_kenmerk    Extra kosten Facilitor            821  A
-- mld_kenmerk    Extra kosten                      817  A
-- mld_kenmerk    Opmerking                         852
-- mld_kenmerk    Schoonmaak^                       876
-- mld_kenmerk    Werkelijke kosten                 894  A
-- mld_kenmerk    Extra kosten Facilitor            822  A
-- mld_kenmerk    Extra kosten                      818  A
-- mld_kenmerk    Opmerking                         855
-- mld_kenmerk    Documentmanagement^               814
-- mld_kenmerk    Werkelijke kosten                 895  A
-- mld_kenmerk    Extra kosten Facilitor            823  A
-- mld_kenmerk    Extra kosten                      819  A
-- mld_kenmerk    Opmerking                         857
-- TODO budget is verplicht; outer join weghalen
CREATE OR REPLACE VIEW akza_v_kpi1
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('CK1','RK11','RK12','SK23','SK25','DK33')),
        kosten AS
        (SELECT mld_melding_key,
                alg_locatie_key, locatie,
                periode,
                (cat_kost + cat_fclt + cat_extra) / cat_kost cat_score,
                (rec_kost + rec_fclt + rec_extra) / rec_kost rec_score,
                (sch_kost + sch_fclt + sch_extra) / sch_kost sch_score,
                (doc_kost + doc_fclt + doc_extra) / doc_kost doc_score,
                (rec_fclt + rec_extra) / (rec_kost + rec_fclt + rec_extra) rec_onvoorz_score,
                (sch_fclt + sch_extra) / (sch_kost + sch_fclt + sch_extra) sch_regie_score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      dloc.alg_locatie_omschrijving locatie,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      fac.safe_to_number(cat_kost.mld_kenmerkmelding_waarde)  cat_kost,
                      fac.safe_to_number(cat_fclt.mld_kenmerkmelding_waarde)  cat_fclt,
                      fac.safe_to_number(cat_extra.mld_kenmerkmelding_waarde) cat_extra,
                      fac.safe_to_number(rec_kost.mld_kenmerkmelding_waarde)  rec_kost,
                      fac.safe_to_number(rec_fclt.mld_kenmerkmelding_waarde)  rec_fclt,
                      fac.safe_to_number(rec_extra.mld_kenmerkmelding_waarde) rec_extra,
                      fac.safe_to_number(sch_kost.mld_kenmerkmelding_waarde)  sch_kost,
                      fac.safe_to_number(sch_fclt.mld_kenmerkmelding_waarde)  sch_fclt,
                      fac.safe_to_number(sch_extra.mld_kenmerkmelding_waarde) sch_extra,
                      fac.safe_to_number(doc_kost.mld_kenmerkmelding_waarde)  doc_kost,
                      fac.safe_to_number(doc_fclt.mld_kenmerkmelding_waarde)  doc_fclt,
                      fac.safe_to_number(doc_extra.mld_kenmerkmelding_waarde) doc_extra
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 892) cat_kost,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 820) cat_fclt,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 816) cat_extra,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 893) rec_kost,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 821) rec_fclt,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 817) rec_extra,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 894) sch_kost,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 822) sch_fclt,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 818) sch_extra,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 895) doc_kost,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 823) doc_fclt,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 819) doc_extra,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key = 1281
                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND cat_kost.mld_melding_key(+) = m.mld_melding_key
                  AND cat_fclt.mld_melding_key(+) = m.mld_melding_key
                  AND cat_extra.mld_melding_key(+) = m.mld_melding_key
                  AND rec_kost.mld_melding_key(+) = m.mld_melding_key
                  AND rec_fclt.mld_melding_key(+) = m.mld_melding_key
                  AND rec_extra.mld_melding_key(+) = m.mld_melding_key
                  AND sch_kost.mld_melding_key(+) = m.mld_melding_key
                  AND sch_fclt.mld_melding_key(+) = m.mld_melding_key
                  AND sch_extra.mld_melding_key(+) = m.mld_melding_key
                  AND doc_kost.mld_melding_key(+) = m.mld_melding_key
                  AND doc_fclt.mld_melding_key(+) = m.mld_melding_key
                  AND doc_extra.mld_melding_key(+) = m.mld_melding_key) )
   SELECT periode, alg_locatie_key,
          kpi_code,
          mld_melding_key,
          kpi.getNormScore(score, n000, n070, n090, n100) normScore,
          normscores
     FROM (
         SELECT n.kpi_code, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key, k.locatie,
                k.periode,
                DECODE(n.kpi_code,
                       'CK1',  cat_score,
                       'RK11', rec_score,
                       'RK12', rec_onvoorz_score,
                       'SK23', sch_regie_score,
                       'SK25', sch_score,
                       'DK33', doc_score) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, kosten k) m
;

-- mld_stdmelding 2. Audit Catering                1282
-- mld_kenmerk    Locatie                           838  A
-- mld_kenmerk    Periode                           865  A
-- mld_kenmerk    Wachttijden bij kassa^            890
-- mld_kenmerk    Tijdstip1                         878
-- mld_kenmerk    Aantal bezoekers                  769  A
-- mld_kenmerk    Aantal op tijd                    781  A
-- mld_kenmerk    Tijdstip2                         881
-- mld_kenmerk    Aantal bezoekers                  771  A
-- mld_kenmerk    Aantal op tijd                    784  A
-- mld_kenmerk    Tijdstip3                         883
-- mld_kenmerk    Aantal bezoekers                  773  A
-- mld_kenmerk    Aantal op tijd                    785  A
-- mld_kenmerk    Opmerking                         853
-- mld_kenmerk    Assortimentsaanbod^               792
-- mld_kenmerk    Aantal producten assortiment      788  A
-- mld_kenmerk    Aantal producten aanwezig         787  A
-- mld_kenmerk    Opmerking                         856
-- mld_kenmerk    HACCP controle^                   829
-- mld_kenmerk    Totaal aantal HACCP punten        884  A
-- mld_kenmerk    Aantal goede HACCP punten         777  A
CREATE OR REPLACE VIEW akza_v_kpi2
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('CK2', 'CK3', 'CK4')),
        audits AS
        (SELECT mld_melding_key,
                alg_locatie_key, locatie,
                periode,
                DECODE(num_bez1 + num_bez2 + num_bez3,
                       0, 0,
                       (tijdig1 + tijdig2 + tijdig3) / (num_bez1 + num_bez2 + num_bez3) ) wachttijd_score,
                DECODE(num_prod,
                       0, 0,
                       aanw_prod / num_prod) assortiment_score,
                DECODE(num_haccp,
                       0, 0,
                       goed_haccp / num_haccp) haccp_score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      dloc.alg_locatie_omschrijving locatie,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      fac.safe_to_number(num_bez1.mld_kenmerkmelding_waarde)   num_bez1,
                      fac.safe_to_number(tijdig1.mld_kenmerkmelding_waarde)    tijdig1,
                      fac.safe_to_number(num_bez2.mld_kenmerkmelding_waarde)   num_bez2,
                      fac.safe_to_number(tijdig2.mld_kenmerkmelding_waarde)    tijdig2,
                      fac.safe_to_number(num_bez3.mld_kenmerkmelding_waarde)   num_bez3,
                      fac.safe_to_number(tijdig3.mld_kenmerkmelding_waarde)    tijdig3,
                      fac.safe_to_number(num_prod.mld_kenmerkmelding_waarde)   num_prod,
                      fac.safe_to_number(aanw_prod.mld_kenmerkmelding_waarde)  aanw_prod,
                      fac.safe_to_number(num_haccp.mld_kenmerkmelding_waarde)  num_haccp,
                      fac.safe_to_number(goed_haccp.mld_kenmerkmelding_waarde) goed_haccp
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 769) num_bez1,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 781) tijdig1,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 771) num_bez2,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 784) tijdig2,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 773) num_bez3,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 785) tijdig3,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 788) num_prod,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 787) aanw_prod,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 884) num_haccp,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 777) goed_haccp,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key = 1282
                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND num_bez1.mld_melding_key(+) = m.mld_melding_key
                  AND tijdig1.mld_melding_key(+) = m.mld_melding_key
                  AND num_bez2.mld_melding_key(+) = m.mld_melding_key
                  AND tijdig2.mld_melding_key(+) = m.mld_melding_key
                  AND num_bez3.mld_melding_key(+) = m.mld_melding_key
                  AND tijdig3.mld_melding_key(+) = m.mld_melding_key
                  AND num_prod.mld_melding_key(+) = m.mld_melding_key
                  AND aanw_prod.mld_melding_key(+) = m.mld_melding_key
                  AND num_haccp.mld_melding_key(+) = m.mld_melding_key
                  AND goed_haccp.mld_melding_key(+) = m.mld_melding_key) )
   SELECT periode, alg_locatie_key,
          kpi_code,
          mld_melding_key,
          kpi.getNormScore(score, n000, n070, n090, n100) normScore,
          normscores
     FROM (
         SELECT n.kpi_code, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key, k.locatie,
                k.periode,
                DECODE(n.kpi_code,
                       'CK2', wachttijd_score,
                       'CK3', assortiment_score,
                       'CK4', haccp_score) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, audits k) m
;

-- mld_stdmelding 3. KTO Klant catering            1283  A
-- mld_stdmelding 3. KTO Receptie                  1284  A
-- mld_stdmelding 3. KTO Telefonie                 1285  A
-- mld_stdmelding 3. KTO Schoonmaak                1286  A
-- mld_stdmelding 3. KTO Documentmanagement        1287  A
-- mld_kenmerk    Locatie                           838  A
-- mld_kenmerk    Periode                           865  A
-- mld_srtkenmerk Cijfer                            646  A
-- mld_srtkenmerk Opmerking                         666
CREATE OR REPLACE VIEW akza_v_kpi3
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('CT6','RT19','RT20','ST30','DT40')),
        kto AS
        (SELECT MIN(mld_melding_key) mld_melding_key,
                alg_locatie_key, locatie,
                periode,
                mld_stdmelding_key,
                DECODE(COUNT(*),
                       0, 0,
                       SUM(cijfer) / COUNT(*) ) avg_score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      dloc.alg_locatie_omschrijving locatie,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      m.mld_stdmelding_key,
                      fac.safe_to_number(cijfer.mld_kenmerkmelding_waarde) cijfer
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL
                          AND mld_kenmerk_key IN (SELECT mld_kenmerk_key FROM mld_kenmerk
                                                   WHERE mld_kenmerk_verwijder IS NULL
                                                     AND mld_srtkenmerk_key = 646) ) cijfer,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key IN (1283, 1284, 1285, 1286, 1287)
                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND cijfer.mld_melding_key = m.mld_melding_key)
         GROUP BY alg_locatie_key, locatie, periode, mld_stdmelding_key)
   SELECT periode, alg_locatie_key,
          kpi_code,
          mld_melding_key,
          kpi.getNormScore(score, n000, n070, n090, n100) normScore,
          normscores
     FROM (
         SELECT n.kpi_code, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key, k.locatie,
                k.periode,
                avg_score score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, kto k
          WHERE k.mld_stdmelding_key = DECODE(n.kpi_code,
                                              'CT6',  1283,
                                              'RT19', 1284,
                                              'RT20', 1285,
                                              'ST30', 1286,
                                              'DT40', 1287)) m
;

-- mld_stdmelding 4. Catering Duurzaamheid en derving       1288
-- mld_kenmerk    Locatie                                    838  A
-- mld_kenmerk    Periode                                    865  A
-- mld_kenmerk    Gebruik biologische producten^             825
-- mld_kenmerk    Percentage Biologisch                      863  A
-- mld_kenmerk    Opmerking                                  846
-- mld_kenmerk    Derving^                                   812
-- mld_kenmerk    Percentage derving                         864  A
-- mld_kenmerk    Opmerking                                  849
CREATE OR REPLACE VIEW akza_v_kpi4
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('CD7', 'CD8')),
        audits AS
        (SELECT mld_melding_key,
                alg_locatie_key, locatie,
                periode,
                perc_bio  / 100 bio_score,
                perc_derv / 100 derving_score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      dloc.alg_locatie_omschrijving locatie,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      fac.safe_to_number(perc_bio.mld_kenmerkmelding_waarde) perc_bio,
                      fac.safe_to_number(perc_derv.mld_kenmerkmelding_waarde)  perc_derv
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 863) perc_bio,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 864) perc_derv,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key = 1288
                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND perc_bio.mld_melding_key(+) = m.mld_melding_key
                  AND perc_derv.mld_melding_key(+) = m.mld_melding_key ) )
   SELECT periode, alg_locatie_key,
          kpi_code,
          mld_melding_key,
          kpi.getNormScore(score, n000, n070, n090, n100) normScore,
          normscores
     FROM (
         SELECT n.kpi_code, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key, k.locatie,
                k.periode,
                DECODE(n.kpi_code,
                       'CD7', bio_score,
                       'CD8', derving_score) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, audits k) m
;

-- mld_stdmelding 5. Managementrapportage                            1289
-- mld_kenmerk    Locatie                                             838  A
-- mld_kenmerk    Periode                                             865  A
-- mld_kenmerk    Catering^                                           804
-- mld_kenmerk    Datum aangeleverd                                   808
-- mld_kenmerk    Op tijd aangeleverd                                 840  A
-- mld_kenmerk    Aantal Bezoekers restaurant per dag                 765  A
-- mld_kenmerk    % Derving                                           761  A
-- mld_kenmerk    GFT Afval (kg)                                      824  A
-- mld_kenmerk    Kosten per EN-categorie                             834  A
-- mld_kenmerk    Overzicht biologische producten                     861  A
-- mld_kenmerk    Overizcht HACCP-rapportage                          859  A
-- mld_kenmerk    KPI-Informatie                                      830  A
-- mld_kenmerk    Receptie^                                           870
-- mld_kenmerk    Datum aangeleverd                                   809
-- mld_kenmerk    Op tijd aangeleverd                                 841  A
-- mld_kenmerk    Aantal bezoekers per dag                            774  A
-- mld_kenmerk    Aantal telefoontjes per dag (ingaand / uitgaand)    789  A
-- mld_kenmerk    Aantal afgehaalde kranten (detail)                  766  A
-- mld_kenmerk    Aantal meldingen / incidenten                       779  A
-- mld_kenmerk    Aantal bevindingen tijdens open-sluitrondes         767  A
-- mld_kenmerk    Aantal bezoekers receptie                           775  A
-- mld_kenmerk    KPI-Informatie                                      831  A
-- mld_kenmerk    Kosten per EN-categorie                             835  A
-- mld_kenmerk    Schoonmaak^                                         877
-- mld_kenmerk    Datum aangeleverd                                   810
-- mld_kenmerk    Op tijd aangeleverd                                 842  A
-- mld_kenmerk    Overzicht DKS                                       860  A
-- mld_kenmerk    Kosten per EN-categorie                             836  A
-- mld_kenmerk    KPI-Informatie                                      832  A
-- mld_kenmerk    VSR rapportage                                      886  A
-- mld_kenmerk    Documentmanagement^                                 815
-- mld_kenmerk    Datum aangeleverd                                   811
-- mld_kenmerk    Op tijd aangeleverd                                 843  A
-- mld_kenmerk    Aantal poststukken in- en uitgaand                  786  A
-- mld_kenmerk    Kosten per EN-categorie                             837  A
-- mld_kenmerk    KPI-Informatie                                      833  A
CREATE OR REPLACE VIEW akza_v_kpi5
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('CP9','CP10','RP21','RP22','SP31','SP32','DP41','DP42')),
        audits AS
        (SELECT mld_melding_key,
                alg_locatie_key, locatie,
                periode,
                cat_tijdig * cat_aantal / 7 cat_tijdig,
                doc_tijdig * doc_aantal / 3 doc_tijdig,
                rec_tijdig * rec_aantal / 8 rec_tijdig,
                sch_tijdig * sch_aantal / 4 sch_tijdig,
                cat_aantal / 7 cat_score,
                doc_aantal / 3 doc_score,
                rec_aantal / 8 rec_score,
                sch_aantal / 4 sch_score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      dloc.alg_locatie_omschrijving locatie,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      COALESCE(fac.safe_to_number(cat_tijdig.mld_kenmerkmelding_waarde), 0) cat_tijdig,
                      COALESCE(fac.safe_to_number(doc_tijdig.mld_kenmerkmelding_waarde), 0) doc_tijdig,
                      COALESCE(fac.safe_to_number(rec_tijdig.mld_kenmerkmelding_waarde), 0) rec_tijdig,
                      COALESCE(fac.safe_to_number(sch_tijdig.mld_kenmerkmelding_waarde), 0) sch_tijdig,
                      cat_punten.aantal cat_aantal,
                      doc_punten.aantal doc_aantal,
                      rec_punten.aantal rec_aantal,
                      sch_punten.aantal sch_aantal
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 840) cat_tijdig,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 843) doc_tijdig,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 841) rec_tijdig,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 842) sch_tijdig,
                      (SELECT mld_melding_key, COUNT(*) aantal FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key IN (765,761,824,834,861,859,830)
                        GROUP BY mld_melding_key) cat_punten,
                      (SELECT mld_melding_key, COUNT(*) aantal FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key IN (786,837,833)
                        GROUP BY mld_melding_key) doc_punten,
                      (SELECT mld_melding_key, COUNT(*) aantal FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key IN (774,789,766,779,767,775,831,835)
                        GROUP BY mld_melding_key) rec_punten,
                      (SELECT mld_melding_key, COUNT(*) aantal FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key IN (860,836,832,886)
                        GROUP BY mld_melding_key) sch_punten,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key = 1289
                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND cat_tijdig.mld_melding_key(+) = m.mld_melding_key
                  AND doc_tijdig.mld_melding_key(+) = m.mld_melding_key
                  AND rec_tijdig.mld_melding_key(+) = m.mld_melding_key
                  AND sch_tijdig.mld_melding_key(+) = m.mld_melding_key
                  AND cat_punten.mld_melding_key(+) = m.mld_melding_key
                  AND doc_punten.mld_melding_key(+) = m.mld_melding_key
                  AND rec_punten.mld_melding_key(+) = m.mld_melding_key
                  AND sch_punten.mld_melding_key(+) = m.mld_melding_key) )
   SELECT periode, alg_locatie_key,
          kpi_code,
          mld_melding_key,
          kpi.getNormScore(score, n000, n070, n090, n100) normScore,
          normscores
     FROM (
         SELECT n.kpi_code, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key, k.locatie,
                k.periode,
                DECODE(n.kpi_code,
                       'CP9',  cat_score,
                       'CP10', cat_tijdig,
                       'RP21', rec_score,
                       'RP22', rec_tijdig,
                       'SP31', sch_score,
                       'SP32', sch_tijdig,
                       'DP41', doc_score,
                       'DP42', doc_tijdig) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, audits k) m
;

-- mld_stdmelding 6. Benchmark                  1290
-- mld_kenmerk    Locatie                        838  A
-- mld_kenmerk    Periode                        865  A
-- mld_kenmerk    Receptie^                      868
-- mld_kenmerk    Resultaat per FTE              871  A
-- mld_kenmerk    Benchmark per FTE              800  A
-- mld_kenmerk    Opmerking                      847
-- mld_kenmerk    Schoonmaak^                    875
-- mld_kenmerk    Resultaat per FTE              872  A
-- mld_kenmerk    Benchmark per FTE              801  A
-- mld_kenmerk    Opmerking                      851
-- mld_kenmerk    Documentmanagement^            813
-- mld_kenmerk    Resultaat per FTE              873  A
-- mld_kenmerk    Benchmark per FTE              802  A
-- mld_kenmerk    Opmerking                      854
CREATE OR REPLACE VIEW akza_v_kpi6
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('RK13','SK24','DK34')),
        kosten AS
        (SELECT mld_melding_key,
                alg_locatie_key, locatie,
                periode,
                DECODE(rec_bm, 0, 0,
                       rec_res / rec_bm) rec_score,
                DECODE(sch_bm, 0, 0,
                       sch_res / sch_bm) sch_score,
                DECODE(doc_bm, 0, 0,
                       doc_res / doc_bm) doc_score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      dloc.alg_locatie_omschrijving locatie,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      fac.safe_to_number(rec_res.mld_kenmerkmelding_waarde) rec_res,
                      fac.safe_to_number(rec_bm.mld_kenmerkmelding_waarde)  rec_bm,
                      fac.safe_to_number(sch_res.mld_kenmerkmelding_waarde) sch_res,
                      fac.safe_to_number(sch_bm.mld_kenmerkmelding_waarde)  sch_bm,
                      fac.safe_to_number(doc_res.mld_kenmerkmelding_waarde) doc_res,
                      fac.safe_to_number(doc_bm.mld_kenmerkmelding_waarde)  doc_bm
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 871) rec_res,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 800) rec_bm,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 872) sch_res,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 801) sch_bm,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 873) doc_res,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 802) doc_bm,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key = 1290
                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND rec_res.mld_melding_key = m.mld_melding_key
                  AND rec_bm.mld_melding_key = m.mld_melding_key
                  AND sch_res.mld_melding_key = m.mld_melding_key
                  AND sch_bm.mld_melding_key = m.mld_melding_key
                  AND doc_res.mld_melding_key = m.mld_melding_key
                  AND doc_bm.mld_melding_key = m.mld_melding_key) )
   SELECT periode, alg_locatie_key,
          kpi_code,
          mld_melding_key,
          kpi.getNormScore(score, n000, n070, n090, n100) normScore,
          normscores
     FROM (
         SELECT n.kpi_code, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key, k.locatie,
                k.periode,
                DECODE(n.kpi_code,
                       'RK13', rec_score,
                       'SK24', sch_score,
                       'DK34', doc_score) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, kosten k) m
;

-- mld_stdmelding 7. Audit Receptie                                  1291
-- mld_kenmerk    Locatie                                             838  A
-- mld_kenmerk    Periode                                             865  A
-- mld_kenmerk    Wachttijden bezoekers^                              889
-- mld_kenmerk    Tijdstip1                                           879
-- mld_kenmerk    Aantal bezoekers                                    768  A
-- mld_kenmerk    Aantal op tijd                                      780  A
-- mld_kenmerk    Tijdstip2                                           880
-- mld_kenmerk    Aantal bezoekers                                    770  A
-- mld_kenmerk    Aantal op tijd                                      782  A
-- mld_kenmerk    Tijdstip3                                           882
-- mld_kenmerk    Aantal bezoekers                                    772  A
-- mld_kenmerk    Aantal op tijd                                      783  A
-- mld_kenmerk    Opmerking                                           850
-- mld_kenmerk    Audit^                                              793
-- mld_kenmerk    Audit^                                              794
-- mld_kenmerk    Actieve lichaamshouding, richt zich op bezoeker     791  A
-- mld_kenmerk    Zoekt direct oogcontact met bezoeker                897  A
-- mld_kenmerk    Welkomsttekst: "Goede (dagdeel)"                    891  A
-- mld_kenmerk    Audit^                                              795
-- mld_kenmerk    Wachttijd is acceptabel, geeft geen irritatie       888  A
-- mld_kenmerk    Contact bij eerst mogelijke gelegenheid             806  A
-- mld_kenmerk    Audit^                                              796
-- mld_kenmerk    Aankondiging zakelijk, niet té joviaal              764  A
-- mld_kenmerk    Gebruikt naam bezoeker                              826  A
-- mld_kenmerk    Gebruikt naam contactpersoon                        827  A
-- mld_kenmerk    Geeft informatie over wachttijd                     828  A
-- mld_kenmerk    Audit^                                              797
-- mld_kenmerk    Persoonlijke verzorging: piercings, tattoeages enz  866  A
-- mld_kenmerk    Correct gedrag en houding                           807  A
-- mld_kenmerk    Passende kleding                                    862  A
-- mld_kenmerk    Audit^                                              798
-- mld_kenmerk    Aanbieden van iets te drinken als bezoeker wacht    762  A
-- mld_kenmerk    Oogcontact bij aanbieden van iets te drinken        839  A
-- mld_kenmerk    Voel je je welkom als bezoeker?                     877  A
-- mld_kenmerk    Audit^                                              799
-- mld_kenmerk    Prettige sfeer                                      867  A
-- mld_kenmerk    Aangename temperatuur                               763  A
-- mld_kenmerk    Schoon en verzorgd bezoekerstoilet                  874  A
-- mld_kenmerk    Opgeruimde wachtruimte                              844  A
-- mld_kenmerk    Wordt het welkomstgevoel voldoende versterkt?       896  A
-- mld_kenmerk    Opmerking                                           858
CREATE OR REPLACE VIEW akza_v_kpi7
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('RK14','RK16')),
        audits AS
        (SELECT mld_melding_key,
                alg_locatie_key, locatie,
                periode,
                DECODE( num_bez1 + num_bez2 + num_bez3,
                        0, 0,
                        (tijdig1 + tijdig2 + tijdig3) / (num_bez1 + num_bez2 + num_bez3) ) wachttijd_score,
                percentage overig_score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      dloc.alg_locatie_omschrijving locatie,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      fac.safe_to_number(num_bez1.mld_kenmerkmelding_waarde) num_bez1,
                      fac.safe_to_number(tijdig1.mld_kenmerkmelding_waarde)  tijdig1,
                      fac.safe_to_number(num_bez2.mld_kenmerkmelding_waarde) num_bez2,
                      fac.safe_to_number(tijdig2.mld_kenmerkmelding_waarde)  tijdig2,
                      fac.safe_to_number(num_bez3.mld_kenmerkmelding_waarde) num_bez3,
                      fac.safe_to_number(tijdig3.mld_kenmerkmelding_waarde)  tijdig3,
                      scores.percentage
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 768) num_bez1,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 780) tijdig1,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 770) num_bez2,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 782) tijdig2,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 772) num_bez3,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 783) tijdig3,
                      (SELECT mld_melding_key, SUM(fac.safe_to_number(mld_kenmerkmelding_waarde) ) / COUNT(*) / 100 percentage
                         FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL
                          AND mld_kenmerk_key IN (791,897,891,888,806,764,826,827,828,866,807,862,762,839,877,867,763,874,844,896)
                        GROUP BY mld_melding_key) scores,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key = 1291
                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND num_bez1.mld_melding_key(+) = m.mld_melding_key
                  AND tijdig1.mld_melding_key(+) = m.mld_melding_key
                  AND num_bez2.mld_melding_key(+) = m.mld_melding_key
                  AND tijdig2.mld_melding_key(+) = m.mld_melding_key
                  AND num_bez3.mld_melding_key(+) = m.mld_melding_key
                  AND tijdig3.mld_melding_key(+) = m.mld_melding_key
                  AND scores.mld_melding_key(+) = m.mld_melding_key ) )
   SELECT periode, alg_locatie_key,
          kpi_code,
          mld_melding_key,
          kpi.getNormScore(score, n000, n070, n090, n100) normScore,
          normscores
     FROM (
         SELECT n.kpi_code, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key, k.locatie,
                k.periode,
                DECODE(n.kpi_code,
                       'RK14', wachttijd_score,
                       'RK16', overig_score) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, audits k) m
;

-- GEGEVENS VOOR DEZE MELDING MOETEN GEIMPORTEERD WORDEN, MAAR HET IMPORTFORMAAT IS NOG ONDUIDELIJK.
-- VOORLOPIG GEEN ACTIE
-- mld_stdmelding 8. Telefonie                                       1292  A
-- mld_kenmerk    Locatie                                             838  A
-- mld_kenmerk    Periode                                             865  A
CREATE OR REPLACE VIEW akza_v_kpi8
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('RK15')),
        audits AS
        (SELECT mld_melding_key,
                alg_locatie_key, locatie,
                periode,
                0 score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      dloc.alg_locatie_omschrijving locatie,
                      TRUNC(m.mld_melding_datum, 'MM') periode
                 FROM mld_melding m,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key = 1292
                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                   ) )
   SELECT periode, alg_locatie_key,
          kpi_code,
          mld_melding_key,
          kpi.getNormScore(score, n000, n070, n090, n100) normScore,
          normscores
     FROM (
         SELECT n.kpi_code, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key, k.locatie,
                k.periode,
                DECODE(n.kpi_code,
                       'RK15', score) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, audits k) m
;

-- IMPORT uit eko!manager
-- mld_stdmelding 9. Schoonmaak VSR/DKS                              1293  A
-- mld_kenmerk    Locatie                                             838  A
-- mld_kenmerk    Periode                                             865  A
-- mld_kenmerk    Aantal meetpunten                                   778  A
-- mld_kenmerk    Aantal fouten                                       776  A
CREATE OR REPLACE VIEW akza_v_kpi9
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('SK28')),
        audits AS
        (SELECT mld_melding_key,
                alg_locatie_key, locatie,
                periode,
                (aant_meet - aant_fout) / aant_meet score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      dloc.alg_locatie_omschrijving locatie,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      fac.safe_to_number(aant_meet.mld_kenmerkmelding_waarde) aant_meet,
                      fac.safe_to_number(aant_fout.mld_kenmerkmelding_waarde) aant_fout
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 778) aant_meet,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 776) aant_fout,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key = 1293
                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND aant_meet.mld_melding_key(+) = m.mld_melding_key
                  AND aant_fout.mld_melding_key(+) = m.mld_melding_key ) )
   SELECT periode, alg_locatie_key,
          kpi_code,
          mld_melding_key,
          kpi.getNormScore(score, n000, n070, n090, n100) normScore,
          normscores
     FROM (
         SELECT n.kpi_code, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key, k.locatie,
                k.periode,
                DECODE(n.kpi_code,
                       'SK28', score) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, audits k) m
;

-- IMPORT(S) uit eko!manager
-- mld_stdmelding 10. Schoonmaak medewerkers                         1294  A
-- mld_kenmerk    Locatie                                             838  A
-- mld_kenmerk    Periode                                             865  A
-- mld_kenmerk    Aantal vaste medewerkers                            790
-- mld_kenmerk    Totaal aantal medewerkers                           885
CREATE OR REPLACE VIEW akza_v_kpi10
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('SK27')),
        audits AS
        (SELECT mld_melding_key,
                alg_locatie_key, locatie,
                periode,
                DECODE(num_tot,
                       0, 0,
                       num_vast / num_tot) score
           FROM (
               SELECT m.mld_melding_key,
                      dloc.alg_locatie_key alg_locatie_key,
                      dloc.alg_locatie_omschrijving locatie,
                      TRUNC(m.mld_melding_datum, 'MM') periode,
                      fac.safe_to_number(mw_vast.mld_kenmerkmelding_waarde) num_vast,
                      fac.safe_to_number(mw_tot.mld_kenmerkmelding_waarde) num_tot
                 FROM mld_melding m,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 790) mw_vast,
                      (SELECT * FROM mld_kenmerkmelding
                        WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 885) mw_tot,
                      alg_locatie dloc
                WHERE m.mld_stdmelding_key = 1294
                  AND m.mld_melding_status IN (5)
                  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
                  AND mw_vast.mld_melding_key(+) = m.mld_melding_key
                  AND mw_tot.mld_melding_key(+) = m.mld_melding_key
                   ) )
   SELECT periode, alg_locatie_key,
          kpi_code,
          mld_melding_key,
          kpi.getNormScore(score, n000, n070, n090, n100) normScore,
          normscores
     FROM (
         SELECT n.kpi_code, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key, k.locatie,
                k.periode,
                DECODE(n.kpi_code,
                       'SK27', score) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, audits k) m
;

-- kpi   |  over                    |  invoer               |  berekening
-- DK35  |  Aantal rondes op tijd   |  import Eko!manager   |  Aantal rondes op tijd / totaal aantal rondes
-- DK37  |  Volledigheid postrondes |  import Eko!manager   |  Aantal uitgevoerde rondes / totaal aantal geplande rondes
CREATE OR REPLACE VIEW akza_v_kpi11
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('DK35','DK37'))
   SELECT *
     FROM normen
;

-- ONDERSTAANDE KPI'S WORDEN BEREKEND O.B.V. GEGEVENS DIE AL IN FACILITOR AANWEZIG ZIJN, ZOALS HET AANTAL KLACHTEN OVER CATERING
-- DIT BETREFT DUS REGULIERE MELDINGEN IN FACILITOR
-- kpi   |  over                                |  stdmelding     |  berekening
-- CT5   |  Aantal klachten [over catering]     |  862            |  "Aantal klachten  / aantal FTE AkzoNobel"
-- RT17  |  Aantal klachten over de receptie    |  869            |  Aantal klachten over de receptie / # fte
-- RT18  |  Aantal klachten over telefonie      |  866            |  Aantal klachten over de telefonie / # fte
-- ST29  |  Aantal klachten over de schoonmaak  |  863            |  Aantal klachten over de schoonmaak / aantal FTE AkzoNobel
-- DT38  |  Aantal klachten over de postkamer   |  874            |  Aantal klachten over de Postkamer / aantal FTE AkzoNobel
-- DT39  |  Aantal klachten over de MFC         |  vakgroep 585   |  Aantal klachten over de MFC / aantal FTE FAkzoNobel

-- Aantal klachten per FTE
-- mld_discipline KPI                               585
-- usrtab         KPI Normen                        493
-- usrtab         KPI Instellingen                  494
-- usrtab         KPI Omschrijving                  495
-- usrtab         KPI Periode                       496
-- mld_stdmelding mbt Catering / Vergaderen         862
-- mld_stdmelding mbt Schoonmaak                    863
-- mld_stdmelding mbt Telefonie                     866
-- mld_stdmelding mbt Receptie                      869
-- mld_stdmelding mbt Logistiek / Post              874
-- fac_usrtab     KPI Instellingen                  494
CREATE OR REPLACE VIEW akza_v_kpi_klachten
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('CT5','RT17','RT18','ST29','DT38','DT39')),
        meldingen AS
        (SELECT meldingen.aanduiding_key,
                dloc.alg_locatie_key alg_locatie_key,
                dloc.alg_locatie_omschrijving locatie,
                periode,
                (meldingen.aantal / dfte.fac_usrdata_prijs) score
           FROM ( SELECT aanduiding_key,
                         alg_locatie_key,
                         TRUNC(mld_melding_datum, 'MM') periode,
                         COUNT(*) aantal
                    FROM (SELECT m.mld_stdmelding_key aanduiding_key,
                                 null mld_ins_discipline_key,
                                 m.mld_stdmelding_key,
                                 m.mld_melding_key,
                                 m.mld_alg_locatie_key alg_locatie_key,
                                 m.mld_melding_datum
                            FROM mld_melding m
                           WHERE m.mld_stdmelding_key IN (862, 869, 866, 863, 874)
                             AND m.mld_melding_status IN (5,6)
                             AND m.mld_melding_datum >= TO_DATE('1-5-2015', 'DD-MM-YYYY')
                          UNION ALL
                          SELECT sm.mld_ins_discipline_key aanduiding_key,
                                 sm.mld_ins_discipline_key,
                                 m.mld_stdmelding_key,
                                 m.mld_melding_key,
                                 m.mld_alg_locatie_key alg_locatie_key,
                                 m.mld_melding_datum
                            FROM mld_melding m,
                                 mld_stdmelding sm
                           WHERE sm.mld_stdmelding_key = m.mld_stdmelding_key
                             AND m.mld_melding_status IN (5,6)
                             AND sm.mld_ins_discipline_key IN (585)
                             AND m.mld_melding_datum >= TO_DATE('1-5-2015', 'DD-MM-YYYY') )
                   GROUP BY aanduiding_key, alg_locatie_key, TRUNC(mld_melding_datum, 'MM')
                ) meldingen,
                alg_locatie dloc,
                fac_usrdata dfte
          WHERE dloc.alg_locatie_key = meldingen.alg_locatie_key
            AND dfte.fac_usrtab_key = 494
            AND dfte.fac_usrdata_volgnr = dloc.alg_locatie_key)
   SELECT periode, alg_locatie_key,
          kpi_code,
          null mld_melding_key,
          kpi.getNormScore(score, n000, n070, n090, n100) normScore,
          normscores
     FROM (
         SELECT n.kpi_code, n.normscores,
                k.aanduiding_key,
                k.alg_locatie_key, k.locatie,
                k.periode,
                score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, meldingen k
          WHERE k.aanduiding_key = DECODE(n.kpi_code,
                                          'CT5',  862,
                                          'RT17', 869,
                                          'RT18', 866,
                                          'ST29', 863,
                                          'DT38', 874,
                                          'DT39', 585) ) m
;

-- kpi   |  over                                      |  discipline  |  berekening
-- SK26  |  Urgente meldingen [over schoonmaak]       |  102         |  Aantal meldingen op tijd opgelost / totaal aantal meldingen
-- DK36  |  Meldingen/storingen MFC op tijd verholpen |  625         |  Aantal meldingen op tijd verholpen / totaal aantal meldingen
-- TODO: deze duurt heel lang door de laatste decode; hoe komt dat?
CREATE OR REPLACE VIEW akza_v_kpi_meldingen_tijdig
AS
   WITH normen AS
        (SELECT kpi_definitie_code kpi_code,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code IN ('SK26','DK36')),
        meldingen AS
        (SELECT meld.aanduiding_key,
                dloc.alg_locatie_key alg_locatie_key,
                dloc.alg_locatie_omschrijving locatie,
                periode,
                (meld.optijd / meld.totaal) score
           FROM ( SELECT aanduiding_key,
                         alg_locatie_key,
                         TRUNC(mld_melding_datum, 'MM') periode,
                         COUNT(*) totaal,
                         SUM(uitvoeringoptijd_sla) optijd
                    FROM ( SELECT std.mld_ins_discipline_key aanduiding_key,
                                  m.mld_melding_datum,
                                  m.mld_alg_locatie_key alg_locatie_key,
                                  CASE
                                      WHEN std.mld_stdmelding_slabewaken = 0 OR m.mld_melding_indult = 1
                                      THEN NULL
                                      ELSE
                                         CASE
                                            WHEN gau.actualuitvoertijd.tijdsduur
                                                 / CASE
                                                      WHEN gau.actualuitvoertijd.eenheid = 'U'
                                                      THEN 24
                                                      ELSE 1
                                                   END <=
                                                    (CASE
                                                        WHEN m.mld_melding_t_uitvoertijd.eenheid = 'U'
                                                        THEN m.mld_melding_t_uitvoertijd.tijdsduur / 24
                                                        ELSE m.mld_melding_t_uitvoertijd.tijdsduur
                                                     END
                                                     + CASE
                                                          WHEN m.mld_melding_t_respijt.tijdsduur IS NULL
                                                          THEN 0
                                                          WHEN m.mld_melding_t_respijt.eenheid = 'U'
                                                          THEN m.mld_melding_t_respijt.tijdsduur / 24
                                                          ELSE m.mld_melding_t_respijt.tijdsduur
                                                       END)
                                            THEN 1
                                            ELSE 0
                                         END
                                   END uitvoeringoptijd_sla
                             FROM mld_melding m,
                                  mld_stdmelding std,
                                  (SELECT m1.mld_melding_key, mld.getactualuitvoer (m1.mld_melding_key) actualuitvoertijd
                                     FROM mld_melding m1) gau
                            WHERE gau.mld_melding_key = m.mld_melding_key
                              AND std.mld_stdmelding_key = m.mld_stdmelding_key
                              AND std.mld_ins_discipline_key IN (102,625)
                              AND m.mld_melding_datum >= TO_DATE('1-5-2015', 'DD-MM-YYYY') )
                   GROUP BY aanduiding_key, alg_locatie_key, TRUNC(mld_melding_datum, 'MM') ) meld,
                alg_locatie dloc
          WHERE dloc.alg_locatie_key = meld.alg_locatie_key )
   SELECT periode, alg_locatie_key,
          kpi_code,
          null mld_melding_key,
          kpi.getNormScore(score, n000, n070, n090, n100) normScore,
          normscores
     FROM (
         SELECT n.kpi_code, n.normscores,
                k.aanduiding_key,
                k.alg_locatie_key, k.locatie,
                k.periode,
                score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, meldingen k
          WHERE k.aanduiding_key = DECODE(n.kpi_code,
                                          'SK26', 102,
                                          'DK36', 625)) m
;

-- Totaaloverzicht van KPI's
-- Dit bevat uiteindelijk alle KPI-scores voor DE LAATSTE periode
CREATE OR REPLACE VIEW akza_v_kpi_all
AS
  SELECT * FROM akza_v_kpi1
  UNION ALL
  SELECT * FROM akza_v_kpi2
  UNION ALL
  SELECT * FROM akza_v_kpi3
  UNION ALL
  SELECT * FROM akza_v_kpi4
  UNION ALL
  SELECT * FROM akza_v_kpi5
  UNION ALL
  SELECT * FROM akza_v_kpi6
  UNION ALL
  SELECT * FROM akza_v_kpi7
--  UNION ALL
--  SELECT * FROM akza_v_kpi8
--  UNION ALL
--  SELECT * FROM akza_v_kpi9
  UNION ALL
  SELECT * FROM akza_v_kpi10
--  UNION ALL
--  SELECT * FROM akza_v_kpi11
  UNION ALL
  SELECT * FROM akza_v_kpi_klachten
  UNION ALL
  SELECT * FROM akza_v_kpi_meldingen_tijdig
;


----- Exports ------------------------------------------------------------------

CREATE OR REPLACE PACKAGE akza
AS
   PROCEDURE refreshscore(p_userkey IN NUMBER);
END;
/

CREATE OR REPLACE PACKAGE BODY akza
AS
   PROCEDURE refreshscore(p_userkey IN NUMBER)
   AS
     v_usrtab_periode_key  fac_usrdata.fac_usrtab_key%TYPE;      --NUMBER(10);
     v_usrdata_volgnr      fac_usrdata.fac_usrdata_volgnr%TYPE;  --NUMBER(3);
     v_usrdata_date        akza_kpi_scores.periode%TYPE;         --DATE;
   BEGIN

     -- Waarden die we willen overschrijven verwijderen.
     DELETE kpi_score
      WHERE (kpi_definitie_key, kpi_score_datum, alg_locatie_key) IN (
         SELECT DISTINCT d.kpi_definitie_key, ka.periode, ka.alg_locatie_key
           FROM akza_v_kpi_all ka,
                kpi_definitie d
          WHERE d.kpi_definitie_code = ka.kpi_code);
     
     -- Opnieuw inlezen van KPI scores.
     -- (akza_v_kpi_all bevat wat kolommen waar we niets mee
     INSERT INTO kpi_score (
         kpi_definitie_key,
         kpi_score_datum,
         alg_locatie_key,
         kpi_score_xmlnode,
         kpi_score_refkey,
         kpi_score_score,
         kpi_score_norm_score,
         kpi_score_drempels)
     SELECT d.kpi_definitie_key,
            ka.periode,
            ka.alg_locatie_key,
            'melding',
            ka.mld_melding_key,
            ka.normscore,
            '0|70|90|100' normdrempels,
            ka.normscores
       FROM akza_v_kpi_all ka,
            kpi_definitie d
      WHERE d.kpi_definitie_code = ka.kpi_code;

   END refreshscore;
END;
/

----- Imports ------------------------------------------------------------------

-- KPI10: Schoonmaakmedewerkers
CREATE OR REPLACE PROCEDURE akza_import_kpi_sch_mw_vast (
   p_import_key IN NUMBER
)
IS
   c_header                         VARCHAR2 (255)  := 'KOSTENPL.;LOCATIE;PERS NR;ORGANISATORISCHE EENHEID;PERSONEELSGEBIED;VOLLEDIGE NAAM;FUNCTIE';
   c_fielddelimitor                 VARCHAR2 (1)    := ';';
   v_newline                        VARCHAR2 (1000);             -- Input line
   v_aanduiding                     VARCHAR2 (200);
   v_errorhint                      VARCHAR2 (1000);
   v_errormsg                       VARCHAR2 (1000);
   oracle_err_num                   NUMBER;
   oracle_err_mes                   VARCHAR2 (200);
   header_is_valid                  NUMBER := 0;
   v_ongeldig                       NUMBER (1);
   v_count_tot                      NUMBER (10);
   v_count_import                   NUMBER (10);
   v_count                          NUMBER;
   -- De importvelden:
   v_pers_nr                        VARCHAR2 (256);
   v_pers_naam                      VARCHAR2 (256);
   v_locatie                        VARCHAR2 (256);
   v_kostenplaats                   VARCHAR2 (256);
   n_kostenplaats                   NUMBER(8);

   v_usrtab_naam                    fac_usrtab.fac_usrtab_naam%TYPE;

   CURSOR c
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM akza_imp_kpi_sch_mw_vast;

   v_count_tot := 0;
   v_count_import := 0;

   -- Naam van Eigen tabel met instellingen, voor logging
   SELECT fac_usrtab_naam
     INTO v_usrtab_naam
     FROM fac_usrtab
    WHERE fac_usrtab_key = 494;

   FOR rec IN c
   LOOP
      BEGIN
         v_newline := rec.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;

         -- Ik controleer of ik een geldige header heb, dat is: de juiste kolomkoppen.
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER(v_newline) LIKE c_header||'%'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Lees alle veldwaarden
            fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_kostenplaats);
            fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_locatie);
            fac.imp_getfield_nr (v_newline, c_fielddelimitor, 3, v_pers_nr);
            fac.imp_getfield_nr (v_newline, c_fielddelimitor, 6, v_pers_naam);

            v_aanduiding := '['||v_kostenplaats||'|'||v_locatie|| '|'||v_pers_nr||'|'||v_pers_naam||'] ';

            -- Lege regels (met alleen naam van locatie) stilzwijgend overslaan
            IF (    v_locatie IS NULL
                AND v_pers_nr IS NULL
                AND v_pers_naam IS NULL)
            THEN
               CONTINUE;
            END IF;

            -- Controleer alle veldwaarden
            v_errorhint := 'Ongeldige kostenplaats';
            n_kostenplaats := fac.safe_to_number( TRIM(v_kostenplaats) );
            IF (n_kostenplaats IS NULL)
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key, 'W',
                                 v_aanduiding || 'Kostenplaats is geen geldig getal',
                                 'Regel wordt overgeslagen' );
            END IF;

            v_errorhint := 'Ongeldige/onbekende locatie';
            v_locatie := TRIM(v_locatie);
            IF (v_locatie IS NOT NULL)
            THEN
               IF LENGTH (v_locatie) > 20
               THEN
                  v_locatie := SUBSTR (v_locatie, 1, 20);
                  fac.imp_writelog (p_import_key, 'W',
                                    v_aanduiding || 'Locatie te lang',
                                    'Wordt afgebroken tot [' || v_locatie || ']' );
               END IF;

               -- Kennen we deze locatie al?
               -- usrtab_key    "KPI FTE per Loc"    494
               SELECT COUNT(*)
                 INTO v_count
                 FROM fac_usrdata
                WHERE fac_usrtab_key = 494
                  AND fac_usrdata_omschr = v_locatie;

               IF (v_count = 0)
               THEN
               v_ongeldig := 1;
                  fac.imp_writelog (p_import_key, 'W',
                                    v_aanduiding || 'Locatie onbekend',
                                    'Bestaat niet in Eigen tabel "'||v_usrtab_naam||'"' );
               END IF;
            END IF;

            v_errorhint := 'Ongeldig personeelsnummer';
            v_pers_nr := TRIM(v_pers_nr);
            IF (v_pers_nr IS NOT NULL)
            THEN
               IF LENGTH (v_pers_nr) > 20
               THEN
                  v_pers_nr := SUBSTR (v_pers_nr, 1, 20);
                  fac.imp_writelog (p_import_key, 'W',
                                    v_aanduiding || 'Personeelsnummer te lang',
                                    'Wordt afgebroken tot [' || v_pers_nr || ']' );
               END IF;
            END IF;

            v_errorhint := 'Ongeldige naam';
            v_pers_naam := TRIM(v_pers_naam);
            IF (v_pers_naam IS NOT NULL)
            THEN
               IF LENGTH (v_pers_naam) > 100
               THEN
                  v_pers_naam := SUBSTR (v_pers_naam, 1, 100);
                  fac.imp_writelog (p_import_key, 'W',
                                    v_aanduiding || 'Naam te lang',
                                    'Wordt afgebroken tot [' || v_pers_naam || ']' );
               END IF;
            END IF;

            -- Alle gegevens aanwezig?
            IF NOT (    v_locatie IS NOT NULL
                    AND v_kostenplaats IS NOT NULL
                    AND v_pers_nr IS NOT NULL
                    AND v_pers_naam IS NOT NULL)
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key, 'W',
                                 v_aanduiding || 'Kostenplaats, locatie, personeelsnummer en naam zijn niet allemaal gevuld.',
                                 'Regel wordt overgeslagen' );
            END IF;

            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errorhint := 'Fout bij toevoegen regel aan importtabel';

                  INSERT INTO akza_imp_kpi_sch_mw_vast (
                     pers_nr,
                     pers_naam,
                     locatie,
                     kostenplaats)
                  VALUES (
                     v_pers_nr,
                     v_pers_naam,
                     v_locatie,
                     n_kostenplaats);

                  v_count_import := v_count_import + 1;

               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=    v_errorhint
                                   || ' ORACLE (error ' || oracle_err_num
                                   || '/' || oracle_err_mes || ')';
                     fac.imp_writelog
                             (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Ingelezen regel kan niet worden weggeschreven!'
                             );
                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSIF (v_ongeldig = 1)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldige regel(s)',
                        'Regel '||v_aanduiding||' is ongeldig! (Mogelijk zijn er nog meer ongeldige regels.)'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'Aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
   END IF;

   COMMIT;

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.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;
END akza_import_kpi_sch_mw_vast;
/

-- usrtab   "KPI FTE per loc"    494
-- usrtab   "KPI Schoonm Mw"     497
CREATE OR REPLACE PROCEDURE akza_update_kpi_sch_mw_vast (
   p_import_key IN NUMBER
)
IS
   v_aanduiding               VARCHAR2 (200);
   v_errorhint                VARCHAR2 (1000);
   v_errormsg                 VARCHAR2 (1000);
   oracle_err_num             NUMBER;
   oracle_err_mes             VARCHAR2 (200);
   v_count_tot                NUMBER (10);
   v_count_error              NUMBER (10);
   v_count                    NUMBER (10);

   -- Iedereen in Eigen tabel, maar niet in import
   CURSOR c_del
   IS
      SELECT mw.fac_usrdata_key,
             mw.fac_usrdata_code pers_nr,
             mw.fac_usrdata_omschr pers_naam
        FROM akza_imp_kpi_sch_mw_vast i,
             fac_usrdata mw
       WHERE fac_usrtab_key = 497
         AND fac_usrdata_verwijder IS NULL
         AND mw.fac_usrdata_code = i.pers_nr(+)
         AND i.pers_nr IS NULL
    ORDER BY mw.fac_usrdata_code;

   -- Iedereen in import, al-dan-niet in Eigen tabel
   CURSOR c_pers
   IS
      SELECT i.pers_nr,
             i.pers_naam,
             i.locatie,
             i.kostenplaats,
             loc.fac_usrdata_key loc_key,
             l.alg_locatie_code||' ('||l.alg_locatie_omschrijving||')' locatie_omschr,
             mw.fac_usrdata_key mw_key
        FROM akza_imp_kpi_sch_mw_vast i,
             (SELECT * FROM fac_usrdata
               WHERE fac_usrtab_key = 494
                 AND fac_usrdata_verwijder IS NULL) loc,
             (SELECT * FROM fac_usrdata
               WHERE fac_usrtab_key = 497
                 AND fac_usrdata_verwijder IS NULL) mw,
             alg_locatie l
       WHERE loc.fac_usrdata_omschr(+) = i.locatie
         AND l.alg_locatie_key(+) = loc.fac_usrdata_volgnr
         AND mw.fac_usrdata_code(+) = i.pers_nr
         AND COALESCE(mw.fac_usrdata_vervaldatum, SYSDATE+1) > SYSDATE
    ORDER BY pers_nr;

BEGIN
   v_count_tot := 0;
   v_count_error := 0;
   v_aanduiding := '';

   FOR rec IN c_del
   LOOP
      BEGIN
         v_aanduiding := '[' || rec.pers_nr ||  '|' || rec.pers_naam || '] ';
         v_errormsg := 'Fout';
         v_errorhint := 'Fout bij verwijderen medewerker';

         UPDATE fac_usrdata
            SET fac_usrdata_verwijder = SYSDATE
          WHERE fac_usrdata_key = rec.fac_usrdata_key;

         fac.imp_writelog (p_import_key,
                           'I',
                           v_aanduiding || 'verwijderd',
                           ''
                          );
      EXCEPTION
      WHEN OTHERS
         THEN
            v_count_error := v_count_error + 1;
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=    'OTHERS (error ' || oracle_err_num
                          || '/' || oracle_err_mes || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              v_errorhint
                             );
            COMMIT;
      END;
   END LOOP;

   FOR rec IN c_pers
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_aanduiding := '[' || rec.pers_nr ||  '|' || rec.pers_naam || '|' || rec.locatie || '|' || rec.kostenplaats|| '] ';
         v_errormsg := 'Toevoegen/bijwerken medewerker';
         v_errorhint := 'Fout bij toevoegen/verwijderen medewerker';

         IF (rec.mw_key IS NULL)
         THEN
            -- Toevoegen
            v_errormsg := 'Toevoegen medewerker';
            v_errorhint := 'Fout bij toevoegen medewerker';

            INSERT INTO fac_usrdata (
               fac_usrtab_key,
               fac_usrdata_code,
               fac_usrdata_omschr,
               fac_usrdata_prijs,
               fac_usrdata_parentkey)
            VALUES (
               497,
               rec.pers_nr,
               rec.pers_naam,
               rec.kostenplaats,
               rec.loc_key);

            fac.imp_writelog (p_import_key,
                              'I',
                              v_aanduiding || 'toegevoegd',
                              'Locatie '||rec.locatie_omschr
                             );
         ELSE
            -- Bijwerken
            UPDATE fac_usrdata
               SET fac_usrdata_code = rec.pers_nr,
                   fac_usrdata_omschr = rec.pers_naam,
                   fac_usrdata_prijs = rec.kostenplaats,
                   fac_usrdata_parentkey = rec.loc_key
             WHERE fac_usrdata_key = rec.mw_key;
            -- (geen logging)
         END IF;

      EXCEPTION
      WHEN OTHERS
         THEN
            v_count_error := v_count_error + 1;
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=    'OTHERS (error ' || oracle_err_num
                          || '/' || oracle_err_mes || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              v_errorhint
                             );
            COMMIT;
      END;
   END LOOP;

   fac.imp_writelog(p_import_key,
                    'S',
                       'Verwerkte regels zonder foutmelding: '
                    || TO_CHAR (v_count_tot - v_count_error),
                    ''
                   );
   fac.imp_writelog(p_import_key,
                    'S',
                       'Verwerkte regels met foutmelding: '
                    || TO_CHAR (v_count_error),
                    ''
                   );
    COMMIT;

END akza_update_kpi_sch_mw_vast;
/


-- Urenoverzicht schoonmaakmedewerkers
-- usrtab_key    "KPI FTE per Loc"    494
CREATE OR REPLACE PROCEDURE akza_import_kpi_sch_mw_uren (
   p_import_key IN NUMBER
)
IS
   c_header                        VARCHAR2 (255)  := 'PERSONEELSNUMMER;NAAM;VERKOOPPUNT;CONTRACTUREN';
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;

   -- De importvelden:
   v_kostenplaats                  VARCHAR2 (256);
   n_kostenplaats                  NUMBER(8);
   v_locatie                       VARCHAR2 (256);
   v_pers_nr                       VARCHAR2 (256);
   v_pers_naam                     VARCHAR2 (256);
   v_uren                          VARCHAR2 (256);
   v_code                          VARCHAR2 (256);

   v_usrtab_naam                   fac_usrtab.fac_usrtab_naam%TYPE;

   CURSOR c
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM akza_imp_kpi_sch_mw_uren;

   v_count_tot := 0;
   v_count_import := 0;

   -- Naam van Eigen tabel met instellingen, voor logging
   SELECT fac_usrtab_naam
     INTO v_usrtab_naam
     FROM fac_usrtab
    WHERE fac_usrtab_key = 494;

   FOR rec IN c
   LOOP
      BEGIN
         v_newline := rec.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;

         -- Ik controleer of ik een geldige header heb, dat is: de juiste kolomkoppen.
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER(v_newline) LIKE c_header||'%'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Lees alle veldwaarden
            fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_pers_nr);
            fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_pers_naam);
            fac.imp_getfield_nr (v_newline, c_fielddelimitor, 3, v_kostenplaats);
            fac.imp_getfield_nr (v_newline, c_fielddelimitor, 4, v_uren);
            fac.imp_getfield_nr (v_newline, c_fielddelimitor, 5, v_code);

            v_pers_nr   := TRIM(v_pers_nr);
            v_pers_naam := TRIM(v_pers_naam);
            v_locatie   := TRIM(v_locatie);
            v_uren      := TRIM(v_uren);
            v_code      := TRIM(v_code);

            v_aanduiding := '['||v_pers_nr||'|'||v_pers_naam||' ('||v_code||'@'||v_kostenplaats||'] ';

            -- Controleer alle veldwaarden
            IF (   v_kostenplaats   IS NULL
                OR v_pers_nr   IS NULL
                OR v_pers_naam IS NULL
                OR v_uren      IS NULL)
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key, 'W',
                                 v_aanduiding || 'Onvoldoende gegevens',
                                 'Personeelsnummer, naam, locatie of uren ontbreken' );
            END IF;

            v_errorhint := 'Ongeldig personeelsnummer';
            IF LENGTH (v_pers_nr) > 20
            THEN
               v_pers_nr := SUBSTR (v_pers_nr, 1, 20);
               fac.imp_writelog (p_import_key, 'W',
                                 v_aanduiding || 'Personeelsnummer te lang',
                                 'Wordt afgebroken tot [' || v_pers_nr || ']' );
            END IF;

            v_errorhint := 'Ongeldige naam';
            IF LENGTH (v_pers_naam) > 100
            THEN
               v_pers_naam := SUBSTR (v_pers_naam, 1, 100);
               fac.imp_writelog (p_import_key, 'W',
                                 v_aanduiding || 'Naam te lang',
                                 'Wordt afgebroken tot [' || v_pers_naam || ']' );
            END IF;

            v_errorhint := 'Ongeldige kostenplaats';
            n_kostenplaats := fac.safe_to_number(v_kostenplaats);
            IF (n_kostenplaats IS NULL)
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key, 'W',
                                 v_aanduiding || 'Kostenplaats geen geldig getal',
                                 'Regel wordt overgeslagen' );
            END IF;

            v_errorhint := 'Ongeldige/onbekende locatie';
            v_locatie := SUBSTR(v_kostenplaats, 1, 4);
            -- Kennen we deze locatie wel?
            SELECT COUNT(*)
              INTO v_count
              FROM fac_usrdata
             WHERE fac_usrtab_key = 494
               AND fac_usrdata_omschr = v_locatie;

            IF (v_count = 0)
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key, 'W',
                                 v_aanduiding || 'Locatie '||v_locatie||' onbekend',
                                 'Bestaat niet in Eigen tabel "'||v_usrtab_naam||'"' );
            END IF;

            v_errorhint := 'Ongeldige uren';
            v_uren := fac.safe_to_number( REPLACE( v_uren, ',', '.') );
            IF (v_uren IS NULL)
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key, 'W',
                                 v_aanduiding || 'Uren zijn geen geldig getal',
                                 'Regel wordt overgeslagen' );
            END IF;

            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errorhint := 'Fout bij toevoegen regel aan importtabel';

                  INSERT INTO akza_imp_kpi_sch_mw_uren (
                     pers_nr,
                     pers_naam,
                     locatie,
                     kostenplaats,
                     uren)
                  VALUES (
                     v_pers_nr,
                     v_pers_naam,
                     v_locatie,
                     v_kostenplaats,
                     v_uren);

                  v_count_import := v_count_import + 1;

               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=    v_errorhint
                                   || ' ORACLE (error ' || oracle_err_num
                                   || '/' || oracle_err_mes || ')';
                     fac.imp_writelog
                             (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Ingelezen regel kan niet worden weggeschreven!'
                             );
                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSIF (v_ongeldig = 1)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldige regel(s)',
                        'Regel '||v_aanduiding||' is ongeldig! (Mogelijk zijn er nog meer ongeldige regels.)'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'Aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
   END IF;

   COMMIT;

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.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;
END akza_import_kpi_sch_mw_uren;
/

-- fac_usrtab        "KPI FTE per loc"              494
-- fac_usrtab        "KPI Schoonm Mw"               497
-- fac_usrtab        "KPI Periode"                  496
-- mld_stdmelding    "10. Schoonmaak medewerkers"  1294
-- mld_kenmerk       "Locatie"                      838
-- mld_kenmerk       "Periode"                      865
-- mld_kenmerk       "Aantal vaste medewerkers"     790
-- mld_kenmerk       "Totaal aantal medewerkers"    885
CREATE OR REPLACE PROCEDURE akza_update_kpi_sch_mw_uren (
   p_import_key IN NUMBER
)
IS
   v_aanduiding               VARCHAR2 (200);
   v_errorhint                VARCHAR2 (1000);
   v_errormsg                 VARCHAR2 (1000);
   oracle_err_num             NUMBER;
   oracle_err_mes             VARCHAR2 (200);
   v_count_tot                NUMBER (10);
   v_count_error              NUMBER (10);
   v_count                    NUMBER (10);

   v_periode_key              NUMBER;
   v_periode_oms              fac_usrdata.fac_usrdata_omschr%TYPE;
   v_periode_datum            DATE;
   v_mld_melding_key          NUMBER;

   -- Gegeven alle personen in import en alle personen in Eigen tabel, bepaal per locatie:
   -- - Aantal vaste schoonmaakmedewerkers die zijn ingezet
   -- - Aantal tijdelijke schoonmaakmedewerkers die zijn ingezet
   -- NB: Import bevat ook andere medewerkers, dus expliciet filteren op de kostenplaatsen
   --     die in de Eigen tabel voorkomen.
   CURSOR c
   IS
      WITH imp AS
              (SELECT DISTINCT pers_nr,
                      pers_naam,
                      kostenplaats,
                      locatie
                 FROM akza_imp_kpi_sch_mw_uren),
           mw AS
              (SELECT *
                 FROM fac_usrdata
                WHERE fac_usrtab_key = 497
                  AND fac_usrdata_verwijder IS NULL
                  AND COALESCE(fac_usrdata_vervaldatum, SYSDATE+1) > SYSDATE)
      SELECT vast.alg_locatie_key,
             vast.alg_locatie_code,
             vast.aantal vast,
             tijd.aantal tijdelijk
        FROM (
            SELECT i.locatie,
                   l.alg_locatie_key,
                   l.alg_locatie_code,
                   COUNT(*) aantal
              FROM imp i,
                   mw mw,
                   (SELECT * FROM fac_usrdata
                     WHERE fac_usrtab_key = 494
                       AND fac_usrdata_verwijder IS NULL) loc,
                   alg_locatie l
             WHERE mw.fac_usrdata_code = i.pers_nr
               AND mw.fac_usrdata_prijs = i.kostenplaats
               AND loc.fac_usrdata_omschr = i.locatie
               AND l.alg_locatie_key = loc.fac_usrdata_volgnr
             GROUP BY i.locatie, l.alg_locatie_key, l.alg_locatie_code) vast
        LEFT OUTER JOIN (
            SELECT i.locatie,
                   COUNT(*) aantal
              FROM imp i,
                   mw mw
             WHERE mw.fac_usrdata_code(+) = i.pers_nr
               AND mw.fac_usrdata_key IS NULL
               AND i.kostenplaats IN (SELECT DISTINCT fac_usrdata_prijs FROM mw)
          GROUP BY i.locatie) tijd
      ON tijd.locatie = vast.locatie;

BEGIN
   v_count_tot := 0;
   v_count_error := 0;
   v_aanduiding := '';

   -- Bepalen periode
   v_errormsg := 'Bepalen periode';
   v_errorhint := 'Fout bij bepalen periode';
   SELECT fac_usrdata_key, fac_usrdata_omschr, fac.safe_to_date(fac_usrdata_code, 'YYYYMM')
     INTO v_periode_key, v_periode_oms, v_periode_datum
     FROM fac_usrdata
    WHERE fac_usrtab_key = 496
      AND fac_usrdata_code = (SELECT MAX(fac_usrdata_code)
                                FROM fac_usrdata
                               WHERE fac_usrtab_key = 496);

   FOR rec IN c
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_aanduiding := '[' || rec.alg_locatie_code || '] ';

         -- Is er al een melding voor deze locatie voor deze periode? Dan niets doen
         v_errormsg := 'Bepalen melding';
         v_errorhint := 'Fout bij bepalen bestaande melding';
         SELECT COUNT(*)
           INTO v_count
           FROM mld_melding m,
                mld_kenmerkmelding l,
                mld_kenmerkmelding p
          WHERE m.mld_stdmelding_key = 1294
            AND l.mld_melding_key = m.mld_melding_key
            AND l.mld_kenmerk_key = 838
            AND l.mld_kenmerkmelding_verwijder IS NULL
            AND fac.safe_to_number(l.mld_kenmerkmelding_waarde) = rec.alg_locatie_key
            AND p.mld_melding_key = m.mld_melding_key
            AND p.mld_kenmerk_key = 865
            AND p.mld_kenmerkmelding_verwijder IS NULL
            AND fac.safe_to_number(p.mld_kenmerkmelding_waarde) = v_periode_key;

         IF (v_count != 0)
         THEN
            v_count_error := v_count_error + 1;
            fac.imp_writelog (p_import_key,
                              'W',
                                'Er bestaat al een melding voor locatie '||rec.alg_locatie_code
                              ||' voor periode '||v_periode_oms,
                              'Wordt overgeslagen'
                             );
         ELSE
            -- Nog geen melding --> aanmaken
            v_errormsg := 'Aanmaken melding';
            v_errorhint := 'Fout bij aanmaken melding';
            INSERT INTO mld_melding (
               mld_melding_omschrijving,
               mld_kosten_klant,
               prs_perslid_key,
               mld_stdmelding_key,
               mld_alg_locatie_key,
               mld_melding_datum,
               mld_meldbron_key,
               mld_melding_module,
               mld_melding_spoed)
            VALUES (
                 'Import KPI schoonmaakmedewerkers voor locatie '||rec.alg_locatie_code,
                 1,
                 7520,
                 1294,
                 rec.alg_locatie_key,
                 v_periode_datum,
                 45,
                 'MLD',
                 3)
            RETURNING mld_melding_key
            INTO v_mld_melding_key;

            v_errorhint := 'Fout bij zetten kenmerk "Locatie"';
            mld.upsertmeldingkenmerk(838, v_mld_melding_key, rec.alg_locatie_key);
            v_errorhint := 'Fout bij zetten kenmerk "Periode"';
            mld.upsertmeldingkenmerk(865, v_mld_melding_key, v_periode_key);
            v_errorhint := 'Fout bij zetten kenmerk "Aantal vaste medewerkers"';
            mld.upsertmeldingkenmerk(790, v_mld_melding_key, rec.vast);
            v_errorhint := 'Fout bij zetten kenmerk "Totaal aantal medewerkers"';
            mld.upsertmeldingkenmerk(885, v_mld_melding_key, rec.tijdelijk);

            v_errorhint := 'Fout bij zetten status';
            mld.setmeldingstatus(v_mld_melding_key, 2, 7520);
            mld.setmeldingstatus(v_mld_melding_key, 5, 7520);

            fac.imp_writelog (p_import_key,
                              'I',
                                'Melding voor locatie '||rec.alg_locatie_code
                              ||' toegevoegd voor periode '||v_periode_oms,
                              'Melding '||v_mld_melding_key
                             );
         END IF;

      EXCEPTION
      WHEN OTHERS
         THEN
            v_count_error := v_count_error + 1;
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=    'OTHERS (error ' || oracle_err_num
                          || '/' || oracle_err_mes || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              v_errorhint
                             );
            COMMIT;
      END;
   END LOOP;

   fac.imp_writelog(p_import_key,
                    'S',
                       'Verwerkte locaties zonder foutmelding: '
                    || TO_CHAR (v_count_tot - v_count_error),
                    ''
                   );
   fac.imp_writelog(p_import_key,
                    'S',
                       'Verwerkte locaties met foutmelding: '
                    || TO_CHAR (v_count_error),
                    ''
                   );
   COMMIT;

EXCEPTION
WHEN OTHERS
   THEN
      v_count_error := v_count_error + 1;
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=    'OTHERS (error ' || oracle_err_num
                    || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;

END akza_update_kpi_sch_mw_uren;
/


BEGIN adm.systrackscriptId('$Id$', 0); END;
/
COMMIT;

SPOOL OFF
