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

     Zwervenden

     Geeft een overzicht van de personen die in dit scenario een rol zouden kunnen spelen
     en niet op een andere manier in het project terecht kunnen komen, of zo.

     Dit zijn:
      - Personen waarbij de totale nieuwe bezetting kleiner zou worden dan hun dienstverband
        (of S("prs_werkplek_implicit")==1-->personen zonder werkplek)

      - personen zonder werkplek in de werkelijkheid
      Te overwegen om toe te voegen (om betrokkenen ook niet grafisch in de buffer te plaatsen):
      - personen met een werkplek op een verdieping behorend tot dit scenario
      - TODO: Personen die in werkelijkheid een werkplek hadden maar nu niet meer
              (feitelijk: dat zijn de personen die ontkoppeld zijn van hun werkplek)

     IN: scenario_key
*/%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="../CAD/FGII.inc" -->
<%
FCLTHeader.Requires({ js: ["../cad/draganddrop.js"]});

var sql = "";
var scenario_key = getQParamInt("scenario_key");
var outputmode = getQParamInt("outputmode", 0);
var showall = getQParamInt("showall", 0) == 1;
var doMove = getQParamInt("doMove", 0) == 1;

// ==========================
// Actie Plaatsen persoon
// ==========================
if (doMove)
{
    perslid_key = getQParamInt("perslid_key"); // PRS_PERSLID
    room_key = getQParamInt("room_key");
    if (S("prs_werkplek_implicit")==0)
    {
      wpKey = getQParamInt("wpKey","NULL");        // evt exact gedropt op voorkeur werkplek
      droppwpKey = getQParamInt("pwpKey","NULL");  // evt exact gedropt op voorkeur perslidwerkplek
                                                // Daar zoeken we dan (als voorkeur) de werkplek bij

      if (droppwpKey != "NULL") // Gedropt op een persoon. Zoek de werkplek van die persoon
      {
        sql = "SELECT prj_werkplek_key"
            + "  FROM prj_perslidwerkplek"
            + " WHERE prj_perslidwerkplek_key = " + droppwpKey
        oRs = Oracle.Execute(sql);
        if (!oRs.eof)
          wpKey = oRs("prj_werkplek_key");
      }
      sql = "BEGIN prj.prj_move_perslid ("+perslid_key+","+(room_key>0?room_key:"NULL")+","+wpKey+"); END;";
    }
    else // Impliciet
    {
      sql = "BEGIN prj.prj_move_perslid2 ("+perslid_key+","+room_key+"); END;";
    }

    try
    {
      Oracle.Execute(sql);
    }
    catch (e1)
    {
        %><div id=myerror>Verplaatsen niet gelukt: <%=e1.description%></div><script>alert(myerror.innerHTML)</script><%
    }
}

// Lastig is dat er personen kunnen zijn met twee werkplekken waarvan één binnen en
// één buiten het project
// Toekomstige bezetting = (totale realbezetting)                                        sqlA
//                        -(realbezetting via werkplekken op verdiepingen
//                                                die bij het project betrokken zijn)    sqlB
//                        +(projectbezetting via werkplekken op verdiepingen             sqlC
//                                                die bij het project betrokken zijn)

// Eerst: alle personen die (volgens hun dienstverband) niet voldoende werkplek hebben
// TODO: Binnen je/de scope

// Bij implicit is bezetting don't care en rekenen we hier met 100 zodat we weten
// of er netto minstens ‚‚n werkplek overblijft

sqlA = "SELECT   pwp.prs_perslid_key, "
     +          (S("prs_werkplek_implicit")==0?"pwp.prs_perslidwerkplek_bezetting ":"100 prs_perslidwerkplek_bezetting")
     + "    FROM prs_perslidwerkplek pwp";

sqlB = "SELECT   pwp.prs_perslid_key, "
     +          (S("prs_werkplek_implicit")==0?"pswp.prs_perslidwerkplek_bezetting ":"-100")
     + "    FROM prs_perslidwerkplek pswp, "
     + "         prj_perslidwerkplek pwp, "
     + "         prj_werkplek pw, "
     + "         prj_ruimte pr "
     + "   WHERE pswp.prs_perslidwerkplek_key = pwp.prs_perslidwerkplek_key "
     + "     AND pwp.prj_werkplek_key = pw.prj_werkplek_key "
     + "     AND pw.prj_ruimte_key = pr.prj_ruimte_key "
     + "     AND pr.prj_scenario_key = " + scenario_key

sqlC = "SELECT   pwp.prs_perslid_key, "
     +          (S("prs_werkplek_implicit")==0?"pwp.prj_perslidwerkplek_bezetting ":"100")
     + "    FROM prj_perslidwerkplek pwp, "
     + "         prj_werkplek pw, "
     + "         prj_ruimte pr "
     + "   WHERE pwp.prj_werkplek_key = pw.prj_werkplek_key "
     + "     AND pw.prj_ruimte_key = pr.prj_ruimte_key "
     + "     AND pwp.prj_perslidwerkplek_verwijder IS NULL "
     + "     AND pr.prj_scenario_key = " + scenario_key


sqlAll = "SELECT prs_perslid_key, sum(prs_perslidwerkplek_bezetting) bezetting"
       + "  FROM (" + sqlA + " UNION ALL " + sqlB + " UNION ALL " + sqlC + ") GROUP BY prs_perslid_key"

