<%@language = "javascript" %>
<% Server.ScriptTimeout=6000; %>
<% /*
     $Revision$
     $Id$

    File:           ins_srtcontrolexcp_pc_save.asp
    Description:    Het indexeren van het prijsniveau van de gehele MJOB begroting .
    Parameters:     verschillende kosten en ctrdiscipline, discipline, srtgroup en srtdeel.
         costs           Kosten 1
         costs2          Kosten 2
         costs2          Kosten 3
         material        Materiaalkosten
         ctrdisc_key     Taakcategorie
         disc_key        Hoofdrecept
         srtgroup_key    Groeprecept
         srtdeel_key     Subrecept

    Context:        Vanuit mjb_search_list.asp
    Note:           Resultaat van een submit is een json object

*/ %>

<%
var JSON_Result = true;
%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="../API2/api2.inc" -->
<!-- #include file="../API2/model_issues.inc" -->
<!-- #include file="ins.inc" -->

<%
protectRequest.validateToken();
var ins_xcp_active_cost = S("ins_xcp_active_cost");
user.auth_required_or_abort(ins_xcp_active_cost > 0 && ins_xcp_active_cost < 16);

var ins_key_arr = getFParamKeyArray("ins_keys");

var groupby = getFParamInt("groupby", 9);

var pc_costs    = ins_xcp_active_cost & 1? getFParamFloat("costs", 0)    : 0; // Prijswijziging kosten.
var pc_costs2   = ins_xcp_active_cost & 2? getFParamFloat("costs2", 0)   : 0; // Prijswijziging kosten2.
var pc_costs3   = ins_xcp_active_cost & 4? getFParamFloat("costs3", 0)   : 0; // Prijswijziging kosten3.
var pc_material = ins_xcp_active_cost & 8? getFParamFloat("material", 0) : 0; // Prijswijziging materiaal.
var aantaltaken = getFParamInt("aantaltaken", 0);
var xcpchanged = 0;

// Settingen.
var inflatiepct = S("mjb_inflation");
var inflatiefactor = 1 + (inflatiepct / 100);
var mjb_start_year = S("mjb_start_year");
var mjb_freeze_year = Math.max(S("mjb_freeze_year"), new Date().getFullYear());

// Dit scherm wordt aangeroepen vanuit het mjob overzicht om de kosten van de taken aan te passen (in procenten).
// Bij mjob taken worden de kosten in de ins_srtcontroledl_xcp tabel aangepast.
// OM mjob (xcp) taken te kunnen wijzigen heb je (WEB_INSUSE of ik ben objectbeheerder) + WEB_CTRUSE + WEB_INSMAN rechten nodig.

// Heb ik de juiste rechten bij MJOB.
// Ben ik een objectbeheerder van een object?
var sql = "SELECT ins_deel_key"
        + "  FROM ins_deel d"
        + " WHERE d.prs_perslid_key_beh = " + user_key;
var oRs = Oracle.Execute(sql);
var objectBeheerder = !oRs.eof;
oRs.Close();

var authparamsINSUSE = user.checkAutorisation("WEB_INSUSE", true);
var authparamsCTRUSE = user.checkAutorisation("WEB_CTRUSE", true);
var authparamsINSMAN = user.checkAutorisation("WEB_INSMAN", true);
var hasWriteINSUSE = authparamsINSUSE && authparamsINSUSE.ALGwritelevel < 9 && authparamsINSUSE.PRSwritelevel < 9;
var hasWriteCTRUSE = authparamsCTRUSE && authparamsCTRUSE.ALGwritelevel < 9 && authparamsCTRUSE.PRSwritelevel < 9;
var hasWriteINSMAN = authparamsINSMAN && authparamsINSMAN.ALGwritelevel < 9 && authparamsINSMAN.PRSwritelevel < 9;
var hasWrite_MJOB = (hasWriteINSUSE || (S("ins_can_edit_own_objects") && objectBeheerder)) && hasWriteCTRUSE && hasWriteINSMAN

user.anything_todo_or_abort(hasWrite_MJOB); // Melding geven dat de user geen rechten heeft om de prijswijzigingen door te voeren.

