Script: Absenzenerfassung Mitarbeiter

Inhalt

Erzeugt Absenzen-Leistungen für einen Zeitraum, der vom User abgefragt wird. Als Aufwand wird die Sollzeit des entsprechenden Tages für den Mitarbeiter eingetragen, abzüglich allenfalls bereits erfasster anderer Leistungen.

Vorab müssen folgende Voraussetzungen erfüllt werden:

  • Das interne Absenzenprojekt, auf das die Leistungen erfasst werden sollen, muss im Script eingetragen werden mit dem Projektcode. Die Beispielzeile lautet:
    absProjekt = "Absenzen"
  • Das Projekt muss mindestens eine Phase haben; in den Systemeinstellungen  muss eine Ferientätigkeit definiert und diese der Phase als Tätigkeit zugeordnet werden. Siehe dazu den Artikel Ferienerfassung. Die aktiven Phasen des Absenzenprojektes können dann in einer Abfrage als Absenzenkategorien vom User ausgewählt werden.

Ausführen

Auf dem Mitarbeiter, für den Ferienleistungen erfasst werden sollen. Entweder über das Kontextmenü / rechte Maustaste oder über das Menü Eintrag / Aktionen.

Versionen

Das Script ist ein Python-Script und wird registriert wie im Artikel Scripts registrieren beschrieben.

Vertec VersionBesonderheiten VersionScript
Ab Version 5.5.

Python Script

Absenz von-bis erfassen.py
Ab Version 6.0

Das Script läuft nur in der Desktop App und der Classic App (enthält vtcForms). Darum wird auf apptype abgefragt.

Bei der Registrierung kann folgende OCL-Expression als Bedingung angegeben werden, dann erscheint der Menüpunkt nicht in der Cloud App und der Web App:

(Timsession.allinstances->first.appType='Desktop') or (Timsession.allinstances->first.appType='Classic')

Absenz von-bis erfassen 60.py

Scripttext

# coding: windows-1252
#
#---Bezeichnung: Absenzen von - bis erfassen
#   Klassen: Projektbearbeiter
#   CondExpression: (Timsession.allinstances->first.appType='Desktop') or (Timsession.allinstances->first.appType='Classic')
#   ObjectScript: Y
#   ContainerScript: N
#   EventType: Kein
#   EventClass:
#   EventMembers:
#   ExtendedRights: N
#---Erstellt Leistungen im angegeben Zeitrahmen  auf der ausgewählten Absenzphase.
#   Das interne "Absenzenprojekt" muss untenstehend im Script eingetragen werden mit dem Projektcode. absProjekt =
#    Die aktiven Phasen des Absenzenprojektes stehen als Dropdownauswahl für die Absenzenerfassung zur Verfügung.
#    Beim Erfassen von Ferien als Phase muss in den Systemeinstellungen eine Ferientätigkeit definiert und der Phase zugeordnet werden. Siehe Ferienerfassung auf http://www.vertec.com/support
#    Absenzen werden erfasst mittels Kontextmenu/rechte Maustaste auf dem Bearbeiter.
#    Die Sollzeit jeden Tages in der Absenzperiode wird als Absenzleistung erzeugt.
#---31.03.2011, IB: erstellt.
#---01.06.2016, SR: Script kann nur in Desktop und Classic ausgeführt werden. CondExpression sowie Abfrage in der Funktion eingefügt.


from vtcapp import msgbox, createobject, evalocl
import vtcforms

