Files
SDL/VERAG_PROG_ALLGEMEIN/Mitarbeiterverzeichnis/frmUeberstundenauszahlen.vb
2024-02-27 12:54:38 +01:00

569 lines
21 KiB
VB.net

Imports System.Text
Imports System.Threading
Imports System.Windows.Forms
Public Class frmUeberstundenauszahlen
Dim MA As cMitarbeiter = Nothing
Dim timas As cTimasAPI = New cTimasAPI
Dim dt As New DataTable
Dim timeaccountdt As New DataTable
Dim dtResult As New DataTable
Dim tag As cFeiertage
Dim auszahlugsdatum As New Date
Dim maxUberstundenpruefung As Boolean = True
Dim istTeilzeit As Boolean = False
Dim faktorTeilzeit As Double = 100
Dim stunden100ausz, stunden50ausz, stunden100auszbere, stunden50auszbere, stunden100bereitsausbezahl, stunden50bereitsausbezahlt, stunden25bereitsausbezahlt, mehrabeit, stundenlfdSaldo, stundenlfdSaldobere, overwrittenSum As Double
Sub New(mit_id)
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
MA = New cMitarbeiter(mit_id)
tag = New cFeiertage(DateTime.Parse(dtpMonat.Value).Year)
Label7.Text = MA.mit_vname & " " & MA.mit_nname
timas.getTimeaccountList(dt)
Dim dv = New DataView(dt)
dv.RowFilter = "info like '%zuschlag%' Or name = 'Mehrarbeit' Or name like 'Überstunden%' Or info like 'Auszahlungskonto%' Or name like '%01-Lfd Saldo%'"
timeaccountdt = dv.ToTable
getUeberstunden(False)
End Sub
Private Sub cbxoverwrite_CheckedChanged(sender As Object, e As EventArgs) Handles cbxoverwrite.CheckedChanged
If Not cbxoverwrite.Checked Then
maxUberstundenpruefung = False 'Limit für max. auszahlbar deaktivieren!
Else
If Not maxUberstundenpruefung Then
maxUberstundenpruefung = True
getUeberstunden(cbxabwDatum.Checked)
End If
End If
End Sub
Private Sub DateTimePicker1_ValueChanged(sender As Object, e As EventArgs) Handles dtpMonat.ValueChanged, dtpBis.ValueChanged
getUeberstunden(cbxabwDatum.Checked)
End Sub
Private Sub 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 = enddate
Else
startdate = tag.GetFirstyDayYInxMonth(DateTime.Parse(dtpMonat.Value).DayOfWeek, DateTime.Parse(dtpMonat.Value).Month, DateTime.Parse(dtpMonat.Value).Year, True)
enddate = tag.GetLastyDayYInxMonth(DateTime.Parse(dtpMonat.Value).DayOfWeek, DateTime.Parse(dtpMonat.Value).Month, DateTime.Parse(dtpMonat.Value).Year, True)
auszahlugsdatum = enddate
End If
timas.getTimeAccounts(startdate, enddate, MA.mit_timasId, timeaccountdt, dtResult)
If dtResult.Rows.Count < 1 Then
MsgBox("Für den gewählten Zeitraum konnten keine Stunden ermittelt werden!")
Panel1.Enabled = False
Exit Sub
Else
Panel1.Enabled = True
End If
Dim dt = getUeberstunden(timeaccountdt, dtResult)
fillFields(dt)
dgvUeberstunden.DataSource = dt
End If
End Sub
Private Function getUeberstunden(dtAccouts As DataTable, dtSumUeberstunden As DataTable) As DataTable
Dim dtmerged As DataTable
If dtAccouts IsNot Nothing AndAlso dtSumUeberstunden IsNot Nothing Then
dtmerged = dtAccouts.Clone
dtmerged.Merge(dtSumUeberstunden, False, MissingSchemaAction.Add)
If (dtmerged.Columns.Contains("accountType")) Then
dtmerged.Columns.Remove("accountType")
dtmerged.AcceptChanges()
End If
If (dtmerged.Columns.Contains("info")) Then
dtmerged.Columns.Remove("info")
dtmerged.AcceptChanges()
End If
If (dtmerged.Columns.Contains("number")) Then
dtmerged.Columns.Remove("number")
dtmerged.AcceptChanges()
End If
If (dtmerged.Columns.Contains("date")) Then
dtmerged.Columns.Remove("date")
dtmerged.AcceptChanges()
End If
Dim groups = dtmerged.AsEnumerable().
GroupBy(Function(row) New With {
Key .Id = row.Field(Of Integer)("accountid"),
Key .Multi = row.Field(Of String)("multiplier")
})
Dim tableResult = dtmerged.Clone()
For Each grp In groups
tableResult.Rows.Add(grp.Key.Id, grp.Key.Multi,
grp.Sum(Function(row)
Dim value = 0
If Not IsDBNull(row.Item("value")) Then value = row.Item("value")
Return value
End Function))
Next
End If
Return dtmerged
End Function
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
getUeberstunden(cbxabwDatum.Checked)
End Sub
Private Sub txtAusz100_TextChanged(sender As Object, e As EventArgs) Handles txtAusz100.TextChanged, txtAusz50.TextChanged, txtAusz50vonSaldo.TextChanged
overwrittenSum = 0
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 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
txtAuszManuell.Visible = True
Else
txtAusz.Visible = True
txtAuszManuell.Visible = False
End If
End Sub
Public Sub fillFields(dt As DataTable)
'69 10-Na 22-06
'70 11-Sa 00-24 ===> 50%
'72 13-So 00-24
'73 14-FtN 00-24
'1209 Mehrarbeit
'1235 Überstunden 100% gesamt ===> 100%
picDel.Visible = False
For Each c As Control In Panel1.Controls
If TypeOf c Is TextBox Then
c.Text = "0"
End If
Next
'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
Else
Button1.Enabled = True
txtAusz.Enabled = True
End If
calxMaxauszahlbar()
End If
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 sum100, sum50, sum0, gesamt As Double
sum100 = RoundOfDigits(CDbl(txtAusz100.Text) * 100 / 200, 2) 'Übergabe in ZE-System als heruntergerechnete 100%ige bzw. 50%ige ÜS!
sum50 = RoundOfDigits(CDbl(txtAusz50.Text) * 100 / 150, 2)
sum0 = RoundOfDigits(CDbl(txtAusz50vonSaldo.Text) * 100 / faktorTeilzeit, 2)
gesamt = IIf(overwrittenSum > 0, overwrittenSum, CDbl(txtAusz.Text))
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)
txtAusgabe.Append(IIf(Not istTeilzeit, sum50 + sum0, sum50) & "x 50% ÜS: " & CDbl(txtAusz50.Text) + IIf(Not istTeilzeit, CDbl(txtAusz50vonSaldo.Text), 0) & vbNewLine)
If istTeilzeit Then txtAusgabe.Append(sum0 & "x 25% ÜS: " & CDbl(txtAusz50vonSaldo.Text) & vbNewLine)
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 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") = IIf(istTeilzeit, 1553, 1551)
row.Item("value") = sum0.ToString.Replace(",", ".")
dtsetEntries.Rows.InsertAt(row, dtsetEntries.Rows.Count)
End If
If gesamt > 0 Then 'vom ldf Saldo, ev. über API Möglich monatliche Korrektur direkt zu befüllen, dann muss dieser If Zweig überarbeitet werden!!!!!!!!!!!!!!
Dim row = dtsetEntries.NewRow
row.Item("accountid") = 993
row.Item("value") = gesamt.ToString.Replace(",", ".")
dtsetEntries.Rows.InsertAt(row, dtsetEntries.Rows.Count)
End If
Dim ues As New cUeberstunden(MA.mit_id, auszahlugsdatum.ToShortDateString, Now())
ues.uest_timasId = MA.mit_timasId
ues.uest_100 = sum100
ues.uest_50 = sum50
ues.uest_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)
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) AndAlso ues.SAVE() Then
MsgBox("Erfolgreich in Timas eingetragen")
Else
MsgBox(info)
End If
End If
End Sub
Private Sub picDel_Click(sender As Object, e As EventArgs) Handles picDel.Click
Dim 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") = 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
If timas.deleteTimeAccounts(auszahlugsdatum, auszahlugsdatum, MA.mit_timasId, dtdeleteEntries) Then
Dim ues As New cUeberstunden(MA.mit_id, auszahlugsdatum.ToShortDateString)
ues.uest_deleted = True
ues.uest_lastChanged = Now()
ues.uest_systemuser = VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME
ues.SAVE()
MsgBox("Erfolgreich aus Timas zurückgesetzt!")
picDel.Visible = False
Thread.Sleep(1000) 'warten bis Eintrag in Timas-DB
getUeberstunden(cbxabwDatum.Checked)
End If
End If
End Sub
Public Function RoundOfDigits(ByVal Value As Decimal, ByVal Digits As Integer) As Decimal
If Digits < 0 Then Return Math.Round(Value * CDec(Math.Pow(10, Digits)), 0, MidpointRounding.AwayFromZero) / CDec(Math.Pow(10, Digits))
Return Math.Round(Value, Digits)
End Function
Private Sub changeTeilzeit()
If istTeilzeit Then
lbllfdSaldo.Text = "Mehrarbeit 25% (nur Teilzeit-MA)"
faktorTeilzeit = 100 ' werden Zeitlich nicht hochgerechnet, sondern nur mit aufschlag ausbezahlt, somit keine Hochrechnung um Faktor!
Else
lbllfdSaldo.Text = "lfd Saldo"
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
'txt50x1.Text = RoundOfDigits(stundenlfdSaldobere * faktorTeilzeit / 100, 2)
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)
If summeAusz >= stunden50auszbere Then
txtAusz50.Text = stunden50auszbere
summeAusz = RoundOfDigits(summeAusz - stunden50auszbere, 2)
ElseIf summeAusz < 0 Then
txtAusz50.Text = "0"
Else
txtAusz50.Text = summeAusz
summeAusz = RoundOfDigits(summeAusz - stunden50auszbere, 2)
End If
If summeAusz >= stundenlfdSaldo Then
txtAusz50vonSaldo.Text = stundenlfdSaldo
summeAusz = RoundOfDigits(summeAusz - stundenlfdSaldo, 2)
ElseIf summeAusz < 0 Then
txtAusz50vonSaldo.Text = "0"
Else
txtAusz50vonSaldo.Text = summeAusz
summeAusz = RoundOfDigits(summeAusz - stundenlfdSaldo, 2)
End If
End If
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, "", "overallBalance")
stunden100auszbere = RoundOfDigits(stunden100ausz * 2, 2)
stunden50auszbere = RoundOfDigits(stunden50ausz * 1.5, 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
txtSummeAuszb.Text = stundenlfdSaldo
'txtSummeAuszb.Text = stundenlfdSaldobere
End Sub
End Class