Imports System.Runtime.InteropServices.ComTypes Imports System.Threading Imports System.Windows.Forms Imports Microsoft.Office.Interop.Outlook 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 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 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("Es 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 '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 txtlfdSaldo.Text = timas.getTimeSaldo(MA.mit_timasId, "", "overallBalance") 'Saldo zu Stichtag, nicht aktueller Saldo!!! 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 Button1.Enabled = False 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 'Dim ausz100 As Double = (CDbl(txt100x2.Text)) 'Dim ausz50 As Double = (CDbl(txt50x15.Text)) 'Dim ausz50vonldfSaldo As Double = CDbl(txtlfdSaldo.Text) 'If ausz50 + ausz100 + ausz50vonldfSaldo >= summeAusz Then 'Prüfung, damit nicht zuviele ÜS ausbezahlt werden! ' Button1.Enabled = True 'Else ' Button1.Enabled = False 'End If 'If summeAusz >= ausz100 Then ' txtAusz100.Text = ausz100 ' summeAusz = summeAusz - ausz100 'Else ' txtAusz100.Text = summeAusz ' summeAusz = summeAusz - ausz100 'End If 'If summeAusz >= ausz50 Then ' summeAusz = summeAusz - ausz50 ' txtAusz50.Text = ausz50 'ElseIf summeAusz < 0 Then ' txtAusz50.Text = "0" 'Else ' txtAusz50.Text = summeAusz ' summeAusz = ausz50 - summeAusz 'End If 'If summeAusz >= ausz50vonldfSaldo Then ' summeAusz = summeAusz - ausz50vonldfSaldo ' txtAusz50vonSaldo.Text = ausz50vonldfSaldo 'ElseIf summeAusz < 0 Then ' txtAusz50vonSaldo.Text = "0" 'Else ' txtAusz50vonSaldo.Text = summeAusz ' summeAusz = ausz50vonldfSaldo - summeAusz '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, gesamt As Double sum100 = Math.Round(CDbl(txtAusz100.Text) * 0.5, 2) 'Übergabe in ZE-System als heruntergerechnete 100%ige bzw. 50%ige ÜS! sum50 = Math.Round(CDbl(txtAusz50.Text) * 0.67, 2) + 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 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 info As String = "" If timas.setTimeAccountEntries(MA, dtsetEntries, auszahlugsdatum, info) 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 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 End Class