Fiskal, Formualre, etc,

This commit is contained in:
2026-03-02 08:39:12 +01:00
parent 6434bcf08e
commit d452db8e16
9 changed files with 613 additions and 200 deletions

View File

@@ -1,4 +1,5 @@
Imports System.IO
Imports System.Data.SqlClient
Imports System.IO
Imports System.Web.UI.WebControls.Expressions
Imports VERAG_PROG_ALLGEMEIN
@@ -12,10 +13,11 @@ Public Class usrCntlFaktAbrechnung
Dim FIRMA As VERAG_PROG_ALLGEMEIN.cFirmen = Nothing
Shared SQL As New VERAG_PROG_ALLGEMEIN.SQL
Dim refactored As Boolean = False
Public SAVED = True ' Eigenschaft, ob das Formular gespeichert ist oder verändert wurde
Dim loaded As Boolean = False
Dim allowGetValues As Boolean = True
Dim allowGetValues As Boolean = False
Public Event EVENT_SAVED()
Public Event EVENT_DELETED()
Public Event SOMETHING_CHANGED(RK_ID)
@@ -1319,7 +1321,16 @@ Public Class usrCntlFaktAbrechnung
If FIRMA IsNot Nothing AndAlso FIRMA.Firma_ID = 19 AndAlso RECHNUNG.DruckDatumZeit Is Nothing Then
Dim isRC As Boolean = If(r.Cells("ReverseCharge").Value IsNot DBNull.Value, r.Cells("ReverseCharge").Value, False)
If Not preistaffelIsSet Then setMWSTABRfromSPEDinPOS(r, landNr, landBez, summeRMC, summeFremd, False, False, preistaffelIsSet, antrag, isVZ)
If Not preistaffelIsSet Then
If refactored Then
SetMWSTFromSpedRefactored(r, landBez, summeRMC, summeFremd, False, False, preistaffelIsSet, antrag, isVZ)
Else
setMWSTABRfromSPEDinPOS(r, landNr, landBez, summeRMC, summeFremd, False, False, preistaffelIsSet, antrag, isVZ)
End If
End If
End If
Catch ex As Exception : End Try
@@ -1496,7 +1507,13 @@ Public Class usrCntlFaktAbrechnung
If r IsNot Nothing AndAlso r.Cells("Anzahl").Value <> 0 AndAlso IsNumeric(r.Cells("Preis").Value) AndAlso r.Cells("Preis").Value <> 0 AndAlso isMWSTBearb Then 'r.Cells("LeistungsNr").Value <> bearbNrRMC AndAlso
If Not preistaffelIsSet Then
setMWSTABRfromSPEDinPOS(r, landNr, landBez, summeRMC, summeFremd, (containRMC AndAlso containFremd), posSet, preistaffelIsSet, antrag, isVZ, True, sumOffertRMC, minBetragRMC, sumOffertFremd, minBetragFremd)
If refactored Then
SetMWSTFromSpedRefactored(r, landBez, summeRMC, summeFremd, (containRMC AndAlso containFremd), posSet, preistaffelIsSet, antrag, isVZ, True, sumOffertRMC, sumOffertFremd)
Else
setMWSTABRfromSPEDinPOS(r, landNr, landBez, summeRMC, summeFremd, (containRMC AndAlso containFremd), posSet, preistaffelIsSet, antrag, isVZ, True, sumOffertRMC, minBetragRMC, sumOffertFremd, minBetragFremd)
End If
End If
'If posSet Then Exit For
End If
@@ -1911,53 +1928,53 @@ Public Class usrCntlFaktAbrechnung
'soll immer alle POS bekommen! laut Lidya! 28.04.2025 - aber nicht im Excel-Format sondern als PDF-Batinic 15.05.2025
Dim dtPOSList As New DataTable
Dim prt As String = func.generatePosList(USTV, "", "", "", False, "prt", dtPOSList, isVZ, IIf(RECHNUNG IsNot Nothing, RECHNUNG.RK_ID, -1))
If prt <> "" Then
Dim prt As String = func.generatePosList(USTV, "", "", "", False, "prt", dtPOSList, isVZ, IIf(RECHNUNG IsNot Nothing, RECHNUNG.RK_ID, -1))
If prt <> "" Then
Try
Try
Dim rpt As New rptMWSTListe
Dim rpt As New rptMWSTListe
rpt.DataSource = dtPOSList
rpt.DataSource = dtPOSList
rpt.GroupHeader1.DataField = "Firma_ID" 'Gruppierung
rpt.GroupHeader1.DataField = "Firma_ID" 'Gruppierung
If rpt.DataSource.rows.count > 0 Then
If rpt.DataSource.rows.count > 0 Then
Dim AD As New cAdressen(USTV.UStVAn_KuNr)
Dim sum As Double = 0
Dim AD As New cAdressen(USTV.UStVAn_KuNr)
Dim sum As Double = 0
rpt.lblVatNo.Text = USTV.UStVAn_Steuernummer
rpt.lblCompanyname.Text = AD.Name_1 & " " & AD.Name_2
rpt.lblDat.Text = Now.ToShortDateString
rpt.lblVatNo.Text = USTV.UStVAn_Steuernummer
rpt.lblCompanyname.Text = AD.Name_1 & " " & AD.Name_2
rpt.lblDat.Text = Now.ToShortDateString
AddHandler rpt.Detail.Format, Sub()
AddHandler rpt.Detail.Format, Sub()
rpt.lblNumber.Text = rpt.Fields.Item("Number").Value()
rpt.lblGoods.Text = rpt.Fields.Item("Name of service").Value()
rpt.lblName.Text = rpt.Fields.Item("Name of supplier").Value()
rpt.lblTax.Text = CDbl(rpt.Fields.Item("Amount of tax refund").Value()).ToString("N2")
rpt.lblDate.Text = CDate((rpt.Fields.Item("Date of Invoice").Value())).ToShortDateString
rpt.lblInvoiceNo.Text = rpt.Fields.Item("Number of invoice").Value()
rpt.lblNumber.Text = rpt.Fields.Item("Number").Value()
rpt.lblGoods.Text = rpt.Fields.Item("Name of service").Value()
rpt.lblName.Text = rpt.Fields.Item("Name of supplier").Value()
rpt.lblTax.Text = CDbl(rpt.Fields.Item("Amount of tax refund").Value()).ToString("N2")
rpt.lblDate.Text = CDate((rpt.Fields.Item("Date of Invoice").Value())).ToShortDateString
rpt.lblInvoiceNo.Text = rpt.Fields.Item("Number of invoice").Value()
sum += CDbl(rpt.Fields.Item("Amount of tax refund").Value()).ToString("N2")
End Sub
sum += CDbl(rpt.Fields.Item("Amount of tax refund").Value()).ToString("N2")
End Sub
AddHandler rpt.GroupFooter1.Format, Sub()
rpt.lblSumme.Text = sum.ToString("N2")
rpt.lblWahrung.Text = USTV.UStVAn_Währungscode
AddHandler rpt.GroupFooter1.Format, Sub()
rpt.lblSumme.Text = sum.ToString("N2")
rpt.lblWahrung.Text = USTV.UStVAn_Währungscode
End Sub
End Sub
Dim tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getTMPPath(SPEDBUCH.AbfertigungsNr, ".pdf", , False)
Dim p As New GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport
rpt.Run(False)
p.NeverEmbedFonts = ""
p.Export(rpt.Document, tmpPath)
rpt.Dispose()
Dim tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getTMPPath(SPEDBUCH.AbfertigungsNr, ".pdf", , False)
Dim p As New GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport
rpt.Run(False)
p.NeverEmbedFonts = ""
p.Export(rpt.Document, tmpPath)
rpt.Dispose()
Dim DS As New VERAG_PROG_ALLGEMEIN.cDATENSERVER("DOKUMENTE", "MDM", "POS_LISTE", "", "", SPEDBUCH.AbfertigungsNr & ".pdf", USTV.UStVAn_KuNr, False)
'If Not DS.hasITEMS Then 'immer neu generieren, falls der Antrag geändert wurde, muss der die neue POS-Liste geladen werden!!!!
@@ -1967,69 +1984,69 @@ Public Class usrCntlFaktAbrechnung
If .Rows.Count > 0 Then
For Each r As DataGridViewRow In .Rows
If .Columns.Contains("clmnBezeichnung") AndAlso r.Cells("clmnBezeichnung").Value = DS.da_name AndAlso RECHNUNG.DruckDatumZeit Is Nothing Then
.Rows.Remove(r)
For Each ATT As cRechnungsausgangAnhaenge In RECHNUNG.ANHAENGE
If ATT.Bezeichnung = DS.da_name AndAlso RECHNUNG.DruckDatumZeit Is Nothing Then
Dim ANH_DEL As New VERAG_PROG_ALLGEMEIN.cRechnungsausgangAnhaenge()
ANH_DEL.DELETE(ATT.RK_ID, ATT.dsId)
End If
Next
For Each r As DataGridViewRow In .Rows
If .Columns.Contains("clmnBezeichnung") AndAlso r.Cells("clmnBezeichnung").Value = DS.da_name AndAlso RECHNUNG.DruckDatumZeit Is Nothing Then
.Rows.Remove(r)
For Each ATT As cRechnungsausgangAnhaenge In RECHNUNG.ANHAENGE
If ATT.Bezeichnung = DS.da_name AndAlso RECHNUNG.DruckDatumZeit Is Nothing Then
Dim ANH_DEL As New VERAG_PROG_ALLGEMEIN.cRechnungsausgangAnhaenge()
ANH_DEL.DELETE(ATT.RK_ID, ATT.dsId)
End If
Next
End If
Next
End If
If RECHNUNG.ANHAENGE.Count > 0 Then
If RECHNUNG.DruckDatumZeit IsNot Nothing AndAlso Not RECHNUNG.ANHAENGE.Exists(Function(c) c.Bezeichnung = DS.da_name) Or RECHNUNG.DruckDatumZeit Is Nothing Then
.Rows.Add(-1, "POS-LIST", DS.da_name, DS.da_id, -1)
End If
Else
Next
End If
If RECHNUNG.ANHAENGE.Count > 0 Then
If RECHNUNG.DruckDatumZeit IsNot Nothing AndAlso Not RECHNUNG.ANHAENGE.Exists(Function(c) c.Bezeichnung = DS.da_name) Or RECHNUNG.DruckDatumZeit Is Nothing Then
.Rows.Add(-1, "POS-LIST", DS.da_name, DS.da_id, -1)
End If
Else
.Rows.Add(-1, "POS-LIST", DS.da_name, DS.da_id, -1)
End If
End If
Catch ex As Exception
MsgBox(ex.Message & ex.StackTrace)
End Try
Catch ex As Exception
MsgBox(ex.Message & ex.StackTrace)
End Try
End If
End If
If dt IsNot Nothing Then
For Each r In dt.Rows
If dt IsNot Nothing Then
For Each r In dt.Rows
'WARUM NOCHMAL not null??? -> weil laut lydia erst ab 2025 (und ab diesem Datum wird die daid in der USTVA_POS befüllt) die Dokumente digital mitgeschickt werden, vorher noch alles per POST!!!!!!!!!!!!!!!!!!
If Not IsDBNull(r("UStVPo_daId")) Then
'WARUM NOCHMAL not null??? -> weil laut lydia erst ab 2025 (und ab diesem Datum wird die daid in der USTVA_POS befüllt) die Dokumente digital mitgeschickt werden, vorher noch alles per POST!!!!!!!!!!!!!!!!!!
If Not IsDBNull(r("UStVPo_daId")) Then
If RECHNUNG.ANHAENGE IsNot Nothing AndAlso Not RECHNUNG.ANHAENGE.Exists(Function(c) c.dsId = r("UStVPo_daId")) Then 'wenn der Anhang schon existiert!
If RECHNUNG.ANHAENGE IsNot Nothing AndAlso Not RECHNUNG.ANHAENGE.Exists(Function(c) c.dsId = r("UStVPo_daId")) Then 'wenn der Anhang schon existiert!
Dim DAID As String = ""
DAID = func.getPDF(r("UStVPo_SchnittstellenNr"), r("UStVPo_ReNr"), r("UStVPo_ReDat"), r("UStVPo_daId"), False, True, Antrag_LandKz, USTV, New cFakturierung, True)
Dim DAID As String = ""
DAID = func.getPDF(r("UStVPo_SchnittstellenNr"), r("UStVPo_ReNr"), r("UStVPo_ReDat"), r("UStVPo_daId"), False, True, Antrag_LandKz, USTV, New cFakturierung, True)
Dim nameLief As String = ""
Dim nameLief As String = ""
Select Case r("UStVPo_SchnittstellenNr")
Case 1 : nameLief = "VERAG-" 'Verag360
Case 2, 8, 12 : nameLief = "IDS-"
Case 3 : nameLief = "IT-"
Case 4, 9 : nameLief = "MSE-"
Case 5, 10 : nameLief = "UTA-"
Case 6, 11 : nameLief = "PLOSE-"
Case 7 : nameLief = "RMC-"
End Select
Select Case r("UStVPo_SchnittstellenNr")
Case 1 : nameLief = "VERAG-" 'Verag360
Case 2, 8, 12 : nameLief = "IDS-"
Case 3 : nameLief = "IT-"
Case 4, 9 : nameLief = "MSE-"
Case 5, 10 : nameLief = "UTA-"
Case 6, 11 : nameLief = "PLOSE-"
Case 7 : nameLief = "RMC-"
End Select
nameLief &= "RE"
nameLief &= "RE"
If DAID <> "" AndAlso IsNumeric(DAID) AndAlso r("UStVPo_SchnittstellenNr") <> 1 Then
Dim daidno As Integer = CInt(DAID)
Dim ds As New cDATENSERVER(daidno)
.Rows.Add(-1, nameLief, ds.da_name, ds.da_id, -1)
If DAID <> "" AndAlso IsNumeric(DAID) AndAlso r("UStVPo_SchnittstellenNr") <> 1 Then
Dim daidno As Integer = CInt(DAID)
Dim ds As New cDATENSERVER(daidno)
.Rows.Add(-1, nameLief, ds.da_name, ds.da_id, -1)
ElseIf DAID <> "" AndAlso r("UStVPo_SchnittstellenNr") = 1 Then
ElseIf DAID <> "" AndAlso r("UStVPo_SchnittstellenNr") = 1 Then
Dim DS_Eigenrechnungen As New VERAG_PROG_ALLGEMEIN.cDATENSERVER("DOKUMENTE", "MDM", "VERAG-RECHNUNGEN", "", "", USTV.UStVAn_KuNr & "_" & r("UStVPo_ReNr") & ".pdf", USTV.UStVAn_KuNr, False)
@@ -2041,13 +2058,13 @@ Public Class usrCntlFaktAbrechnung
End If
End If
End If
End If
Next
End If
Next
End If
End If
End If
End If
@@ -5210,4 +5227,196 @@ mwst:
End Function
Private Structure AntragSummen
Public RMC As Double
Public Fremd As Double
Public VZ As Double
End Structure
Private Structure MWSTEntscheidung
Public IsMWST As Boolean
Public SetPreisstaffel As Boolean
End Structure
Private Sub SetMWSTFromSpedRefactored(r As DataGridViewRow, LandBez As String, ByRef summeRMC As Double, ByRef summeFremd As Double, ByRef fremdUndRMC As Boolean, ByRef posChanged As Boolean, ByRef setPreisstaffel As Boolean, antrag As cUSTVAntrag, isVZ As Boolean, Optional changed As Boolean = False, Optional sumOffertRMC As Double = 0, Optional sumOffertFremd As Double = 0)
If Not IsSpedArtRelevant() Then Exit Sub
If Not IsRowValid(r) Then Exit Sub
If Not IsAntragValid(antrag) Then Exit Sub
If Not IsLandAndTextMatching(r, LandBez, antrag) Then Exit Sub
Dim summen As AntragSummen = CalculateSummen(antrag, isVZ)
Dim isRMCKunde = isRMCKunde_ref(antrag)
Dim isMWST As Boolean = DecideMWST(r, summen, isRMCKunde, isVZ, setPreisstaffel)
If Not isMWST Then Exit Sub
ApplyPreis(r, summen, isRMCKunde)
ApplyBearbeitungsGebuehr(r, summen, summeRMC, summeFremd, fremdUndRMC, posChanged, changed, sumOffertRMC, sumOffertFremd)
End Sub
Private Function IsAntragValid(antrag As cUSTVAntrag) As Boolean
Return antrag IsNot Nothing AndAlso antrag.UStVAn_ID > 0
End Function
Private Function IsRowValid(r As DataGridViewRow) As Boolean
If r Is Nothing Then Return False
If IsDBNull(r.Cells("LeistungsBez").Value) Then Return False
If IsDBNull(r.Cells("Land").Value) Then Return False
Return True
End Function
Private Function IsLandAndTextMatching(r As DataGridViewRow, landBez As String, antrag As cUSTVAntrag) As Boolean
Dim iso2 = ConvertToISO2(landBez)
If r.Cells("Land").Value.ToString <> iso2 Then Return False
Dim leistungsText = r.Cells("LeistungsBez").Value.ToString.ToLower
Dim begriffe = GetUebersetzungen(antrag.UStVAn_AntragArt)
Return begriffe.Any(Function(x) leistungsText.StartsWith(x))
End Function
Private Function ConvertToISO2(landBez As String) As String
Select Case landBez.Length
Case 2 : Return landBez
Case 3 : Return VERAG_PROG_ALLGEMEIN.cProgramFunctions.getISO2LandFromISO3Land(landBez)
Case 1 : Return VERAG_PROG_ALLGEMEIN.cProgramFunctions.getISO2LandFromISO1Land(landBez)
Case Else : Return ""
End Select
End Function
Private Function GetUebersetzungen(antragArt As String) As List(Of String)
Dim baseText = antragArt.ToLower
Return New List(Of String) From {
baseText,
baseText.Replace("mwst", "vat"),
baseText.Replace("moest", "excise"),
baseText.Replace("oe", "ö"),
baseText.Replace("mwst", "rambursare tva"),
baseText.Replace("moest", "rambursare acciza")
}
End Function
Private Function CalculateSummen(antrag As cUSTVAntrag, isVZ As Boolean) As AntragSummen
Dim result As New AntragSummen
For Each pos In antrag.POSITIONEN
Dim offenVZ = pos.UStVPo_VZ AndAlso pos.UStVPo_VZ_RKID Is Nothing
Dim offenNormal = Not pos.UStVPo_VZ AndAlso pos.UStVPo_VZ_RKID Is Nothing
If offenVZ Then result.VZ += pos.UStVPo_USteuerbetragEUR
Dim relevant = If(isVZ, offenVZ, offenNormal)
If Not relevant Then Continue For
If pos.UStVPo_Leistender.ToUpper.StartsWith("RMC") Then
result.RMC += pos.UStVPo_USteuerbetragEUR
Else
result.Fremd += pos.UStVPo_USteuerbetragEUR
End If
Next
Return result
End Function
Private Function DecideMWST(r As DataGridViewRow, summen As AntragSummen, isRMCKunde As Boolean, isVZ As Boolean, ByRef setPreisstaffel As Boolean) As Boolean
Dim isMWST As Boolean = False
Dim staffel As Double = If(IsDBNull(r.Cells("Staffelpreis").Value), -1, r.Cells("Staffelpreis").Value)
Dim offRMC As Boolean = If(IsDBNull(r.Cells("RMC").Value), False, r.Cells("RMC").Value)
Dim offFremd As Boolean = If(IsDBNull(r.Cells("Fremd").Value), False, r.Cells("Fremd").Value)
Dim offVZ As Boolean = If(IsDBNull(r.Cells("VZ").Value), False, r.Cells("VZ").Value)
If isRMCKunde Then
If (offRMC Or offFremd) AndAlso (summen.RMC > 0 Or summen.Fremd > 0) Then
isMWST = True
End If
Else
If offVZ = isVZ Then
If isVZ AndAlso summen.VZ > 0 Then
If staffel > -1 AndAlso staffel <= summen.VZ Then
setPreisstaffel = True
End If
isMWST = True
ElseIf Not isVZ AndAlso summen.VZ > 0 Then
If staffel > -1 AndAlso staffel <= summen.VZ Then
setPreisstaffel = True
End If
isMWST = True
End If
End If
End If
Return isMWST
End Function
Private Sub ApplyPreis(
r As DataGridViewRow,
summen As AntragSummen,
isRMCKunde As Boolean)
r.Cells("Anzahl").Value = 1
If Not IsDBNull(r.Cells("Preis").Value) _
AndAlso CDbl(r.Cells("Preis").Value) <> 0 Then Exit Sub
If isRMCKunde Then
r.Cells("Preis").Value = If(summen.RMC > 0, summen.RMC, summen.Fremd)
Else
r.Cells("Preis").Value = summen.VZ
End If
End Sub
Private Sub ApplyBearbeitungsGebuehr(
r As DataGridViewRow,
summen As AntragSummen,
ByRef summeRMC As Double,
ByRef summeFremd As Double,
ByRef fremdUndRMC As Boolean,
ByRef posChanged As Boolean,
changed As Boolean,
sumOffertRMC As Double,
sumOffertFremd As Double)
If IsDBNull(r.Cells("BGebLeistungsNr").Value) Then Exit Sub
If IsDBNull(r.Cells("BGebProzent").Value) Then Exit Sub
If IsDBNull(r.Cells("Preis").Value) Then Exit Sub
' hier nur noch Gebühr-Logik
' KEINE MWST-Logik mehr
' KEINE Antrag-Logik mehr
posChanged = True
End Sub
Private Function isRMCKunde_ref(antrag As cUSTVAntrag) As Boolean
If antrag Is Nothing Then Return False
Dim kdNr = If(RECHNUNG.RechnungsKundenNr > 0, RECHNUNG.RechnungsKundenNr, kdFirmaRechnungAn.KdNr)
Return kdNr = 150000 AndAlso (antrag.UStVAn_AntragArt = "MWST" OrElse antrag.UStVAn_AntragArt = "MOEST")
End Function
Private Function IsSpedArtRelevant() As Boolean
If SPEDBUCH Is Nothing Then Return False
Return SPEDBUCH.Abfertigungsart = 114 _
OrElse SPEDBUCH.Abfertigungsart = 115 _
OrElse SPEDBUCH.Abfertigungsart = 10
End Function
End Class