Skip to content
Snippets Groups Projects
onInsert.js 11.82 KiB
import("system.logging");
import("system.neon");
import("system.calendars");
import("system.vars");
import("system.question");
import("system.translate");
import("system.text");
import("system.datetime");
import("system.db");
import("system.result");
import("system.tools");

logging.log("on insert");

// Dieser Prozess speichert die im Frame angezeigten Daten
// Je nach Modus (INSERT, EDIT) wird ein neuer Datensatz angelegt oder der alte editiert
var event = vars.get("$image.entry");

var ok = false;

event[calendars.TYPE] = calendars.VEVENT;
event[calendars.STATUS] = vars.getString("$field.STATUS");
event[calendars.SUMMARY] = vars.getString("$field.SUBJECT");
event[calendars.LOCATION] = vars.get("$field.LOCATION");
event[calendars.DESCRIPTION] = vars.get("$field.DESCRIPTION");
event[calendars.DTSTART] = vars.get("$field.STARTDATE");
event[calendars.DTEND] = vars.get("$field.ENDDATE");
event[calendars.HASREMINDER] = "false";
var hasReminder = vars.get("$field.REMINDER_CHECK");
if (hasReminder == "true")
{
    // Absolut nur, wenn auch gesetzt. Default ist relativ
    if ( event[calendars.REMINDER_ABSOLUT] == "true")
    {
        var reminder_date = vars.get("$field.REMINDER");
        if ( reminder_date != "" )
        {
            event[calendars.HASREMINDER] = "true";
            event[calendars.REMINDER_DATE] = reminder_date;
        }
    }
//        else
//        {
//            var reminder_duration = vars.getString("$field.reminder_duration");
//            if ( reminder_duration != "")
//            {
//                event[calendars.HASREMINDER] = "true";
//                event[calendars.REMINDER_DURATION] = reminder_duration;
//            }
//        }
}
event[calendars.CLASSIFICATION] = vars.get("$field.CLASSIFICATION");
//    event[calendars.TRANSPARENCY] = vars.get("$field.transparency");
event[calendars.AFFECTEDUSERS] = getAffectedUsers( event );   
//    event[calendars.CATEGORIES] = vars.get("$field.categories");
//calcrecurrence(event);
//if (event[calendars.RRULE] != undefined)     recurrencend(event);
// Links updaten
//    swing.saveTableEdit("$field.links");
// Entweder jetzt neu anlegen oder nur updaten
event[calendars.ID] = calendars.insert([event])[0];
vars.set("$image.editmode", calendars.MODE_UPDATE);
ok = true;

////Zwischenspeichern
//if(vars.exists("$image.dontClose") && vars.get("$image.dontClose") )    ok = false; //Maske offen lassen
//vars.set("$image.dontClose",  false); // zurücksetzen, damit Klick auf Speichern noch funktioniert

if(vars.exists("$sys.ancestorimageuid") && vars.get("$sys.ancestorimageuid") != null)
{
    neon.closeImage(vars.getString("$sys.currentimage"), true);
    neon.refresh(vars.get("$sys.ancestorimageuid"));
}


// Liefert die AffectedUsers
function getAffectedUsers( pEvent )
{
    var affectedusers = vars.get("$image.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]);
        }
    }
    //    a.showMessage(calendarusers.join("\n"))
    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("$image.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("$field.rec_end");

    // Automatische Erkennung, was gewollt ist
    if (rec_end == "")
    {
        if (vars.get("$field.rec_end_count") != "")
            rec_end = "Endet nach Anzahl Terminen";
        else if (vars.get("$field.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("$field.rec_end_count"));
    }
    else if (rec_end == "Endet am")
    {
        var dat = vars.get("$field.rec_end_date");
        var start = vars.get("$field.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("$field.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("$field.rec_yearly");
    var rec_yearly_month = vars.get("$field.rec_yearly_month");
    var rec_yearly_day = vars.get("$field.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("$field.rec_yearly_day2") != "" && vars.get("$field.rec_yearly_number2") != "")
            rec_year = "Am #. # im #";
    }

    if (rec_year == "" || (rec_yearly_month == "" && rec_yearly_day == "" ))
    {
        question.showMessage(translate.text("Jährliche Serie nicht genauer spezifiziert. Ignoriere Serie."));
    }
    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("$field.rec_yearly_month2");
        day = vars.get("$field.rec_yearly_day2");
        var number = vars.get("$field.rec_yearly_number2");
        event[calendars.RRULE] = new Array("FREQ=YEARLY;BYMONTH="+month+";BYDAY="+number+day);
    }
}
/***********************/
function rec_monthly(event)
{
    var rec_month = vars.get("$field.rec_month");
    var rec_monthly_day = vars.get("$field.rec_monthly_day");
    var rec_monthly_interval = vars.get("$field.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("$field.rec_monthly_day2") != "" && vars.get("$field.rec_monthly_interval2") != "" && vars.get("$field.rec_monthly_weekday2") != "")
            rec_month = "Am #. # jeden #. Monat";
    }

    if (rec_month == "" || (rec_monthly_day == "" && rec_monthly_interval != ""))
    {
        question.showMessage(translate.text("Monatliche Serie nicht genauer spezifiziert. Ignoriere Serie."));
    }
    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("$field.rec_monthly_day2");
        interval = vars.get("$field.rec_monthly_interval2");
        var weekday = vars.get("$field.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("$field.rec_weekly_intervall");
    if (rec_weekly_intervall == "")
        rec_weekly_intervall = "1";

    var days = new Array();
    var count = 0;
    if (vars.get("$field.rec_weekly_mo") == "true")
    {
        days[count] = "MO";
        count++;
    }
    if (vars.get("$field.rec_weekly_di") == "true")
    {
        days[count] = "TU";
        count++;
    }
    if (vars.get("$field.rec_weekly_mi") == "true")
    {
        days[count] = "WE";
        count++;
    }
    if (vars.get("$field.rec_weekly_do") == "true")
    {
        days[count] = "TH";
        count++;
    }
    if (vars.get("$field.rec_weekly_fr") == "true")
    {
        days[count] = "FR";
        count++;
    }
    if (vars.get("$field.rec_weekly_sa") == "true")
    {
        days[count] = "SA";
        count++;
    }
    if (vars.get("$field.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++)
        {
            event[calendars.RRULE][0] += days[i];
            if (i+1 < count)
            {
                event[calendars.RRULE][0] += ",";
            }
        }
    }
}
/***********************/
function rec_daily(event)
{
    var rec_dailytype = vars.get("$field.rec_dailytype");
    var rec_dailydays = vars.get("$field.rec_daily_days");
    if (rec_dailytype == "")
    {
        if (rec_dailydays != "")
            rec_dailytype = "Alle # Tage";
    }

    if (rec_dailytype == "" || rec_dailydays == "")
    {
        question.showMessage(translate.text("Tägliche Serie nicht genauer spezifiziert. Ignoriere Serie."));
    }
    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);
    }
}