CaritasverbandDuerenJuelichEV/EmployeeKilometerauswertungs - Freigabe durch spezielle Buchung, Unterschrift von QB

158016
This commit is contained in:
2026-03-24 13:47:49 +01:00
parent ff6d52c292
commit 062f33bc14
5 changed files with 183 additions and 66 deletions

View File

@@ -65,6 +65,7 @@ namespace CaritasverbandDuerenJuelichEV
this.xrTableCell11 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell12 = new DevExpress.XtraReports.UI.XRTableCell();
this.GroupFooter1 = new DevExpress.XtraReports.UI.GroupFooterBand();
this.xrPictureBox2 = new DevExpress.XtraReports.UI.XRPictureBox();
this.xrLabel15 = new DevExpress.XtraReports.UI.XRLabel();
this.xrLabel14 = new DevExpress.XtraReports.UI.XRLabel();
this.xrLabel12 = new DevExpress.XtraReports.UI.XRLabel();
@@ -82,6 +83,7 @@ namespace CaritasverbandDuerenJuelichEV
this.topMarginBand1 = new DevExpress.XtraReports.UI.TopMarginBand();
this.bottomMarginBand1 = new DevExpress.XtraReports.UI.BottomMarginBand();
this.objectDataSource1 = new DevExpress.DataAccess.ObjectBinding.ObjectDataSource(this.components);
this.xrLabel17 = new DevExpress.XtraReports.UI.XRLabel();
((System.ComponentModel.ISupportInitialize)(this.xrTable4)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.xrTable1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.objectDataSource1)).BeginInit();
@@ -481,6 +483,8 @@ namespace CaritasverbandDuerenJuelichEV
// GroupFooter1
//
this.GroupFooter1.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] {
this.xrLabel17,
this.xrPictureBox2,
this.xrLabel15,
this.xrLabel14,
this.xrLabel12,
@@ -494,6 +498,15 @@ namespace CaritasverbandDuerenJuelichEV
this.GroupFooter1.PageBreak = DevExpress.XtraReports.UI.PageBreak.AfterBand;
this.GroupFooter1.RepeatEveryPage = true;
//
// xrPictureBox2
//
this.xrPictureBox2.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("ImageSource", null, "Employees2Entries.EmployeeSignature")});
this.xrPictureBox2.LocationFloat = new DevExpress.Utils.PointFloat(329.4027F, 50F);
this.xrPictureBox2.Name = "xrPictureBox2";
this.xrPictureBox2.SizeF = new System.Drawing.SizeF(168.9861F, 50.04177F);
this.xrPictureBox2.Sizing = DevExpress.XtraPrinting.ImageSizeMode.ZoomImage;
//
// xrLabel15
//
this.xrLabel15.Borders = DevExpress.XtraPrinting.BorderSide.Bottom;
@@ -685,6 +698,22 @@ namespace CaritasverbandDuerenJuelichEV
this.objectDataSource1.DataSource = typeof(BeWo.Report.ReportObjects.EmployeeKilometerauswertungsListRO);
this.objectDataSource1.Name = "objectDataSource1";
//
// xrLabel17
//
this.xrLabel17.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "Employees2Entries.EmployeeSignatureDate")});
this.xrLabel17.Font = new DevExpress.Drawing.DXFont("arial", 10F);
this.xrLabel17.LocationFloat = new DevExpress.Utils.PointFloat(249.1944F, 66.62508F);
this.xrLabel17.Multiline = true;
this.xrLabel17.Name = "xrLabel17";
this.xrLabel17.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 96F);
this.xrLabel17.SizeF = new System.Drawing.SizeF(80.20834F, 33.41669F);
this.xrLabel17.StylePriority.UseFont = false;
this.xrLabel17.StylePriority.UseTextAlignment = false;
this.xrLabel17.Text = "xrLabel17";
this.xrLabel17.TextAlignment = DevExpress.XtraPrinting.TextAlignment.BottomLeft;
this.xrLabel17.TextFormatString = "{0:dd.MM.yyyy}";
//
// EmployeeKilometerauswertungsListReport
//
this.Bands.AddRange(new DevExpress.XtraReports.UI.Band[] {
@@ -769,5 +798,7 @@ namespace CaritasverbandDuerenJuelichEV
private DevExpress.XtraReports.UI.XRLabel xrLabel10;
private DevExpress.XtraReports.UI.XRLabel xrLabel7;
private DevExpress.XtraReports.UI.XRLabel xrLabel13;
private DevExpress.XtraReports.UI.XRPictureBox xrPictureBox2;
private DevExpress.XtraReports.UI.XRLabel xrLabel17;
}
}

