GerdasPflegedienst/Service/CustomServiceRecordValidator - Warnung in letzten 6 Monaten HP und letzte 10 Std HP
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user