Ev. wäre nicht nur für uns nützlich:
Ein OCL-Operator der den ersten Arbeitstag eines Monats zurück gibt. D.h. Erster Tag des Monats, der weder Samstag, Sonntag oder Feiertag ist. (ev. mit Option, ob Samstag oder Sonntag als Arbeitstag gilt).
Ev. wäre nicht nur für uns nützlich:
Ein OCL-Operator der den ersten Arbeitstag eines Monats zurück gibt. D.h. Erster Tag des Monats, der weder Samstag, Sonntag oder Feiertag ist. (ev. mit Option, ob Samstag oder Sonntag als Arbeitstag gilt).
Der erste Arbeitstag wäre dabei aber Mitarbeiterspezifisch, oder? Es gibt da ja diverse Faktoren wie unterschiedliche Vorgaben oder das Eintrittsdatum.
Mit den CallOperatoren könnte man die Funktionalität ebenfalls sehr gut abbilden.
Nein, nicht auf MA-Ebene, sondern auf Gruppenebene wäre die Funktion gefragt.
Hintergrund: Bei uns sind verschiedene administrativen Tätigkeiten abhängig vom 1. Arbeitstag (der Firma/"Gruppe")
Das geht mit Bordmitteln und Python:
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:
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.
Python ist klar, dachte nur als Idee als OCL-Operator.
Danke fürs rasche Feedback!
Nein das ist zu kundenspezifisch für einen fix eingebauten OCL Operator. Aber mit einem OCL Call Operator und dieser Python Funktion bist Du ja genau da.
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.
#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)
Sieht für mich gut aus. Du hast den OCL Ansatz gewählt, man könnte es auch in Python ausformulieren was es vielleicht noch etwas lesbarer machen würde. Aber: müsste es im zentralen while nicht or sein anstatt and?
Danke für den Hinweis, klar. OR nicht AND (hatte zuerst eine andere OCL-Expression genutzt). Habs auch oben im Script geändert