<% /*
     $Revision$
     $Id$

     File:          mld_edit_note.inc
     Description:   Functie vooor het echte bewaren van een melding notitie
     Context:       Vanuit mld_edit_note.asp

*/
%>
<!-- #include file="../Shared/notes.inc" -->
<%
// params: note_key, isFE, zichtFE
function mld_note_save(mld_key, note, params) {
    var mld_info = mld.mld_melding_info(mld_key);
    var result = {};

    lcl.set_dialect(mld_info.srtdisc_key, "MLD_SRTDISCIPLINE_KEY");

    var mfe = mld.func_enabled_melding (mld_key);
    // Heb ik rechten om notities te wijzigen?
    user.auth_required_or_abort(mfe.canWriteNotes);

    var saveNote = !params.bijlage; // In het gaval van een het toevoegen van een bijlage (alleen door de FrontEnd)
                                    // bij notities onder water de flags/status/notitificatie doen
                                    // alsof er een notitie was getikt door die Frontend.

    var eigenMelding = user.isCollega(mld_info.melder_key);

    if (note) {
      params.note = note;
      params.module = "MLD";
      params.table = "mld_melding";

      // fenotes betekenis:
      //   0 FE kan niet reageren, per notitie, default niet zichtbaar voor FE
      //   1 FE kan reageren, alle notities zichtbaar voor FE (transparantiemodus)
      //   2 FE kan reageren, per notitie, default niet zichtbaar voor FE
      //   3 FE kan reageren, per notitie, default wel zichtbaar voor FE
      // Let op: fenotes is geen bitwise codering (meer), gewoon 0-3

      var zichtbaarFE = params.has_zichtbaarFE ? params.zichtFE : true; // default: zelf ingevoerd --> zichtbaar (tenzij anders aangegeven)
      if (!eigenMelding)
      {   // FOBO
          zichtbaarFE = (mld_info.fenotes == 1); // Default waarden
          if (mld_info.fenotes != 1)
          {   // Afhankelijk van checkbox die door FOBO kan worden ingevuld.
              if (params.has_zichtbaarFE)
                  zichtbaarFE = params.zichtFE;
              else if (mld_info.publiek == 1) // use default when public and no checkbox for visibility present
                  zichtbaarFE = mld_info.fenotes == 3;
          }
      }

      if (params.note_key > -1) { // bestaande notitie
          var sql = "SELECT mld_melding_note_flag,"
                  + "       mld_melding_note_aanmaak"
                  + "  FROM mld_melding_note"
                  + " WHERE mld_melding_note_key = " + params.note_key
                  + "   AND mld_melding_key = " + mld_key;
          var oRs = Oracle.Execute(sql);
          var oldflag = oRs("mld_melding_note_flag").Value;
          var noteaanmaak = new Date(oRs("mld_melding_note_aanmaak").Value);
          oRs.Close();
          var newflag = (zichtbaarFE ? 1 : 0);

          newflag |= (oldflag & 64); // Bij edit de 'ismailnote' bit behouden

          params.flag = newflag;
      } else { // nieuwe notitie
        var newflag = (zichtbaarFE ? 1 : 0) + (params.ismailnote ? 64 : 0);

            params.flag = newflag;
      }

      if (saveNote) {
        // Hier het daadwerkelijke opslaan van de notitie
        // In het gaval van een bijlage wordt er niets opgeslagen.
        var note_key = notes.note_save(mld_key, params);
      }

      if (params.note_key > -1) { // bestaande notitie
          if (!zichtbaarFE && oldflag & 1) // Proberen MLDNOT notificatie terug te trekken. Geen garanties
          {                                // Merk op dat de volgorde notitie1 maken (zichtbaar),
                                           //                         notitie2 maken (zichtbaar),
                                           //                         notitie2 bewerken (onzichtbaarbaar maken)
                                           // ingewikkeld is. Daarom de check op fac_notificatie_datum. Niet 100% maar goed genoeg.
              var sql = "DELETE FROM fac_notificatie"
                      + " WHERE fac_srtnotificatie_key = "
                      + "        (SELECT fac_srtnotificatie_key"
                      + "           FROM fac_srtnotificatie"
                      + "          WHERE fac_srtnotificatie_code = 'MLDNOT')"
                      + "  AND fac_notificatie_datum >= " + noteaanmaak.toSQL(true)
                      + "  AND fac_notificatie_refkey = " + mld_key;
              Oracle.Execute(sql);
          }
      } else { // Nieuwe 'Notitie bij {0}: {1}'
          var txt = L("lcl_mld_is_mldnotetrack").format((mld_info.prefix||"") + mld_key, note);
          var txt = txt.split("\n")[0].split("\r")[0]; // Altijd alleen eerste regel
          if (txt.length > 80)
              txt = txt.substr(0, 80);
          txt = txt + "...";
          var sender = getNotiSenderEmail(mld_key);
          if (mfe.haveOnlyFErights) // Frontend gebruiker
          {
              if (eigenMelding && mld_info.mld_status != 5 &&
                  ((params.action2BO && !(mld_info.actiecode & 1)) ||                                 // BO had de actie nog niet
                   (!params.has_action2BO && mld_info.actiecode & 1 && !(mld_info.actiecode & 128) )  // BO had de actie wel, maar de attentie nog niet
                  )
                 )
              {
                  var sql = "UPDATE mld_melding"
                          + "   SET mld_melding_actiecode = 1 + 128" // + actionBO + attentieBO (evt. - attentieFE)
                          + " WHERE mld_melding_key = " + mld_key;
                  Oracle.Execute(sql);
                  shared.trackaction("MLDA2B", mld_key);
                  result.mustrefreshMLD = true;
              } else if (mld_info.actiecode & 256) {
                  var sql = "UPDATE mld_melding"
                          + "   SET mld_melding_actiecode = mld_melding_actiecode - 256" // - attentieFE
                          + " WHERE mld_melding_key = " + mld_key;
                  Oracle.Execute(sql);
              }
          } else { // FOBO medewerker
              if ((mld_info.actiecode & 128) == 128) { // Altijd attentie er af, *ik* heb hem blijkbaar gezien
                  var sql = "UPDATE mld_melding"
                          + "   SET mld_melding_actiecode = BITAND(mld_melding_actiecode, 511 - 128)"
                          + " WHERE mld_melding_key = " + mld_key;
                  Oracle.Execute(sql);
                  mld_info.actiecode &= ~128; // - attentieBO
                  result.mustrefreshMLD = true;
              }

              if (zichtbaarFE && params.notifyFE) {
                  // Notificatie (MLDNOT) indien notitie zichtbaar is voor FE.
                  // (tracking ervan is overkill: de notitie zelf is eigenlijk tracking)
                  Oracle.Execute("BEGIN fac.putnotificationsrtprio("
                                  + "NULL"
                                  + ", " + mld_info.melder_key
                                  + ", 'MLDNOT'"
                                  + ", " + mld_key
                                  + ", " + safe.quoted_sql(txt)
                                  + ", NULL, NULL, NULL, NULL, 2, " + safe.quoted_sql(sender) + "); END;");
              }

              if (zichtbaarFE && mld_info.haschild && params.notifyFEchild) {
                  var sql = "SELECT mld_melding_key"
                          + "     , prs_perslid_key"
                          + "  FROM mld_melding"
                          + " WHERE mld_melding_parentkey = " + mld_key;
                  var oRs = Oracle.Execute(sql);
                  while (!oRs.eof) {
                      var mld_child_key = oRs("mld_melding_key").Value;
                      var prs_child_key = oRs("prs_perslid_key").Value;
                      Oracle.Execute("BEGIN fac.putnotificationsrtprio("
                                  + "NULL"
                                  + ", " + prs_child_key
                                  + ", 'MLDNOT'"
                                  + ", " + mld_child_key
                                  + ", " + safe.quoted_sql(txt)
                                  + ", NULL, NULL, NULL, NULL, 2, " + safe.quoted_sql(sender) + "); END;");
                      oRs.MoveNext();
                  }
                  oRs.Close();
              }

              if (zichtbaarFE && mld_info.canholdthirdparty && mld_info.email_ext && params.notifyExt) {
                  Oracle.Execute("BEGIN fac.putnotificationsrtprio("
                               + "NULL"
                               + ", NULL"
                               + ", 'MLDNOT'"
                               + ", " + mld_key
                               + ", " + safe.quoted_sql(txt)
                               + ", 2, " + safe.quoted_sql(mld_info.email_ext) + ", NULL, NULL, 2, " + safe.quoted_sql(sender) + "); END;");
              }

              if (params.action2BO && !(mld_info.actiecode & 1)) { // action2BO
                  var sql = "UPDATE mld_melding"
                          + "   SET mld_melding_actiecode = 1" // Actie nu bij BO. Zelf gedaan dus geen attentie
                          + " WHERE mld_melding_key = " + mld_key;
                  Oracle.Execute(sql);
                  shared.trackaction("MLDA2B", mld_key);
                  result.mustrefreshMLD = true;
              } else if (   params.notifyFE                                                                     // notifyFE
                         || S("mld_note_hidden_action2FE") && params.action2FE && !(mld_info.actiecode & 2)) {  // action2FE
                  var mldActiecode = mld_info.actiecode | 256; // Huidige actiecode + attentieFE
                  if (params.action2FE && !(mld_info.actiecode & 2)) { // action2FE
                      mldActiecode &= ~3; // - action2BO/FE
                      mldActiecode |= 2; // + action2FE
                      shared.trackaction("MLDA2M", mld_key);
                  }
                  var sql = "UPDATE mld_melding"
                          + "   SET mld_melding_actiecode = " + mldActiecode
                          + " WHERE mld_melding_key = " + mld_key;
                  Oracle.Execute(sql);
                  result.mustrefreshMLD = true;
              }
          }

          // Controleren of er ook naar het gebouw een mailtje gestuurd moet worden.
          // Normaal gesproken gaat dit automatisch als het getrackt wordt. Maar hier wordt geen tracking gedaan. De notitie is de tracking.
          // LET OP: Code komt uit de FAC_PAC.SRC package PROCEDURE notifytracking aan het einde van de lxmlnode "melding".
          var sql_sng = "SELECT fac_srtnotificatie_gebouw"
                      + "  FROM fac_srtnotificatie"
                      + " WHERE fac_srtnotificatie_code = 'MLDNOT'";
          var oRs = Oracle.Execute(sql_sng);
          var srtnotigebouw = oRs("fac_srtnotificatie_gebouw").Value;
          oRs.Close();

          var sql_ogk = "SELECT mld_alg_onroerendgoed_keys"
                      + "  FROM mld_melding"
                      + " WHERE mld_melding_key = " + mld_key;
          var oRs = Oracle.Execute(sql_ogk);
          var algonrgoedkey = oRs("mld_alg_onroerendgoed_keys").Value || -1;
          oRs.Close();

          if (srtnotigebouw == 1 && algonrgoedkey > 0 && zichtbaarFE) { // Stuur een notificatie naar het e-mail adres van het gebouw
              var sql_ge = "SELECT g.alg_gebouw_email"
                      + "  FROM alg_v_allonroerendgoed aog"
                      + "     , alg_gebouw g"
                      + " WHERE aog.alg_gebouw_key = g.alg_gebouw_key"
                      + "   AND aog.alg_onroerendgoed_keys = " + algonrgoedkey;
              var oRs = Oracle.Execute(sql_ge);
              var gebouwemail = oRs("alg_gebouw_email").Value;
              oRs.Close();

              Oracle.Execute("BEGIN fac.putnotificationsrtprio("
                          + "NULL"
                          + ", NULL"
                          + ", 'MLDNOT'"
                          + ", " + mld_key
                          + ", " + safe.quoted_sql(txt)
                          + ", NULL"
                          + ", " + safe.quoted_sql(gebouwemail)
                          + ", NULL, NULL, 2, " + safe.quoted_sql(sender) + "); END;");
          }
      }

      mld.lock(mld_key); // Voor zowel nieuwe als bestaande notitie de lock zetten als de notitie bewaard wordt

      if (mld_info.nobnotify && params.note_key == -1) {
          // De meest specifieke behandelaar nog een echte notificatie sturen bij nieuwe notitie
          // naar jezelf hoeft dat niet.
          var behandelaar_key = -1;
          if (mld_info.behandel2_key > 0) {
              if (mld_info.behandel2_key != user_key) {
                  behandelaar_key = mld_info.behandel2_key;
              }
          } else if (mld_info.behandel_key > 0 && mld_info.behandel_key != user_key) {
              behandelaar_key = mld_info.behandel_key;
          }

          // Laat de Behandelaar weten dat er iemand (anders) een notitie heeft toegevoegd of gewijzigd
          // only notify with a new note
          if (behandelaar_key > 0) {
              // putnotificationsrtprio doet geen vertaling van andere vars dan ##KEY## (notify_tracking zou dat wel doen)
              // dus doen we het hier zelf maar.
              var omssql = "SELECT fac_srtnotificatie_oms"
                         + "  FROM fac_srtnotificatie"
                         + " WHERE fac_srtnotificatie_code = 'MLDNOB'";
              var oRs = Oracle.Execute(omssql);
              var oms = L(oRs("fac_srtnotificatie_oms").Value, { autolcl: true });
              oRs.Close();
              var sender = getNotiSenderEmail(mld_key);
              Oracle.Execute("BEGIN fac.putnotificationsrtprio("
                            + (saveNote? "NULL" : user_key)
                            + ", " + behandelaar_key
                            + ", " + (saveNote? "'MLDNOB'" : "'MLDUPD'")
                            + ", " + mld_key
                            + ", mld.mldsprintf(" + safe.quoted_sql(saveNote? oms : params.note) + ", " + mld_key + ")"
                            + ", NULL, NULL, NULL, NULL, 2, " + safe.quoted_sql(sender) + "); END;");
          }
      }

      if (S("mld_rejected_is_open") && mld_info.mld_status == 1) {
          // Aanpassen van een afgewezen melding werpt die weer opnieuw de molen in.
          mld.setmeldingstatus(mld_key, 2);
          result.mustrefreshMLD = true;
          result.verynewnote = true;
      }

      if (eigenMelding && ((mld_info.actiecode & 256) == 256) && mld_info.mld_status == 5)
      { // De attentie van de FE er afhalen en de attentie op de FO/BO zetten.
        var mldActiecode = mld_info.actiecode;
        // Als de melder gereageerd heeft op de Attentie, dan deze er weer afhalen. Ook als de melder niet akkoord is.
        mldActiecode -= 256; // - attentieFE (256).

        if (params.has_assume_not_ok && params.assume_not_ok)
        { // Melder niet akkoord, dan de actiecodeFO/BO zetten.
          mldActiecode |= 128; // + attentieFOBO (128).
        }

        var sql = "UPDATE mld_melding"
                + "   SET mld_melding_actiecode = " + mldActiecode
                + " WHERE mld_melding_key = " + mld_key;
         Oracle.Execute(sql);
      }
    }

    result.mld_key    = mld_key;
    result.note_key   = note_key || params.note_key;
    result.canAccept  = mfe.canAccept;

    return result;
}

