
Imports System.Drawing
Imports System.Text
Imports System.Threading
Imports System.Windows.Forms

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()

        If VERAG_PROG_ALLGEMEIN.cBerechtignunen.CHECK_BERECHTIGUNG_bool("ADMIN", "SDL") Then
            cbxoverwrite.Enabled = True
        End If


    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 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
                ' If MA.mit_firma = "ATILLA" Then GoTo sonderRegelungAtilla : Laut ANDREAS mit 25.11.2025 wieder deaktiviert!!!!!!!!!!!! -> VILDAN soll hier direkt mit Andreas sprechen
                picDel.Visible = True
                Button1.Enabled = False
                txtAusz.Enabled = False
                picShow.Visible = True
            Else
                'sonderRegelungAtilla: Laut ANDREAS mit 25.11.2025 wieder deaktiviert!!!!!!!!!!!! -> VILDAN soll hier direkt mit Andreas sprechen
                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) as ignoreAuszahlungsdatum
                FROM [ADMIN].[dbo].[tblUeberstunden] 
                where uest_timasId = " & MA.mit_timasId & IIf(Not cbxalle.Checked, " and uest_deleted = 0", "") & "
                Order by uest_date"




                dgvUberstundenauszahlungen.SET_SQL(bereitsgezahlteueberstunden, "ADMIN")
                dgvUberstundenauszahlungen.LOAD()

                Dim cell As DataGridViewCell = New DataGridViewCheckBoxCell()

                With dgvUberstundenauszahlungen
                    '.AutoGenerateColumns = False
                    '.Columns("ignoreAuszahlungsdatum").CellTemplate = cell
                    .Columns("ignoreAuszahlungsdatum").Width = 70
                    .Columns("ignoreAuszahlungsdatum").HeaderText = "zu spät eingetragen"
                    .Columns("ignoreAuszahlungsdatum").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
                    .Columns("geloescht").Width = 70
                    .Columns("Datum").Width = 70
                    .Columns("ÜS100").Width = 70
                    .Columns("ÜS100").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                    .Columns("ÜS50").Width = 70
                    .Columns("ÜS50").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                    .Columns("ÜS25").Width = 70
                    .Columns("ÜS25").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                    .Columns("ÜS50_Saldo").Width = 70
                    .Columns("ÜS50_Saldo").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                    .Columns("ausbezahlt").Width = 70
                    .Columns("ausbezahlt").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight



                    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 dtpMonat_Leave(sender As Object, e As EventArgs) Handles dtpMonat.Leave, dtpBis.Leave
        getUeberstunden(cbxabwDatum.Checked)
    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

        If cbxoverwrite.Checked AndAlso (CDbl(txtSummeAuszb.Text) < CDbl(txtAuszManuell.Text) Or CDbl(txtSummeAuszb.Text) < CDbl(txtAuszManuell_hhmm.Text) Or CDbl(txtSummeAuszb.Text) < (CDbl(txtAusz100Netto.Text) + CDbl(txtAusz50.Text) + CDbl(txtAusz50vonSaldo.Text))) Then
            MsgBox("Auszahlungssumme übersteigt den aktuellen Saldo!" & vbNewLine & "Vorgang wird abgebrochen")
            Exit Sub
        End If

        Select Case IIf(MA.mit_firma = "ALL", MA.mit_FirmaHaupt, MA.mit_firma)
            '25.02.2025: ATILLA ist bereits auf das einheitliche Auszahlungsschema umgestiegen! 
            '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))

        If cbxabwDatum.Checked Then
            MsgBox("Das Zurücksetzen von bereits ausgezahlten Stunden bei abweichenden Datum wird aktuell (noch) nicht unterstützt!")
            Exit Sub
        End If

        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()


        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