absProjekt = "Absenzen"
projekt = None
phase = None
frm = None
def main():

    if not vtcapp.evalocl("timsession->first.apptype") in ['Desktop', 'Classic']:
        return
    global frm
    global phase
    global projekt
    
    projekt = evalocl("projekt->select(code='%s')->first" % absProjekt)
    if not projekt:
        msgbox("Das Absenzprojekt '%s' existiert nicht." % absProjekt)
        return
    
    aktBearbeiter = None
    if argobject.eval("self.oclistypeof(Projektbearbeiter)"):
        aktBearbeiter = argobject
    else:
        msgbox("Die Absenzerfassung sollte auf einem Bearbeiter gemacht werden.")
        return
        
    # Form initialisieren
    frm = vtcforms.readcomponent(formdef)
    try:
        frm.Caption = "Absenzerfassung"
        frm.edtVon.Date = argobject.eval("self.date")
        frm.edtBis.Date = argobject.eval("self.date")
        for tmpphase in projekt.eval("phasen->select(aktiv)"):
            frm.cmbTyp.Items.Add(tmpphase.code)
        frm.cmbTyp.ItemIndex = 0
        frm.btnOK.OnClick = btnOkClick
        
        if frm.ShowModal() == 2:
            return
        else:
            # Leistungen erstellen
            for datum in range(int(frm.edtVon.Date), int(frm.edtBis.Date)+1):
                sollzeit = aktBearbeiter.eval("self->getSollzeit(%i.floatToDate, %i.floatToDate)" % (datum, datum))
                arbeitszeit = aktBearbeiter.eval("self->getArbeitszeit(%i.floatToDate, %i.floatToDate)" % (datum, datum))
                sollzeit = sollzeit - arbeitszeit
                if sollzeit > 0:
                    leistung = createobject("OffeneLeistung")
                    leistung.projekt = projekt
                    leistung.phase = phase
                    leistung.minutenint = sollzeit
                    leistung.bearbeiter = aktBearbeiter
                    leistung.datum = projekt.eval("%i.floatToDate" % datum)
                
    finally:
        del frm
        
def btnOkClick(Sender):
    global frm
    global projekt
    global phase

    frm.ModalResult = 0

    # Werte abfragen
    if int(frm.edtVon.Date) > int(frm.edtBis.Date):
        msgbox("Von-Datum ist grösser als Bis-Datum")
        return
        
    if frm.cmbTyp.Text == "":
        msgbox("Bitte wählen Sie eine Absenzkategorie aus.")
        return
        
    phase = projekt.eval("self.phasen->select(code='%s')->first" % frm.cmbTyp.Text)
    if not phase:
        msgbox("Absenzkategorie wurde nicht gefunden. Bitte wählen Sie einen aus der Liste aus.")
        return
        
    frm.ModalResult = 1

formdef="""
object Form1: TForm1
  Left = 425
  Top = 134
  Width = 207
  Height = 190
  Caption = 'Absenzerfassung'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object lblVon: TLabel
    Left = 8
    Top = 14
    Width = 53
    Height = 13
    Caption = 'Zeitrahmen'
  end
  object Label1: TLabel
    Left = 96
    Top = 32
    Width = 6
    Height = 16
    Caption = '-'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -13
    Font.Name = 'MS Sans Serif'
    Font.Style = [fsBold]
    ParentFont = False
  end
  object lblPhase: TLabel
    Left = 8
    Top = 64
    Width = 79
    Height = 13
    Caption = 'Absenzkategorie'
  end
  object cmbTyp: TComboBox
    Left = 8
    Top = 80
    Width = 145
    Height = 21
    ItemHeight = 13
    TabOrder = 0
  end
  object btnAbbrechen: TButton
    Left = 32
    Top = 120
    Width = 75
    Height = 25
    Cancel = True
    Caption = 'Abbrechen'
    ModalResult = 2
    TabOrder = 1
  end
  object btnOK: TButton
    Left = 114
    Top = 120
    Width = 75
    Height = 25
    Caption = 'OK'
    Default = True
    ModalResult = 1
    TabOrder = 2
  end
  object edtVon: TDateTimePicker
    Left = 8
    Top = 30
    Width = 81
    Height = 21
    CalAlignment = dtaLeft
    Date = 40633.4548374653
    Time = 40633.4548374653
    DateFormat = dfShort
    DateMode = dmComboBox
    Kind = dtkDate
    ParseInput = False
    TabOrder = 3
  end
  object edtBis: TDateTimePicker
    Left = 109
    Top = 30
    Width = 81
    Height = 21
    CalAlignment = dtaLeft
    Date = 40633.4548374653
    Time = 40633.4548374653
    DateFormat = dfShort
    DateMode = dmComboBox
    Kind = dtkDate
    ParseInput = False
    TabOrder = 4
  end
end
"""

main()

25.06.2010 | 01.06.2016: Version für Vertec 6.0 hinzugefügt: CondExpression sowie Abfrage in der Funktion eingefügt wegen vtcForms (läuft nur in Desktop und Classic).
Produktlinien: Expert
Module: Leistung & CRM