339 lines
16 KiB
C#
339 lines
16 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using BeWo.Service.Reporting.Straffaelligenhilfe;
|
||
using DevExpress.XtraReports.UI;
|
||
|
||
namespace BeWo.Report.DefaultReports.Straffaelligenhilfe
|
||
{
|
||
/// <summary>
|
||
/// XtraReport für die "Statistik der Ableistung gemeinnütziger Arbeit" (V 2014.1).
|
||
///
|
||
/// Verwendung:
|
||
/// var rows = VgaStatistikReport.CreateRows(efs, a153, a153s, bewO, bewM, gnad);
|
||
/// var report = new VgaStatistikReport();
|
||
/// report.Parameters["Vermittlungsstelle"].Value = "Musterstadt";
|
||
/// report.Parameters["Staatsanwaltschaft"].Value = "GESAMT";
|
||
/// report.Parameters["Berichtszeitraum"].Value = new DateTime(2025, 6, 30);
|
||
/// report.SetReportDataSource(rows);
|
||
/// report.ShowPreview();
|
||
/// </summary>
|
||
public partial class VgaStatistikReport : XtraReport
|
||
{
|
||
public VgaStatistikReport()
|
||
{
|
||
InitializeComponent();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Setzt die Datenquelle des Reports.
|
||
/// </summary>
|
||
public void SetReportDataSource(VgaStatistic efs,
|
||
VgaStatistic auflage153a,
|
||
VgaStatistic auflage153aSteuerstraf,
|
||
VgaStatistic bewOhne,
|
||
VgaStatistic bewMit,
|
||
VgaStatistic gnadenverfahren)
|
||
{
|
||
lblBerichtszeitraum.Text = String.Format("{0:dd.MM.yyyy}-{1:dd.MM.yyyy}", efs.StartDate, efs.EndDate);
|
||
this.bindingSource1.DataSource = CreateRows(efs, auflage153a, auflage153aSteuerstraf, bewOhne, bewMit, gnadenverfahren);
|
||
|
||
}
|
||
|
||
// ── Factory ─────────────────────────────────────────────────────────────
|
||
|
||
/// <summary>
|
||
/// Konvertiert 6 ausgefüllte VgaStatistic-Objekte (je eine Kategorie) in die
|
||
/// Zeilenliste für den Report. Spalte C (insgesamt) wird als Summe berechnet.
|
||
///
|
||
/// Parameterreihenfolge entspricht den Excel-Spalten D–I:
|
||
/// efs → Spalte D: Abwendung Ersatzfreiheitsstrafe
|
||
/// auflage153a → Spalte E: Auflage gem. § 153a StPO
|
||
/// auflage153aSteuerstraf → Spalte F: Auflage § 153a StPO Steuerstrafverfahren
|
||
/// bewOhne → Spalte G: Bewährungsauflage ohne Bewährungshelfer
|
||
/// bewMit → Spalte H: Bewährungsauflage mit Bewährungshelfer
|
||
/// gnadenverfahren → Spalte I: Auflage im Gnadenverfahren
|
||
/// </summary>
|
||
public static List<VgaStatistikReportRow> CreateRows(
|
||
VgaStatistic efs,
|
||
VgaStatistic auflage153a,
|
||
VgaStatistic auflage153aSteuerstraf,
|
||
VgaStatistic bewOhne,
|
||
VgaStatistic bewMit,
|
||
VgaStatistic gnadenverfahren)
|
||
{
|
||
// Kurzform: Zähle eine Eigenschaft über alle 6 Kategorien
|
||
decimal Sum(Func<VgaStatistic, decimal> f) =>
|
||
f(efs) + f(auflage153a) + f(auflage153aSteuerstraf) +
|
||
f(bewOhne) + f(bewMit) + f(gnadenverfahren);
|
||
|
||
// Normale Datenzeile
|
||
VgaStatistikReportRow Row(string pos, string beschr,
|
||
Func<VgaStatistic, decimal> f,
|
||
VgaReportRowType type = VgaReportRowType.Normal) =>
|
||
VgaStatistikReportRow.FromValues(pos, beschr,
|
||
f(efs), f(auflage153a), f(auflage153aSteuerstraf),
|
||
f(bewOhne), f(bewMit), f(gnadenverfahren), type);
|
||
|
||
return new List<VgaStatistikReportRow>
|
||
{
|
||
// ── Auftragsbestand ────────────────────────────────────────────
|
||
Row("0.1",
|
||
"Anzahl der aus dem vorhergehenden Berichtszeitraum übernommenen offenen Aufträge",
|
||
s => s.AnzahlAlt),
|
||
|
||
Row("0.2",
|
||
"Anzahl der im aktuellen Berichtszeitraum erteilten Aufträge",
|
||
s => s.AnzahlNeu, VgaReportRowType.Highlighted),
|
||
|
||
Row("1.",
|
||
"Anzahl der insges. erteilten Aufträge (Summe Zeilen 0.1 + 0.2)",
|
||
s => s.AnzahlInsgesamt, VgaReportRowType.Highlighted),
|
||
|
||
Row("1.1.",
|
||
"darunter mehrfach erteilte Aufträge zur selben Person und zum selben Aktenzeichen (Fallzahl v. Zeile 1)",
|
||
s => s.Anzahl1_1, VgaReportRowType.Highlighted),
|
||
|
||
Row("1.2.",
|
||
"darunter Amtshilfe für andere Bezirke in BW (Fallzahl v. Zeile 1)",
|
||
s => s.Anzahl1_2),
|
||
|
||
Row("1.3.",
|
||
"darunter Amtshilfe für andere Bundesländer / Ausland (Fallzahl v. Zeile 1)",
|
||
s => s.Anzahl1_3),
|
||
|
||
Row("1.4.",
|
||
"Aufträge für männliche Klienten (Fallzahl v. Zeile 1)",
|
||
s => s.Anzahl1_4),
|
||
|
||
Row("1.5.",
|
||
"Aufträge für weibliche Klienten (Fallzahl v. Zeile 1)",
|
||
s => s.Anzahl1_5),
|
||
|
||
// ── Arbeitsstunden ─────────────────────────────────────────────
|
||
Row("2.",
|
||
"Anzahl der (beauftragten) Arbeitsstunden (bezogen auf Zeile 1) in vollen Std.",
|
||
s => s.Anzahl2),
|
||
|
||
// ── Erledigte Aufträge ─────────────────────────────────────────
|
||
Row("3.",
|
||
"Anzahl aller erledigten Aufträge (incl. Abbrüche, teilweise erledigter Aufträge, gescheiterte Fälle)",
|
||
s => s.Anzahl3),
|
||
|
||
Row("3.1.",
|
||
"davon Anzahl der teilweise erledigten Aufträge (Fallzahl v. Zeile 3)",
|
||
s => s.Anzahl3_1),
|
||
|
||
VgaStatistikReportRow.FromEfsOnly(
|
||
"3.1.1.",
|
||
"Anzahl der Aufträge = Personen, bei denen die Auflagen teilweise nur durch Arbeitsleistungen erledigt wurden (Fallzahl v. Spalte D; Zeile 3.1.)",
|
||
efs.Anzahl3_1_1.ToString("N0")),
|
||
|
||
Row("3.2.",
|
||
"davon Anzahl der gescheiterten Fälle (negativer Fallstatus u. Abbrüche (Fallzahl v. Zeile 3))",
|
||
s => s.Anzahl3_2),
|
||
|
||
Row("3.3.",
|
||
"davon Anzahl der vollständig erledigten Aufträge (Fallzahl v. Zeile 3)",
|
||
s => s.Anzahl3_3),
|
||
|
||
VgaStatistikReportRow.FromEfsOnly(
|
||
"3.3.1.",
|
||
"Anzahl der Aufträge = Personen, bei denen die Auflagen nur durch Arbeitsleistungen erfüllt wurden (Fallzahl v. Spalte D; Zeile 3.3.)",
|
||
efs.Anzahl3_3_1.ToString("N0")),
|
||
|
||
// ── Verlauf (Abschnittsüberschrift) ────────────────────────────
|
||
VgaStatistikReportRow.SectionHeader(
|
||
"4.",
|
||
"Verlauf (der erledigten Aufträge gem. Zeile 3) Mehrfachnennungen möglich !!"),
|
||
|
||
Row("4.1.",
|
||
"darunter Vermittlungen in externe Einsatzstellen (Fallzahl von Zeile 3)",
|
||
s => s.Anzahl4_1),
|
||
|
||
Row("4.2.",
|
||
"darunter Vermittlungen in verschiedene Einsatzstellen (Fallzahl von Zeile 3)",
|
||
s => s.Anzahl4_2),
|
||
|
||
Row("4.3.",
|
||
"darunter Vermittlungen in eigene Arbeitsgruppen (Fallzahl von Zeile 3)",
|
||
s => s.Anzahl4_3),
|
||
|
||
Row("4.4.",
|
||
"darunter durch Ratenzahlungsvereinbarung (Fallzahlen v. Zeile 3)",
|
||
s => s.Anzahl4_4),
|
||
|
||
Row("4.5.",
|
||
"darunter sonstige Erledigung (Umzug, Änderung des Beschlusses) (Fallzahl v. Zeile 3)",
|
||
s => s.Anzahl4_5),
|
||
|
||
Row("4.6.",
|
||
"darunter Mischformen (Fallzahlen von Zeile 3)",
|
||
s => s.Anzahl4_6),
|
||
|
||
Row("4.7.",
|
||
"Übergang in Aufsuchende Sozialarbeit",
|
||
s => s.Anzahl4_7),
|
||
|
||
Row("4.8.",
|
||
"Übergang in Treuhänderische Geldverwaltung",
|
||
s => s.Anzahl4_8),
|
||
|
||
// ── Geleistete Stunden ─────────────────────────────────────────
|
||
Row("5.",
|
||
"Anzahl der geleisteten Arbeitsstunden bezogen auf Zeile 3 (volle Std.)",
|
||
s => s.Anzahl5),
|
||
|
||
// ── Zahlungen / Hafttage / Fälle (nur Insgesamt = EFS) ─────────
|
||
VgaStatistikReportRow.FromEfsOnly(
|
||
"6.",
|
||
"Summe der nachgewiesenen Zahlungen in €",
|
||
(efs.Betrag6 + auflage153a.Betrag6 + auflage153aSteuerstraf.Betrag6 +
|
||
bewOhne.Betrag6 + bewMit.Betrag6 + gnadenverfahren.Betrag6).ToString("N2")),
|
||
|
||
VgaStatistikReportRow.FromEfsOnly(
|
||
"7.",
|
||
"Anzahl der vermiedenen Hafttage (durch Arbeitsstd. und / oder Zahlungen)",
|
||
Sum(s => s.Anzahl7).ToString("N0")),
|
||
|
||
VgaStatistikReportRow.FromEfsOnly(
|
||
"7.1.",
|
||
"Anzahl der vermiedenen Hafttage (nur durch Arbeitsstd.)",
|
||
Sum(s => s.Anzahl7_1).ToString("N0")),
|
||
|
||
VgaStatistikReportRow.FromEfsOnly(
|
||
"8.",
|
||
"Anzahl der Aufträge = Personen, bei denen die Vollstreckung der Freiheitsstrafe vollständig oder teilweise durch gemeinnützige Arbeit abgewendet wurde",
|
||
Sum(s => s.Anzahl8).ToString("N0")),
|
||
|
||
// ── Gründe für Abbrüche (Abschnittsüberschrift) ────────────────
|
||
VgaStatistikReportRow.SectionHeader(
|
||
"9.",
|
||
"Gründe für Abbrüche / Scheitern (Fallzahlen bezogen auf Zeile 3.2 - Mehrfachnennung möglich)"),
|
||
|
||
Row("9.1.", "kein Kontakt", s => s.Anzahl9_1),
|
||
Row("9.2.", "nicht angetreten", s => s.Anzahl9_2),
|
||
Row("9.3.", "Abbruch der Tätigkeit", s => s.Anzahl9_3),
|
||
Row("9.4.", "längerfristig arbeitsunfähig", s => s.Anzahl9_4),
|
||
Row("9.5.", "Suchtproblematik", s => s.Anzahl9_5),
|
||
Row("9.6.", "psychische Probleme", s => s.Anzahl9_6),
|
||
Row("9.7.", "keine Motivation", s => s.Anzahl9_7),
|
||
Row("9.8.", "in Haft", s => s.Anzahl9_8),
|
||
Row("9.9.", "unbekannt", s => s.Anzahl9_9),
|
||
|
||
// ── Offene Aufträge ────────────────────────────────────────────
|
||
Row("10.",
|
||
"Anzahl der offenen Aufträge (= Zeile 1 minus Zeile 3)",
|
||
s => s.Anzahl10),
|
||
|
||
// ── Dauer der Beratung (Abschnittsüberschrift) ─────────────────
|
||
VgaStatistikReportRow.SectionHeader(
|
||
"11.",
|
||
"Dauer der Beratung / Betreuung (der erl. Aufträge) (Fallzahlen-Summen müssen identisch sein mit Zeile 3)"),
|
||
|
||
Row("11.1.", "bis 3 Monate", s => s.Anzahl11_1),
|
||
Row("11.2.", "3 bis 6 Monate", s => s.Anzahl11_2),
|
||
Row("11.3.", "6 bis 12 Monate", s => s.Anzahl11_3),
|
||
Row("11.4.", "über 12 Monate", s => s.Anzahl11_4),
|
||
|
||
// ── Vermittlung aus Haft ───────────────────────────────────────
|
||
Row("12.", "Vermittlung aus Haft", s => s.Anzahl12),
|
||
};
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// Zeilentyp für die bedingte Formatierung im VGA-Statistik Report.
|
||
/// </summary>
|
||
public enum VgaReportRowType
|
||
{
|
||
Normal = 0,
|
||
Highlighted = 1, // Orangefarbener Hintergrund (z. B. Zeilen 0.2, 1., 1.1.)
|
||
SectionHeader = 2 // Blauer Hintergrund (Abschnittsüberschriften 4., 9., 11.)
|
||
}
|
||
|
||
/// <summary>
|
||
/// Datenmodell für eine Zeile im VGA-Statistik Report.
|
||
/// Alle Werte werden als formatierte Strings übergeben, damit auch "x"-Einträge
|
||
/// für nicht anwendbare Felder dargestellt werden können.
|
||
/// </summary>
|
||
public class VgaStatistikReportRow
|
||
{
|
||
public string Position { get; set; } = "";
|
||
public string Beschreibung { get; set; } = "";
|
||
public string ColInsgesamt { get; set; } = "";
|
||
public string ColEFS { get; set; } = "";
|
||
public string ColAuflage153a { get; set; } = "";
|
||
public string ColAuflage153aSteuerstraf { get; set; } = "";
|
||
public string ColBewOhne { get; set; } = "";
|
||
public string ColBewMit { get; set; } = "";
|
||
public string ColGnadenverfahren { get; set; } = "";
|
||
public VgaReportRowType RowType { get; set; } = VgaReportRowType.Normal;
|
||
|
||
/// <summary>
|
||
/// Erstellt eine normale Datenzeile aus den Einzelwerten der 6 Kategorien.
|
||
/// Insgesamt wird als Summe berechnet.
|
||
/// </summary>
|
||
internal static VgaStatistikReportRow FromValues(
|
||
string position, string beschreibung,
|
||
decimal valEFS, decimal valA153, decimal valA153s, decimal valBewO, decimal valBewM, decimal valGnad,
|
||
VgaReportRowType rowType = VgaReportRowType.Normal)
|
||
{
|
||
decimal total = valEFS + valA153 + valA153s + valBewO + valBewM + valGnad;
|
||
return new VgaStatistikReportRow
|
||
{
|
||
Position = position,
|
||
Beschreibung = beschreibung,
|
||
ColInsgesamt = total.ToString("0.##"),
|
||
ColEFS = valEFS.ToString("0.##"),
|
||
ColAuflage153a = valA153.ToString("0.##"),
|
||
ColAuflage153aSteuerstraf = valA153s.ToString("0.##"),
|
||
ColBewOhne = valBewO.ToString("0.##"),
|
||
ColBewMit = valBewM.ToString("0.##"),
|
||
ColGnadenverfahren = valGnad.ToString("0.##"),
|
||
RowType = rowType
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// Erstellt eine Zeile, bei der nur Insgesamt (= EFS-Wert) relevant ist –
|
||
/// Spalten E–I werden als "x" (nicht anwendbar) dargestellt.
|
||
/// Verwendet für Positionen 3.1.1., 3.3.1., 6., 7., 7.1., 8.
|
||
/// </summary>
|
||
internal static VgaStatistikReportRow FromEfsOnly(
|
||
string position, string beschreibung,
|
||
string valTotal,
|
||
VgaReportRowType rowType = VgaReportRowType.Normal)
|
||
{
|
||
return new VgaStatistikReportRow
|
||
{
|
||
Position = position,
|
||
Beschreibung = beschreibung,
|
||
ColInsgesamt = valTotal,
|
||
ColEFS = valTotal,
|
||
ColAuflage153a = "x",
|
||
ColAuflage153aSteuerstraf = "x",
|
||
ColBewOhne = "x",
|
||
ColBewMit = "x",
|
||
ColGnadenverfahren = "x",
|
||
RowType = rowType
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// Erstellt eine Abschnittsüberschrift (blauer Hintergrund).
|
||
/// ColInsgesamt nimmt den Hinweistext auf.
|
||
/// </summary>
|
||
internal static VgaStatistikReportRow SectionHeader(
|
||
string position, string beschreibung)
|
||
{
|
||
return new VgaStatistikReportRow
|
||
{
|
||
Position = position,
|
||
Beschreibung = beschreibung,
|
||
ColInsgesamt = "",
|
||
RowType = VgaReportRowType.SectionHeader
|
||
};
|
||
}
|
||
}
|
||
}
|
||
|