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:

  • Beim Erfassen von Ferien als Phase muss in den Systemeinstellungen eine Ferientätigkeit definiert und der Phase zugeordnet werden. Siehe dazu den Artikel Ferienerfassung.
  • Das interne Absenzenprojekt, auf das die Leistungen erfasst werden sollen, muss im Script eingetragen werden mit dem Projektcode. Die Beispielzeile lautet:
    absProjekt = "Absenzen"

    Die aktiven Phasen des Absenzenprojektes stehen dann als Absenzenkategorien in einer Dropdownauswahl für die Absenzenerfassung zur Verfügung und können 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