var result = {key: "", pricechange: true };
var ingesloten = [];
// Bepaal de objecten in de selectie die
// ook echt gewijzigd kunnen of mogen worden.
if (pc_costs != 0 || pc_costs2 != 0 || pc_costs3 != 0 || pc_material != 0)
{
  var showempty  = getFParamInt("showempty", 0) == 1; // Ook lege regels tonen.
  var dist_key_arr = getFParamKeyArray("dist_key_arr", []); // District array.
  var loc_key_arr = getFParamKeyArray("loc_key_arr", []); // Locatie array.
  var bld_key_arr = getFParamKeyArray("bld_key_arr", []); // Gebouw array.

  var disc_key_arr = getFParamKeyArray("disc_key_arr", []);
  var srtgroep_key_arr = getFParamKeyArray("srtgroep_key_arr", []);
  var srtdeel_key_arr = getFParamKeyArray("srtdeel_key_arr", []);
  var moredetail = getFParamInt("moredetail", 0);
  var srtgebouw_key_arr = getFParamKeyArray("srtgebouw_key_arr", []);
  var groep_str_arr = getFParam("groep_str_arr", []); // Groep.
  var categorie_key_arr = getFParamKeyArray("categorie_key_arr", []); // Categorie.
  var srtcontrole_key_arr = getFParamKeyArray("srtcontrole_key_arr", []); // Taak.
  var frequentie_arr = getFParamIntArray("frequentie_arr", []); // Array met frequenties.
  var kp_key_arr = getFParamKeyArray("kp_key_arr", []); // Kostenplaats.
  var incbtw = false; // Voor de prijswijziging zijn de bedragen (pricechange) zonder BTW nodig. Dus ALTIJD false meegeven;
  var showunfin = getFParamInt("showunfin", 0) == 1; // Alleen onvoltooide regels.
  var toyear = getFParamInt("toyear", new Date().getFullYear());
  var deel = getFParam("deel", ""); // Identieficatie.
  var jaren = getFParamIntArray("jaren", []); // Jaren.

  // FORM score velden.
  var fitness_score1_from = getFParamInt("fitness_score1_from", -1);               // Conditie score van.
  var fitness_score1_through = getFParamInt("fitness_score1_through", -1);         // Conditie score t/m.
  var fitness_score1_from_neg = getFParamInt("fitness_score1_from_neg", -1);       // Negatieve afwijking conditie score van.
  var fitness_score1_through_neg = getFParamInt("fitness_score1_through_neg", -1); // Negatieve afwijking conditie score t/m.
  var fitness_score1_from_pos = getFParamInt("fitness_score1_from_pos", -1);       // Positieve afwijking conditie score van.
  var fitness_score1_through_pos = getFParamInt("fitness_score1_through_pos", -1); // Positieve afwijking conditie score t/m.
  var priority_score2_from = getFParamInt("priority_score2_from", -1);             // Prioriteitsscore van.
  var priority_score2_through = getFParamInt("priority_score2_through", -1);       // Prioriteitsscore t/m.

  // FORM status checkboxes.
  var mjbMoved  = getFParamInt("mjbMoved", 0) == 1; // Verschoven.
  var mjbFreezed = getFParamInt("mjbFreezed", 0) == 1; // In behandeling.
  var mjbXcped = getFParamInt("mjbXcped", 0) == 1; // Aangepast.

  // Start building the query to fetch all objects satisfying
  var mjbparams = { niveau: groupby,   // Het niveau (betekenis) van de keys (district(1), locatie(2), gebouw(3), discipline(4), groep(5), objectsoort(6), object(7))
                    keys: ins_key_arr,
                    scenario: 1,
                    fulldetails: true,
                    //actsit: actsit, // actsit alleen van invloed op scenario_key > 1.
                    //showempty: showempty, // Niet meegeven. De lege regels worden, indien nodig (!showempty), later uit het resultaat gefilterd.
                    dist_key_arr: dist_key_arr,
                    loc_key_arr: loc_key_arr,
                    bld_key_arr: bld_key_arr,
                    disc_key_arr: disc_key_arr,
                    srtgroep_key_arr: srtgroep_key_arr,
                    srtdeel_key_arr: srtdeel_key_arr,
                    moredetail: moredetail,
                    srtgebouw_key_arr: srtgebouw_key_arr,
                    groep_str_arr: groep_str_arr,
                    categorie_key_arr: categorie_key_arr,
                    srtcontrole_key_arr: srtcontrole_key_arr,
                    frequentie_arr: frequentie_arr,
                    kp_key_arr: kp_key_arr,
                    incbtw: incbtw,
                    showunfin: showunfin,
                    inflatiefactor: inflatiefactor,
                    toyear: toyear,
                    groupby: 9, // Ik wil alle objecten opvragen.
                    deel: deel,
                    fitness_score1_from : fitness_score1_from,
                    fitness_score1_through : fitness_score1_through,
                    fitness_score1_from_neg : fitness_score1_from_neg,
                    fitness_score1_through_neg : fitness_score1_through_neg,
                    fitness_score1_from_pos : fitness_score1_from_pos,
                    fitness_score1_through_pos : fitness_score1_through_pos,
                    priority_score2_from : priority_score2_from,
                    priority_score2_through : priority_score2_through,
                    mjbMoved: mjbMoved,
                    mjbFreezed: mjbFreezed,
                    mjbXcped: mjbXcped,
                    jaren: jaren,
                    pricechange: true
                  };
  var mjblist_sql = ins.getmjblist_sql(mjbparams);
  // De mjblist_sql bevat nu alle objecten (ins_deel_key) van de aangevinkte regels uit het mjb overzicht en levert voor elk object de waarden voor de insert op.

  var oRs = Oracle.Execute(mjblist_sql);
  // Hier geen "user.anything_todo_or_abort(!oRs.eof);". We geven een melding terug hoeveel taken er geaccodeerd zijn.

  while (!oRs.eof)
  { // Ik mag het object wijzigen dus voer wijziging uit
    var ins_key = oRs("ins_deel_key").Value;
    var srtcont_key = oRs("ins_srtcontrole_key").Value;
    var xcp_key = oRs("ins_srtcontroledl_xcp_key").Value;

    // Nu kan ik per taak kijken of ik de exceptions (xcp) waarden van de taak bij het object mag aanpassen?
    var this_ins = ins.func_enabled_deel(ins_key,
                                         { srtcont_key: srtcont_key,
                                           scen_key: 1
                                         });
    if (this_ins.canChangeXcp)
    {
      if (!showempty)
      { // De lege regels niet meenemen. Deze regels zijn ook niet in het overzicht getoond.
        var found_amount = false;
        for (var j = 0; j < jaren.length; j++)
        {
            if (oRs(String(jaren[j])).Value != null) // Wel regels met een bedrag van 0 i.p.v. null tonen. Die moeten wel geaccodeerd worden ook al kosten deze niets.
              found_amount = true;
        }
        if (!found_amount)
        {
          oRs.MoveNext();
          continue;
        }
      }

      // De huidige waarde ophalen (COALESCE(xcp waarde, standaard waarde)) en de nieuwe kosten berekenen.
      var sql = "SELECT xcp.ins_srtcontrole_eenheid eenheid_val"
              + "     , xcp.ins_deel_aantal aantal_val"
              + "     , xcp.ins_srtdeel_eenheid aanteh_val"
              + "     , xcp.ins_srtcontrole_periode periode_val"
              + "     , xcp.prs_kostenplaats_key kp_key_val"
              + "     , xcp.ins_srtcontrole_bits bits_val"
              + "     , ROUND(xcp.ins_srtcontrole_kosten"
              + (ins_xcp_active_cost & 1
                ? "     * (1 + " + pc_costs + " / 100)"
                : "") + ", 2) kosten1_val"
              + "     , ROUND(xcp.ins_srtcontrole_kosten2"
              + (ins_xcp_active_cost & 2
                ? "     * (1 + " + pc_costs2 + " / 100)"
                : "") + ", 2) kosten2_val"
              + "     , ROUND(xcp.ins_srtcontrole_kosten3"
              + (ins_xcp_active_cost & 4
                ? "     * (1 + " + pc_costs3 + " / 100)"
                : "") + ", 2) kosten3_val"
              + "     , ROUND(xcp.ins_srtcontrole_materiaal"
              + (ins_xcp_active_cost & 8
                ? "     * (1 + " + pc_material + " / 100)"
                : "") + ", 2) materiaal_val"
              + "     , xcp.ins_srtcontrole_uren uren_val"
              + "     , xcp.ins_srtcontrole_percentage perc_val"
              + "     , xcp.ins_srtcontrole_groep groep_val"
              + "     , xcp.ins_srtcontrole_opmerking opmerk_val"
              + "     , xcp.ins_srtcontrole_eind vervaldatum_val"
              + "     , xcp.ins_srtcontroledl_xcp_startdat startdatum_val"
              + "  FROM ins_v_defined_inspect_xcp xcp"
              + " WHERE xcp.ins_deel_key = " + ins_key
              + "   AND xcp.ins_srtcontrole_key = " + srtcont_key
              + "   AND xcp.ins_scenario_key = 1"
              + (xcp_key > 0
                ? " AND xcp.ins_srtcontroledl_xcp_key = " + xcp_key
                : " AND xcp.ins_srtcontroledl_xcp_key IS NULL");
      var oRs_val = Oracle.Execute(sql);

      var kosten1 = oRs_val("kosten1_val").Value || 0;
      var kosten2 = oRs_val("kosten2_val").Value || 0;
      var kosten3 = oRs_val("kosten3_val").Value || 0;
      var materiaal = oRs_val("materiaal_val").Value || 0;
      // Alleen als er wat te veranderden is.
      // Dan moet er bij de taak: 1) een bedrag bij de kosten ingevuld zijn en
      //                          2) een prijsverandering zijn ingevuld bij die kosten
      if ((pc_costs != 0 && kosten1 > 0) || (pc_costs2 != 0 && kosten2 > 0) || (pc_costs3 != 0 && kosten3 > 0) || (pc_material != 0 && materiaal > 0))
      {
        var params = { xcp_key: xcp_key,
                       periode: oRs_val("periode_val").Value,
                       eenheid: oRs_val("eenheid_val").Value,
                       kp_key: oRs_val("kp_key_val").Value || -1,
                       bits: oRs_val("bits_val").Value,
                       uren: oRs_val("uren_val").Value,
                       materiaal: oRs_val("materiaal_val").Value,
                       kosten1: oRs_val("kosten1_val").Value,
                       kosten2: oRs_val("kosten2_val").Value,
                       kosten3: oRs_val("kosten3_val").Value,
                       perc: oRs_val("perc_val").Value,
                       groep: oRs_val("groep_val").Value,
                       vervaldatum: oRs_val("vervaldatum_val").Value != null? new Date(oRs_val("vervaldatum_val").Value) : null,
                       opmerk: oRs_val("opmerk_val").Value,
                       startdatum: startdatum = oRs_val("startdatum_val").Value != null? new Date(oRs_val("startdatum_val").Value) : null,
                       aantal:  oRs_val("aantal_val").Value,
                       aanteh:  oRs_val("aanteh_val").Value,
                       isScenario: false,
                       scen_key: -1,
                       commit: false
                     };
        result = ins.saveXcp(ins_key, srtcont_key, params);
        xcpchanged++;
      }
      oRs_val.Close();
    }
    oRs.MoveNext();
  }
  oRs.Close();
}

if (xcpchanged < aantaltaken)
{ // Niet bij alle taken zijn de prijswijzigingen aangepast.
  result.message = xcpchanged == 1? L("lcl_mjb_multiedit_mes_1").format(aantaltaken) : L("lcl_mjb_multiedit_mes_n").format(xcpchanged, aantaltaken);
}
else
{ // Bij alle taken zijn de prijswijzigingen aangepast.
  result.toaster = L("lcl_mjb_price_change_completed");
}
Response.Write(JSON.stringify(result));
%>
<% ASPPAGE_END(); %>
