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