• Das geht mit Bordmitteln und Python:


    Code
    def ErsterArbeitstagImMonat(bearbeiter, monat):
        datum = vtcapp.firstdayofmonth(monat)
        while bearbeiter.evalocl("self->getSollzeitOnlyGroupAbw({0}, {0})".format(vtcapp.ocldate(datum))) == 0:
            datum = vtcapp.incday(datum, 1)
    
        return datum


    aufrufen kann man das z.B. so:

    Code
    print ErsterArbeitstagImMonat(vtcapp.currentlogin(), vtcapp.currentdate())


    gibt den 1.4. zurück, testehalber kann man am 1.4. dann einen Feiertag erfassen und dann kommt der 2.4. Oder mit einem Datum im Mai testen, dann gibt das aufgrund der Kalendersituation dann den 3.5.


    Wenn man das aus OCL heraus aufrufen will, dann kann man das gut via OCL Call Operatoren machen, siehe https://www.vertec.com/ch/kb/ocl/#ocl-call-operatoren.


    Um das produktiv in Betrieb zu nehmen, braucht es natürlich noch Absicherungsmassnahmen für die Methode, vor allem ein Schutz vor einem Endlosloop im while drin.

  • inwieweit ist dieses Vorgehen für eine Listenansicht kompatibel? die "wichtigen Hinweise" beim zitierten KB-Artikel besagen ja, dass die OCL-Call Operatoren nicht geeignet sind für Listen (mit wechselnden Daten).

    Konkret haben wir das Bedürfnis, auf dem Ordner Freigaben eine Liste mit "von". "bis". "erfasste Präsenzzeit", "Arbeitszeit", "Sollzeit", "Über- / Unterzeit", etc. anzuzeigen. So kann der Benutzer auf einen Blick erkennen, ob er nun für die gesamte Freigabeperiode auch alles erfasst hat (ja, ich weiss, das geht auch anders, aber es soll ja effizient sein, nicht nur "möglich"). Wäre da eine solche pyhton-Funktion mit OCL Call Operator sinnvoll?

    und falls das schon jemand so programmiert hätte, würden wir das natürlich auch nehmen ;-)

  • Sind die Freigaben immer auf einen ganzen Monat bezogen?


    Falls ja, könnte man in der Freigabe auch pro Tag eine Checkbox anzeigen, die angehakt ist, sobald der Mitarbeiter an diesem Tag eine Sollzeit besaß und auch Arbeitszeit erfasst hat. Dadurch sieht man durch fehlende Häkchen sofort vergessene Arbeitstage.


    Das sieht dann so aus (in diesem Fall: zu viel gearbeitet ;-)):


  • Das geht mit Bordmitteln und Python:

    Soweit so gut - das Script liefert den ersten Arbeitstag für den Bearbeiter.
    Tja, ich benötige jedoch den ersten Arbeitstag einer "Location".
    Bsp: Bei uns in Zürich ist ja der 1. August ein Feiertag, bei den Kollegen in Frankfurt ist der 1. Aug (sofern kein Wochenende) erster Arbeitstag im August
    Diesen ersten Arbeitstag benötige ich.

    (ja, natürlich könnte ich durch alle Mitarbeiter gehen, eine(n) finden der 100% angestellt ist und dessen/deren 1. Arbeitstag gemäss Script bestimmen. Sollte doch einafcher gehen?)

  • Renzo Peduzzi (Ferax Treuhand AG) die OCL Call Operatoren eigenen sich schon für Listen, nur updaten sie sich nicht automatisch wenn sich die darunterliegenden Daten ändern und man nicht von der Liste weg- und wieder hingeht. Auch ist es natürlich so, dass so es pro Zelle einen Call gibt, je nach dem was man da macht kann das dauern.


    die Werte "von". "bis". "erfasste Präsenzzeit", "Arbeitszeit", "Sollzeit", "Über- / Unterzeit" sind aber auch mit OCL Bordmitteln machtbar, da gibt es überall fertige OCL Operatoren dazu, siehe https://www.vertec.com/ch/kb/ocl/#bearbeiteroperatoren. Das "von" bis "bis" kommt von der Freigabe nehme ich an? Dann könnte man die Operatoren direkt mit diesen Werten aufrufen. Ich kann gerne ein Beispiel machen, wenn ich die Anforderung konkreter verstanden habe.

  • Tja, ich benötige jedoch den ersten Arbeitstag einer "Location".

    Amadeo Vergés (Zühlke Engineering AG) Das brauchst Du aber vermutlich nur für Gruppen wo es mindestens einen Bearbeiter zugeordnet hat. Dann einfach von der Gruppe her benutzer->first machen und dann die Sollzeitlogik von oben anwenden.


    Wenn man das auch für Gruppen ohne Benutzer wissen will (muss), dann muss man wohl selber durch die Abwesenheiten der Gruppe durchgehen und schauen, welches dass der erste Arbeitstag (Mo-Fr nehme ich an) ohne volltägige Abwesenheit ist.

  • So, ich poste hier mal meinen Python-Code und hoffe, dass er den strengen Blicken meines Vertec-Betreuers bestehen vermag.
    Vorteil hier: Ich muss nicht beachten, ob der Bearbeiter nur Teilzeit z.B. am Dienstag arbeitet, was es beim obigen Code schwierig macht.
    Hinweis: Ein(e) BearbeiterIn bei uns hat verschiedenen Gruppenzuweisungen, jene mit dem Anstellungs-/Arbeitsort beginnt mit "Location: ..." darum suche ich diese.


    Code
    #Calculates the first workday of an location (where the user is asigned, independent of his level of employement)
    
    def FirstWorkdayInMonthForLocation(bearbeiter):
        datum = vtcapp.firstdayofmonth(datetime.date.today())
    
        # ich suche den ersten Tag, der nicht ein Wochenende ist und keinen Absenz-Eintrag in der Gruppe hat
        while (datum.weekday()>=5) or (bearbeiter.eval("gruppen->select(bezeichnung->sqllike('Location%'))->first.abwesenheiten->select(datum = {})->size>0".format(vtcapp.ocldate(datum)))):
            datum = vtcapp.incday(datum, 1)
    
    return datum

    (Änderung 18.6.21: falsches AND in OR geändert in WHILE-Codition, siehe Beitrag unten)