View File

@@ -3,6 +3,7 @@ using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BeWo.Service.DCEntityMapper;
using BS.Shared.Core;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -18,6 +19,7 @@ namespace CaritasverbandDuerenJuelichEV
public void SetReportDataSource(EmployeeKilometerauswertungsListRO pRO)
{
var records = DAOFactory.SearchDAO.GetServiceRecordForTimeSpan(pRO.StartDate, pRO.EndDate.AddDays(1).AddSeconds(-1));
foreach (var e2e in pRO.Employees2Entries)
{
var emp = DAOFactory.GenericDAO.LoadByID<Employee>(e2e.Employee.EmployeeOid);
@@ -78,6 +80,25 @@ namespace CaritasverbandDuerenJuelichEV
e2e.Entries = dayEntries;
e2e.TotalDistanceInMeters = totalkm;
e2e.TotalKilometerPauschale = Math.Round(totalkm * e2e.TotalKmPauschalePreis, 2, MidpointRounding.AwayFromZero);
// ab März 2026, geben die Mitarbeiter am Ende des Monats über Rüstzeit - Monatsabschluss den Monat frei und die Unterschrift wird automatisch eingefügt:
var empRecords = records.Where(r => r.EmployeeOid == emp.Oid).ToList();
if (empRecords.Any(r => r.ServiceDescription.Name == "Monatsabschluss"))
{
var timeSpan = new DateTimeSpan();
timeSpan.StartDateTime = pRO.StartDate;
timeSpan.EndDateTime = pRO.EndDate.AddDays(1).AddSeconds(-1);
var signatures = DAOFactory.SearchDAO.GetConfirmationReceiptSignaturesByEmployeeInTimeSpan(emp.Oid.Value, timeSpan);
if (signatures != null)
{
var eSignature = signatures.LastOrDefault();
if (!(eSignature?.SignatureImage is null))
{
e2e.EmployeeSignature = ImageUtils.ConvertBase64StringToBitmap(eSignature.SignatureImage);
e2e.EmployeeSignatureDate = eSignature.InsTs;
}
}
}
}
objectDataSource1.DataSource = pRO;
}

View File

@@ -3,8 +3,10 @@ using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BeWo.Service.DCEntityMapper;
using BS.Shared.Core;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace CaritasverbandDuerenJuelichEV
@@ -76,6 +78,26 @@ namespace CaritasverbandDuerenJuelichEV
pRO.Entries = dayEntries;
pRO.TotalDistanceInMeters = totalkm;
pRO.TotalKilometerPauschale = Math.Round(totalkm * pRO.TotalKmPauschalePreis, 2, MidpointRounding.AwayFromZero);
// ab März 2026, geben die Mitarbeiter am Ende des Monats über Rüstzeit - Monatsabschluss den Monat frei und die Unterschrift wird automatisch eingefügt:
var records = DAOFactory.SearchDAO.GetServiceRecordForTimeSpan(pRO.StartDate, pRO.EndDate.AddDays(1).AddSeconds(-1)).Where(r => r.EmployeeOid == pRO.Employee.EmployeeOid).ToList();
if (records.Any(r => r.ServiceDescription.Name == "Monatsabschluss"))
{
var timeSpan = new DateTimeSpan();
timeSpan.StartDateTime = pRO.StartDate;
timeSpan.EndDateTime = pRO.EndDate.AddDays(1).AddSeconds(-1);
var signatures = DAOFactory.SearchDAO.GetConfirmationReceiptSignaturesByEmployeeInTimeSpan(emp.Oid.Value, timeSpan);
if (signatures != null)
{
var eSignature = signatures.LastOrDefault();
if (!(eSignature?.SignatureImage is null))
{
xrPictureBox2.Image = ImageUtils.ConvertBase64StringToBitmap(eSignature?.SignatureImage);
lblDate.Text = String.Format("{0:dd.MM.yyyy}", eSignature.InsTs);
}
}
}
objectDataSource1.DataSource = pRO;
}
}

