Imports System.Drawing Imports System.Globalization Imports System.Reflection Imports System.Text Imports System.Threading Imports System.Windows.Forms Imports DocumentFormat.OpenXml.Drawing.Diagrams Public Class frmUeberstundenauszahlen Dim refresh As Boolean = False Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL Dim MA As cMitarbeiter = Nothing Dim timas = New cTimasAPI("timas") Dim dt As New DataTable Dim customFields 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 istTeilzeit As Boolean = False Dim faktorTeilzeit As Double = 100 Dim faktor100Zuschlag As Double = 200 Dim faktor50Zuschlag As Double = 150 Dim ignoreFactor As Boolean = False Dim stunden100ausz, stunden50ausz, stunden100auszbere, stunden50auszbere, stunden100bereitsausbezahl, stunden50bereitsausbezahlt, stunden25bereitsausbezahlt, mehrabeit, stundenlfdSaldo, stundenlfdSaldobere, overwrittenSum, overallSumNetto, overallSumBrutto As Double 'Dim dtbereitsausgezahlteUE As New DataTable 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 customFields = timas.getEmployeecustomFields(MA.mit_timasId) timas.getTimeaccountList(dt) Select Case MA.mit_firma Case "VERAG", "FRONTOFFICE", "IMEX", "ALL" : LinkLabel1.Visible = True Case Else : LinkLabel1.Visible = False End Select cbxalle.Visible = VERAG_PROG_ALLGEMEIN.cBerechtignunen.CHECK_BERECHTIGUNG_bool("ADMIN", "SDL") Dim dv = New DataView(dt) dv.RowFilter = "accountid = 65 Or accountid = 69 Or accountid = 70 Or accountid = 72 Or accountid = 73 Or accountid = 1209 Or accountid = 1235 Or accountid = 1550 Or accountid = 1551 Or accountid = 1553" timeaccountdt = dv.ToTable getAddDataFromTimas() getUeberstunden(False) 'getAddDataFromTimas() 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 cbxTeilzeit_CheckedChanged(sender As Object, e As EventArgs) Handles cbxTeilzeit.CheckedChanged istTeilzeit = cbxTeilzeit.Checked changeTeilzeit() 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 = tag.GetLastyDayYInxMonth(enddate.DayOfWeek, enddate.Month, enddate.Year, True) 'Endmonat des Enddates 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 lblWarning.Text = "Für den gewählten Zeitraum konnten keine Stunden ermittelt werden!" Panel1.Enabled = False Exit Sub Else lblWarning.Text = "" Panel1.Enabled = True End If dt = getUeberstunden(timeaccountdt, dtResult) fillFields(dt) End If End Sub Private Function getUeberstunden(dtAccouts As DataTable, dtSumUeberstunden As DataTable) As DataTable Dim dtmerged As New 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 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 Private Sub cbx100_CheckedChanged(sender As Object, e As EventArgs) Handles cbx100.CheckedChanged, cbx50.CheckedChanged, cx25.CheckedChanged txtAusz100.ReadOnly = Not cbx100.Checked txtAusz50.ReadOnly = Not cbx50.Checked txtAusz50vonSaldo.ReadOnly = Not cx25.Checked End Sub Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click customFields = timas.getEmployeecustomFields(MA.mit_timasId) getAddDataFromTimas() getUeberstunden(cbxabwDatum.Checked) End Sub Private Sub picShow_Click(sender As Object, e As EventArgs) Handles picShow.Click Try Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL Dim frm As New Form Dim dgv As New DataGridView() If dt.Rows.Count = 0 Then MsgBox("keine Daten vorhanden!") Exit Sub End If If dt.Columns.Contains("accountid") Then Dim dv = New DataView(dt) dv.RowFilter = "accountid = 1550 Or accountid = 1551 Or accountid = 1553" 'Überstunden! dt = dv.ToTable For Each row As DataRow In dt.Rows Select Case row(0) Case 1550 : If IsDBNull(row(1)) Then row(1) = CStr("ÜS 100%") Case 1551 : If IsDBNull(row(1)) Then row(1) = CStr("ÜS 50%") Case 1553 : If IsDBNull(row(1)) Then row(1) = CStr("ÜS 25%") End Select Next If (dt.Columns.Contains("accountid")) Then dt.Columns.Remove("accountid") dt.AcceptChanges() End If End If dgv.DataSource = dt If dgv IsNot Nothing Then dgv.AutoSize = DataGridViewAutoSizeColumnMode.Fill dgv.Dock = DockStyle.Fill dgv.ReadOnly = True frm.Controls.Add(dgv) frm.Width *= 2 frm.StartPosition = FormStartPosition.CenterScreen frm.ShowDialog() End If Catch ex As System.Exception VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name) End Try End Sub Private Sub txtAusz100_TextChanged(sender As Object, e As EventArgs) Handles txtAusz100.TextChanged, txtAusz50.TextChanged, txtAusz50vonSaldo.TextChanged Dim sum As Double = 0 overwrittenSum = 0 Select Case sender.Name Case "txtAusz100" txtAusz100Netto.Text = 0 If txtAusz100.Text <> "" AndAlso IsNumeric(txtAusz100.Text) AndAlso CDbl(txtAusz100.Text) > 0 Then txtAusz100Netto.Text = RoundOfDigits(txtAusz100.Text * 100 / faktor100Zuschlag, 2) Else txtAusz100Netto.Text = 0 End If Case "txtAusz50" txtAusz50Netto.Text = 0 If txtAusz50.Text <> "" AndAlso IsNumeric(txtAusz50.Text) AndAlso CDbl(txtAusz50.Text) > 0 Then txtAusz50Netto.Text = RoundOfDigits(txtAusz50.Text * 100 / faktor50Zuschlag, 2) Else txtAusz50Netto.Text = 0 End If Case "txtAusz50vonSaldo" txtAusz50vonSaldoNetto.Text = 0 If txtAusz50vonSaldo.Text <> "" AndAlso IsNumeric(txtAusz50vonSaldo.Text) AndAlso CDbl(txtAusz50vonSaldo.Text) > 0 Then txtAusz50vonSaldoNetto.Text = txtAusz50vonSaldo.Text Else txtAusz50vonSaldoNetto.Text = 0 End If End Select If cbx100.Checked AndAlso txtAusz100.Text <> "" AndAlso IsNumeric(txtAusz100.Text) AndAlso CDbl(txtAusz100.Text) > 0 Then stunden100auszbere = CDbl(txtAusz100.Text) overwrittenSum += stunden100auszbere End If If (txtAusz100.Text <> "" AndAlso IsNumeric(txtAusz100.Text)) Then sum += CDbl(txtAusz100.Text) End If If (txtAusz50.Text <> "" AndAlso IsNumeric(txtAusz50.Text)) Then sum += CDbl(txtAusz50.Text) End If If (txtAusz50vonSaldo.Text <> "" AndAlso IsNumeric(txtAusz50vonSaldo.Text)) Then sum += CDbl(txtAusz50vonSaldo.Text) End If If cbx50.Checked AndAlso txtAusz50.Text <> "" AndAlso IsNumeric(txtAusz50.Text) AndAlso CDbl(txtAusz50.Text) > 0 Then stunden50auszbere = CDbl(txtAusz50.Text) overwrittenSum += stunden50auszbere End If If cx25.Checked AndAlso txtAusz50vonSaldo.Text <> "" AndAlso IsNumeric(txtAusz50vonSaldo.Text) AndAlso CDbl(txtAusz50vonSaldo.Text) > 0 Then stundenlfdSaldobere = RoundOfDigits(txtAusz50vonSaldo.Text, 2) overwrittenSum += stundenlfdSaldobere End If If overwrittenSum > 0 Then txtAuszManuell.Text = overwrittenSum txtAusz.Visible = False txtAusz_hhmm.Visible = False txtAuszManuell.Visible = True txtAuszManuell_hhmm.Visible = True Else txtAusz.Visible = True txtAusz_hhmm.Visible = True txtAuszManuell.Visible = False txtAuszManuell_hhmm.Visible = False End If If overwrittenSum > 0 Then txtBruttoSum.Text = overwrittenSum Else txtBruttoSum.Text = sum End If End Sub Public Sub fillFields(dt As DataTable) picDel.Visible = False For Each c As Control In Panel1.Controls If TypeOf c Is Windows.Forms.TextBox Then c.Text = "0" End If Next 'alle zurücksetzen, falls im neuen Monat dieser Wert nicht mitgegeben wird! stunden50ausz = 0 stunden100ausz = 0 mehrabeit = 0 stunden50bereitsausbezahlt = 0 stunden100bereitsausbezahl = 0 stunden25bereitsausbezahlt = 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") = "1553" Then txtberAusz25.Visible = True calc = CDbl(txtberAusz25.Text) calc += r.Item("value") * (r.Item("multiplier") & "1") txtberAusz25.Text = calc stunden25bereitsausbezahlt = calc cbxTeilzeit.Checked = True 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 + stunden25bereitsausbezahlt) > 0 Then picDel.Visible = True Button1.Enabled = False txtAusz.Enabled = False picShow.Visible = True Else Button1.Enabled = True txtAusz.Enabled = True picShow.Visible = False End If 'If cbxabwDatum.Checked AndAlso dtbereitsausgezahlteUE IsNot Nothing Then ' 'If dtbereitsausgezahlteUE.Rows.Count > 0 Then ' ' txtberAusz100ZR.Text = CDbl(dtbereitsausgezahlteUE.Rows(0).Item("ue100").ToString) ' ' If istTeilzeit Then ' ' txtberAusz50ZR.Text = CDbl(dtbereitsausgezahlteUE.Rows(0).Item("ue50").ToString) + CDbl(dtbereitsausgezahlteUE.Rows(0).Item("ue0").ToString) ' ' Else ' ' txtberAusz25ZR.Text = CDbl(dtbereitsausgezahlteUE.Rows(0).Item("ue25").ToString) + CDbl(dtbereitsausgezahlteUE.Rows(0).Item("ue0").ToString) ' ' End If ' 'End If 'End If calxMaxauszahlbar() End If End Sub Private Sub txtAuszManuell_TextChanged(sender As Object, e As EventArgs) Handles txtAuszManuell.TextChanged 'If txtAuszManuell.Text <> "" AndAlso IsNumeric(txtAuszManuell.Text) Then ' txtAuszManuell_hhmm.Text = fixTime(txtAuszManuell.Text) 'End If End Sub Private Sub txtAuszManuell_hhmm_TextChanged(sender As Object, e As EventArgs) Handles txtAuszManuell_hhmm.TextChanged If txtAuszManuell_hhmm.Text <> "" AndAlso txtAuszManuell_hhmm.Text.Contains(":") AndAlso Not txtAuszManuell_hhmm.Text.EndsWith(":") Then Try Dim timeToDouble = txtAuszManuell_hhmm.Text Dim ts As TimeSpan = New TimeSpan(Integer.Parse(timeToDouble.Split(":"c)(0)), Integer.Parse(timeToDouble.Split(":"c)(1)), 0) txtAuszManuell.Text = Math.Round(ts.TotalHours, 2) 'txtAusz.Text = ts.Hours & "," & ts.Minutes Catch ex As Exception VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name) End Try End If End Sub Private Sub txtAusz_hhmm_TextChanged(sender As Object, e As EventArgs) Handles txtAusz_hhmm.TextChanged If txtAusz_hhmm.Text <> "" AndAlso txtAusz_hhmm.Text.Contains(":") AndAlso Not txtAusz_hhmm.Text.EndsWith(":") Then Try Dim timeToDouble = txtAusz_hhmm.Text Dim ts As TimeSpan = New TimeSpan(Integer.Parse(timeToDouble.Split(":"c)(0)), Integer.Parse(timeToDouble.Split(":"c)(1)), 0) txtAusz.Text = Math.Round(ts.TotalHours, 2) 'txtAusz.Text = ts.Hours & "," & ts.Minutes Catch ex As Exception VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name) End Try End If End Sub Private Sub PictureBox5_Click(sender As Object, e As EventArgs) Handles PictureBox5.Click Dim webAddress As String = "https://wiki.verag.ag/de/software/zeiterfassung_admin/zeiterfassung_admin#%C3%BCberstunden-auszahlen-%C3%BCber-avisosdldispo" Process.Start(webAddress) End Sub Private Sub LinkLabel1_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked Dim webAddress As String = "https://wiki.verag.ag/de/software/zeiterfassung_admin/zeiterfassung_admin#dokumente" Process.Start(webAddress) End Sub Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged, cbxalle.CheckedChanged If TabControl1.SelectedIndex = 1 Then Try Dim dtbereitsausgezahlteUE As DataTable Dim bereitsgezahlteueberstunden = "select uest_deleted as geloescht, uest_date as Datum ,isnull(uest_100,0) as ÜS100 , isnull(uest_50,0) as ÜS50, isnull(uest_25,0) as ÜS25, isnull(uest_0,0) as ÜS50_Saldo, isnull(uest_paidout_sum,0) as ausbezahlt, uest_systemuser as eingetragen_von ,uest_created as eingetragen_am, cast (case when isnull([uest_ignorePayoutDate],0) = 0 then 0 else 1 end as bit) ignoreAuszahlungsdatum FROM [ADMIN].[dbo].[tblUeberstunden] where uest_timasId = " & MA.mit_timasId & IIf(Not cbxalle.Checked, " and uest_deleted = 0", "") & " Order by uest_date" dtbereitsausgezahlteUE = SQL.loadDgvBySql(bereitsgezahlteueberstunden, "ADMIN", 100, True) With dgvUberstundenauszahlungen .DataSource = dtbereitsausgezahlteUE .Columns("geloescht").Visible = False .Columns("ignoreAuszahlungsdatum").Width = 50 .Columns("ignoreAuszahlungsdatum").HeaderText = "Auszdat. irgnoriert" .Columns("ignoreAuszahlungsdatum").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter For Each row As DataGridViewRow In .Rows If Not IsDBNull(row.Cells("geloescht").Value) Then If Not row.Cells("geloescht").Value Then row.DefaultCellStyle.BackColor = Color.LightGreen Else row.DefaultCellStyle.BackColor = Color.IndianRed End If End If Next End With Catch ex As Exception VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name) End Try End If End Sub Private Sub txtAusz_hhmm_KeyPress(sender As Object, e As KeyPressEventArgs) Select Case Asc(e.KeyChar) Case 48 To 57, 8, 44, 46, 58 Case Else e.Handled = True End Select End Sub Private Sub txtAusz_hhmm_Validated(sender As Object, e As EventArgs) End Sub Private Sub txtAusz100Netto_TextChanged(sender As Object, e As EventArgs) Handles txtAusz100Netto.TextChanged, txtAusz50Netto.TextChanged, txtAusz50vonSaldoNetto.TextChanged Dim sum As Double = 0 If txtAusz100Netto.Text <> "" AndAlso txtAusz100Netto.Text >= 0 Then sum += RoundOfDigits(CDbl(txtAusz100Netto.Text), 2) End If If txtAusz50Netto.Text <> "" AndAlso txtAusz50Netto.Text >= 0 Then sum += RoundOfDigits(CDbl(txtAusz50Netto.Text), 2) End If If txtAusz50vonSaldoNetto.Text <> "" AndAlso txtAusz50vonSaldoNetto.Text >= 0 Then sum += RoundOfDigits(CDbl(txtAusz50vonSaldoNetto.Text), 2) End If txtNettoSum.Text = sum End Sub Private Sub txtAusz_TextChanged(sender As Object, e As EventArgs) Handles txtAusz.TextChanged calcUeberstunden() 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 checkauszahlungsdatum As Boolean = False Dim meldung As String = "" Dim stichtag As Integer = 25 Dim ignoreAuszahlungsdatum As Boolean = False Select Case IIf(MA.mit_firma = "ALL", MA.mit_FirmaHaupt, MA.mit_firma) Case "ATILLA" meldung = " des Vormonats" If auszahlugsdatum.Month = Now.Month - 1 AndAlso Now.Day < 25 Or auszahlugsdatum.Month = Now.Month AndAlso Now.Day < 25 Or auszahlugsdatum.Month > Now.Month Then checkauszahlungsdatum = True End If Case Else meldung = " des Monats" If auszahlugsdatum.Month = Now.Month AndAlso Now.Day < 25 Or auszahlugsdatum.Month > Now.Month Then checkauszahlungsdatum = True End If End Select If Not checkauszahlungsdatum Then Dim check = InputBox("Die Ü-Std. von " & MonthName(auszahlugsdatum.Month) & " wurden uU schon in die Lohnverrechnung übertragen (Stichtag: " & stichtag & meldung & ")!" & vbNewLine & "Wollten Sie die Ü-Std. trotzdem in Timas austragen, dann bitte GELESEN eingeben!", "Auszahlungsmonat beachten!") If check <> "GELESEN" Then Exit Sub Else ignoreAuszahlungsdatum = True End If End If '65;"01-Lfd Saldo" '66;02-Krank '67;03-Urlaub '69;"10-Na 22-06" '70;"11-Sa 00-24" '72;"13-So 00-24" '73;"14-FtN 00-24" '438;04-Sonstige '986;Stundenlohn '987;FT-Ersatzzeit '993;"Ausz. ÜS" '1209;Mehrarbeit '1210;"Script hilfskonto WSaldo" '1227;Schichtzulage '1231;Urlaubsstunden '1235;"Überstunden 100% gesamt" '1257;Zuschlag '1272;"unbezahlter Urlaub" '1366;"Mehrarbeit am 25. des Monats gesamt" '1393;"Urlaub (Stunden)" '1550;"AUSZ ÜS 100%" '1551;"AUSZ ÜS 50%" '1598; Korrektur MJ - ÜBER API ansprechen! 'sum100 = RoundOfDigits(CDbl(txtAusz100.Text) * 100 / faktor100Zuschlag, 2) 'Übergabe in ZE-System als heruntergerechnete 100%ige bzw. 50%ige ÜS! 'sum50 = RoundOfDigits(CDbl(txtAusz50.Text) * 100 / faktor50Zuschlag, 2) 'sum0 = RoundOfDigits(CDbl(txtAusz50vonSaldo.Text) * 100 / faktorTeilzeit, 2) 'gesamt = IIf(overwrittenSum > 0, overwrittenSum, CDbl(txtAusz.Text)) Dim sum100, sum50, sum0, gesamt As Double sum100 = RoundOfDigits(CDbl(txtAusz100Netto.Text), 2) 'Übergabe in ZE-System als heruntergerechnete 100%ige bzw. 50%ige ÜS! sum50 = RoundOfDigits(CDbl(txtAusz50Netto.Text), 2) sum0 = RoundOfDigits(CDbl(txtAusz50vonSaldoNetto.Text), 2) gesamt = IIf(overwrittenSum > 0, overwrittenSum, CDbl(txtAusz.Text)) If faktor50Zuschlag = 150 AndAlso istTeilzeit Then 'Besprechung mit RESI ob Teilzeitmitarbeiter 50% ausgezahlt bekommen oder diese umgerechnet in 25% werden! '29.03.2024 MÜSSEN SOFERN SICH NICHT 40Wochenstunden ERREICHEN, ALS 25% AUSBEZAHLT WERDEN! 'MsgBox("Die Konstellation SA-Zuschlag und Teilzeitmitarbeiter ist noch nicht umgesetzt!") 'Exit Sub End If Dim txtAusgabe As New StringBuilder txtAusgabe.Append("Überstunden für " & MA.mit_vname & " " & MA.mit_nname & " mit " & auszahlugsdatum.ToShortDateString() & " auszahlen?" & vbNewLine) txtAusgabe.Append(sum100 & "x 100% ÜS :" & txtAusz100.Text & vbNewLine) If Not istTeilzeit Then txtAusgabe.Append(sum50 + sum0 & "x 50% ÜS: " & CDbl(txtAusz50.Text) + CDbl(txtAusz50vonSaldo.Text) & vbNewLine) Else txtAusgabe.Append(sum50 + sum0 & "x 25% ÜS: " & CDbl(txtAusz50.Text) + CDbl(txtAusz50vonSaldo.Text) & vbNewLine) End If txtAusgabe.Append("ÜS gesamt: " & gesamt) Dim aksAuszahlung As MsgBoxResult = MsgBox(txtAusgabe.ToString, 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 Or sum0 > 0) And Not istTeilzeit Then Dim row = dtsetEntries.NewRow row.Item("accountid") = 1551 row.Item("value") = (sum50 + sum0).ToString.Replace(",", ".") dtsetEntries.Rows.InsertAt(row, dtsetEntries.Rows.Count) End If 'ANMERKUNG -> TZ-Mitarbeiter bekommt die Stunden, die am SA gearbeitet wurden, auch als 25% ausgezahlt! If (sum50 > 0 Or sum0 > 0) And istTeilzeit Then Dim row = dtsetEntries.NewRow row.Item("accountid") = 1553 row.Item("value") = (sum50 + sum0).ToString.Replace(",", ".") dtsetEntries.Rows.InsertAt(row, dtsetEntries.Rows.Count) End If 'If istTeilzeit Then ' 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") = 1553 ' row.Item("value") = sum0.ToString.Replace(",", ".") ' dtsetEntries.Rows.InsertAt(row, dtsetEntries.Rows.Count) ' End If 'End If If gesamt > 0 Then Dim row = dtsetEntries.NewRow row.Item("accountid") = 1598 Dim value = gesamt * (-1) row.Item("value") = value.ToString.Replace(",", ".") dtsetEntries.Rows.InsertAt(row, dtsetEntries.Rows.Count) 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_overwriteValue = IIf(cbx100.Checked Or cbx50.Checked Or cx25.Checked, True, False) ues.uest_systemuser = VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME ues.uest_ignoreLimit = Not maxUberstundenpruefung ues.uest_maxUE = CDbl(txtSummeAuszb.Text) ues.uest_paidout_sum = gesamt ues.uest_isParttime = cbxTeilzeit.Checked ues.uest_ignorePayoutDate = ignoreAuszahlungsdatum If istTeilzeit Then ues.uest_25 = sum0 Else ues.uest_0 = sum0 End If Dim info As String = "" If timas.setTimeAccountEntries(MA, dtsetEntries, auszahlugsdatum, info) Then If ues.SAVE() Then MsgBox("Erfolgreich in Timas eingetragen") Else MsgBox("Fehler beim Speichern") End If Else MsgBox(info) End If End If End Sub Private Sub picDel_Click(sender As Object, e As EventArgs) Handles picDel.Click Dim txtAusgabe As New StringBuilder txtAusgabe.Append("Ausbezahlte Überstunden für " & MA.mit_vname & " " & MA.mit_nname & " mit " & auszahlugsdatum.ToShortDateString() & " zurücksetzen?" & vbNewLine) txtAusgabe.Append("100% ÜS: " & txtberAusz100.Text & vbNewLine) txtAusgabe.Append("50% ÜS: " & txtberAusz50.Text + IIf(Not istTeilzeit, CDbl(txtberAusz25.Text), 0) & vbNewLine) If istTeilzeit Then txtAusgabe.Append("25% ÜS: " & CDbl(txtberAusz25.Text) & vbNewLine) 'txtAusgabe.Append("ÜS gesamt: " & CDbl(txtberAusz100.Text) + CDbl(txtberAusz50.Text) + CDbl(txtberAusz25.Text)) Dim aksAuszahlung As MsgBoxResult = MsgBox(txtAusgabe.ToString, vbYesNo) If aksAuszahlung = vbYes Then Dim dtdeleteEntries As New DataTable dtdeleteEntries.Columns.Add("accountid", GetType(Integer)) Dim rowNew = dtdeleteEntries.NewRow rowNew.Item("accountid") = 1598 dtdeleteEntries.Rows.InsertAt(rowNew, dtdeleteEntries.Rows.Count) 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 txtberAusz25.Text <> "" AndAlso IsNumeric(txtberAusz25.Text) Then Dim row = dtdeleteEntries.NewRow row.Item("accountid") = 1553 dtdeleteEntries.Rows.InsertAt(row, dtdeleteEntries.Rows.Count) End If Dim info As String = "" If timas.deleteTimeAccounts(auszahlugsdatum, auszahlugsdatum, MA.mit_timasId, dtdeleteEntries, info) Then 'Dim dtEntriesset0 As New DataTable 'dtEntriesset0.Columns.Add("accountid", GetType(Integer)) 'dtEntriesset0.Columns.Add("value", GetType(Double)) 'Dim row0 = dtEntriesset0.NewRow 'row0.Item("accountid") = 1598 'row0.Item("value") = -0.000001 'darf nicht 0 sein!!!! 'dtEntriesset0.Rows.InsertAt(row0, dtEntriesset0.Rows.Count) 'timas.setTimeAccountEntries(MA, dtEntriesset0, auszahlugsdatum, "") Dim ues As New cUeberstunden(MA.mit_id, auszahlugsdatum.ToString("dd/MM/yyyy")) If ues.hasEntry Then ues.uest_deleted = True ues.uest_lastChanged = Now() ues.uest_systemuser = VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME ues.SAVE() End If MsgBox("Erfolgreich aus Timas zurückgesetzt!") picDel.Visible = False Thread.Sleep(1000) 'warten bis Eintrag in Timas-DB getUeberstunden(cbxabwDatum.Checked) Else MsgBox(info) 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 Private Sub changeTeilzeit() If istTeilzeit Then lbllfdSaldo.Text = "Mehrarbeit 25% (nur Teilzeit-MA)" Label4.Text = "Überstunden 50% (Sa) - werden als 25% ausbezahlt!" faktorTeilzeit = 100 ' werden Zeitlich nicht hochgerechnet, sondern nur mit aufschlag ausbezahlt, somit keine Hochrechnung um Faktor! Else lbllfdSaldo.Text = "lfd Saldo" Label4.Text = "Überstunden 50% (Sa)" faktorTeilzeit = 100 End If calcUeberstunden() calxMaxauszahlbar() End Sub Private Sub calcUeberstunden() 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 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 = RoundOfDigits(summeAusz - stunden100auszbere, 2) 'summeAusz = RoundOfDigits(summeAusz - RoundOfDigits(stunden100auszbere * 100 / faktor100Zuschlag, 2), 2) If summeAusz >= stunden50auszbere Then txtAusz50.Text = stunden50auszbere summeAusz = RoundOfDigits(summeAusz - stunden50auszbere, 2) 'summeAusz = RoundOfDigits(summeAusz - RoundOfDigits(stunden50auszbere * 100 / faktor50Zuschlag, 2), 2) ElseIf summeAusz < 0 Then txtAusz50.Text = "0" Else txtAusz50.Text = summeAusz summeAusz = RoundOfDigits(summeAusz - stunden50auszbere, 2) 'summeAusz = RoundOfDigits(summeAusz - RoundOfDigits(stunden50auszbere * 100 / faktor50Zuschlag, 2), 2) End If 'If summeAusz < 0 Then ' txtAusz50vonSaldo.Text = "0" 'ElseIf summeAusz > stundenlfdSaldo Then ' summeAusz = RoundOfDigits(stundenlfdSaldo - summeAusz, 2) ' txtAusz50vonSaldo.Text = summeAusz 'Else ' txtAusz50vonSaldo.Text = summeAusz 'End If If summeAusz < 0 Then txtAusz50vonSaldo.Text = "0" Else txtAusz50vonSaldo.Text = summeAusz End If End If If stundenlfdSaldo < 0 And cbxoverwrite.Checked Then txtAusz50vonSaldo.Text = 0 'Wenn Saldo negativ, dann nichts vom lfd Saldo vorschlagen! If Not refresh Then refresh = Not refresh End Sub Private Sub calxMaxauszahlbar() '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, "", "dailyBalanceYesterday") stunden100auszbere = RoundOfDigits(stunden100ausz * faktor100Zuschlag / 100, 2) stunden50auszbere = RoundOfDigits(stunden50ausz * faktor50Zuschlag / 100, 2) txt100x2.Text = stunden100auszbere txt50x15.Text = stunden50auszbere stundenlfdSaldo = CDbl(txtlfdSaldo.Text) stundenlfdSaldobere = RoundOfDigits(stundenlfdSaldo * faktorTeilzeit / 100, 2) txt50x1.Text = stundenlfdSaldobere stundenlfdSaldobere -= stunden100auszbere stundenlfdSaldobere -= stunden50auszbere stundenlfdSaldobere = Math.Round(stundenlfdSaldobere, 2) If stundenlfdSaldo <= 0 Then Button1.Enabled = False If (stunden100bereitsausbezahl + stunden50bereitsausbezahlt + stunden25bereitsausbezahlt) > 0 Then txtSummeAuszb.Text = stundenlfdSaldobere Else txtSummeAuszb.Text = stundenlfdSaldo End If End Sub Private Sub getAddDataFromTimas() For Each row As DataRow In customFields.Rows If Not IsDBNull(row.Item("value")) AndAlso Not IsDBNull(row.Item("name")) Then If row.Item("name") = "Teilzeit" Then If row.Item("value") = "true" Then cbxTeilzeit.Checked = True Else cbxTeilzeit.Checked = False End If End If If row.Item("name") = "SA-Zuschlag" Then If row.Item("value") = "true" Then faktor50Zuschlag = 150 'Samstagsarbeit wir im Timas hochgerechnet lblMA.Text = "Mitarbeiter (mit SA-Zuschlag):" Else faktor50Zuschlag = 100 'Samstagsarbeit wir im Timas NICHT hochgerechnet lblMA.Text = "Mitarbeiter (ohne SA-Zuschlag):" End If End If If row.Item("name") = "ÜS werden nicht auf lfd. Saldo hinzugezählt" Then If row.Item("value") = "true" Then Label5.Text = "ÜS werden nicht auf lfd. Saldo hinzugezählt!" ignoreFactor = True 'Zuschläge ohne Faktoren! faktor50Zuschlag = 100 faktor100Zuschlag = 100 faktorTeilzeit = 100 Else Label5.Text = "" ignoreFactor = False End If cbxabwDatum.Enabled = Not ignoreFactor End If If row.Item("name") = "Automatisch auszahlen" Then If row.Item("value") = "true" Then Label3.Text = "Mehrarbeit (autom. ausbez.)" Else Label3.Text = "Mehrarbeit (NICHT autom. ausbez.)" End If End If End If Next End Sub End Class