#ifdef CARE
/* CARE_PAC.SRC
 *
 * $Revision$
 * $Id$
 */


CREATE OR REPLACE PACKAGE care
AS
   TYPE t_cursor IS REF CURSOR;
   FUNCTION goodmonday_start (p_mld_key IN NUMBER)
      RETURN DATE;
   FUNCTION goodmonday_end (p_mld_key IN NUMBER)
      RETURN DATE;
   PROCEDURE care_v_rap2_factuur_uren_a (user_key IN NUMBER, p_datum_van IN VARCHAR2, p_datum_tot IN VARCHAR2, p_cursor OUT t_cursor, p_where IN VARCHAR2 DEFAULT NULL);
   PROCEDURE care_v_rap2_factuur_uren_e (user_key IN NUMBER, p_datum_van IN VARCHAR2, p_datum_tot IN VARCHAR2, p_cursor OUT t_cursor, p_where IN VARCHAR2 DEFAULT NULL);
END care;
/

CREATE OR REPLACE PACKAGE BODY care
AS

   FUNCTION goodmonday_start (p_mld_key IN NUMBER)
      RETURN DATE
   IS
      -- Herindicaties/vorige indicaties van dezelfde client die in dezelfde week start/eindigt.

      l_mld_key    NUMBER(10);
      l_good_monday DATE;

   BEGIN
      --- Vorige beschikking: bij herindicatie midden in de week is 1 van beide beschikkingen geldig
      --- Herindicatie midden in de week wordt gekenmerkt door:
         --- dezelfde client, dezelfde gemeente, eindweek van de vorige is gelijk aan beginweek van herindicatie,
         --- en het maakt niet uit wat de product is/wordt.
      --- Baas' van dubbele beschikking is diegene met de meeste aantal uren, ongeacht HV1->HV2 overgang.
      --- Bij gelijke aantal uren is de nieuwe beschikking de baas.



     -- Selecteer de vorige beschikking b1 van de beschikking b2 die meer uren heeft.
      SELECT MAX(b1.mld_melding_key)
      INTO l_mld_key
      FROM care_v_beschikking_all b1, care_v_beschikking_all b2
      WHERE b2.mld_melding_key = p_mld_key
      AND b1.mld_melding_key <> b2.mld_melding_key
      AND b1.mld_melding_status <> 1
      AND b1.beschikking_week_tot = b2.beschikking_week_van
      AND b1.beschikking_jaar_tot = b2.beschikking_jaar_van
      AND b1.prs_client_key = b2.prs_client_key
      AND b1.gemeente_code = b2.gemeente_code
      AND b1.uren_beschikking > b2.uren_beschikking;


      IF l_mld_key IS NOT NULL
      THEN
         -- Er is een vorige indicatie met meer uren, die is de 'baas'.
         -- Dat betekent dat de goede maandag van de beschikking b2 verder, naar de volgende week wordt gezet
         -- (ipv standaard op maandag deze week)

        SELECT (  TRUNC (mld_melding_datum) + 7
             - DECODE (TO_CHAR (mld_melding_datum, 'D'), '1', 8, TO_CHAR (mld_melding_datum, 'D'))
             + 2)
             INTO l_good_monday
             FROM mld_melding
             WHERE mld_melding_key = p_mld_key;
      ELSE
         -- Er is GEEN vorige indicatie bestaat of GEEN vorige indicatie met MEER uren, dus deze is de 'baas'.
         -- Dat betekent dat de goede maandag van de beschikking b2 standaard op maandag deze week komt te staan.
         SELECT (  TRUNC (mld_melding_datum)
             - DECODE (TO_CHAR (mld_melding_datum, 'D'), '1', 8, TO_CHAR (mld_melding_datum, 'D'))
             + 2)
             INTO l_good_monday
             FROM mld_melding
             WHERE mld_melding_key = p_mld_key;
      END IF;

      RETURN l_good_monday;
   END;

