Files
SDL/VERAG_PROG_ALLGEMEIN/Mitarbeiterverzeichnis/frmUeberstundenauszahlen.vb
2024-08-30 16:55:58 +02:00

1063 lines
40 KiB
VB.net

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