From 7ee1d09652dbdff3c7b902d35143b61c2672a13b Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Tue, 12 Mar 2019 16:29:00 +0100
Subject: [PATCH] =?UTF-8?q?#1035776=20Serie=20=C3=A4nderbar=20+=20Calendar?=
 =?UTF-8?q?=20fixes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../Appointment_entity/Appointment_entity.aod |   1 +
 .../children/appointmentid_param/code.js      |   1 -
 .../entityfields/attendees/valueProcess.js    |  15 +
 .../recordcontainers/jdito/contentProcess.js  |   1 -
 .../recordcontainers/jdito/onInsert.js        |   5 +
 .../recordcontainers/jdito/onUpdate.js        | 328 +++---------------
 6 files changed, 63 insertions(+), 288 deletions(-)
 create mode 100644 entity/Appointment_entity/entityfields/attendees/valueProcess.js

diff --git a/entity/Appointment_entity/Appointment_entity.aod b/entity/Appointment_entity/Appointment_entity.aod
index 632ee34458..68a22c6589 100644
--- a/entity/Appointment_entity/Appointment_entity.aod
+++ b/entity/Appointment_entity/Appointment_entity.aod
@@ -59,6 +59,7 @@
     <entityField>
       <name>ATTENDEES</name>
       <possibleItemsProcess>%aditoprj%/entity/Appointment_entity/entityfields/attendees/possibleItemsProcess.js</possibleItemsProcess>
+      <valueProcess>%aditoprj%/entity/Appointment_entity/entityfields/attendees/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>TRANSPARENCY</name>
diff --git a/entity/Appointment_entity/entityfields/appointmentlinks/children/appointmentid_param/code.js b/entity/Appointment_entity/entityfields/appointmentlinks/children/appointmentid_param/code.js
index 4caaf94026..53c1bcb86f 100644
--- a/entity/Appointment_entity/entityfields/appointmentlinks/children/appointmentid_param/code.js
+++ b/entity/Appointment_entity/entityfields/appointmentlinks/children/appointmentid_param/code.js
@@ -2,5 +2,4 @@ import("system.logging");
 import("system.result");
 import("system.vars");
 
-logging.log("SET: -" + vars.get("$field.UID") + "-")
 result.string(vars.get("$field.UID"));