FUNCTION goodmonday_end (p_mld_key IN NUMBER)
      RETURN DATE
   IS
      -- Herindicaties/vorige indicaties van dezelfde client die in dezelfde week start/eindigt.

      l_mld_key    NUMBER(10);
      l_good_monday DATE;

   BEGIN
      --- Volgende beschikking: bij herindicatie midden in de week is 1 van beide beschikkingen geldig
      --- Herindicatie midden in de week wordt gekenmerkt door:
         --- dezelfde client, dezelfde gemeente, eindjaar/week van de vorige is gelijk aan beginjaar/week van herindicatie,
         --- en het maakt niet uit wat de product is/wordt.
      --- Baas' van dubbele beschikking is diegene met de meeste aantal uren, ongeacht HV1->HV2 overgang.
      --- Bij gelijke aantal uren is de nieuwe beschikking de baas.

      -- Controleer of die er is, en zo ja, selecteer de volgende beschikking b2 van de beschikking b1 die MEER
      -- of GELIJK AANTAL uren heeft.
      SELECT MAX(b2.mld_melding_key)
      INTO l_mld_key
      FROM care_v_beschikking_all b1, care_v_beschikking_all b2
      WHERE b1.mld_melding_key = p_mld_key
      AND b1.mld_melding_key <> b2.mld_melding_key
      AND b2.mld_melding_status <> 1
      AND b1.beschikking_week_tot = b2.beschikking_week_van
      AND b1.beschikking_jaar_tot = b2.beschikking_jaar_van
      AND b1.prs_client_key = b2.prs_client_key
      AND b1.gemeente_code = b2.gemeente_code
      AND b2.uren_beschikking >= b1.uren_beschikking;


      IF l_mld_key IS NOT NULL
      THEN
         -- Er is een volgende indicatie b2 met MEER of GELIJK AANTAL uren, die is de 'baas' is.
         -- Dat betekent dat de goede maandag van de beschikking b2 op de maandag van deze week wordt gezet
         -- (ipv standaard op maandag de volgende week)

         SELECT (  TRUNC (mld_melding_einddatum)
             - DECODE (TO_CHAR (mld_melding_einddatum, 'D'), '1', 8, TO_CHAR (mld_melding_einddatum, 'D'))
             + 2)
             INTO l_good_monday
             FROM mld_melding
             WHERE mld_melding_key = p_mld_key;


      ELSE
         -- Er is GEEN volgende indicatie is of GEEN volgende indicatie met MEER of GELIJK AANTAL uren, dus deze is de 'baas'.
         -- Dat betekent dat de goede maandag van de beschikking b2 standaard op maandag van de volgende week komt te staan.

         SELECT (  TRUNC (mld_melding_einddatum) + 7
             - DECODE (TO_CHAR (mld_melding_einddatum, 'D'), '1', 8, TO_CHAR (mld_melding_einddatum, 'D'))
             + 2)
             INTO l_good_monday
             FROM mld_melding
             WHERE mld_melding_key = p_mld_key;
      END IF;

      RETURN l_good_monday;
   END;

