<%@language = "javascript" %>
<% /*
     $Revision$
     $Id$

     File:               opdr_goedkeur.asp
     Description:        Goedkeuren van een opdracht (status 10 naar status 3/5 door iemand met passende WEB_ORDGOE autorisatie)
     Parameters:
        opdr_key         Opdrachtnummer (key)
*/ %>

<%
var JSON_Result = true;
%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="mld.inc" -->

<%
protectRequest.validateToken();

var opdr_key_arr = getFParamIntArray("opdr_key");
var dofiat = getFParamInt("dofiat", 0) == 1; // Goedkeurder kan aangeven met een vinkje dat de opdracht niet meer gefiatteerd hoeft te worden.
                                             // Als er geen checkbox aanwezig was, wordt altijd een 1 meegegeven. Alleen de kostenplaats kan het fiatteren dan nog uitschakelen.
                                             // Alleen mogelijk i.g.v. herfiattering en setting mld_opdr_refiat_preference op 1 (1=goedkeurder kan aangeven of dat moet})
                                             // De volgende status wordt dan refiatstatus.

var result = { message: "", success: false };
var tobegoedkeur = 0;
var ingesloten = [];
// Bepaal de opdrachten in de selectie die
// ook echt goedgekeurd kunnen of mogen worden.
for (var i = 0; i < opdr_key_arr.length; i++)
{
  var this_opdr = mld.func_enabled_opdracht(opdr_key_arr[i]); // Wat heb ik zoal aan rechten op deze opdracht?
  var opdr_info = this_opdr.mld_opdr; // Globale variabele met alle mld_opdr informatie
  var mld_info = mld.mld_melding_info(opdr_info.mld_key);
  if (this_opdr.canGoedkeur || this_opdr.canGoedkeur2 || this_opdr.canGoedkeur3 || this_opdr.canGoedkeur4 || this_opdr.canGoedkeur5)
  {
    ingesloten.push({ opdr_key: opdr_key_arr[i],
                      mld_key: opdr_info.mld_key,
                      kosten: opdr_info.t_cost,
                      fiatbedrag: opdr_info.fiatbedrag,
                      approved: opdr_info.approved,
                      bestellimiet: opdr_info.bestellimiet,
                      bestellimiet2: opdr_info.bestellimiet2,
                      bestellimiet3: opdr_info.bestellimiet3,
                      bestellimiet4: opdr_info.bestellimiet4,
                      bestellimiet5: opdr_info.bestellimiet5,
                      opdr_kp_key: opdr_info.kp_key,
                      opdr_kp_fiat: opdr_info.kp_fiat,
                      kostenklant: mld_info.mld_kk,                 // Waarde gelijk aan opdr_info.kosten_klant.
                      kosten: opdr_info.t_cost,
                      dis_key: mld_info.disc_key,
                      opdr_disc_key: opdr_info.opdr_disc_key,
                      uitv_key: opdr_info.uitvoerende_key,
                      canGoedkeur: this_opdr.canGoedkeur,
                      canGoedkeur2: this_opdr.canGoedkeur2,
                      canGoedkeur3: this_opdr.canGoedkeur3,
                      canGoedkeur4: this_opdr.canGoedkeur4,
                      canGoedkeur5: this_opdr.canGoedkeur5,
                      fiatteur_kp_key: opdr_info.fiatteur_kp_key,
                      fiatteur_kpg_key: opdr_info.fiatteur_kpg_key,
                      mld_kp_key: mld_info.kostenpl_key,
                      melder_key: mld_info.melder_key,
                      contactpers_key: opdr_info.contactpers_key,
                      opdr_status: opdr_info.opdr_status,
                      opdr_status_refiat: opdr_info.opdr_status_refiat,
                      opdr_handfiat: opdr_info.opdr_handfiat,
                      typeopdr_fvs: opdr_info.typeopdr_fvs
                    });
    tobegoedkeur++;
  }
}
user.anything_todo_or_abort(tobegoedkeur > 0); // We klagen niet over enkele wel en enkele niet

