diff --git a/ReportImp/GerdasPflegedienst/GerdasPflegedienst.csproj b/ReportImp/GerdasPflegedienst/GerdasPflegedienst.csproj
index e56afe584..389ae0a22 100644
--- a/ReportImp/GerdasPflegedienst/GerdasPflegedienst.csproj
+++ b/ReportImp/GerdasPflegedienst/GerdasPflegedienst.csproj
@@ -102,6 +102,7 @@
+
Component
diff --git a/ReportImp/GerdasPflegedienst/Service/CustomServiceRecordValidator.cs b/ReportImp/GerdasPflegedienst/Service/CustomServiceRecordValidator.cs
new file mode 100644
index 000000000..e479b0297
--- /dev/null
+++ b/ReportImp/GerdasPflegedienst/Service/CustomServiceRecordValidator.cs
@@ -0,0 +1,134 @@
+using BeWo.Data.Access;
+using BeWo.Data.Entities;
+using BeWo.Service.DCEntityMapper;
+using BeWo.Service.Plugins;
+using BS.Shared;
+using BS.Shared.DataContracts;
+using BS.Shared.Services;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace GerdasPflegedienst.Service
+{
+ public class CustomServiceRecordValidator : ServiceRecordValidator
+ {
+ public override List ValidateServiceRecord(ServiceRecordDC newServiceRecord, SupportConceptStatisticsDC statistics, int maxDaysEditServiceRecordsAllowed, IList employeeOids, IList cb2scOids)
+ {
+ // Zwei Warnungen zum Ende des HPs, zum einen Hinweis innerhalb der letzten 10 FLS
+ // zum anderen jeden ersten ServiceRecord im Monat eine Warnung innerhalb der letzten 6 Monate
+ var list = base.ValidateServiceRecord(newServiceRecord, statistics, maxDaysEditServiceRecordsAllowed, employeeOids, cb2scOids);
+ if (newServiceRecord.ServiceDescription.Category.IsBillable)
+ {
+ var startDate = newServiceRecord.Start.Value;
+ var endDate = newServiceRecord.End.Value;
+ var klientenoid = newServiceRecord.SupportConcept?.Customer?.CustomerOid;
+ var mitarbeiteroid = newServiceRecord.Employee?.EmployeeOid;
+ if (klientenoid is object && mitarbeiteroid is object)
+ {
+ // Check ob letzte 10 Stunden angebrochen sind, falls ja, gib ne Warnung
+ decimal totalFLSApproved = 0;
+ var factory = PluginLoader.FindClass();
+ SupportConceptStatisticsDC stats = null;
+
+ if (factory == null)
+ {
+ factory = new ServiceRecordStatisticFactory();
+ }
+ long? cb2ScOid = null;
+ if (newServiceRecord.SupportConcept != null && newServiceRecord.CostBearer != null && newServiceRecord.CostBearer2SupportConceptOid.HasValue)
+ {
+ cb2ScOid = newServiceRecord.CostBearer2SupportConceptOid.Value;
+ }
+ if (cb2ScOid.HasValue)
+ {
+ SupportConceptCostBearerRelDC reldc = MapperFactory.SupportConceptCostBearerRelDC_CostBearer2SupportConcept.MapToNewDC(
+ DAOFactory.GenericDAO.GetByID(cb2ScOid.Value));
+
+ Calculations calc = PluginLoader.FindClass(reldc.CostBearer.CostBearerID) ?? Calculations.GetInstance(reldc.CostBearer.CostBearerID);
+ totalFLSApproved = calc.GetApprovedHoursTotal(reldc, true) ?? 0m;
+ if (totalFLSApproved > 0)
+ {
+ stats = factory.CreateSupportConceptStatisticsImpl(reldc.CostBearer2SupportConceptOid.Value, newServiceRecord.Start ?? DateTime.Now, newServiceRecord.ServiceRecordOid);
+ decimal flmTotalRounded = 0;
+ decimal flmApprovedForPeriod = 0;
+
+ SupportConceptPeriodStatisticsDC periodStat = GetStatisticsForServiceRecord(stats, newServiceRecord);
+ if (periodStat != null)
+ {
+ flmTotalRounded = periodStat.MinutesProvidedTotalRounded;
+ flmApprovedForPeriod = periodStat.MinutesApprovedTotal;
+
+ //Prüfe nicht übertragbare Stunden
+ if (periodStat.SupportConceptApprovalPeriod != null && !periodStat.SupportConceptApprovalPeriod.IsApprovedBEShifting && (newServiceRecord.ServiceDescription.Category.IsBillable || periodStat.SupportConceptApprovalPeriod.ServiceCategory != null))
+ {
+ if (periodStat.SupportConceptApprovalPeriod.ApprovedBEInterval.HasValue && periodStat.SupportConceptApprovalPeriod.ApprovedBEPerInterval.HasValue)
+ {
+ decimal totalfls = (newServiceRecord.RoundedDuration) / 60;
+ decimal maxAllowed = periodStat.SupportConceptApprovalPeriod.ApprovedBEPerInterval.Value;
+ if (periodStat.SupportConceptApprovalPeriod.ApprovedBEInterval.Value == SupportConceptApprovalInterval.Weekly)
+ {
+ totalfls += periodStat.MinutesProvidedThisWeek / 60;
+ }
+ else if (periodStat.SupportConceptApprovalPeriod.ApprovedBEInterval.Value == SupportConceptApprovalInterval.Monthly)
+ {
+ totalfls += periodStat.MinutesProvidedThisMonth / 60;
+ }
+
+ if (maxAllowed > 0 && totalfls > maxAllowed - 10)
+ {
+ list.Add(new ServiceRecordValidationResultDC
+ {
+ ResultType = ServiceRecordValidationResult.Custom,
+ Message = String.Format("Das Zeitguthaben des Klienten beträgt nur noch {0:0.00} Stunden und ist bei der weiteren Terminplanung zu berücksichtigen.", maxAllowed - totalfls),
+ Allow = true
+ });
+ }
+ }
+ }
+ }
+ else
+ {
+ flmTotalRounded = stats.MinutesProvidedTotalRounded;
+ flmApprovedForPeriod = stats.MinutesApprovedTotal;
+ }
+
+ decimal totalFLS = flmTotalRounded / 60;
+ decimal approvedFlsForPeriod = Math.Round(flmApprovedForPeriod / 60, 2, MidpointRounding.AwayFromZero);
+
+ if (approvedFlsForPeriod > 0 && totalFLS > approvedFlsForPeriod - 10)
+ {
+ if (newServiceRecord.ServiceDescription.Category.IsBillable ||
+ (periodStat != null && periodStat.SupportConceptApprovalPeriod != null && periodStat.SupportConceptApprovalPeriod.ServiceCategory != null))
+ {
+ list.Add(new ServiceRecordValidationResultDC
+ {
+ ResultType = ServiceRecordValidationResult.Custom,
+ Message = String.Format("Das Zeitguthaben des Klienten beträgt nur noch {0:0.00} Stunden und ist bei der weiteren Terminplanung zu berücksichtigen.", approvedFlsForPeriod - totalFLS),
+ Allow = true
+ });
+ }
+ }
+ }
+ // gib eine Warnung, wenn der MA das erste Mal im Monat einen Zeiterfassungeintrag macht und die letzten 6 Monate laufen
+ if (reldc.StartDate.HasValue && reldc.EndDate.HasValue && DateTime.Today >= reldc.EndDate.Value.AddMonths(-6) && DateTime.Today <= reldc.EndDate.Value)
+ {
+ var now = DateTime.Now;
+ var records = DAOFactory.SearchDAO.FindServiceRecordsDetailsForLastDays(cb2ScOid.Value, null);
+ if (!records.Any(r => r.EmployeeOid == newServiceRecord.Employee.EmployeeOid && r.Start.HasValue && r.Start.Value.Year == now.Year && r.Start.Value.Month == now.Month))
+ {
+ list.Add(new ServiceRecordValidationResultDC
+ {
+ ResultType = ServiceRecordValidationResult.Custom,
+ Message = String.Format("Der Hilfeplan läuft am {0:dd.MM.yyyy} aus. Bitte die Besuchshäufigkeit dem Zeitguthaben anpassen.", reldc.EndDate.Value),
+ Allow = true
+ });
+ }
+ }
+ }
+ }
+ }
+ return list;
+ }
+ }
+}
\ No newline at end of file