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

    File:               bes_approve.asp
    Description:        Fiatteren van een bestelling.
    Parameters:
        bes_key         Bestellingnummer
    Note:               Het gaat hier om fiateren door de kostenplaats(groep)verantwoordelijke
                        De backoffice kan hierna eventueel ook nog moeten accepteren
*/ %>

<%
var JSON_Result = true;
%>

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

<%
protectRequest.validateToken();
var bes_key_arr = getFParamIntArray("bes_key");

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 < bes_key_arr.length; i++)
{
  var bes_bestelling = bes.bestelling_info(bes_key_arr[i]); // Globale variabele met alle bes_bestelling informatie
  var bes_disc_info = bes.disc_info(bes_bestelling.dis_key); // alle discipline informatie
  var this_bes = bes.func_enabled_bestelling(bes_bestelling);
  if (this_bes.canApprove)
  {
    ingesloten.push({ bes_key: bes_key_arr[i],
                      totaal: bes_bestelling.totaal,
                      rfoBesKosten: bes_bestelling.rfoBesKosten,
                      rfoLevKosten: bes_bestelling.rfoLevKosten,
                      fiatteur_key: bes_bestelling.fiatteur_key, // LET OP: De huidige fiatteur wordt opgehaald (Ook als de user_key een vervanger is).
                      fiatteur_kp_key: bes_bestelling.fiatteur_kp_key, // De kostenplaats verantwoordelijke/fiatteur.
                      fiatteur_kpg_key: bes_bestelling.fiatteur_kpg_key, // De kostenplaatsgroep verantwoordelijke/fiatteur.
                      fiatteur2_kpg_key: bes_bestelling.fiatteur2_kpg_key, // De tweede kostenplaatsgroep verantwoordelijke/fiatteur.
                      fiatteur3_kpg_key: bes_bestelling.fiatteur3_kpg_key, // De derde kostenplaatsgroep verantwoordelijke/fiatteur.
                      kpg_fin_limit1: bes_bestelling.kpg_fin_limit1, // De eerste kpg limiet van het opdracht fiattering mechanisme.
                      kpg_fin_limit2: bes_bestelling.kpg_fin_limit2, // De tweede kpg limiet van het opdracht fiattering mechanisme.
                      bes_bestelling_fiat_user: bes_bestelling.bes_bestelling_fiat_user, // Degene als laatste heeft gefiatteerd.
                      dis_key: bes_bestelling.dis_key,
                      perslid_key_voor: bes_bestelling.perslid_key_voor,
                      disc_params_fiatflow: bes_disc_info.disc_params_fiatflow,
                      disc_params_bestellimiet: bes_disc_info.disc_params_bestellimiet,
                      disc_params_auto_order: bes_disc_info.disc_params_auto_order
                    });
    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 totaal = ingesloten[i].totaal - ingesloten[i].rfoBesKosten + ingesloten[i].rfoLevKosten;
  // als het valt binnen onze limiet (of eigenlijk: degene die nu moet fiatteren als we vervanger zijn) dan zijn we klaar
  // NB: de fiatteur kan nu direct de kpg-er zijn

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

  if (user.isCollega(ingesloten[i].fiatteur_kp_key)) {
    profile_user_key = ingesloten[i].fiatteur_kp_key;
  }

  var fiatbedrag = 0;
  var bijnaklaar = false;
  var fiat_key = ingesloten[i].bes_bestelling_fiat_user;  // is deze opdracht al een keer gefiatterd

  // Vrijwillige fiattering komt bij bestellingen niet voor en het totaalbedrag is groter dan 0 want er valt iets te fiatteren.
  if (!budget.exceeds_profiel(totaal, profile_user_key, ingesloten[i].dis_key) && !fiat_key) // Het valt binnen onze limiet 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(ingesloten[i].nextfiatteur_kpg_key)                   // wij zijn de groepverantwoordelijke1,2,3 of de vervanger van de groepverantwoordelijke.
    if ( ingesloten[i].fiatteur3_kpg_key > 0 && user.isCollega(ingesloten[i].fiatteur3_kpg_key) )
    {
      fiatbedrag = totaal;
      bijnaklaar = true;
    }
    else if (ingesloten[i].fiatteur2_kpg_key > 0 && user.isCollega(ingesloten[i].fiatteur2_kpg_key))
    {
      fiatbedrag = ingesloten[i].kpg_fin_limit2;
      if (totaal <= ingesloten[i].kpg_fin_limit2)
      {
        bijnaklaar = true;
      }
    }
    else if (ingesloten[i].fiatteur_kpg_key > 0 && user.isCollega(ingesloten[i].fiatteur_kpg_key)) // we zijn (collega van) ingesloten[i].fiatteur_kpg_key.
    {
      fiatbedrag = ingesloten[i].kpg_fin_limit1;
      if (totaal <= ingesloten[i].kpg_fin_limit1)
      {
        bijnaklaar = true;
      }
    }
    else
    { // budgethouder en profiel is niet toereikend.
      fiatbedrag = budget.get_pgblimiet(profile_user_key, -1);
    }
  }

  var sql = "UPDATE bes_bestelling"
          + "   SET bes_bestelling_fiatbedrag = " + fiatbedrag
          + "     , bes_bestelling_fiat_user = " + user_key // Als we vervanger zijn wordt *onze* naam geregistreerd.
          + " WHERE bes_bestelling_key = " + ingesloten[i].bes_key;
  Oracle.Execute(sql);
  // Gequeuede berichten/notificaties en portalberichten van de approver verwijderen.
  sql = "BEGIN fac.clrnotifications ('BESAP1', " + ingesloten[i].bes_key + "); END;";
  Oracle.Execute(sql);

  if (bijnaklaar)
  {
    // Klaar met fiatteren.
    bes.setbestellingstatus(ingesloten[i].bes_key, 3); // Gefiatteerd, trackt zelf BESFIT

    // Afhankelijk van de fiatterings/acceptatie flow zijn dit de acties:
    // 1) "Fiatteur -> BESBOF":  bes_disc_params_fiatflow = 0 (fiatteren en dan accepteren).
    //                           Als het totaalbedrag onder de eerste bestellimiet is hoeft niet geaccepteerd te worden.
    //                           De status kan dan naar "Geaccepteerd(4)" of naar status "Besteld(5)" als de setting auto_order is gezet.
    //                           Dit is de standaard flow.
    // 2) "BESBOF -> Fiatteur":  bes_disc_params_fiatflow = 1 (accepteren en dan fiatteren).
    //                           De eventuele acceptatie heeft al plaatsgevonden. De status kan naar "Besteld(5)" als de setting auto_order is gezet.

    if (ingesloten[i].disc_params_fiatflow == 0)
    { // "Fiatteur -> BESBOF"
      if (ingesloten[i].totaal <= ingesloten[i].disc_params_bestellimiet)
      {
        bes.setbestellingstatus(ingesloten[i].bes_key, 4); // Geaccepteerd door BO
        if (ingesloten[i].disc_params_auto_order == "1") // direct opdracht aanmaken
          bes.makeOrders(user_key, ingesloten[i].bes_key);  //  opdracht aanmaken en status naar besteld (5)
      }
    }
    else // ingesloten[i].disc_params_fiatflow == 1
    { // "BESBOF -> Fiatteur"
      if (ingesloten[i].disc_params_auto_order == "1") // direct opdracht aanmaken
        bes.makeOrders(user_key, ingesloten[i].bes_key);  //  opdracht aanmaken en status naar besteld (5)
    }
  }
  else // (verder/hogerop) fiatteren
  {
    // Nog wel even tracken
    shared.trackaction("BESFIT", ingesloten[i].bes_key);

    // vervolgens naar de volgende/kostenplaatsgroep fiatteur sturen
    // Fiatteringsproces moet gevolgd worden op de naam van de "voor wie" (bestelling voor)
    // Als bes_disc_params_for_others niet is gezet zijn perslid_key en perslid_key_voor identiek
    // Haal de volgende kostenplaatsgroep verantwoordelijke/fiatteur op in de rij van drie. De kolom b.bes_bestelling_fiat_user is gevuld met de user_key.

    // Als er al een keer is gefiatteerd (er is BESFIT tracking) dan doet nextfiatteur niets met pexcludekey parameter.
    // De functie nextfiatteur kijkt dan zelf welke kpg verantwoordelijke nu aan de beurt is.
    sql = "SELECT prs.nextfiatteur(b.bes_bestelling_key, 'BES') kpg_fiatteur_key"
        + "  FROM bes_bestelling b"
        + " WHERE b.bes_bestelling_key = " + ingesloten[i].bes_key;
    var oRs = Oracle.Execute(sql);
    var nextapprover_key = oRs("kpg_fiatteur_key").Value;
    if (nextapprover_key == -1)
    { // Deze bestelling overschrijdt het mandaat van de budgethouder (kostenplaatsgroep verantwoordelijke/fiatteur) van de opgegeven kostenplaats en/of de budgethouder is onbekend.
      result.message = L("lcl_bes_exceed_limit");
    }
    else
    {
      result.message = bes.sendNeedApprovalNotification(ingesloten[i].bes_key, nextapprover_key);
    }
    oRs.close();
  }
  result.success = true;
}

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

<% ASPPAGE_END(); %>
