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

     File:               opdr_approve.asp
     Description:        Fiatteren van een opdracht.
     Parameters:
        opdr_key         String van opdrachtnummers (keys)
*/ %>

<%
var JSON_Result = true;

var opdr_key_arr = getFParamIntArray("opdr_key");
if (opdr_key_arr.length)
    var LOCKED_USER_OK = { "xmlnode": "opdracht", "key": opdr_key_arr[0] };
%>

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

<%
protectRequest.validateToken();

var result = { message: "", success: false };

var result = {};
var tobeapproved = 0;
var ingesloten = [];
// Bepaal de bestellingen in de selectie die
// ook echt geaccepteerd 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]);
  if (this_opdr.canApprove)
  {
    ingesloten.push({ key: opdr_key_arr[i], mld_opdr: this_opdr.mld_opdr });
    tobeapproved++;
  }
}
user.anything_todo_or_abort(tobeapproved > 0); // We klagen niet over enkele wel en enkele niet


for (var i = 0; i < ingesloten.length; i++)
{
  // Blijkbaar mogen we Approve'n
  var mld_opdr = ingesloten[i].mld_opdr;

  // Check welk profiel gebruikt moet worden als ik vervanger van de budgethouder ben.
  var profile_user_key = user_key;

  if (user.isCollega(mld_opdr.fiatteur_kp_key)) {
    profile_user_key = mld_opdr.fiatteur_kp_key;
  }

  var fiatbedrag = 0;
  var bijnaklaar = false;
  var fiat_key = mld_opdr.mld_opdr_fiat_user;  // is deze opdracht al een keer gefiatterd

  if (S("mld_opdr_reapproval_rate") >= 0) // Herfiatteringstarief (%) wordt gebruikt.
  {
    fiatbedrag = mld_opdr.t_cost;
    bijnaklaar = true;
  }
  else if (!S("mld_use_order_approval") || mld_opdr.t_cost == 0)          // het was sowieso vrijwillige approval
    bijnaklaar = true;
  else if (!budget.exceeds_profiel(mld_opdr.t_cost, profile_user_key, -1) && !fiat_key) // het valt binnen onze limiet (geen disicpline) en alleen voor de budgethouder.
  {
    fiatbedrag = budget.get_pgblimiet(profile_user_key, -1);
    bijnaklaar = true;
  }
  else // een kpgroep verantwoordelijke moet fiatteren
  { // dat zijn wij of collega daarvan, anders was this_opdr.canApprove false geweest
    // || user.isCollega(mld_opdr.nextfiatteur_kpg_key)                   // wij zijn de groepverantwoordelijke1,2,3 of de vervanger van de groepverantwoordelijke.
    if ( mld_opdr.fiatteur3_kpg_key > 0 && user.isCollega(mld_opdr.fiatteur3_kpg_key) )
    {
      fiatbedrag = mld_opdr.t_cost;
      bijnaklaar = true;
    }
    else if ( mld_opdr.fiatteur2_kpg_key > 0 && user.isCollega(mld_opdr.fiatteur2_kpg_key) )
    {
      fiatbedrag = mld_opdr.kpg_fin_limit2;
      if (mld_opdr.t_cost <= mld_opdr.kpg_fin_limit2)
      {
        bijnaklaar = true;
      }
    }
    else if ( mld_opdr.fiatteur_kpg_key > 0 && user.isCollega(mld_opdr.fiatteur_kpg_key) ) // we zijn (collega van) mld_opdr.fiatteur_kpg_key
    {
      fiatbedrag = mld_opdr.kpg_fin_limit1;
      if (mld_opdr.t_cost <= mld_opdr.kpg_fin_limit1)
      {
        bijnaklaar = true;
      }
    }
    else
    {
      // budgethouder en profiel is niet toereikend.
      fiatbedrag = budget.get_pgblimiet(profile_user_key, -1);
    }
  }

  var sql_update = "UPDATE mld_opdr"
                 + "   SET mld_opdr_fiatbedrag = " + fiatbedrag
                 + " WHERE mld_opdr_key = " + ingesloten[i].key;
  if (bijnaklaar)
  { // Zetten van de status en afhandelen van de tracking van het fiatteren (approve).
    mld.setopdrachtstatus(ingesloten[i].key, 4); // Gefiatteerd, trackt zelf ORDFOK

    // Gequeuede berichten/notificaties en portalberichten van de approver verwijderen.
    sql = "BEGIN fac.clrnotifications ('MLDAP1', " + ingesloten[i].key + "); END;";
    Oracle.Execute(sql);

    // In het geval van herfiattering de status hier al terugzetten naar de herfiatteringstatus.
    var refiatstatus = mld_opdr.opdr_status_refiat;
    if (refiatstatus > 0)
    {
      mld.setopdrachtstatus(ingesloten[i].key, refiatstatus, mld_opdr.uitvoerende_key); // Naar de herfiatteringstatus.

      // 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].key;
      Oracle.Execute(sql);
    }
    else
    { // Altijd naar status Uitgegeven(5). Gebeurt namelijk ook als er nooit sprake is geweest van fiatteren
      mld.setopdrachtstatus(ingesloten[i].key, 5, mld_opdr.uitvoerende_key);
      Oracle.Execute("UPDATE mld_opdr SET mld_opdr_actiecode = 4 WHERE mld_opdr_key = " + ingesloten[i].key);
    }
    Oracle.Execute(sql_update);
  }
  else // we zijn nog niet helemaal klaar
  {

    // Naar kostenplaatsgroep fiatteur sturen
    shared.trackaction("ORDFOK", ingesloten[i].key); // nog even van onszelf

    // Gequeuede berichten/notificaties en portalberichten van de KP approver verwijderen.
    sql = "BEGIN fac.clrnotifications ('MLDAP1', " + ingesloten[i].key + "); END;";
    Oracle.Execute(sql);

    // De mld_opdr.nextfiatteur_kpg_key is de huidige fiatteur.
    // Dus nu eerst de approve update doorvoeren. Daarna kan ik pas de volgende mld_opdr.nextfiatteur_kpg_key bepalen.
    Oracle.Execute(sql_update);
    mld_opdr_after = mld.mld_opdr_info(ingesloten[i].key);
    // notify approver_key by message & mail as configured in fac_srtnotificatie with BESAPx
    mld.sendNeedApprovalNotification(ingesloten[i].key, mld_opdr_after.nextfiatteur_kpg_key);
  }
}

result.success = true;

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

<% ASPPAGE_END(); %>
