448 lines
17 KiB
VB.net
448 lines
17 KiB
VB.net
Imports System.Runtime.InteropServices.ComTypes
|
|
Imports System.Threading
|
|
Imports System.Windows.Forms
|
|
Imports Microsoft.Office.Interop.Outlook
|
|
Imports Therefore.API
|
|
|
|
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 stunden100ausz, stunden50ausz, stunden100auszbere, stunden50auszbere, stunden100bereitsausbezahl, stunden50bereitsausbezahlt, mehrabeit, stundenlfdSaldo, stundenlfdSaldobere As Double
|
|
|
|
|
|
Sub New(mit_id)
|
|
|
|
' Dieser Aufruf ist für den Designer erforderlich.
|
|
InitializeComponent()
|
|
|
|
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
|
|
MA = New cMitarbeiter(mit_id)
|
|
tag = New cFeiertage(DateTime.Parse(dtpMonat.Value).Year)
|
|
Label7.Text = MA.mit_vname & " " & MA.mit_nname
|
|
timas.getTimeaccountList(dt)
|
|
|
|
|
|
Dim dv = New DataView(dt)
|
|
dv.RowFilter = "info like '%zuschlag%' Or name = 'Mehrarbeit' Or name like 'Überstunden%' Or info like 'Auszahlungskonto%' Or name like '%01-Lfd Saldo%'"
|
|
timeaccountdt = dv.ToTable
|
|
|
|
getUeberstunden(False)
|
|
|
|
|
|
End Sub
|
|
|
|
Private Sub 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 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 = calcUeberstunden(timeaccountdt, dtResult)
|
|
fillFields(dt)
|
|
dgvUeberstunden.DataSource = dt
|
|
|
|
End If
|
|
End Sub
|
|
|
|
|
|
Private Function calcUeberstunden(dtAccouts As DataTable, dtSumUeberstunden As DataTable) As DataTable
|
|
Dim dtmerged As DataTable
|
|
If dtAccouts IsNot Nothing AndAlso dtSumUeberstunden IsNot Nothing Then
|
|
|
|
dtmerged = dtAccouts.Clone
|
|
dtmerged.Merge(dtSumUeberstunden, False, MissingSchemaAction.Add)
|
|
|
|
If (dtmerged.Columns.Contains("accountType")) Then
|
|
dtmerged.Columns.Remove("accountType")
|
|
dtmerged.AcceptChanges()
|
|
End If
|
|
|
|
If (dtmerged.Columns.Contains("info")) Then
|
|
dtmerged.Columns.Remove("info")
|
|
dtmerged.AcceptChanges()
|
|
End If
|
|
|
|
If (dtmerged.Columns.Contains("number")) Then
|
|
dtmerged.Columns.Remove("number")
|
|
dtmerged.AcceptChanges()
|
|
End If
|
|
|
|
If (dtmerged.Columns.Contains("date")) Then
|
|
dtmerged.Columns.Remove("date")
|
|
dtmerged.AcceptChanges()
|
|
End If
|
|
|
|
|
|
Dim groups = dtmerged.AsEnumerable().
|
|
GroupBy(Function(row) New With {
|
|
Key .Id = row.Field(Of Integer)("accountid"),
|
|
Key .Multi = row.Field(Of String)("multiplier")
|
|
})
|
|
|
|
Dim tableResult = dtmerged.Clone()
|
|
For Each grp In groups
|
|
|
|
tableResult.Rows.Add(grp.Key.Id, grp.Key.Multi,
|
|
grp.Sum(Function(row)
|
|
Dim value = 0
|
|
If Not IsDBNull(row.Item("value")) Then value = row.Item("value")
|
|
Return value
|
|
End Function))
|
|
Next
|
|
|
|
|
|
End If
|
|
Return dtmerged
|
|
End Function
|
|
|
|
Public Sub fillFields(dt As DataTable)
|
|
|
|
'69 10-Na 22-06
|
|
'70 11-Sa 00-24 ===> 50%
|
|
'72 13-So 00-24
|
|
'73 14-FtN 00-24
|
|
'1209 Mehrarbeit
|
|
'1235 Überstunden 100% gesamt ===> 100%
|
|
|
|
picDel.Visible = False
|
|
|
|
For Each c As Control In Panel1.Controls
|
|
If TypeOf c Is TextBox Then
|
|
c.Text = "0"
|
|
End If
|
|
Next
|
|
|
|
stunden50bereitsausbezahlt = 0
|
|
stunden100bereitsausbezahl = 0
|
|
|
|
|
|
If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then
|
|
Dim calc As Double = 0
|
|
For Each r As DataRow In dt.Rows
|
|
If Not IsDBNull(r.Item("value")) Then
|
|
|
|
If r.Item("accountid") = "1209" Then
|
|
calc = CDbl(txtMehr.Text)
|
|
calc += r.Item("value") * (r.Item("multiplier") & "1")
|
|
txtMehr.Text = calc
|
|
mehrabeit = calc
|
|
End If
|
|
|
|
If r.Item("accountid") = "1235" Then
|
|
calc = CDbl(txt100.Text)
|
|
calc += r.Item("value") * (r.Item("multiplier") & "1")
|
|
txt100.Text = calc
|
|
stunden100ausz = calc
|
|
End If
|
|
|
|
If r.Item("accountid") = "70" Then
|
|
calc = CDbl(txt50.Text)
|
|
calc += r.Item("value") * (r.Item("multiplier") & "1")
|
|
txt50.Text = calc
|
|
stunden50ausz = calc
|
|
End If
|
|
|
|
|
|
If r.Item("accountid") = "1550" Then
|
|
calc = CDbl(txtberAusz100.Text)
|
|
calc += r.Item("value") * (r.Item("multiplier") & "1")
|
|
txtberAusz100.Text = calc
|
|
stunden100bereitsausbezahl = calc
|
|
End If
|
|
|
|
If r.Item("accountid") = "1551" Then
|
|
calc = CDbl(txtberAusz50.Text)
|
|
calc += r.Item("value") * (r.Item("multiplier") & "1")
|
|
txtberAusz50.Text = calc
|
|
stunden50bereitsausbezahlt = calc
|
|
End If
|
|
|
|
'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) > 0 Then
|
|
picDel.Visible = True
|
|
Button1.Enabled = False
|
|
txtAusz.Enabled = False
|
|
Else
|
|
Button1.Enabled = True
|
|
txtAusz.Enabled = True
|
|
End If
|
|
|
|
stunden100auszbere = stunden100ausz * 2
|
|
stunden50auszbere = stunden50ausz * 1.5
|
|
|
|
txt100x2.Text = stunden100auszbere
|
|
txt50x15.Text = stunden50auszbere
|
|
|
|
'If CDbl(txtlfdSaldo.Text) < 0 Or auszahlugsdatum.Month = Today.Month AndAlso auszahlugsdatum.Year = Today.Year Then
|
|
'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")
|
|
|
|
'End If
|
|
|
|
|
|
stundenlfdSaldo = CDbl(txtlfdSaldo.Text)
|
|
stundenlfdSaldobere = stundenlfdSaldo
|
|
|
|
stundenlfdSaldobere -= stunden100auszbere
|
|
stundenlfdSaldobere -= stunden50auszbere
|
|
stundenlfdSaldobere = Math.Round(stundenlfdSaldobere, 2)
|
|
|
|
|
|
If stundenlfdSaldo <= 0 Then Button1.Enabled = False
|
|
|
|
txtSummeAuszb.Text = stundenlfdSaldo
|
|
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Private Sub txtAusz_TextChanged(sender As Object, e As EventArgs) Handles txtAusz.TextChanged
|
|
|
|
|
|
|
|
If txtAusz.Text <> "" AndAlso IsNumeric(txtAusz.Text) Then
|
|
|
|
Dim summeAusz = CDbl(txtAusz.Text)
|
|
If summeAusz <= 0 Then
|
|
txtAusz50vonSaldo.Text = "0"
|
|
txtAusz50.Text = "0"
|
|
txtAusz100.Text = "0"
|
|
txtAusz.Text = "0"
|
|
Button1.Enabled = False
|
|
Exit Sub
|
|
End If
|
|
|
|
txt100x2.Text = stunden100auszbere
|
|
txt50x15.Text = stunden50auszbere
|
|
txt50x1.Text = stundenlfdSaldobere
|
|
|
|
If stundenlfdSaldo >= summeAusz Then 'Prüfung, damit nicht zuviele ÜS ausbezahlt werden können!
|
|
|
|
Button1.Enabled = True
|
|
|
|
Else
|
|
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 = Math.Round(summeAusz - stunden100auszbere, 2)
|
|
|
|
If summeAusz >= stunden50auszbere Then
|
|
txtAusz50.Text = stunden50auszbere
|
|
summeAusz = Math.Round(summeAusz - stunden50auszbere, 2)
|
|
ElseIf summeAusz < 0 Then
|
|
txtAusz50.Text = "0"
|
|
Else
|
|
txtAusz50.Text = summeAusz
|
|
summeAusz = Math.Round(summeAusz - stunden50auszbere, 2)
|
|
End If
|
|
|
|
If summeAusz >= stundenlfdSaldo Then
|
|
txtAusz50vonSaldo.Text = stundenlfdSaldo
|
|
summeAusz = Math.Round(summeAusz - stundenlfdSaldo, 2)
|
|
ElseIf summeAusz < 0 Then
|
|
txtAusz50vonSaldo.Text = "0"
|
|
Else
|
|
txtAusz50vonSaldo.Text = summeAusz
|
|
summeAusz = Math.Round(summeAusz - stundenlfdSaldo, 2)
|
|
End If
|
|
|
|
End If
|
|
|
|
|
|
|
|
End Sub
|
|
|
|
Private Sub cbxabwDatum_CheckedChanged(sender As Object, e As EventArgs) Handles cbxabwDatum.CheckedChanged
|
|
If cbxabwDatum.Checked Then
|
|
lblBis.Visible = True
|
|
dtpBis.Visible = True
|
|
lblMonat.Text = "bis"
|
|
dtpMonat.CustomFormat = "yyyy/MM/dd"
|
|
|
|
Else
|
|
lblBis.Visible = False
|
|
dtpBis.Visible = False
|
|
lblMonat.Text = "Monat"
|
|
dtpMonat.CustomFormat = "yyyy/MM"
|
|
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
|
|
|
|
|
|
Dim sum100, sum50, sum0, gesamt As Double
|
|
sum100 = RoundOfDigits(CDbl(txtAusz100.Text) * 0.5, 2) 'Übergabe in ZE-System als heruntergerechnete 100%ige bzw. 50%ige ÜS!
|
|
sum50 = RoundOfDigits(CDbl(txtAusz50.Text) * 100 / 150, 2)
|
|
sum0 = CDbl(txtAusz50vonSaldo.Text)
|
|
gesamt = CDbl(txtAusz.Text)
|
|
|
|
Dim aksAuszahlung As MsgBoxResult = MsgBox("Überstunden für " & MA.mit_vname & " " & MA.mit_nname & " mit " & auszahlugsdatum.ToShortDateString() & " auszahlen?" & vbNewLine & sum100 & "x 100% ÜS :" & txtAusz100.Text & vbNewLine & sum50 & "x 50% ÜS: " & CDbl(txtAusz50.Text) + CDbl(txtAusz50vonSaldo.Text) & vbNewLine & "ÜS gesamt: " & gesamt, vbYesNo)
|
|
|
|
If aksAuszahlung = vbYes Then
|
|
Dim dtsetEntries As New DataTable
|
|
|
|
dtsetEntries.Columns.Add("accountid", GetType(Integer))
|
|
dtsetEntries.Columns.Add("value", GetType(String))
|
|
|
|
If sum100 >= 0 Then
|
|
Dim row = dtsetEntries.NewRow
|
|
row.Item("accountid") = 1550
|
|
row.Item("value") = sum100.ToString.Replace(",", ".")
|
|
dtsetEntries.Rows.InsertAt(row, dtsetEntries.Rows.Count)
|
|
End If
|
|
|
|
If sum50 >= 0 Then
|
|
Dim row = dtsetEntries.NewRow
|
|
row.Item("accountid") = 1551
|
|
row.Item("value") = sum50.ToString.Replace(",", ".")
|
|
dtsetEntries.Rows.InsertAt(row, dtsetEntries.Rows.Count)
|
|
End If
|
|
|
|
If sum0 >= 0 Then
|
|
Dim row = dtsetEntries.NewRow
|
|
row.Item("accountid") = 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_0 = sum0
|
|
ues.uest_systemuser = VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME
|
|
|
|
|
|
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 aksAuszahlung As MsgBoxResult = MsgBox("Ausbezahlte Überstunden für " & MA.mit_vname & " " & MA.mit_nname & " mit " & auszahlugsdatum.ToShortDateString() & " zurücksetzen?" & vbNewLine & "100% ÜS: " & txtberAusz100.Text & vbNewLine & "50% ÜS: " & txtberAusz50.Text & vbNewLine & "ÜS gesamt: " & CDbl(txtberAusz100.Text) + CDbl(txtberAusz50.Text), vbYesNo)
|
|
If aksAuszahlung = vbYes Then
|
|
Dim dtdeleteEntries As New DataTable
|
|
|
|
dtdeleteEntries.Columns.Add("accountid", GetType(Integer))
|
|
|
|
|
|
Dim rowNew = dtdeleteEntries.NewRow
|
|
rowNew.Item("accountid") = 993
|
|
dtdeleteEntries.Rows.InsertAt(rowNew, dtdeleteEntries.Rows.Count)
|
|
|
|
If txtAusz100.Text <> "" AndAlso IsNumeric(txtAusz100.Text) Then
|
|
Dim row = dtdeleteEntries.NewRow
|
|
row.Item("accountid") = 1550
|
|
dtdeleteEntries.Rows.InsertAt(row, dtdeleteEntries.Rows.Count)
|
|
End If
|
|
|
|
If txtAusz50.Text <> "" AndAlso IsNumeric(txtAusz50.Text) Then
|
|
Dim row = dtdeleteEntries.NewRow
|
|
row.Item("accountid") = 1551
|
|
dtdeleteEntries.Rows.InsertAt(row, dtdeleteEntries.Rows.Count)
|
|
End If
|
|
|
|
If timas.deleteTimeAccounts(auszahlugsdatum, auszahlugsdatum, MA.mit_timasId, dtdeleteEntries) Then
|
|
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
|
|
End Class |