PROCEDURE care_v_rap2_factuur_uren_a
    ( user_key      IN     NUMBER,
      p_datum_van   IN     VARCHAR2,
      p_datum_tot   IN     VARCHAR2,
      p_cursor      OUT    t_cursor,
      p_where       IN     VARCHAR2 DEFAULT NULL
    )
   AS
      v_datum_van DATE;
      v_datum_tot DATE;
   BEGIN


        DELETE FROM care_periode;

        INSERT INTO care_periode (jaar, periode, week, maandag)
        SELECT
            TO_CHAR (SYSDATE - 7*(LEVEL-1), 'IYYY') jaar,
      			LEAST(FLOOR((TO_CHAR (SYSDATE - 7*(LEVEL-1),'IW') - 1) /4) + 1, 13) periode,
            TO_CHAR (SYSDATE - 7*(LEVEL-1), 'IW') week,
            TRUNC (SYSDATE - 7*(LEVEL-1), 'IW') startdatum
        FROM  DUAL
        CONNECT BY LEVEL <= 1*52+1;

        DELETE FROM CARE_T_BESCHIKK_X_PERIODETABEL;

        INSERT INTO CARE_T_BESCHIKK_X_PERIODETABEL(JAAR, PERIODE,WEEK_VAN,WEEK_TM,BSN,PRODUCT,UREN_BESCHIKKING)
            SELECT pw.jaar, pw.periode, MIN(week), MAX(week), b.client_bsn, b.product, SUM(b.uren_beschikking)
            FROM care_periode pw, care_v_beschikking_all b
            WHERE pw.maandag >= B.BESCHIKKING_MAANDAG_VAN
            AND pw.maandag < B.BESCHIKKING_MAANDAG_TOT
            AND b.beschikking_datum_tot >= sysdate - 53*7
            GROUP BY pw.jaar, pw.periode, b.client_bsn, b.product;

        OPEN p_cursor FOR
           'SELECT
               fclt_f_periode,
               factuurdatum,
               wzacode,
               fclt_f_gemeente,
               beschikkingsnr,
               bsn_client,
               client,
               geboortedatum,
               uren_periode,
               indicatie_uren,
               product,
               tarief,
               uren,
               minuten,
               bedrag_euro,
               bedrag_centen
             FROM care_v_rap2_factuur_uren_a' || p_where;

    END care_v_rap2_factuur_uren_a;


PROCEDURE care_v_rap2_factuur_uren_e
    ( user_key      IN     NUMBER,
      p_datum_van   IN     VARCHAR2,
      p_datum_tot   IN     VARCHAR2,
      p_cursor      OUT    t_cursor,
      p_where       IN     VARCHAR2 DEFAULT NULL
    )
   AS
      v_datum_van DATE;
      v_datum_tot DATE;
   BEGIN

        DELETE FROM care_periode;

        INSERT INTO care_periode (jaar, periode, week, maandag)
        SELECT
            TO_CHAR (SYSDATE - 7*(LEVEL-1), 'IYYY') jaar,
            LEAST(FLOOR((TO_CHAR (SYSDATE - 7*(LEVEL-1),'IW') - 1) /4) + 1, 13) periode,
            TO_CHAR (SYSDATE - 7*(LEVEL-1), 'IW') week,
            TRUNC (SYSDATE - 7*(LEVEL-1), 'IW') startdatum
        FROM  DUAL
        CONNECT BY LEVEL <= 1*52+1;

        DELETE FROM CARE_T_BESCHIKK_X_PERIODETABEL;

        INSERT INTO CARE_T_BESCHIKK_X_PERIODETABEL(JAAR, PERIODE,WEEK_VAN,WEEK_TM,BSN,PRODUCT,UREN_BESCHIKKING)
            SELECT pw.jaar, pw.periode, MIN(week), MAX(week), b.client_bsn, b.product, SUM(b.uren_beschikking)
            FROM care_periode pw, care_v_beschikking_all b
            WHERE pw.maandag >= B.BESCHIKKING_MAANDAG_VAN
            AND pw.maandag < B.BESCHIKKING_MAANDAG_TOT
            AND b.beschikking_datum_tot >= sysdate - 53*7
            GROUP BY pw.jaar, pw.periode, b.client_bsn, b.product;

        OPEN p_cursor FOR
           'SELECT
               fclt_x_periode,
               periode,
               weeknrs,
               factuurnummer,
               wzacode,
               fclt_f_gemeente,
               bsn_client,
               client,
               geboortedatum,
               uren_periode,
               indicatie_uren,
               product,
               tarief,
               uren,
               bedrag_euro
             FROM care_v_rap2_factuur_uren_e' || p_where;

    END care_v_rap2_factuur_uren_e;

END care;
/

REGISTERRUN('$Id$')

#endif // CARE
