<%@ language="javascript" %>

<% /*
     $Revision$
     $Id$

    File:                   opdr_edit_uren_save.asp
    Description:            Sla de wijziging van uren bij een opdracht direct op
                            of bevries een hele week of sla kosten op.
    Parameters:
        datum               Bij deze datum/ vanaf deze datum
        prs_key             Deze persoon
        done                2=week bevriezen (door fe/fo), 3=week goedkeuren (door bo)
        als niet done:
        mld_opdr_key        Bij deze opdracht of:
        mld_impropdr_key    Bij deze improductieve opdracht.
        uren                Aantal uren
    Context:                Op onBlur van een urenveldje of 'week klaar' knop
    Note:
*/ %>

<%
var JSON_Result = true;
%>

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

<%
protectRequest.validateToken();
var urole = getQParamSafe("urole");
var	datum_array = getFParamDateArray("datum");
var prs_key_array = getFParamIntArray("prs_key", [user_key]);
var done = getFParamInt("done", 0);
var permaand = getFParamInt("permaand", 0) == 1;

var autfunction = {fe: "WEB_UURUSE", fo: "WEB_UURFOF", bo: "WEB_UURBOF"} [urole];
var authparams = user.checkAutorisation(autfunction);

var result = {success: true};

if (done > 0) // Altijd hele week
{ // Over welke dagen moet de status aangepast worden als done>0.
  // 1. S("mld_opdr_hours_approve_monthly") == 0, dan altijd een hele week
  // 2. S("mld_opdr_hours_approve_monthly") == 1 en dagen liggen in dezelfde maand, dan een hele week.
  // 3. S("mld_opdr_hours_approve_monthly") == 1 en dagen liggen in verschillende maanden, dan alleen de laatste dagen van de afgelopen maand.

  for (var i = 0; i < prs_key_array.length; i++)
  {
    var dtstart = new Date(datum_array[i]);
    var dteinde = new Date(datum_array[i]);
    var plusdagen = 6; // default is hele week
    dteinde.setDate(dteinde.getDate() + plusdagen);

    if (permaand && (dtstart.getDate() > dteinde.getDate()))
    { // tot laatste dag van de maand
      var dag_start = dtstart.getDate();
      var dag_einde = new Date(dtstart.getFullYear(), dtstart.getMonth() + 1, 0).getDate();
      dteinde.setMonth(dtstart.getMonth());
      dteinde.setDate(dtstart.getDate() + (dag_einde - dag_start));
    }

    var sql = "UPDATE mld_opdr_uren"
            + "   SET mld_opdr_uren_status = " + ((done == 2)? "2" : "3")// 2 is ter goedkeuring, 3 is goedgekeurd
            + " WHERE prs_perslid_key = " + prs_key_array[i]
            + "   AND mld_opdr_uren_datum BETWEEN " + dtstart.toSQL() + " AND " + dteinde.endToSQL()
            + "   AND mld_opdr_uren_status < 3";
    oRs = Oracle.Execute(sql);
  }
  Response.Write(JSON.stringify(result));
  Response.End
}

var mld_opdr_key = getFParamInt("mld_opdr_key");
var mld_impropdr_key = getFParamInt("mld_impropdr_key"); // één van de twee zal -1 zijn
var uren = parseFloat(getFParam("uren", 0)) || 0;

