134 lines
6.3 KiB
C#
134 lines
6.3 KiB
C#
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;
|
|
}
|
|
}
|
|
} |