GerdasPflegedienst/Service/CustomServiceRecordValidator - Warnung in letzten 6 Monaten HP und letzte 10 Std HP

This commit is contained in:
2026-03-06 14:48:53 +01:00
parent d12ba2b5ca
commit 48a1f28e56
2 changed files with 135 additions and 0 deletions

View File

@@ -102,6 +102,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Reporting\CustomAnnualReportFactory.cs" />
<Compile Include="Service\CustomCustomerService.cs" />
<Compile Include="Service\CustomServiceRecordValidator.cs" />
<Compile Include="SettlementReport.cs">
<SubType>Component</SubType>
</Compile>

View File

@@ -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<ServiceRecordValidationResultDC> ValidateServiceRecord(ServiceRecordDC newServiceRecord, SupportConceptStatisticsDC statistics, int maxDaysEditServiceRecordsAllowed, IList<long> employeeOids, IList<long> 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<ServiceRecordStatisticFactory>();
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<CostBearer2SupportConcept>(cb2ScOid.Value));
Calculations calc = PluginLoader.FindClass<Calculations>(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;
}
}
}