// Nu informatie bij de prs_perslid_key zoeken
sql = " SELECT p.prs_perslid_key, "+ S("prs_pers_string") +" naam,"
    + "          p.prs_perslid_telefoonnr, p.prs_perslid_email email, "+S("prs_dep_string")+" afd,"
    + "          "+ lcl.xsqla('p.prs_srtperslid_omschrijving','prs_v_aanwezigperslid.prs_srtperslid_key') +", p.prs_perslid_upper, "
    + "          prs_perslid_dienstverband, sel.bezetting"
    + "     FROM prs_v_aanwezigperslid, prs_v_perslid_gegevens p, "
    + "          prs_v_afdeling d,"
    + "          (" + sqlAll + ") sel"
    + "    WHERE p.prs_perslid_key = prs_v_aanwezigperslid.prs_perslid_key"
    + "      AND p.prs_perslid_key = sel.prs_perslid_key(+)"
    + "      AND p.prs_afdeling_key = d.prs_afdeling_key"
    + "      AND p.prs_perslid_upper NOT LIKE '[%'"
    + "      AND p.prs_perslid_upper NOT LIKE 'LEEG [%'"
    + "      AND (bezetting is null OR "
    + "           bezetting < "+(S("prs_werkplek_implicit")==0?"prs_perslid_dienstverband":"100")
    + " ) ORDER BY prs_perslid_upper"  ;


%>
<html>
  <head>
<%  FCLTHeader.Generate({ outputmode: outputmode }); %>

    <script type="text/javascript">
      function initDragger()
      {
        if (window.draginit) draginit();
      }

      // drag Event when dragged outside our frame
      function drag_onMouseOut(dragElement)
      {
        myHTML="<div style='color:red;font-family:Verdana;font-size:8pt;cursor:move;'>" + dragElement.innerText + "</div>"
        parent.EnableDragAndDrop(notifyDrop, myHTML);
      }

      // Callback functie: er is iets gedropt op het plaatje
      function notifyDrop(SlnkEvent)
      {
        if (SlnkEvent.Key && SlnkEvent.ContourLayer == "SLNK Contours") // "PRJ_RUIMTE"
        {
          document.u2.action="rap_prj9.asp?domove=1&scenario_key=<%=scenario_key%>"+
                      "&perslid_key="+dragElement.getAttribute("perslid_key")+"&room_key="+SlnkEvent.Key;
          document.u2.submit();
        }
        else if (SlnkEvent.Key && SlnkEvent.Key.match(/^W:/)) // PRJ_WERKPLEK
        {
          var wpKey = SlnkEvent.Key.substring(2);
          document.u2.action="rap_prj9.asp?domove=1&scenario_key=<%=scenario_key%>"+
                      "&perslid_key="+dragElement.getAttribute("perslid_key")+"&room_key=-1"+
                      "&wpKey="+wpKey;
          document.u2.submit();
        }
        else if (SlnkEvent.Soort == "PRJ_PERSLIDWERKPLEK")
        {   // Gedropt op een bestaande persoon. Mogelijk past hij op de werkplek van die persoon bij
          pwpKey = SlnkEvent.Key;
          document.u2.action="rap_prj9.asp?domove=1&scenario_key=<%=scenario_key%>"+
                      "&perslid_key="+dragElement.getAttribute("perslid_key")+"&room_key="+SlnkEvent.Key+
                      "&pwpKey="+pwpKey;
          document.u2.submit();
        }
        else if (typeof(SlnkEvent.Soort) != "undefined")
          alert("Sorry: droppen op " + SlnkEvent.Soort + "(key "+SlnkEvent.Key+") nog niet ondersteund");
        dragend();
      }

      function PerhapsRefresh()
      {
        <%if (doMove) { %>
            parent.myRefresh();
        <%} %>
      }
    </script>
  </head>

  <body class="prjtabpage" onLoad="PerhapsRefresh();initDragger()">
    <form name='u2' action="rap_prj9.asp" method="post" target="_self">
<%
      function DraggableName(oRs)
      {
        var nm = safe.htmlattr(oRs("naam").value);
        return "<div class='draggable' perslid_key=" + oRs("prs_perslid_key").value + ">" + nm + "</div>";
      }

      function DraggablePercent(oRs)
      {
        var in_te_delen = oRs("prs_perslid_dienstverband").value - oRs("bezetting").value;
        return in_te_delen;
      }

      var rst = new ResultsetTable({ keyColumn: "prs_perslid_key",
                                       sql: sql,
                                       ID: "workTable",
                                       outputmode: outputmode,
                                       title: L("lcl_prj_verhuis_scenarios"),
                                       showAll: showall
                                      });

      rst.addColumn(new Column({caption: L("lcl_prj_draggable_name"), content: DraggableName, title: L("lcl_draggable")}));
      if (S("prs_werkplek_implicit") == 0)
        rst.addColumn(new Column({caption: L("lcl_prj_to_assign_perc"), content: DraggablePercent, datatype: "number"}));
      rst.addColumn(new Column({caption: L("lcl_prs_person_dienstverband_perc"), content: "prs_perslid_dienstverband", datatype: "number"}));
      rst.addColumn(new Column({caption: L("lcl_phone"), content: "prs_perslid_telefoonnr"}));
      rst.addColumn(new Column({caption: L("lcl_prs_organisatie"), content: "afd"}));
      rst.addColumn(new Column({caption: L("lcl_fg_func_names"), content: "prs_srtperslid_omschrijving"}));

      var cnt = rst.processResultset();
%>
    </form>
  </body>
</html>

