<% /*
    $Revision$
    $Id$

    File:        budget.inc
    Description: Generieke functies die door BES en MLD module gebruikt worden.
    Parameters:
    Context:     Vanuit asp bestand
    Note:

*/ %>
<%
var budget = {
      // Geeft true als het bestelde bedrag boven de profiel-limiet van prs_key komt
      // en dus goedkeuring vereist zal zijn.
      exceeds_profiel: function(bestelbedrag, prs_key, dis_key)
      {
        var exceed = true; // geen profiel is altijd te hoog.
        var sql = "SELECT prs.getprofiellimiet(" + prs_key + ", " + dis_key + ") limiet FROM DUAL";
        var oRs = Oracle.Execute(sql);

        if (oRs("limiet").value != null)
        {
          exceed = (oRs("limiet").value < bestelbedrag);
        }
        oRs.Close();
        return exceed;
      },

      // Geeft true als het bestelde bedrag boven de profiel-limiet van prs_key komt
      // en dus goedkeuring vereist zal zijn.
      exceeds_limietagb: function(bestelbedrag, kp_key, dis_key)
      {
        var exceed = true; // geen profiel is altijd te hoog.
        var sql = "SELECT prs.getlimietagb(" + kp_key + ", " + S("prs_approvemethod") + ", " + dis_key + ") limiet FROM DUAL";
        var oRs = Oracle.Execute(sql);

        if (oRs("limiet").value != null)
        {
          exceed = (oRs("limiet").value < bestelbedrag);
        }
        oRs.Close();
        return exceed;
      },

      besteed_budget_pgb: function (prs_key, dis_key, params)
      { // Besteed budget van meegegeven persoon dit jaar voor de meegegeven discipline i.v.m. Persoons Gebonden Budget (PGB).
        // Eventueel uitgezonderd (huidige) bestellingkey bes_key en meldingopdrachtkey opdr_key.
        var budgetbesteld = 0;
        // De discipline instelling disc_params_pgb moet 1 of 3 zijn. Afhankelijk van deze instelling roep je de pgb of agb versie aan. Hier opnieuw controleren is niet nodig.
        // Totaalbedrag van eerdere bestellingen en meldingopdrachten dit jaar van de besteller en behandelaar i.v.m. Persoons Gebonden Budget (PGB).
        var sql = "SELECT SUM(totaalbedrag) totaalbedrag"
                + "     , SUM(b.bes_bestelling_korting) korting"
                + "     , SUM(b.bes_bestelling_levkosten) levkosten"
                + "  FROM (SELECT SUM (boi.bes_bestelopdr_item_aantal * boi.bes_bestelopdr_item_prijs) totaalbedrag"
                + "             , b.bes_bestelling_key"
                + "          FROM bes_bestelling b"
                + "             , bes_bestelling_item bi"
                + "             , bes_bestelopdr_item boi"
                + "             , bes_bestelopdr bo"
                + "             , bes_srtdeel isd"
                + "             , bes_srtgroep isg"
                + "         WHERE b.bes_bestelling_key = bi.bes_bestelling_key"
                + "           AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key"
                + "           AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key"
                + "           AND bi.bes_srtdeel_key = isd.bes_srtdeel_key"
                + "           AND isd.bes_srtgroep_key = isg.bes_srtgroep_key"
                + "           AND b.prs_perslid_key = " + prs_key
                + "           AND isg.ins_discipline_key = " + dis_key
                // Alleen bestellingopdrachten in de behandelings fase (In bestelling (Bevestigd)(4)) en in de gereed fase (Geleverd(6) en Verwerkt(7)).
                // Afgewezen(1), In behandeling(3), Ter bevestiging(5) en Geannuleerd(8) doen niet mee in de bepaling van geraamde en definitieve kosten.
                + "           AND bo.bes_bestelopdr_status IN (4, 6, 7)"
                + (params && params.bes_key > -1
                  ? "         AND b.bes_bestelling_key <> " + params.bes_key
                  : "")
                + "           AND b.bes_bestelling_datum >= TRUNC (SYSDATE, 'YEAR')"
                + "        GROUP BY b.bes_bestelling_key) tot"
                + "     , bes_bestelling b"
                + " WHERE b.bes_bestelling_key = tot.bes_bestelling_key"
                + " UNION "
                + "SELECT SUM (totaalbedrag) totaalbedrag"
                + "     , 0 korting"
                + "     , 0 levkosten"
                + "  FROM (SELECT SUM (o.mld_opdr_kosten) totaalbedrag"
                + "             , o.mld_opdr_key"
                + "          FROM mld_opdr o"
                + "             , mld_melding m"
                + "             , mld_stdmelding sm"
                + "         WHERE o.mld_melding_key = m.mld_melding_key"
                + "           AND m.mld_stdmelding_key = sm.mld_stdmelding_key"
                + "           AND o.prs_perslid_key = " + prs_key
                + "           AND sm.mld_ins_discipline_key = " + dis_key
                // Alleen meldingopdrachten in de actieve opdracht fase (Uitgegeven(5) en Geaccepteerd(8)),
                // in de afhandelings fase (Technisch voltooid(6) en Kosten voltooid(9)) en in de gereed fase (Verwerkt(7)).
                + "           AND o.mld_statusopdr_key IN (5, 6, 7, 8, 9)"
                + (params && params.opdr_key > -1
                  ? "         AND o.mld_opdr_key <> " + params.opdr_key
                  : "")
                + "           AND o.mld_opdr_datumbegin >= TRUNC (SYSDATE, 'YEAR')"
                + "        GROUP BY o.mld_opdr_key) tot"
                + "     , mld_opdr o"
                + " WHERE o.mld_opdr_key = tot.mld_opdr_key";
        sql = "SELECT SUM(totaalbedrag) totaalbedrag"
            + "     , SUM(korting) korting"
            + "     , SUM(levkosten) levkosten"
            + " FROM (" + sql + ")";
        oRs = Oracle.Execute(sql);
        var prstotaalbesteld = oRs("totaalbedrag").Value || 0;
        var korting = oRs("korting").Value || 0;
        var levkosten = oRs("levkosten").Value || 0;
        var budgetbesteld = prstotaalbesteld - korting + levkosten;
        oRs.close();
        return budgetbesteld;
      },

      besteed_budget_agb: function (kp_key, params)
      { // Besteed budget van meegegeven persoon afgelopen periode i.v.m. Afdelings Gebonden Budget (AGB).
        // Eventueel uitgezonderd (huidige) bestellingkey bes_key en meldingopdrachtkey opdr_key.
        var budgetbesteld = 0;
        // De discipline instelling disc_params_pgb moet 1 of 3 zijn. Afhankelijk van deze instelling roep je de pgb of agb versie aan. Hier opnieuw controleren is niet nodig.
        // Totaalbedrag van eerdere bestellingen en meldingopdrachten van afgelopen periode van de besteller en behandeaar i.v.m. Afdelings Gebonden Budget (AGB).

         // Limietperiode kostenplaats (prs_kostenplaats_limietperiode): 0(of NULL)=geen(oneindig) (default), 1=maand, 2=jaar.
        if (kp_key > 0)
        { // Er is een kostenplaats gevonden.
          // De limiet periode van de kostenplaatsgroep overruled die van de kostenplaats indien ingevuld.
           sql = "SELECT CASE COALESCE(kg.prs_kostenplaatsgrp_limperiode, 0)" // Indien kostenplaats geen kostenplaatsgroep heeft dan ook "Geen" en eigen limietperiode van de kostenplaats nemen.
               + "       WHEN 0" // Geen.
               + "       THEN k.prs_kostenplaats_limietperiode"
               + "       ELSE kg.prs_kostenplaatsgrp_limperiode" // Maand of Jaar.
               + "       END limietperiode"
               + "  FROM prs_kostenplaats k"
               + "     , prs_kostenplaatsgrp kg"
               + " WHERE k.prs_kostenplaatsgrp_key = kg.prs_kostenplaatsgrp_key(+)"
               + "   AND k.prs_kostenplaats_key = " + kp_key;
           oRs = Oracle.Execute(sql);
          var kp_limietperiode = oRs("limietperiode").Value;
          var periode;
          if (kp_limietperiode == 1)
            periode = "MM"; // Maandelijks budget.
          else if (kp_limietperiode == 2)
            periode = "YYYY"; // Jaarlijks budget.

          sql = "SELECT SUM(totaalbedrag) totaalbedrag"
              + "     , SUM(b.bes_bestelling_korting) korting"
              + "     , SUM(b.bes_bestelling_levkosten) levkosten"
              + "  FROM (SELECT SUM (boi.bes_bestelopdr_item_aantal * boi.bes_bestelopdr_item_prijs) totaalbedrag"
              + "             , b.bes_bestelling_key"
              + "          FROM bes_bestelling b"
              + "             , bes_bestelling_item bi"
              + "             , bes_bestelopdr_item boi"
              + "             , bes_bestelopdr bo"
              + "             , bes_srtdeel bsd"
              + "             , bes_srtgroep bsg"
              + "             , bes_discipline bd"
              + "             , bes_disc_params bdp"
              + "         WHERE b.bes_bestelling_key = bi.bes_bestelling_key"
              + "           AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key"
              + "           AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key"
              + "           AND bi.bes_srtdeel_key = bsd.bes_srtdeel_key"
              + "           AND bsd.bes_srtgroep_key = bsg.bes_srtgroep_key"
              + "           AND bsg.ins_discipline_key = bd.ins_discipline_key"
              + "           AND bsg.ins_discipline_key = bdp.bes_ins_discipline_key"
              + "           AND bdp.bes_disc_params_pgb IN (2, 3)" // Alleenn agb meetellen: 2 = Alleen agb, 3 = Beiden, pgb en agb.
              + "           AND b.prs_kostenplaats_key = " + kp_key
              // Alleen bestellingopdrachten in de behandelings fase (In bestelling (Bevestigd)(4)) en in de gereed fase (Geleverd(6) en Verwerkt(7)).
              // Afgewezen(1), In behandeling(3), Ter bevestiging(5) en Geannuleerd(8) doen niet mee in de bepaling van geraamde en definitieve kosten.
              + "           AND bo.bes_bestelopdr_status IN (4, 6, 7)"
              + (params && params.bes_key > -1
                ? "         AND b.bes_bestelling_key <> " + params.bes_key
                : "")
              + (kp_limietperiode && kp_limietperiode > 0
                ? "         AND b.bes_bestelling_datum >= TRUNC (SYSDATE, " + safe.quoted_sql(periode) + ")" // De eerste van de deze maand of 1 januari dit jaar
                : "")
              + "        GROUP BY b.bes_bestelling_key) tot"
              + "     , bes_bestelling b"
              + " WHERE b.bes_bestelling_key = tot.bes_bestelling_key"
              + " UNION "
              + "SELECT SUM (totaalbedrag) totaalbedrag"
              + "     , 0 korting"
              + "     , 0 levkosten"
              + "  FROM (SELECT SUM (o.mld_opdr_kosten) totaalbedrag"
              + "             , o.mld_opdr_key"
              + "          FROM mld_opdr o"
              + "             , mld_melding m"
              + "             , mld_stdmelding sm"
              + "             , mld_discipline md"
              + "             , mld_disc_params mdp"
              + "         WHERE o.mld_melding_key = m.mld_melding_key"
              + "           AND m.mld_stdmelding_key = sm.mld_stdmelding_key"
              + "           AND sm.mld_ins_discipline_key = md.ins_discipline_key"
              + "           AND md.ins_discipline_key = mdp.mld_ins_discipline_key"
              + "           AND mdp.mld_disc_params_pgb IN (2,3)" // Alleenn agb meetellen: 2 = Alleen agb, 3 = Beiden, pgb en agb.
              + "           AND o.prs_kostenplaats_key = " + kp_key
              // Alleen meldingopdrachten in de actieve opdracht fase (Uitgegeven(5) en Geaccepteerd(8)),
              // in de afhandelings fase (Technisch voltooid(6) en Kosten voltooid(9)) en in de gereed fase (Verwerkt(7)).
              + "           AND o.mld_statusopdr_key IN (5, 6, 7, 8, 9)"
              + (params && params.opdr_key > -1
                ? "         AND o.mld_opdr_key <> " + params.opdr_key
                : "")
              + (kp_limietperiode && kp_limietperiode > 0
                ? "         AND o.mld_opdr_datumbegin >= TRUNC (SYSDATE, " + safe.quoted_sql(periode) + ")" // De eerste van de deze maand of 1 januari dit jaar
                : "")
              + "        GROUP BY o.mld_opdr_key) tot"
              + "     , mld_opdr o   "
              + " WHERE o.mld_opdr_key = tot.mld_opdr_key";
          sql = "SELECT SUM(totaalbedrag) totaalbedrag"
              + "     , SUM(korting) korting"
              + "     , SUM(levkosten) levkosten"
              + " FROM (" + sql + ")";
          oRs = Oracle.Execute(sql);
          var prstotaalbesteld = oRs("totaalbedrag").Value || 0;
          var korting = oRs("korting").Value || 0;
          var levkosten = oRs("levkosten").Value || 0;
          var budgetbesteld = prstotaalbesteld - korting + levkosten;
          oRs.close();
        }
        return budgetbesteld;
      },

      get_pgblimiet: function(prs_key, dis_key)
      { // Bepaal PGB limiet
        var sql = "SELECT prs.getprofiellimiet(" + prs_key + ", " + dis_key + ") pgblimiet FROM DUAL";
        var oRs = Oracle.Execute(sql);
        var pgblimiet = oRs("pgblimiet").Value;
        oRs.close();
        return pgblimiet;
      },

      get_agblimiet: function(kp_key, dis_key)
      { // Bepaal AGB limiet
        var sql = "SELECT prs.getlimietagb(" + kp_key + ", " + S("prs_approvemethod") + ", " + dis_key + ") agblimiet FROM DUAL";
        var oRs = Oracle.Execute(sql);
        var agblimiet = oRs("agblimiet").Value;
        oRs.close();
        return agblimiet;
      }
}
%>