function note_recently_changed(mld_key, lastdate) {
    // Is de melding recent nog gewijzigd.
    var changedby = "";
    var sql_t = "SELECT t.fac_tracking_datum"
              + "     , prs_perslid_naam_friendly naam"
              + "  FROM (SELECT f.fac_tracking_datum"
                      + "     , f.prs_perslid_key"
                      + "     , f.fac_tracking_refkey mld_melding_key"
                      + "  FROM fac_tracking f"
                      + "     , fac_srtnotificatie n"
                      + " WHERE f.fac_srtnotificatie_key = n.fac_srtnotificatie_key"
                      + "   AND n.fac_srtnotificatie_xmlnode = 'melding'"
                      + " UNION "
                      + "SELECT mld_melding_note_aanmaak"
                      + "     , prs_perslid_key"
                      + "     , mld_melding_key"
                      + "  FROM mld_melding_note"
                      + ") t"
              + "     , prs_v_perslid_fullnames_all p"
              + " WHERE t.prs_perslid_key = p.prs_perslid_key"
              + "   AND t.mld_melding_key = " + mld_key
              + "   AND t.prs_perslid_key <> " + user_key
              + "   AND t.fac_tracking_datum > " + lastdate.toSQL(true)
              + " ORDER BY t.fac_tracking_datum DESC";
    var oRs_t = Oracle.Execute(sql_t);
    if (!oRs_t.eof) {
        changedby = oRs_t("naam").Value;
    }
    oRs_t.Close();
    return changedby;
}

function getNotiSenderEmail(mldkey) { // Deze functie volgt dezelfde logica als fac.notifytracking wat betreft het ophalen van het afzend emailadres
    var sql = "SELECT COALESCE (d.ins_discipline_email,"
            + "                 l1.alg_locatie_email,"
            + "                 l2.alg_locatie_email)"
            + "           sender"
            + "  FROM mld_melding         m,"
            + "       mld_stdmelding      stdm,"
            + "       ins_tab_discipline  d,"
            + "       mld_adres           ma,"
            + "       alg_locatie         l1,"
            + "       alg_locatie         l2"
            + " WHERE stdm.mld_stdmelding_key = m.mld_stdmelding_key"
            + "   AND d.ins_discipline_key    = stdm.mld_ins_discipline_key"
            + "   AND m.mld_adres_key         = ma.mld_adres_key(+)"
            + "   AND ma.alg_locatie_key      = l1.alg_locatie_key(+)"
            + "   AND m.mld_alg_locatie_key   = l2.alg_locatie_key(+)"
            + "   AND m.mld_melding_key       = " + mldkey;
    var oRs = Oracle.Execute(sql);
    var sender = oRs("sender").Value;
    oRs.Close();
    return sender;
}

%>