for (var i = 0; i < prs_key_array.length; i++)
{
  var opdrWhere = mld_opdr_key > 0? ("mld_opdr_key = " + mld_opdr_key) : ("mld_impropdr_key = " + mld_impropdr_key)
  opdrWhere += " AND mld_opdr_uren_datum = " + datum_array[i].toSQL()
             + " AND prs_perslid_key = " + prs_key_array[i];

  var sql = "SELECT mou.mld_opdr_uren_key"
          + "     , mld_opdruren_kosten_key"
          + "     , mou.mld_opdr_uren_opmerking"
          + "  FROM mld_opdr_uren mou, mld_opdruren_kosten mouk"
          + " WHERE " + opdrWhere
          + "   AND mou.mld_opdr_uren_key = mouk.mld_opdr_uren_key(+)";
  var oRs = Oracle.Execute(sql)

  var l_actie = ""; // Initieel geen Database actie, met mogelijk waarden: leeg (initieel), insert (I), update (U), delete (D) van uren, of dubbel delete (DD) van uren en kosten

  if (!oRs.Eof) // er waren al uren op geboekt
  {
      if (uren == 0)
      {
          sql = "DELETE FROM mld_opdr_uren"
              + " WHERE " + opdrWhere;
          l_actie = "D"; // Delete (uren)
          if (oRs("mld_opdruren_kosten_key").Value)
          {	l_actie = "DD"; // Delete (uren) en nog een Delete (kosten)
          	result.message = L("lcl_mlduren_kostenverwijderd");
            result.refresh = true;
          }
      }
      else
      {
          var last_remark = oRs("mld_opdr_uren_opmerking").Value || "";
          var remark = getFParam("remark", last_remark);
          if ((!S("mld_opdr_minuren") && (uren > 0)) || S("mld_opdr_minuren"))
          {
              var sql = "UPDATE mld_opdr_uren"
                      + "   SET mld_opdr_uren_besteed = " + uren
                      + "     , mld_opdr_uren_opmerking = " + safe.quoted_sql(remark)
                      + "     , mld_opdr_uren_wijziguser_key = " + user_key
                      + " WHERE " + opdrWhere;
              l_actie = "U"; // Update (uren)
          }
      }
  }
  else // insert nieuw
  {
      if ((!S("mld_opdr_minuren") && (uren > 0)) || S("mld_opdr_minuren"))
      { // Opmerking is nog niet ingevuld en hoeft dus nog niet opgeslagen te worden.
        var sql = "INSERT INTO mld_opdr_uren"
                + "          ( mld_opdr_key"
                + "          , mld_impropdr_key"
                + "          , mld_opdr_uren_datum"
                + "          , mld_opdr_uren_besteed"
                + "          , prs_perslid_key"
                + "          , mld_opdr_uren_status"
                + "          , mld_opdr_uren_wijziguser_key"
                + "          )"
                + " VALUES (" + (mld_opdr_key > 0? mld_opdr_key : " NULL")
                + "        ," + (mld_impropdr_key > 0? mld_impropdr_key : " NULL")
                + "        ," + datum_array[i].toSQL()
                + "        ," + uren
                + "        ," + prs_key_array[i]
                + "        ," + (urole == "bo"? 2 : 1) // 2 is ter fiat, 1 is ingevoerd
                + "        ," + user_key
                + "        )";
        l_actie = "I"; // Insert (uren)
      }
  }
  oRs.Close();

  if (l_actie != ""){
	  // Er is een DB-actie (sql) uit te voeren..., hetzij een I, U, D of DD
	  oRs = Oracle.Execute(sql);

	  	// POST!! Hookfunction, dus na de sql-query!
		  // Klantspecifieke functie (hookfunction) voor de invoer (of beter gezegd: verwijdering) van kosten, die gaat niet via 'aanroep' opdr_edit_urenkosten_save.asp
		  // Let op: er is verschil tussen D en DD, zodat kan worden besloten om iets extra's te doen in de user-hook,
		  // Immers dat extra's is niet meer in de user-hook te bepalen omdat dit een post-hook is (de sql heeft via de DELETE-cascade de kosten-records verwijderd)
		  var pResult = new HookResult();
		  if (!custfunc.mld_urenpostsave(prs_key_array[i], datum_array[i], mld_opdr_key, mld_impropdr_key, l_actie, pResult))
		  {
		     abort_with_warning(pResult.errmsg);
		  }
  } // endif l_actie != ""
}


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