View File

@@ -53,6 +53,12 @@ namespace CaritasverbandDuerenJuelichEV
this.xrLabel10 = new DevExpress.XtraReports.UI.XRLabel();
this.xrLabel9 = new DevExpress.XtraReports.UI.XRLabel();
this.GroupHeader2 = new DevExpress.XtraReports.UI.GroupHeaderBand();
this.xrTable1 = new DevExpress.XtraReports.UI.XRTable();
this.xrTableRow1 = new DevExpress.XtraReports.UI.XRTableRow();
this.xrTableCell1 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell2 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell11 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell12 = new DevExpress.XtraReports.UI.XRTableCell();
this.objectDataSource1 = new DevExpress.DataAccess.ObjectBinding.ObjectDataSource(this.components);
this.pageFooterBand1 = new DevExpress.XtraReports.UI.PageFooterBand();
this.Title = new DevExpress.XtraReports.UI.XRControlStyle();
@@ -78,15 +84,11 @@ namespace CaritasverbandDuerenJuelichEV
this.xrCheckBox2 = new DevExpress.XtraReports.UI.XRCheckBox();
this.lblKennzeichen = new DevExpress.XtraReports.UI.XRLabel();
this.lblDoppelkm = new DevExpress.XtraReports.UI.XRLabel();
this.xrTable1 = new DevExpress.XtraReports.UI.XRTable();
this.xrTableRow1 = new DevExpress.XtraReports.UI.XRTableRow();
this.xrTableCell1 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell2 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell11 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell12 = new DevExpress.XtraReports.UI.XRTableCell();
this.lblDate = new DevExpress.XtraReports.UI.XRLabel();
this.xrPictureBox2 = new DevExpress.XtraReports.UI.XRPictureBox();
((System.ComponentModel.ISupportInitialize)(this.xrTable4)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.objectDataSource1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.xrTable1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.objectDataSource1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this)).BeginInit();
//
// Detail
@@ -226,6 +228,8 @@ namespace CaritasverbandDuerenJuelichEV
// GroupFooter1
//
this.GroupFooter1.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] {
this.lblDate,
this.xrPictureBox2,
this.xrLabel15,
this.xrLabel14,
this.xrLabel12,
@@ -357,6 +361,68 @@ namespace CaritasverbandDuerenJuelichEV
this.GroupHeader2.Name = "GroupHeader2";
this.GroupHeader2.RepeatEveryPage = true;
//
// xrTable1
//
this.xrTable1.Borders = ((DevExpress.XtraPrinting.BorderSide)((((DevExpress.XtraPrinting.BorderSide.Left | DevExpress.XtraPrinting.BorderSide.Top)
| DevExpress.XtraPrinting.BorderSide.Right)
| DevExpress.XtraPrinting.BorderSide.Bottom)));
this.xrTable1.Font = new DevExpress.Drawing.DXFont("Arial", 10F, DevExpress.Drawing.DXFontStyle.Bold);
this.xrTable1.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F);
this.xrTable1.Name = "xrTable1";
this.xrTable1.Rows.AddRange(new DevExpress.XtraReports.UI.XRTableRow[] {
this.xrTableRow1});
this.xrTable1.SizeF = new System.Drawing.SizeF(677.0002F, 49.66666F);
this.xrTable1.StylePriority.UseBorders = false;
this.xrTable1.StylePriority.UseFont = false;
this.xrTable1.StylePriority.UsePadding = false;
//
// xrTableRow1
//
this.xrTableRow1.Cells.AddRange(new DevExpress.XtraReports.UI.XRTableCell[] {
this.xrTableCell1,
this.xrTableCell2,
this.xrTableCell11,
this.xrTableCell12});
this.xrTableRow1.Name = "xrTableRow1";
this.xrTableRow1.Weight = 1D;
//
// xrTableCell1
//
this.xrTableCell1.CanGrow = false;
this.xrTableCell1.Name = "xrTableCell1";
this.xrTableCell1.StylePriority.UseTextAlignment = false;
this.xrTableCell1.Text = "Datum";
this.xrTableCell1.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
this.xrTableCell1.Weight = 0.55121411577217783D;
//
// xrTableCell2
//
this.xrTableCell2.Multiline = true;
this.xrTableCell2.Name = "xrTableCell2";
this.xrTableCell2.StylePriority.UseTextAlignment = false;
this.xrTableCell2.Text = "Route";
this.xrTableCell2.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
this.xrTableCell2.Weight = 3.1438578698415873D;
//
// xrTableCell11
//
this.xrTableCell11.CanGrow = false;
this.xrTableCell11.Multiline = true;
this.xrTableCell11.Name = "xrTableCell11";
this.xrTableCell11.StylePriority.UseTextAlignment = false;
this.xrTableCell11.Text = "Kilometer\r\ngefahren";
this.xrTableCell11.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
this.xrTableCell11.Weight = 0.48293968769118206D;
//
// xrTableCell12
//
this.xrTableCell12.Multiline = true;
this.xrTableCell12.Name = "xrTableCell12";
this.xrTableCell12.StylePriority.UseTextAlignment = false;
this.xrTableCell12.Text = "Kilometer\r\ndienstlich";
this.xrTableCell12.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
this.xrTableCell12.Weight = 0.48185133670195773D;
//
// objectDataSource1
//
this.objectDataSource1.DataSource = typeof(BeWo.Report.ReportObjects.EmployeeKilometerauswertungsRO);
@@ -636,67 +702,26 @@ namespace CaritasverbandDuerenJuelichEV
this.lblDoppelkm.Text = "Doppelkilometer: ";
this.lblDoppelkm.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft;
//
// xrTable1
// lblDate
//
this.xrTable1.Borders = ((DevExpress.XtraPrinting.BorderSide)((((DevExpress.XtraPrinting.BorderSide.Left | DevExpress.XtraPrinting.BorderSide.Top)
| DevExpress.XtraPrinting.BorderSide.Right)
| DevExpress.XtraPrinting.BorderSide.Bottom)));
this.xrTable1.Font = new DevExpress.Drawing.DXFont("Arial", 10F, DevExpress.Drawing.DXFontStyle.Bold);
this.xrTable1.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F);
this.xrTable1.Name = "xrTable1";
this.xrTable1.Rows.AddRange(new DevExpress.XtraReports.UI.XRTableRow[] {
this.xrTableRow1});
this.xrTable1.SizeF = new System.Drawing.SizeF(677.0002F, 49.66666F);
this.xrTable1.StylePriority.UseBorders = false;
this.xrTable1.StylePriority.UseFont = false;
this.xrTable1.StylePriority.UsePadding = false;
this.lblDate.Font = new DevExpress.Drawing.DXFont("arial", 10F);
this.lblDate.LocationFloat = new DevExpress.Utils.PointFloat(249.1944F, 69.33333F);
this.lblDate.Multiline = true;
this.lblDate.Name = "lblDate";
this.lblDate.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.lblDate.SizeF = new System.Drawing.SizeF(80.20834F, 33.41669F);
this.lblDate.StylePriority.UseFont = false;
this.lblDate.StylePriority.UseTextAlignment = false;
this.lblDate.TextAlignment = DevExpress.XtraPrinting.TextAlignment.BottomLeft;
//
// xrTableRow1
// xrPictureBox2
//
this.xrTableRow1.Cells.AddRange(new DevExpress.XtraReports.UI.XRTableCell[] {
this.xrTableCell1,
this.xrTableCell2,
this.xrTableCell11,
this.xrTableCell12});
this.xrTableRow1.Name = "xrTableRow1";
this.xrTableRow1.Weight = 1D;
//
// xrTableCell1
//
this.xrTableCell1.CanGrow = false;
this.xrTableCell1.Name = "xrTableCell1";
this.xrTableCell1.StylePriority.UseTextAlignment = false;
this.xrTableCell1.Text = "Datum";
this.xrTableCell1.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
this.xrTableCell1.Weight = 0.55121411577217783D;
//
// xrTableCell2
//
this.xrTableCell2.Multiline = true;
this.xrTableCell2.Name = "xrTableCell2";
this.xrTableCell2.StylePriority.UseTextAlignment = false;
this.xrTableCell2.Text = "Route";
this.xrTableCell2.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
this.xrTableCell2.Weight = 3.1438578698415873D;
//
// xrTableCell11
//
this.xrTableCell11.CanGrow = false;
this.xrTableCell11.Multiline = true;
this.xrTableCell11.Name = "xrTableCell11";
this.xrTableCell11.StylePriority.UseTextAlignment = false;
this.xrTableCell11.Text = "Kilometer\r\ngefahren";
this.xrTableCell11.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
this.xrTableCell11.Weight = 0.48293968769118206D;
//
// xrTableCell12
//
this.xrTableCell12.Multiline = true;
this.xrTableCell12.Name = "xrTableCell12";
this.xrTableCell12.StylePriority.UseTextAlignment = false;
this.xrTableCell12.Text = "Kilometer\r\ndienstlich";
this.xrTableCell12.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
this.xrTableCell12.Weight = 0.48185133670195773D;
this.xrPictureBox2.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("ImageSource", null, "Employees2Entries.EmployeeSignature")});
this.xrPictureBox2.LocationFloat = new DevExpress.Utils.PointFloat(329.4027F, 52.70824F);
this.xrPictureBox2.Name = "xrPictureBox2";
this.xrPictureBox2.SizeF = new System.Drawing.SizeF(168.9861F, 50.04177F);
this.xrPictureBox2.Sizing = DevExpress.XtraPrinting.ImageSizeMode.ZoomImage;
//
// EmployeeKilometerauswertungsReport
//
@@ -726,8 +751,8 @@ namespace CaritasverbandDuerenJuelichEV
xrWatermark1.Id = "Watermark1";
this.Watermarks.Add(xrWatermark1);
((System.ComponentModel.ISupportInitialize)(this.xrTable4)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.objectDataSource1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.xrTable1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.objectDataSource1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this)).EndInit();
}
@@ -786,5 +811,7 @@ namespace CaritasverbandDuerenJuelichEV
private DevExpress.XtraReports.UI.XRTableCell xrTableCell2;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell11;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell12;
private DevExpress.XtraReports.UI.XRLabel lblDate;
private DevExpress.XtraReports.UI.XRPictureBox xrPictureBox2;
}
}

View File

@@ -14,5 +14,21 @@ namespace CaritasverbandDuerenJuelichEV.Service
{
return false;
}
public override List<ServiceRecordValidationResultDC> ValidateServiceRecord(ServiceRecordDC newServiceRecord, SupportConceptStatisticsDC statistics, int maxDaysEditServiceRecordsAllowed, IList<long> employeeOids, IList<long> cb2scOids)
{
// Am Ende des Monats erklärt der MA, dass er den Monat abgeschlossen hat, dass soll wirklich seine letzte Buchung sein
var list = base.ValidateServiceRecord(newServiceRecord, statistics, maxDaysEditServiceRecordsAllowed, employeeOids, cb2scOids);
if (newServiceRecord.ServiceDescription.Name == "Monatsabschluss")
{
list.Add(new ServiceRecordValidationResultDC
{
ResultType = ServiceRecordValidationResult.Custom,
Message = String.Format("Sind alle Daten vollständig und korrekt erfasst (Fachleistungsstunden inkl. Kurzkontakte, Rüstzeiten, gefahrene Strecken, Leistungsnachweise, etc.)?"),
Allow = true
});
}
return list;
}
}
}