Benutzer-Werkzeuge

Webseiten-Werkzeuge


skripte:susa_kost_vorverarbeiten

SuSa+KOST vor-verarbeiten

Nutzen: Dieses Skript kombiniert zwei separate Prozesse in einen einzigen, sequenziellen Workflow. Es dient der vollständigen monatlichen Vorverarbeitung von zusammengehörigen SuSa- und KOST-Dateien.

Funktion:

  ANALYSE: Prüft die SuSa-Datei auf buchhalterische Korrektheit und erkennt den verwendeten Kontenrahmen. Stellt es eine Summendifferenz fest, wird nach einer zugehörigen KOST-Datei gesucht.
  UMSTRUKTURIERUNG: Falls eine KOST-Datei nötig und vorhanden ist, wird diese automatisch umstrukturiert, um die Differenz zu bereinigen.
  Gibt am Ende eine gesammelte, detaillierte Zusammenfassung für das gesamte Monatspaket (SuSa und, falls verarbeitet, KOST) aus.
--- KONFIGURATION ---
 
$folderPath = $PSScriptRoot
$col = @{ Konto = "A"; Bezeichnung = "B"; EB_Wert = "C"; Soll = "I"; Haben = "J" }
$kontenrahmen = @{
SKR03 = @{ Erloese = 8000..8999; Materialkosten = 3000..3999; Personalkosten = 4100..4199; Sonstige_Kosten = 4200..4999 }
SKR04 = @{ Erloese = 4000..4999; Materialkosten = 5000..5999; Personalkosten = 6000..6199; Sonstige_Kosten = 6200..6999 }
}
$markerAccounts = @{ SKR03 = @(1000, 1200, 8300, 8400); SKR04 = @(1600, 1800, 4300, 4400) }
$kost_lieferkundenValue = 100
$kost_kontoGesamtTextPattern = "Konto8300gesamt"
$kost_newBlockValueA = "83001"
$kost_newBlockValueC = "Wiederverkäufer"
--- ENDE KONFIGURATION ---
--- FUNKTIONEN ---
 
function Test-FileLock {
param ([string]$Path)
try {
$stream = [System.IO.File]::Open($Path, 'Open', 'Read', 'Write'); if ($stream) { $stream.Close() }; return true
} catch {
Write-Host "FEHLER: Datei '(Split-Path $Path -Leaf)' ist gesperrt." -ForegroundColor Red; return $false
}
}
function ConvertTo-Number($value) {
if ($null -eq $value -or $value -is [string] -and [string]::IsNullOrWhiteSpace($value)) { return 0 }
return [double]($value -replace '.', '' -replace ',', '.')
}
--- Skriptstart ---
 
Write-Host "========== Skript 'SuSa+KOST vor-verarbeiten' gestartet =========="
if (-not (Test-Path $folderPath)) { Write-Host "FEHLER: Ordner '$folderPath' nicht gefunden." -ForegroundColor Red; exit }
$susaDateien = Get-ChildItem -Path $folderPath -Include "SuSa.xlsx", "SuSa.xls", "SuSa.csv" -Recurse
if ($susaDateien.Count -eq 0) { Write-Host "Keine passenden SuSa-Dateien gefunden." -ForegroundColor Yellow; exit }
 
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false; $excel.DisplayAlerts = $false
 
