Imports System.Runtime.InteropServices.ComTypes Imports System.Threading Imports System.Windows.Forms Imports Microsoft.Office.Interop.Outlook Imports Therefore.API Public Class frmUeberstundenauszahlen Dim MA As cMitarbeiter = Nothing Dim timas As cTimasAPI = New cTimasAPI Dim dt As New DataTable Dim timeaccountdt As New DataTable Dim dtResult As New DataTable Dim tag As cFeiertage Dim auszahlugsdatum As New Date Dim maxUberstundenpruefung As Boolean = True Dim stunden100ausz, stunden50ausz, stunden100auszbere, stunden50auszbere, stunden100bereitsausbezahl, stunden50bereitsausbezahlt, mehrabeit, stundenlfdSaldo, stundenlfdSaldobere As Double Sub New(mit_id) ' Dieser Aufruf ist für den Designer erforderlich. InitializeComponent() ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu. MA = New cMitarbeiter(mit_id) tag = New cFeiertage(DateTime.Parse(dtpMonat.Value).Year) Label7.Text = MA.mit_vname & " " & MA.mit_nname timas.getTimeaccountList(dt) Dim dv = New DataView(dt) dv.RowFilter = "info like '%zuschlag%' Or name = 'Mehrarbeit' Or name like 'Überstunden%' Or info like 'Auszahlungskonto%' Or name like '%01-Lfd Saldo%'" timeaccountdt = dv.ToTable getUeberstunden(False) End Sub Private Sub cbxoverwrite_CheckedChanged(sender As Object, e As EventArgs) Handles cbxoverwrite.CheckedChanged If Not cbxoverwrite.Checked Then maxUberstundenpruefung = False 'Limit für max. auszahlbar deaktivieren! Else If Not maxUberstundenpruefung Then maxUberstundenpruefung = True getUeberstunden(cbxabwDatum.Checked) End If End If End Sub Private Sub DateTimePicker1_ValueChanged(sender As Object, e As EventArgs) Handles dtpMonat.ValueChanged, dtpBis.ValueChanged getUeberstunden(cbxabwDatum.Checked) End Sub Private Sub getUeberstunden(abwDatum As Boolean) Dim startdate, enddate As Date If timeaccountdt IsNot Nothing Then If abwDatum Then startdate = (dtpMonat.Value) enddate = (dtpBis.Value) auszahlugsdatum = enddate Else startdate = tag.GetFirstyDayYInxMonth(DateTime.Parse(dtpMonat.Value).DayOfWeek, DateTime.Parse(dtpMonat.Value).Month, DateTime.Parse(dtpMonat.Value).Year, True) enddate = tag.GetLastyDayYInxMonth(DateTime.Parse(dtpMonat.Value).DayOfWeek, DateTime.Parse(dtpMonat.Value).Month, DateTime.Parse(dtpMonat.Value).Year, True) auszahlugsdatum = enddate End If timas.getTimeAccounts(startdate, enddate, MA.mit_timasId, timeaccountdt, dtResult) If dtResult.Rows.Count < 1 Then MsgBox("Für den gewählten Zeitraum konnten keine Stunden ermittelt werden!") Panel1.Enabled = False Exit Sub Else Panel1.Enabled = True End If Dim dt = calcUeberstunden(timeaccountdt, dtResult) fillFields(dt) dgvUeberstunden.DataSource = dt End If End Sub Private Function calcUeberstunden(dtAccouts As DataTable, dtSumUeberstunden As DataTable) As DataTable Dim dtmerged As DataTable If dtAccouts IsNot Nothing AndAlso dtSumUeberstunden IsNot Nothing Then dtmerged = dtAccouts.Clone dtmerged.Merge(dtSumUeberstunden, False, MissingSchemaAction.Add) If (dtmerged.Columns.Contains("accountType")) Then dtmerged.Columns.Remove("accountType") dtmerged.AcceptChanges() End If If (dtmerged.Columns.Contains("info")) Then dtmerged.Columns.Remove("info") dtmerged.AcceptChanges() End If If (dtmerged.Columns.Contains("number")) Then dtmerged.Columns.Remove("number") dtmerged.AcceptChanges() End If If (dtmerged.Columns.Contains("date")) Then dtmerged.Columns.Remove("date") dtmerged.AcceptChanges() End If Dim groups = dtmerged.AsEnumerable(). GroupBy(Function(row) New With { Key .Id = row.Field(Of Integer)("accountid"), Key .Multi = row.Field(Of String)("multiplier") }) Dim tableResult = dtmerged.Clone() For Each grp In groups tableResult.Rows.Add(grp.Key.Id, grp.Key.Multi, grp.Sum(Function(row) Dim value = 0 If Not IsDBNull(row.Item("value")) Then value = row.Item("value") Return value End Function)) Next End If Return dtmerged End Function Public Sub fillFields(dt As DataTable) '69 10-Na 22-06 '70 11-Sa 00-24 ===> 50% '72 13-So 00-24 '73 14-FtN 00-24 '1209 Mehrarbeit '1235 Überstunden 100% gesamt ===> 100% picDel.Visible = False For Each c As Control In Panel1.Controls If TypeOf c Is TextBox Then c.Text = "0" End If Next stunden50bereitsausbezahlt = 0 stunden100bereitsausbezahl = 0 If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then Dim calc As Double = 0 For Each r As DataRow In dt.Rows If Not IsDBNull(r.Item("value")) Then If r.Item("accountid") = "1209" Then calc = CDbl(txtMehr.Text) calc += r.Item("value") * (r.Item("multiplier") & "1") txtMehr.Text = calc mehrabeit = calc End If If r.Item("accountid") = "1235" Then calc = CDbl(txt100.Text) calc += r.Item("value") * (r.Item("multiplier") & "1") txt100.Text = calc stunden100ausz = calc End If If r.Item("accountid") = "70" Then calc = CDbl(txt50.Text) calc += r.Item("value") * (r.Item("multiplier") & "1") txt50.Text = calc stunden50ausz = calc End If If r.Item("accountid") = "1550" Then calc = CDbl(txtberAusz100.Text) calc += r.Item("value") * (r.Item("multiplier") & "1") txtberAusz100.Text = calc stunden100bereitsausbezahl = calc End If If r.Item("accountid") = "1551" Then calc = CDbl(txtberAusz50.Text) calc += r.Item("value") * (r.Item("multiplier") & "1") txtberAusz50.Text = calc stunden50bereitsausbezahlt = calc End If 'Berechnung von lfd Saldo im Zeitraum -> deaktiviert, es soll immer der aktuelle Saldo gezogen werden, egal in welchem Monat ich bin (22.02.2024) 'If r.Item("accountid") = "65" Then ' calc = CDbl(txtlfdSaldo.Text) ' calc += r.Item("value") * (r.Item("multiplier") & "1") ' txtlfdSaldo.Text = calc 'End If End If Next If (stunden100bereitsausbezahl + stunden50bereitsausbezahlt) > 0 Then picDel.Visible = True Button1.Enabled = False txtAusz.Enabled = False Else Button1.Enabled = True txtAusz.Enabled = True End If stunden100auszbere = stunden100ausz * 2 stunden50auszbere = stunden50ausz * 1.5 txt100x2.Text = stunden100auszbere txt50x15.Text = stunden50auszbere 'If CDbl(txtlfdSaldo.Text) < 0 Or auszahlugsdatum.Month = Today.Month AndAlso auszahlugsdatum.Year = Today.Year Then 'wenn berechneter Saldo negativ, dann ist im Regelfall das aktuelle MOnat noch nicht abgeschlossen!, daher anstatt den berechneten Saldo in overallBalance laden! txtlfdSaldo.Text = timas.getTimeSaldo(MA.mit_timasId, "", "overallBalance") 'End If stundenlfdSaldo = CDbl(txtlfdSaldo.Text) stundenlfdSaldobere = stundenlfdSaldo stundenlfdSaldobere -= stunden100auszbere stundenlfdSaldobere -= stunden50auszbere stundenlfdSaldobere = Math.Round(stundenlfdSaldobere, 2) If stundenlfdSaldo <= 0 Then Button1.Enabled = False txtSummeAuszb.Text = stundenlfdSaldo End If End Sub Private Sub txtAusz_TextChanged(sender As Object, e As EventArgs) Handles txtAusz.TextChanged If txtAusz.Text <> "" AndAlso IsNumeric(txtAusz.Text) Then Dim summeAusz = CDbl(txtAusz.Text) If summeAusz <= 0 Then txtAusz50vonSaldo.Text = "0" txtAusz50.Text = "0" txtAusz100.Text = "0" txtAusz.Text = "0" Button1.Enabled = False Exit Sub End If txt100x2.Text = stunden100auszbere txt50x15.Text = stunden50auszbere txt50x1.Text = stundenlfdSaldobere If stundenlfdSaldo >= summeAusz Then 'Prüfung, damit nicht zuviele ÜS ausbezahlt werden können! Button1.Enabled = True Else If maxUberstundenpruefung Then Button1.Enabled = False Else Button1.Enabled = True End If End If If summeAusz >= stunden100auszbere Then txtAusz100.Text = stunden100auszbere Else txtAusz100.Text = summeAusz End If summeAusz = Math.Round(summeAusz - stunden100auszbere, 2) If summeAusz >= stunden50auszbere Then txtAusz50.Text = stunden50auszbere summeAusz = Math.Round(summeAusz - stunden50auszbere, 2) ElseIf summeAusz < 0 Then txtAusz50.Text = "0" Else txtAusz50.Text = summeAusz summeAusz = Math.Round(summeAusz - stunden50auszbere, 2) End If If summeAusz >= stundenlfdSaldo Then txtAusz50vonSaldo.Text = stundenlfdSaldo summeAusz = Math.Round(summeAusz - stundenlfdSaldo, 2) ElseIf summeAusz < 0 Then txtAusz50vonSaldo.Text = "0" Else txtAusz50vonSaldo.Text = summeAusz summeAusz = Math.Round(summeAusz - stundenlfdSaldo, 2) End If End If End Sub Private Sub cbxabwDatum_CheckedChanged(sender As Object, e As EventArgs) Handles cbxabwDatum.CheckedChanged If cbxabwDatum.Checked Then lblBis.Visible = True dtpBis.Visible = True lblMonat.Text = "bis" dtpMonat.CustomFormat = "yyyy/MM/dd" Else lblBis.Visible = False dtpBis.Visible = False lblMonat.Text = "Monat" dtpMonat.CustomFormat = "yyyy/MM" End If End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim sum100, sum50, sum0, gesamt As Double sum100 = RoundOfDigits(CDbl(txtAusz100.Text) * 0.5, 2) 'Übergabe in ZE-System als heruntergerechnete 100%ige bzw. 50%ige ÜS! sum50 = RoundOfDigits(CDbl(txtAusz50.Text) * 100 / 150, 2) sum0 = CDbl(txtAusz50vonSaldo.Text) gesamt = CDbl(txtAusz.Text) Dim aksAuszahlung As MsgBoxResult = MsgBox("Überstunden für " & MA.mit_vname & " " & MA.mit_nname & " mit " & auszahlugsdatum.ToShortDateString() & " auszahlen?" & vbNewLine & sum100 & "x 100% ÜS :" & txtAusz100.Text & vbNewLine & sum50 & "x 50% ÜS: " & CDbl(txtAusz50.Text) + CDbl(txtAusz50vonSaldo.Text) & vbNewLine & "ÜS gesamt: " & gesamt, vbYesNo) If aksAuszahlung = vbYes Then Dim dtsetEntries As New DataTable dtsetEntries.Columns.Add("accountid", GetType(Integer)) dtsetEntries.Columns.Add("value", GetType(String)) If sum100 >= 0 Then Dim row = dtsetEntries.NewRow row.Item("accountid") = 1550 row.Item("value") = sum100.ToString.Replace(",", ".") dtsetEntries.Rows.InsertAt(row, dtsetEntries.Rows.Count) End If If sum50 >= 0 Then Dim row = dtsetEntries.NewRow row.Item("accountid") = 1551 row.Item("value") = sum50.ToString.Replace(",", ".") dtsetEntries.Rows.InsertAt(row, dtsetEntries.Rows.Count) End If If sum0 >= 0 Then Dim row = dtsetEntries.NewRow row.Item("accountid") = 1551 row.Item("value") = sum0.ToString.Replace(",", ".") dtsetEntries.Rows.InsertAt(row, dtsetEntries.Rows.Count) End If If gesamt >= 0 Then 'vom ldf Saldo, ev. über API Möglich monatliche Korrektur direkt zu befüllen, dann muss dieser If Zweig überarbeitet werden!!!!!!!!!!!!!! Dim row = dtsetEntries.NewRow row.Item("accountid") = 993 row.Item("value") = gesamt.ToString.Replace(",", ".") dtsetEntries.Rows.InsertAt(row, dtsetEntries.Rows.Count) End If Dim ues As New cUeberstunden(MA.mit_id, auszahlugsdatum.ToShortDateString, Now()) ues.uest_timasId = MA.mit_timasId ues.uest_100 = sum100 ues.uest_50 = sum50 ues.uest_0 = sum0 ues.uest_systemuser = VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME Dim info As String = "" If timas.setTimeAccountEntries(MA, dtsetEntries, auszahlugsdatum, info) AndAlso ues.SAVE() Then MsgBox("Erfolgreich in Timas eingetragen") Else MsgBox(info) End If End If End Sub Private Sub picDel_Click(sender As Object, e As EventArgs) Handles picDel.Click Dim aksAuszahlung As MsgBoxResult = MsgBox("Ausbezahlte Überstunden für " & MA.mit_vname & " " & MA.mit_nname & " mit " & auszahlugsdatum.ToShortDateString() & " zurücksetzen?" & vbNewLine & "100% ÜS: " & txtberAusz100.Text & vbNewLine & "50% ÜS: " & txtberAusz50.Text & vbNewLine & "ÜS gesamt: " & CDbl(txtberAusz100.Text) + CDbl(txtberAusz50.Text), vbYesNo) If aksAuszahlung = vbYes Then Dim dtdeleteEntries As New DataTable dtdeleteEntries.Columns.Add("accountid", GetType(Integer)) Dim rowNew = dtdeleteEntries.NewRow rowNew.Item("accountid") = 993 dtdeleteEntries.Rows.InsertAt(rowNew, dtdeleteEntries.Rows.Count) If txtAusz100.Text <> "" AndAlso IsNumeric(txtAusz100.Text) Then Dim row = dtdeleteEntries.NewRow row.Item("accountid") = 1550 dtdeleteEntries.Rows.InsertAt(row, dtdeleteEntries.Rows.Count) End If If txtAusz50.Text <> "" AndAlso IsNumeric(txtAusz50.Text) Then Dim row = dtdeleteEntries.NewRow row.Item("accountid") = 1551 dtdeleteEntries.Rows.InsertAt(row, dtdeleteEntries.Rows.Count) End If If timas.deleteTimeAccounts(auszahlugsdatum, auszahlugsdatum, MA.mit_timasId, dtdeleteEntries) Then Dim ues As New cUeberstunden(MA.mit_id, auszahlugsdatum.ToShortDateString) ues.uest_deleted = True ues.uest_lastChanged = Now() ues.uest_systemuser = VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME ues.SAVE() MsgBox("Erfolgreich aus Timas zurückgesetzt!") picDel.Visible = False Thread.Sleep(1000) 'warten bis Eintrag in Timas-DB getUeberstunden(cbxabwDatum.Checked) End If End If End Sub Public Function RoundOfDigits(ByVal Value As Decimal, ByVal Digits As Integer) As Decimal If Digits < 0 Then Return Math.Round(Value * CDec(Math.Pow(10, Digits)), 0, MidpointRounding.AwayFromZero) / CDec(Math.Pow(10, Digits)) Return Math.Round(Value, Digits) End Function End Class