\ No newline at end of file
diff --git a/entity/Appointment_entity/entityfields/attendees/valueProcess.js b/entity/Appointment_entity/entityfields/attendees/valueProcess.js
new file mode 100644
index 0000000000..bc78b4d9d3
--- /dev/null
+++ b/entity/Appointment_entity/entityfields/attendees/valueProcess.js
@@ -0,0 +1,15 @@
+import("system.neon");
+import("system.vars");
+import("system.calendars");
+import("system.result");
+
+/**
+ * Following if() is only for passing param-parts from "new Appointment"-Dialog to AppointmentEditViewTemplate
+ */
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.Entry_param"))
+{
+    var event = JSON.parse(vars.getString("$param.Entry_param"));
+
+    if(event[calendars.AFFECTEDUSERS])
+        result.string(event[calendars.AFFECTEDUSERS]);
+}
\ No newline at end of file
diff --git a/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js b/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js
index cdb013d534..469d54a167 100644
--- a/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js
@@ -10,7 +10,6 @@ if(vars.exists("$param.Entry_param"))
 {
 
     var entry = JSON.parse(vars.getString("$param.Entry_param"));
-        logging.log(entry.toSource())
 
     var masterEntry = null;
     if (vars.exists("$param.MasterEntry_param") && vars.get("$param.MasterEntry_param") != "") {
diff --git a/entity/Appointment_entity/recordcontainers/jdito/onInsert.js b/entity/Appointment_entity/recordcontainers/jdito/onInsert.js
index 64df0562ab..c9605494a9 100644
--- a/entity/Appointment_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/Appointment_entity/recordcontainers/jdito/onInsert.js
@@ -10,10 +10,13 @@ import("system.db");
 import("system.result");
 import("system.tools");
 
+logging.log("onInsert");
+
 var event = JSON.parse(vars.getString("$param.Entry_param"));
 
 event[calendars.TYPE] = calendars.VEVENT;
 event[calendars.ID] = ""; //wenn hier neue id erstellt und mitgegeben wird, wird versucht einen termin mit dieser id zu finden, den es nicht gibt. also leer.
+logging.log("attendees: "+ vars.get("$field.ATTENDEES"));
 event[calendars.AFFECTEDUSERS] = vars.get("$field.ATTENDEES");
 event[calendars.STATUS] = vars.getString("$field.STATUS");
 event[calendars.SUMMARY] = vars.getString("$field.SUMMARY");
@@ -24,6 +27,8 @@ event[calendars.DTEND] = vars.get("$field.END");
 event[calendars.CLASSIFICATION] = vars.get("$field.CLASSIFICATION");
 event[calendars.TRANSPARENCY] = vars.get("$field.TRANSPARENCY"); 
 event[calendars.CATEGORIES] = vars.get("$field.CATEGORIES");
+if(vars.get("$field.RRULE"))
+    event[calendars.RRULE] = [vars.get("$field.RRULE")];
 if (vars.get("$field.REMINDER") != undefined && vars.get("$field.REMINDER") != "")
 {
     event[calendars.HASREMINDER] = "true";
diff --git a/entity/Appointment_entity/recordcontainers/jdito/onUpdate.js b/entity/Appointment_entity/recordcontainers/jdito/onUpdate.js
index b0b135b62a..2fe0a95ace 100644
--- a/entity/Appointment_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/Appointment_entity/recordcontainers/jdito/onUpdate.js
@@ -12,12 +12,26 @@ import("system.result");
 import("system.tools");
 
 
+logging.log("onUpdate");
 // Dieser Prozess speichert die im Frame angezeigten Daten
 // Je nach Modus (INSERT, EDIT) wird ein neuer Datensatz angelegt oder der alte editiert
 
-if(vars.exists("$param.Entry_param") && vars.getString("$param.Entry_param") != "")
+var event;
+
+if(vars.get("$field.SAFESCOPEFIELD") == "ALL" && vars.exists("$param.MasterEntry_param") && vars.getString("$param.MasterEntry_param") != "")
+{
+    event = JSON.parse(vars.getString("$param.MasterEntry_param")); 
+    logging.log("safescope all");
+}
+else if(vars.exists("$param.Entry_param") && vars.getString("$param.Entry_param") != "")
 {
-    var event = JSON.parse(vars.getString("$param.Entry_param"));
+    event = JSON.parse(vars.getString("$param.Entry_param"));
+    logging.log("safescope this");
+}
+
+if(event)
+{    
+    var differencesDetected = areEventAndFieldsDifferent(event);
 
     //if ( calendars.getBackendType() == calendars.BACKEND_EXCHANGEWS  && event[calendars.ORGANIZER2]["cn"] != event[calendars.USER2]["cn"])
     //    question.showMessage(translate.text("Ein Gruppentermin kann nur durch den Organisator bearbeitet werden."));
@@ -36,301 +50,43 @@ if(vars.exists("$param.Entry_param") && vars.getString("$param.Entry_param") !=
         event[calendars.CATEGORIES] = vars.get("$field.CATEGORIES");
         event[calendars.AFFECTEDUSERS] = vars.get("$field.ATTENDEES");
         event[calendars.TRANSPARENCY] = vars.get("$field.TRANSPARENCY");
-        if(vars.get("$field.REMINDER") != undefined && vars.get("$field.REMINDER") != "")
+        if(vars.get("$field.REMINDER"))
         {
             event[calendars.HASREMINDER] = "true";
             event[calendars.REMINDER_DURATION] = vars.get("$field.REMINDER");
         }
-        if(event[calendars.RRULE] != undefined)     
-            event[calendars.RRULE] = vars.getString("$field.RRULE")
-    
+        
+        if(event[calendars.RRULE])
+            event[calendars.RRULE] = [vars.getString("$field.RRULE")];
         
         calendars.updateEntry(event);
 }
 
-// Liefert die AffectedUsers
-function getAffectedUsers( pEvent )
-{
-        var affectedusers = vars.get("$context.affectedusers");   
-        var attendess = pEvent[calendars.ATTENDEES]
-        var calendarusers = [];
-        for ( var i = 0; i < affectedusers.length; i++)   
-        {
-            var insert = true;
-            for ( var y = 0; y < attendess.length; y++)
-            {
-                // Teilnehmer schon vorhanden
-                if ( text.encodeMS( [attendess[y]["paramvalue"], "CN:" + attendess[y]["cn"]] ) == affectedusers[i][0] )
-                {
-                    var userparts = [attendess[y]["paramvalue"]];
-                    if ( affectedusers[i][1] != "" && affectedusers[i][1] != "UNKNOWN" )  attendess[y]["partstat"] = affectedusers[i][1];
-                    for ( var part in attendess[y] )   if ( part != "paramvalue")  userparts.push(part + ":" + attendess[y][part] )
-                    calendarusers.push( text.encodeMS(userparts) );
-                    insert = false;
-                    break;
-                }
-            }
-            if ( insert ) // Teilnehmer noch nicht im Termin vorhanden
-            {
-                var resource = db.cell("select THEME from THEME where THEMEID = '" + affectedusers[i][0] + "'");
-                if( resource != "" && tools.existUsers(resource) )   
-                    calendarusers.push(text.encodeMS(text.decodeMS(calendars.getCalendarUser(resource)).concat("CUTYPE:RESOURCE")));
-                else    calendarusers.push(affectedusers[i][0]);
-            }
-        }
-        return text.encodeMS( calendarusers );
-    }
 
-// Liefert die Benutzer zurück, auf die keine Schreibrechte bestehen
-function getReadOnlyUser()
-{
-    var writeable = calendars.getFullCalendarUsers(calendars.RIGHT_WRITE);	
-    var affectedusers = vars.get("$context.affectedusers");
-    var readonly = new Array();
-
-    for ( i = 0; i < affectedusers.length; i++)
-    {
-        var user = affectedusers[i][0];
-        if (!isWriteable(user, writeable))
-            readonly.push(affectedusers[i][3]);
-    }	
-    return readonly;	
-}
-
-// Liefert TRUE, wenn der Benutzer bei denen mit Schreibberechtigungen enthalten ist
-function isWriteable(user, writeable)
-{
-    for (var i = 0; i < writeable.length; i++)
-    {
-        if (writeable[i][0] == calendars.getCalendarUser(user))
-            return true;
-    }	
-    return false;
-}
-
-// Berechnet das Ende der Recurrence
-function recurrencend(event)
-{
-    var rec_end = vars.getString("$comp.rec_end");
-
-    // Automatische Erkennung, was gewollt ist
-    if (rec_end == "")
-    {
-        if (vars.get("$comp.rec_end_count") != "")
-            rec_end = "Endet nach Anzahl Terminen";
-        else if (vars.get("$comp.rec_end_date") != "")
-            rec_end = "Endet am";
-    }
-
-    if (rec_end == "" || rec_end == "Kein Enddatum")
-    {
-    // Nichts
-    }
-    else if (rec_end == "Endet nach Anzahl Terminen")
-    {
-        event[calendars.RRULE][0] += (";COUNT=" + vars.get("$comp.rec_end_count"));
-    }
-    else if (rec_end == "Endet am")
-    {
-        var dat = vars.get("$comp.rec_end_date");
-        var start = vars.get("$comp.start_date");
-        var localTime = datetime.toDate(dat, translate.text("yyyyMMdd")) + datetime.toDate(start, "HHmmss");
-        var utcTime = datetime.toLong(localTime, "yyyyMMddHHmmss");
-        event[calendars.RRULE][0] += (";UNTIL=" + datetime.toDate(utcTime, "yyyyMMdd\'T\'HHmmss\'Z\'", "UTC"));
-    }
-}
 
 /**
- * Berechnet die Wiederholung
- *
- * @param event Das fertige Event. Hier die Reccurrence speichern
- */
-function calcrecurrence(event)
-{
-    var rec_type = vars.get("$comp.rec_type");
-
-    if (rec_type == "")
-    {
-    // Nichts
-    }
-    else if (rec_type == "Keine")
-    {
-    }
-    else if (rec_type == "Täglich")
-    {
-        rec_daily(event);
-    }
-    else if (rec_type == "Wöchentlich")
-    {
-        rec_weekly(event);
-    }
-    else if (rec_type == "Monatlich")
-    {
-        rec_monthly(event);
-    }
-    else if (rec_type == "Jährlich")
-    {
-        rec_yearly(event);
-    }
-    else
-    {
-        question.showMessage("Internal (1) " + rec_type);
-    }
-}
-/***********************/
-function rec_yearly(event)
-{
-    var rec_year = vars.get("$comp.rec_yearly");
-    var rec_yearly_month = vars.get("$comp.rec_yearly_month");
-    var rec_yearly_day = vars.get("$comp.rec_yearly_day");
-    var month;
-    var day;
-
-    if (rec_year == "")
-    {
-        if (rec_yearly_month != "" && rec_yearly_day != "")
-            rec_year = "Jeden # #";
-        else if (rec_yearly_month != "" && vars.get("$comp.rec_yearly_day2") != "" && vars.get("$comp.rec_yearly_number2") != "")
-            rec_year = "Am #. # im #";
-    }
-
-    if (rec_year == "" || (rec_yearly_month == "" && rec_yearly_day == "" ))
-    {
-        question.showMessage(translate.text("yearly series not specified"));
-    }
-    else if (rec_year == "Jeden # #")
-    {
-        month = rec_yearly_month;
-        day = rec_yearly_day;
-        event[calendars.RRULE] = new Array("FREQ=YEARLY;BYMONTHDAY="+day+";BYMONTH="+month);
-    }
-    else if (rec_year == "Am #. # im #")
-    {
-        month = vars.get("$comp.rec_yearly_month2");
-        day = vars.get("$comp.rec_yearly_day2");
-        var number = vars.get("$comp.rec_yearly_number2");
-        event[calendars.RRULE] = new Array("FREQ=YEARLY;BYMONTH="+month+";BYDAY="+number+day);
-    }
-}
-/***********************/
-function rec_monthly(event)
-{
-    var rec_month = vars.get("$comp.rec_month");
-    var rec_monthly_day = vars.get("$comp.rec_monthly_day");
-    var rec_monthly_interval = vars.get("$comp.rec_monthly_interval");
-    var day;
-    var interval;
-
-    if (rec_month == "")
-
-    {
-        if (rec_monthly_day != "" && rec_monthly_interval != "")
-            rec_month = "Am #. jedes #. Monat";
-        else if (vars.get("$comp.rec_monthly_day2") != "" && vars.get("$comp.rec_monthly_interval2") != "" && vars.get("$comp.rec_monthly_weekday2") != "")
-            rec_month = "Am #. # jeden #. Monat";
-    }
-
-    if (rec_month == "" || (rec_monthly_day == "" && rec_monthly_interval != ""))
-    {
-        question.showMessage(translate.text("Ignore series"));
-    }
-    else if (rec_month == "Am #. jedes #. Monat")
-    {
-        day = rec_monthly_day;
-        interval = rec_monthly_interval;
-        event[calendars.RRULE] = new Array("FREQ=MONTHLY;INTERVAL=" + interval + ";BYMONTHDAY=" + day);
-    }
-    else if(rec_month == "Am #. # jeden #. Monat")
-    {
-        day = vars.get("$comp.rec_monthly_day2");
-        interval = vars.get("$comp.rec_monthly_interval2");
-        var weekday = vars.get("$comp.rec_monthly_weekday2");
-        event[calendars.RRULE] = new Array("FREQ=MONTHLY;INTERVAL=" + interval + ";BYDAY=" + day + weekday);
-    }
-}
-/***********************/
-function rec_weekly(event)
-{
-
-    var rec_weekly_intervall = vars.get("$comp.rec_weekly_intervall");
-    if (rec_weekly_intervall == "")
-        rec_weekly_intervall = "1";
-
-    var days = new Array();
-    var count = 0;
-    if (vars.get("$comp.rec_weekly_mo") == "true")
-    {
-        days[count] = "MO";
-        count++;
-    }
-    if (vars.get("$comp.rec_weekly_di") == "true")
-    {
-        days[count] = "TU";
-        count++;
-    }
-    if (vars.get("$comp.rec_weekly_mi") == "true")
-    {
-        days[count] = "WE";
-        count++;
-    }
-    if (vars.get("$comp.rec_weekly_do") == "true")
-    {
-        days[count] = "TH";
-        count++;
-    }
-    if (vars.get("$comp.rec_weekly_fr") == "true")
-    {
-        days[count] = "FR";
-        count++;
-    }
-    if (vars.get("$comp.rec_weekly_sa") == "true")
-    {
-        days[count] = "SA";
-        count++;
-    }
-    if (vars.get("$comp.rec_weekly_so") == "true")
-    {
-        days[count] = "SU";
-        count++;
-    }
-    if (count > 0)
-    {
-        event[calendars.RRULE] = new Array("FREQ=WEEKLY;INTERVAL=" + rec_weekly_intervall + ";WKST=MO;BYDAY=");
-        for (var i = 0; i < count; i++)
+* checks if the entryParam has different values like the current fieldvalues
+*/
+function areEventAndFieldsDifferent(event){
+    
+    var different = false;
+    
+    if( event[calendars.ID] != vars.getString("$field.UID") ||
+        event[calendars.TYPE] != calendars.VEVENT ||
+        event[calendars.STATUS] != vars.getString("$field.STATUS") ||
+        event[calendars.SUMMARY] != vars.getString("$field.SUMMARY") ||
+        event[calendars.LOCATION] != vars.get("$field.LOCATION") ||
+        event[calendars.DESCRIPTION] != vars.get("$field.DESCRIPTION") ||
+        event[calendars.DTSTART] != vars.get("$field.BEGIN") ||
+        event[calendars.DTEND] != vars.get("$field.END") ||
+        event[calendars.HASREMINDER] != "false" ||
+        event[calendars.CLASSIFICATION] != vars.get("$field.CLASSIFICATION") ||
+        event[calendars.CATEGORIES] != vars.get("$field.CATEGORIES") ||
+        event[calendars.AFFECTEDUSERS] != vars.get("$field.ATTENDEES") ||
+        event[calendars.TRANSPARENCY] != vars.get("$field.TRANSPARENCY"))
         {
-            event[calendars.RRULE][0] += days[i];
-            if (i+1 < count)
-            {
-                event[calendars.RRULE][0] += ",";
-            }
+            different = true;
         }
-    }
-}
-/***********************/
-function rec_daily(event)
-{
-    var rec_dailytype = vars.get("$comp.rec_dailytype");
-    var rec_dailydays = vars.get("$comp.rec_daily_days");
-    if (rec_dailytype == "")
-    {
-        if (rec_dailydays != "")
-            rec_dailytype = "Alle # Tage";
-    }
-
-    if (rec_dailytype == "" || rec_dailydays == "")
-    {
-        question.showMessage(translate.text("Ignore daily series"));
-    }
-    else if (rec_dailytype == "Alle # Tage")
-    {
-        event[calendars.RRULE] = new Array("FREQ=DAILY;INTERVAL=" + rec_dailydays);
-    }
-    else if (rec_dailytype == "Jeden Arbeitstag")
-    {
-        event[calendars.RRULE][0] = new Array("FREQ=WEEKLY;WKST=MO;BYDAY=MO,TU,WE,TH,FR");
-    }
-    else
-    {
-        question.showMessage(translate.text("Internal (2)") + " " + rec_dailytype);
-    }
+    
+    return different;
 }
\ No newline at end of file
-- 
GitLab