for (var i = 0; i < ingesloten.length; i++)
{ // Blijkbaar mogen we Goedkeuren. Maar welke? 1, 2, 3, 4 of 5?
  var opdr_key = ingesloten[i].opdr_key;
  var setnextstatus = false;

  lcl.set_dialect(opdr_info.opdr_type, "MLD_TYPEOPDR_KEY");

  if (ingesloten[i].canGoedkeur && (S("mld_opdr_approval_all") == 1 || !ingesloten[i].canGoedkeur2)) // Kan ik deze opdracht goedkeuren tot de eerste limiet? Als ik ook al tot de tweede limiet goed kan keuren dan direct maar tot de tweede limiet (volgende if).
  {
    var finalapproval = (S("mld_opdr_approval_all") == 1 || ingesloten[i].kosten <= ingesloten[i].bestellimiet2 || ingesloten[i].approved > ingesloten[i].bestellimiet2);
    sql = "UPDATE mld_opdr"
        + " SET mld_opdr_approved = " + (ingesloten[i].kosten < ingesloten[i].bestellimiet2? ingesloten[i].kosten : ingesloten[i].bestellimiet2) // Gefiatteerd tot een bedrag van limiet1 (<=500 Euro)
        + " WHERE mld_opdr_key = " + opdr_key;
    oRs = Oracle.Execute(sql);

    if (!finalapproval)
    { // Alle tweede goedkeurders een notificatie (ORD2GO) sturen. Tracking ORDGOE alleen als de status voor de eerste keer naar "Ter goedkeuring" gaat.
      mld.notifyopdrachtgoedkeuren(opdr_key);
    }
    else
      // De opdracht is tot de opdrachtkosten goedgekeurd. Verder goedkeuren hoeft niet.
      // De status van de opdracht mag (indien mogelijk) naar Ter fiattering(0) of Uitgegeven(5).
      setnextstatus = true;
    result.success = true;
  }
  else if (ingesloten[i].canGoedkeur2 && (S("mld_opdr_approval_all") == 1 || !ingesloten[i].canGoedkeur3)) // Kan ik deze opdracht goedkeuren tot de tweede limiet? Als ik ook boven de derde limiet goed kan keuren dan direct maar tot de derde limiet (volgende if).
  {
    var finalapproval = (S("mld_opdr_approval_all") == 1 || ingesloten[i].kosten <= ingesloten[i].bestellimiet3 || ingesloten[i].approved > ingesloten[i].bestellimiet3);
    sql = "UPDATE mld_opdr"
        + "   SET mld_opdr_approved = " + (ingesloten[i].kosten < ingesloten[i].bestellimiet3? ingesloten[i].kosten : ingesloten[i].bestellimiet3) // Goedgekeurd tot een bedrag van limiet2 (<=5000 Euro)
        + " WHERE mld_opdr_key = " + opdr_key;
    oRs = Oracle.Execute(sql);

    if (!finalapproval)
    { // Alle derde goedkeurders een notificatie (ORD2GO) sturen. Tracking ORDGOE alleen als de status voor de eerste keer naar "Ter goedkeuring" gaat.
      mld.notifyopdrachtgoedkeuren(opdr_key);
    }
    else
      // De opdracht is tot de opdrachtkosten goedgekeurd. Verder goedkeuren hoeft niet.
      // De status van de opdracht mag (indien mogelijk) naar Ter fiattering(0) of Uitgegeven(5).
      setnextstatus = true;
    result.success = true;
  }
  else if (ingesloten[i].canGoedkeur3 && (S("mld_opdr_approval_all") == 1 || !ingesloten[i].canGoedkeur4)) // Kan ik deze opdracht goedkeuren tot de derde limiet? Als ik ook boven de vierde limiet goed kan keuren dan direct maar tot de vierde limiet (volgende if).
  {
    var finalapproval = (S("mld_opdr_approval_all") == 1 || ingesloten[i].kosten <= ingesloten[i].bestellimiet4 || ingesloten[i].approved > ingesloten[i].bestellimiet4);
    sql = "UPDATE mld_opdr"
        + "   SET mld_opdr_approved = " + (ingesloten[i].kosten < ingesloten[i].bestellimiet4? ingesloten[i].kosten : ingesloten[i].bestellimiet4) // Goedgekeurd tot een bedrag van limiet3 (<=125000 Euro)
        + " WHERE mld_opdr_key = " + opdr_key;
    oRs = Oracle.Execute(sql);

    if (!finalapproval)
    { // Alle vierde goedkeurders een notificatie (ORD2GO) sturen. Tracking ORDGOE alleen als de status voor de eerste keer naar "Ter goedkeuring" gaat.
      mld.notifyopdrachtgoedkeuren(opdr_key);
    }
    else
      // De opdracht is tot de opdrachtkosten goedgekeurd. Verder goedkeuren hoeft niet.
      // De status van de opdracht mag (indien mogelijk) naar Ter fiattering(0) of Uitgegeven(5).
      setnextstatus = true;
    result.success = true;
  }
  else if (ingesloten[i].canGoedkeur4 && (S("mld_opdr_approval_all") == 1 || !ingesloten[i].canGoedkeur5)) // Kan ik deze opdracht goedkeuren tot de vierde limiet? Als ik ook boven de vijfde limiet goed kan keuren dan direct maar tot de vijfde limiet (volgende if).
  {
    var finalapproval = (S("mld_opdr_approval_all") == 1 || ingesloten[i].kosten <= ingesloten[i].bestellimiet5 || ingesloten[i].approved > ingesloten[i].bestellimiet5);
    sql = "UPDATE mld_opdr"
        + "   SET mld_opdr_approved = " + (ingesloten[i].kosten < ingesloten[i].bestellimiet5? ingesloten[i].kosten : ingesloten[i].bestellimiet5) // Goedgekeurd tot een bedrag van limiet4 (<=1000000 Euro)
        + " WHERE mld_opdr_key = " + opdr_key;
    oRs = Oracle.Execute(sql);

    if (!finalapproval)
    { // Alle vijfde goedkeurders een notificatie (ORD2GO) sturen. Tracking ORDGOE alleen als de status voor de eerste keer naar "Ter goedkeuring" gaat.
      mld.notifyopdrachtgoedkeuren(opdr_key);
    }
    else
      // De opdracht is tot de opdrachtkosten goedgekeurd. Verder goedkeuren hoeft niet.
      // De status van de opdracht mag (indien mogelijk) naar Ter fiattering(0) of Uitgegeven(5).
      setnextstatus = true;
    result.success = true;
  }
  else if (ingesloten[i].canGoedkeur5) // Kan ik dit contract volledig fiatteren en acfief maken?
  {
    sql = "UPDATE mld_opdr"
        + " SET mld_opdr_approved = " + ingesloten[i].kosten // Gefiatteerd boven bedrag van limiet5 (>1000000 Euro) voor het bedrag van de opdrachtkosten.
        + " WHERE mld_opdr_key = " + opdr_key;
    oRs = Oracle.Execute(sql);

    // De status van de opdracht mag (indien mogelijk) naar Ter fiattering(0) of Uitgegeven(5).
    setnextstatus = true;
    result.success = true;
  }

  // "Opdracht is goedgekeurd door xxxxx"
  if (result.success)
    mld.trackopdrachtupdate(opdr_key, L("lcl_mld_opdr_goedgek_by").format(user.naam(), ingesloten[i].kosten));

  if (setnextstatus)
  { // Nu naar status 3 (ter fiattering), status 5 (uitgegeven) (of het blijft toch status 10 (Ter goedkeuring)).
    // Let op: de essentie van deze code staat ook in mld_edit_opdr_save.asp

    var refiatstatus = ingesloten[i].opdr_status_refiat;

    var approver_key = -1;  // Die gaan we bepalen. Als het niet anders wordt, wordt er niet gefiatteerd.
    var pkey = -1;


    // Kan ik zelf fiatteren?: true:  totaalbedrag <= can_selfapprove
    //                         false  totaalbedrag > can_selfapprove
    var nextstatus = 5; // Uitgegeven(5).
    result.message = L("lcl_mld_opdr_goedgekeurd");

    // 1) Als de kosten onder de fiatteringsvrijstelling zit dan hoef ik niet te fiatteren.
    // 2) Afhankelijk van de setting "mld_opdr_refiat_preference" fiatteren.
    //    Bij herfiattering opnieuw fiatteren {0=(default) fiatteur moet opnieuw fiatteren, 1=goedkeurder kan aangeven of dat moet}
    //    a) mld_opdr_refiat_preference = 0: - Herfiatteren als bedrag nu boven FVS limiet is en boven profiel limiet van de laatste fiatteur.
    //    b) mld_opdr_refiat_preference = 1: - Goedkeuren met vinkje aan: Altijd herfiatteren als nieuwe opdracht.
    //                                       - Goedkeuren met vinkje uit: Niet fiatteren en direct naar volgende status.
    //                                       - Indien bedrag boven de profiel limiet komt, dan vinkje niet tonen en fiatteren als nieuwe opdracht.
    if (ingesloten[i].kosten < ingesloten[i].typeopdr_fvs)
    {
      // Bedrag zit onder de fiatteringsvrijstelling. De nextstatus blijft Uitgegeven(5).
    }
    else if (S("mld_opdr_refiat_preference") == 1)
    { // Fiatteren als een nieuwe opdracht (als eerst keer fiatteren) of fiatteren overslaan. Afhankelijk van vinkje (dofiat). Verderop wordt deze keuze verwerkt.
      var mld_info = {kostenpl_key: ingesloten[i].mld_kp_key,
                      melder_key: ingesloten[i].melder_key,
                      mld_kk: ingesloten[i].kostenklant,
                      disc: ingesloten[i].dis_key};
      var mld_opdr = {kp_key: ingesloten[i].opdr_kp_key,
                      opdr_key: ingesloten[i].opdr_key,
                      fiatbedrag: ingesloten[i].fiatbedrag,
                      t_cost: ingesloten[i].kosten,
                      opdr_handfiat: ingesloten[i].opdr_handfiat,
                      contactpers_key: ingesloten[i].contactpers_key,
                      kp_fiat: ingesloten[i].opdr_kp_fiat,
                      opdr_disc_key: ingesloten[i].opdr_disc_key,
                      opdr_status: ingesloten[i].opdr_status,
                      opdr_status_refiat: ingesloten[i].opdr_status_refiat};
      var approver = mld.getFirstApprover(mld_info, mld_opdr);
      approver_key = approver.approver_key;
      // Geeft de kostenplaats ook aan dat er gefiatteerd moet worden?
      if (approver.for_approval &&            // Hoeft er wel gefiatteerd te worden?
          dofiat &&
          ingesloten[i].opdr_kp_fiat)
      { // Fiatteren opdracht.
        if (approver_key == -1)
          abort_with_warning(L("lcl_bes_exceed_limit"));
        else
        {
          nextstatus = 3; // Ter fiattering(3).

          // Herfiattering waarbij de goedkeurder heeft aangegeven dat de opdracht opnieuw gefiatteerd dient te worden (Setting mld_opdr_refiat_preference = 1).
          // Fiattering opnieuw ingaan. Het fiatbedrag leeg maken. Opdracht als nieuw fiatteren.
          var sql_update = "UPDATE mld_opdr"
                         + "   SET mld_opdr_fiatbedrag = null"
                         + " WHERE mld_opdr_key = " + opdr_key;
          Oracle.Execute(sql_update);

          // Notificatie aan de fiatteur.
          result.message += "\n" + mld.sendNeedApprovalNotification(opdr_key, approver_key);
        }
      }
      else
      { // Fiatteren opdracht overslaan. Dit is aangegeven door de goedkeurder of kostenplaats.
        // Dit moet getrackt worden.
        // Het kan zijn dat er ook geen fiatteur gevonden is. Normaal kreeg je dan een foutmelding. Nu tracken we het alleen.
        if (approver_key == -1)
          var prsname = L("lcl_prs_budgethouder");
        else
        {
          var sql = "SELECT prs_perslid_naam_full FROM prs_v_perslid_fullnames_all WHERE prs_perslid_key = " + approver_key;
          var oRs = Oracle.Execute(sql);
          var prsname = oRs("prs_perslid_naam_full").Value;
          oRs.Close();
        }
        var mldtrackarray = [];
        if (approver.for_approval && approver_key == -1)  // PF: op de gok, TODO verifiëren
          mldtrackarray.push(L("lcl_bes_exceed_limit"));
        if (!dofiat)
          mldtrackarray.push(L("lcl_mld_no_approval_indicated").format(prsname));
        if (!ingesloten[i].opdr_kp_fiat)
          mldtrackarray.push(L("lcl_mld_no_approval_kp").format(prsname));
        mld.trackopdrachtupdate(opdr_key, mldtrackarray.join("\n"));
      }
    }
    else
    { // mld_opdr_refiat_preference = 0

      // Herfiattering wordt (pas) vereist indien het bedrag boven het mandaat van de oorspronkelijke (laatste) fiatteur uitkomt
      // en boven de FVS-grens uitkomt. Als er hergoedgekeurd is dan was het bedrag al boven de FVS-grens en hoeven wij dit hier niet meer opnieuw te checken/testen.
      if (refiatstatus > 0 || ingesloten[i].opdr_handfiat)
      { // Herfiattering of vrijwillige fiattering.
        var wasSelfapproved = false;
        // Bepaling oorspronkelijke (laatste) fiatteur, als die er was.
        if (ingesloten[i].kosten > 0)
        { // Er zijn nu kosten.
          // Bepaling oorspronkelijke (laatste) fiatteur, als die er was.
          sql = "SELECT pf.prs_perslid_key"
              + "  FROM fac_tracking tr"
              + "     , fac_srtnotificatie str"
              + "     , prs_v_perslid_fullnames_all pf"
              + " WHERE tr.fac_srtnotificatie_key = str.fac_srtnotificatie_key"
              + "   AND tr.prs_perslid_key = pf.prs_perslid_key(+)"
              + "   AND (str.fac_srtnotificatie_code = 'ORDFOK'"
              + "    AND tr.fac_tracking_refkey = " + opdr_key
              + "    AND str.fac_srtnotificatie_xmlnode IN ('opdracht'))"
              + " ORDER BY fac_tracking_datum DESC"
              + "        , fac_tracking_key DESC"
          var oRs = Oracle.Execute(sql);
          if (!oRs.eof)
          { // Fiatteur gevonden.
            pkey = oRs("prs_perslid_key").Value;
          }
          oRs.Close();
        }
      }

      if (pkey < 0 || ingesloten[i].opdr_handfiat)
      { // Vorige keer selfapproved of vrijwillige fiattering.
        wasSelfapproved = !ingesloten[i].opdr_handfiat;
        // Als de kostenplaats bij de opdracht overruled is dan wordt altijd tegen het profiel van de BO-medewerker getest.
        // Bepalen eerste persoon om te fiatteren.
        if (ingesloten[i].kostenklant == 1 && ingesloten[i].mld_kp_key == ingesloten[i].opdr_kp_key && S("mld_opdr_ignore_caller_profile") == 0)
          pkey = ingesloten[i].melder_key;  // Melder van de melding.
        else
        { // Terugzoeken wie *oorspronkelijk* de opdrachtaanmaker was (De user op dat moment).
          var sql = "SELECT fac.gettrackinguserkey('ORDNEW', " + opdr_key + ") opdrachtaanmaker FROM DUAL";
          var oRs = Oracle.Execute(sql);
          pkey = oRs("opdrachtaanmaker").Value;
          oRs.Close();
          if (!pkey)
          { // Dan is de opdrachtaanmaker wellicht de verantwoordelijke van de ORDGOE tracking/notificatie.
            // De tracking zal aanwezig zijn want de opdracht staat ter goedkeuring en er is dus een tracking/notificatie verstuurd.
            var sql = "SELECT fac.gettrackinguserkey('ORDGOE', " + opdr_key + ") opdrachtaanmaker FROM DUAL";
            var oRs = Oracle.Execute(sql);
            pkey = oRs("opdrachtaanmaker").Value;
            oRs.Close();
          }
        }
      }
      // Vrijwilleg fiatteren of herfiatteren.
      // Bij het bepalen of er geherfiatteerd moet worden geldt:
      // a) Selfapprove was WEL  van toepassing: Er moet gechecked worden of ik nu weer zelf mag fiatteren.
      // b) Selfapprove was NIET van toepassing: De kp-verantwoordlijke of kpg-verantwoordelijke heeft als laatst gefiatteerd.
      //                                         Kijk of het nieuwe bedrag binnen zijn limiet is gebleven.
      //                                         Er moet dan niet naar de (tot_kosten > S("can_selfapprove")) gekeken worden,
      //                                         want die zal in dit geval altijd waar zijn omdat vorige keer ook al niet zelf is gefiatteerd.
      if (ingesloten[i].opdr_handfiat || // Vrijwillig. Wel even checken of er een fiatteur gevonden kan worden.
          (S("mld_use_order_approval") &&
           (ingesloten[i].kosten > ingesloten[i].fiatbedrag &&  // Als de totale kosten nog steeds onder het reeds gefiatteerde bedrag blijven, hoeven we niet te herfiatteren.
            ((wasSelfapproved && ingesloten[i].kosten > S("can_selfapprove")) ||
             (S("mld_opdr_reapproval_rate") == -1 && budget.exceeds_profiel(ingesloten[i].kosten, pkey, ingesloten[i].opdr_disc_key))
            )) ||
           (S("mld_opdr_reapproval_rate") >= 0 && ingesloten[i].kosten > (ingesloten[i].fiatbedrag * (1 + S("mld_opdr_reapproval_rate") / 100))) // Als de totale kosten een bepaald percentage toeneemt, moet geherfiatteerd worden.
          ))
      { // Wie moet op verzoek fiatteren voor deze kostenplaats, terwijl het bedrag wellicht onbekend is?
        if (refiatstatus > 0 && pkey > 0)
        { // Herfiattering en er is een oorspronkelijke (laatste) fiatteur gevonden.
          // Wie was die laatste fiatteur?
          if (pkey == ingesloten[i].fiatteur_kp_key || pkey == ingesloten[i].fiatteur_kpg_key ||
              pkey == ingesloten[i].fiatteur2_kpg_key || pkey == ingesloten[i].fiatteur3_kpg_key)
          {
            if (S("mld_opdr_reapproval_rate") >= 0)
            { // Bepaal of dezelfde fiatteur nog een keer moet fiatteren of de volgende in de rij.
              approver_key = prs.getFiatteur(ingesloten[i].opdr_kp_key, -1, ingesloten[i].kosten, ingesloten[i].opdr_disc_key, ingesloten[i].fiatbedrag);
            }
            else
            { // De laatste fiatteur was de KP veranwoordelijke of de 1ste, 2de of 3de KPG veranwoordelijke. Bepaal de volgende KPG fiatteur.
              // MGE: Kunnen we hier ook "prs.getFiatteur" gebruiken i.p.v. "prs.nextfiatteur"? Dan kunnen we nextfiatteur uitfaseren voor de MLD module.
              //      Dat doen we ook in mld_edit_opdr_save functie getToReaApprove.
              var sql = "SELECT prs.nextfiatteur(" + opdr_key + ", 'MLD') approver_key FROM DUAL";
              var oRs = Oracle.Execute(sql);
              approver_key = oRs("approver_key").Value;
              oRs.Close();
            }
          }
          else
          {
            // Dan moet het de behandelaar/user (can_selfapprove) zijn geweest. Bepaal KP verantwoordelijke.
            // Laatste fiatteur of eerste fiatteur (pkey) mag niet fiatteren want het zit boven zijn profiel limiet.
            // De melder van de melding of opdrachtaanmaker van de melding (pkey) mag niet zelf goedkeuren boven het bedrag can_selfapprove.
            // ingesloten[i].kosten > can_selfapprove => pkey als exclude key meegeven.
            // Bij een kpg fiatteur moeten we de volgende hebben en niet de laatste, daarom (fiatbedrag >= 0) meegeven.
            var pexcludekey = (ingesloten[i].kosten > S("can_selfapprove"))? pkey : -1;
            approver_key = prs.getFiatteur(ingesloten[i].opdr_kp_key, pexcludekey, ingesloten[i].kosten, ingesloten[i].opdr_disc_key, ingesloten[i].fiatbedrag);
          }
        }
        else
        {
          // Eerst keer fiatteren.
          // Laatste fiatteur of eerste fiatteur (pkey) mag niet fiatteren want het zit boven zijn profiel limiet.
          // Alleen de melder/aanmaker mag niet zelf goedkeuren boven het bedrag can_selfapprove.
          // Ook bij vervangers moet de juiste fiatteur gevonden worden (AADB#38785). Later is de datafunctie prs.getfiatteur aangepast voor vervangers.
          // Hier hiertzelfde doen als op de andere plekken.
          // Bij een kpg fiatteur moeten we de volgende hebben en niet de laatste, daarom (fiatbedrag >= 0) meegeven.
          var pexcludekey = (ingesloten[i].kosten > S("can_selfapprove"))? pkey : -1;
          approver_key = prs.getFiatteur(ingesloten[i].opdr_kp_key, pexcludekey, ingesloten[i].kosten, ingesloten[i].opdr_disc_key, ingesloten[i].fiatbedrag);
        }

        if (ingesloten[i].opdr_kp_fiat)
        {
          if (approver_key == -1)
            // Deze opdracht overschrijdt het mandaat van de budgethouder van de opgegeven kostenplaats en/of de budgethouder is onbekend of heeft geen budget.
            // Stop en geef warning mee.
            abort_with_warning(L("lcl_bes_exceed_limit"));
          else
          {
            nextstatus = 3; // Ter fiattering(3).
            // Notificatie aan de fiatteur.
            result.message += "\n" + mld.sendNeedApprovalNotification(opdr_key, approver_key);
          }
        }
        else
        { // Volgens de kostenplaats hoeft niet gefiatteerd te worden. Dit wel even tracken.
          if (approver_key == -1)
            var prsname = L("lcl_prs_budgethouder");
          else
          {
            var sql = "SELECT prs_perslid_naam_full FROM prs_v_perslid_fullnames_all WHERE prs_perslid_key = " + approver_key;
            var oRs = Oracle.Execute(sql);
            var prsname = oRs("prs_perslid_naam_full").Value;
            oRs.Close();
          }
          var mldtrackarray = [];
          if (approver_key == -1)
            mldtrackarray.push(L("lcl_bes_exceed_limit"));
          mldtrackarray.push(L("lcl_mld_no_approval_kp").format(prsname));
          mld.trackopdrachtupdate(opdr_key, mldtrackarray.join("\n"));
        }
      }
    }

    // Herfiatteren van een bestaande opdracht: Na het fiatteren weer terug naar de oude status.
    if (nextstatus == 5 && refiatstatus > 0)
      nextstatus = refiatstatus;

    // Zet de opdrachtstatus. Tracking wordt ook automatisch gedaan. Bij hergoedkeuren wordt alleen naar status Ter fiattering(3), Gefiatteerd(4) en Ter goedkeuring(10) getrackt.
    mld.setopdrachtstatus(opdr_key, nextstatus, ingesloten[i].uitv_key);

    if (nextstatus == 5) {
      Oracle.Execute("UPDATE mld_opdr SET mld_opdr_actiecode = 4 WHERE mld_opdr_key = " + opdr_key);
    }

    // Refresh meldingstatus zonodig als gevolg van een nieuw uitgegeven opdracht.
    mld.updatemeldingstatus(ingesloten[i].mld_key, 0);

    if (refiatstatus > 0 && nextstatus >= 5)
    { // Refiat opdracht kosten en refiat status weer op NULL zetten.
      sql = "UPDATE mld_opdr"
          + "   SET mld_opdr_uren_refiat = NULL"
          + "     , mld_opdr_uurloon_refiat = NULL"
          + "     , mld_opdr_materiaal_refiat = NULL"
          + "     , mld_opdr_kosten_refiat = NULL"
          + "     , mld_statusopdr_key_refiat = NULL"
          + "     , mld_opdr_approved_refiat = NULL"
          + " WHERE mld_opdr_key = " + ingesloten[i].opdr_key;
      Oracle.Execute(sql);
    }
  }
}

Response.Write(JSON.stringify(result));
%>

<% ASPPAGE_END(); %>