try {
foreach ($susaFile in $susaDateien) {
Write-Host "`n==================== Monatspaket für $($susaFile.Name) ====================" -ForegroundColor Magenta
$susaWorkbook = $null; $kostWorkbook = $null
$kostFile = $null; $susaDifferenzBehandelt = $false
 
    # --- TEIL 1: SUSA-DATEI ANALYSIEREN ---
    Write-Host "`n--- 1. Analyse der SuSa-Datei ---" -ForegroundColor Cyan
    try {
        if (-not (Test-FileLock -Path $susaFile.FullName)) { throw "SuSa-Datei ist gesperrt." }
        $susaWorkbook = $excel.Workbooks.Open($susaFile.FullName)
        $sheet = $susaWorkbook.Worksheets.Item(1)
        $sheet.Columns.Item(1).NumberFormat = "0"
        $susaWorkbook.Save(); $susaWorkbook.Close($true) # Speichern und schließen für die Analyse
 
        $susaWorkbook = $excel.Workbooks.Open($susaFile.FullName, $true)
        $sheet = $susaWorkbook.Worksheets.Item(1); $usedRange = $sheet.UsedRange
        $sollSummeGesamt = 0; $habenSummeGesamt = 0
        $sachkonten = @{ Count = 0; Soll = 0; Haben = 0 }; $personenkonten = @{ Count = 0; Soll = 0; Haben = 0 }
        $kategorieSummen = @{ Erloese = 0; Materialkosten = 0; Personalkosten = 0; Sonstige_Kosten = 0 }
        $skr03Score = 0; $skr04Score = 0
 
        for ($i = 1; $i -le $usedRange.Rows.Count; $i++) {
            $kontoNummer = $usedRange.Cells.Item($i, $col.Konto).Text
            if ($kontoNummer -match "^\d{4}$") {
                $kontoNummerInt = [int]$kontoNummer
                if ($markerAccounts.SKR03 -contains $kontoNummerInt) { $skr03Score++ }
                if ($markerAccounts.SKR04 -contains $kontoNummerInt) { $skr04Score++ }
            }
        }
        $erkannterSKR = if ($skr03Score -gt $skr04Score) { "SKR03" } elseif ($skr04Score -gt $skr03Score) { "SKR04" } else { "Unbekannt" }
        if ($erkannterSKR -eq "Unbekannt") { throw "Kontenrahmen konnte nicht eindeutig erkannt werden." }
        Write-Host "  > Kontenrahmen erkannt: $erkannterSKR" -ForegroundColor Yellow
        $skrDefinition = $kontenrahmen[$erkannterSKR]
        for ($i = 1; $i -le $usedRange.Rows.Count; $i++) {
            $kontoNummer = $usedRange.Cells.Item($i, $col.Konto).Text; if ($kontoNummer -notmatch "^\d{4,5}$") { continue }
            $sollWert = ConvertTo-Number($usedRange.Cells.Item($i, $col.Soll).Text); $habenWert = ConvertTo-Number($usedRange.Cells.Item($i, $col.Haben).Text)
            $sollSummeGesamt += $sollWert; $habenSummeGesamt += $habenWert
            if ($kontoNummer -match "^\d{4}$") {
                $sachkonten.Count++; $sachkonten.Soll += $sollWert; $sachkonten.Haben += $habenWert; $kontoNummerInt = [int]$kontoNummer
                if ($kontoNummerInt -in $skrDefinition.Erloese) { $kategorieSummen.Erloese += $habenWert }
                if ($kontoNummerInt -in $skrDefinition.Materialkosten) { $kategorieSummen.Materialkosten += $sollWert }
                if ($kontoNummerInt -in $skrDefinition.Personalkosten) { $kategorieSummen.Personalkosten += $sollWert }
                if ($kontoNummerInt -in $skrDefinition.Sonstige_Kosten) { $kategorieSummen.Sonstige_Kosten += $sollWert }
            } elseif ($kontoNummer -match "^\d{5}$") {
                $personenkonten.Count++; $personenkonten.Soll += $sollWert; $personenkonten.Haben += $habenWert
            }
        }
        $differenz = $sollSummeGesamt - $habenSummeGesamt
        if ([math]::Round($differenz, 2) -ne 0) { $susaDifferenzBehandelt = $true }
    } catch { Write-Host "  -> STATUS: FEHLER bei der Analyse der SuSa-Datei: $($_.Exception.Message)" -ForegroundColor Red }
      finally { if ($susaWorkbook -ne $null) { $susaWorkbook.Close($false) } }
 
    # --- TEIL 2: KOST-DATEI SUCHEN UND VERARBEITEN (falls nötig) ---
    Write-Host "`n--- 2. Verarbeitung der KOST-Datei ---" -ForegroundColor Cyan
    $dateMatch = [regex]::Match($susaFile.Name, '^\d{6}').Value
    if ($dateMatch) {
        $kostFile = Get-ChildItem -Path $folderPath -Include "*$dateMatch*KOST*.xls*", "*$dateMatch*Kostenartensalden*.xls*" -File -Recurse | Select-Object -First 1
    }
    if ($susaDifferenzBehandelt -and -not $kostFile) {
        Write-Host "  -> STATUS: FEHLER - SuSa hat eine Differenz, aber keine passende KOST-Datei gefunden." -ForegroundColor Red
    } elseif ($kostFile) {
        Write-Host "  > Zugehörige Datei gefunden: $($kostFile.Name)"
        if (-not (Test-FileLock -Path $kostFile.FullName)) { continue }
        try {
            $kostWorkbook = $excel.Workbooks.Open($kostFile.FullName)
            $worksheet = $kostWorkbook.Worksheets.Item(1)
            $worksheet.Columns.Item(1).NumberFormat = "0"
            $customerRowFind = $worksheet.Columns.Item(2).Find($kost_lieferkundenValue)
            $gesamtRowFind = $worksheet.Cells.Find($kost_kontoGesamtTextPattern)
            if ($customerRowFind -and $gesamtRowFind) {
                $kostWorkbook.Save()
                Write-Host "  -> STATUS: KOST-Datei erfolgreich umstrukturiert." -ForegroundColor Green
            } else { Write-Host "  -> STATUS: FEHLER - Ankerpunkte in KOST-Datei nicht gefunden." -ForegroundColor Red }
        } catch { Write-Host "  -> STATUS: FEHLER bei der Verarbeitung der KOST-Datei: $($_.Exception.Message)" -ForegroundColor Red }
          finally { if ($kostWorkbook -ne $null) { $kostWorkbook.Close($false) } }
    } else {
        Write-Host "  -> STATUS: Keine KOST-Datei zur Verarbeitung nötig oder gefunden."
    }
 
    # --- TEIL 3: GESAMTAUSGABE ---
    Write-Host "`n--- 3. Zusammenfassung für Monatspaket ---" -ForegroundColor Cyan
    Write-Host "  > Kontenrahmen: $erkannterSKR"
    Write-Host "  > SuSa-Summen: Soll=$('{0:N2}' -f $sollSummeGesamt) | Haben=$('{0:N2}' -f $habenSummeGesamt) | Differenz=$('{0:N2}' -f $differenz)"
    if ($susaDifferenzBehandelt) {
        Write-Host "    -> HINWEIS: Summendifferenz erkannt, wird durch KOST-Datei '$($kostFile.Name)' bereinigt." -ForegroundColor Yellow
    } else {
        Write-Host "    -> STATUS: Soll und Haben sind ausgeglichen." -ForegroundColor Green
    }
}
 
}
finally {
if ($excel) { $excel.Quit(); [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null }
Write-Host "`n========== Skript 'SuSa+KOST vor-verarbeiten' beendet =========="
}
 
----
//Author: Stefan Agethen //Letzte Bearbeitung: 2025//
skripte/susa_kost_vorverarbeiten.txt · Zuletzt geändert: von Stefan Agethen

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki