2019-07-12 17:36:37 +02:00
using System ;
using System.Collections.Generic ;
using System.Linq ;
2022-04-25 15:45:02 +02:00
using BeWo.Data ;
2019-07-12 17:36:37 +02:00
using BeWo.Data.Access ;
using BeWo.Data.Entities ;
using BeWo.Service.DCEntityMapper ;
using BS.Shared ;
using BS.Shared.Core ;
using BS.Shared.DataContracts ;
using BS.Shared.DataContracts.Compact ;
using BS.Shared.Extensions ;
namespace BeWo.Service.Plugins
{
public class OperationService : AbstractIDSpecificDefaultClass < OperationService >
{
2022-04-25 15:45:02 +02:00
protected String ReturnMessage { get ; set ; }
2024-09-17 21:10:47 +02:00
protected virtual bool CreateServiceRecordsIfAnyExistInDateRange { get { return false ; } }
2022-06-03 12:34:41 +02:00
public virtual String CreateDefaultCustomerServiceRecords ( DateTime start , DateTime end , IList < long > cb2scOids )
2022-04-25 15:45:02 +02:00
{
var vs = PluginLoader . FindClass < VacationService > ( ) ;
ReturnMessage = "" ;
DateTimeSpan span = new DateTimeSpan ( ) ;
span . StartDateTime = start ;
span . EndDateTime = end . AddDays ( 1 ) . AddTicks ( - 1 ) ;
var c2sList = DAOFactory . GenericDAO . LoadByIDs < CostBearer2SupportConcept > ( cb2scOids ) ;
foreach ( var c2s in c2sList )
{
var srList = DAOFactory . SearchDAO . FindServiceRecordsInSpan ( c2s . Oid . Value , span ) . ToList ( ) ;
2024-09-17 21:10:47 +02:00
if ( srList . Count = = 0 | | CreateServiceRecordsIfAnyExistInDateRange )
2022-04-25 15:45:02 +02:00
{
2024-09-17 21:10:47 +02:00
var newSrList = ErstelleStundenplanEintraege ( span . StartDateTime . Date , span . EndDate . Date , c2s , vs , srList ) ;
2022-04-25 15:45:02 +02:00
2024-09-17 21:10:47 +02:00
DAOFactory . GenericDAO . Insert ( newSrList ) ;
2023-09-08 15:52:55 +02:00
if ( ReturnMessage . Length > 0 )
{
ReturnMessage + = "\n" ;
}
2024-09-17 21:10:47 +02:00
ReturnMessage + = String . Format ( "Es wurden {0} Einträge erstellt." , newSrList . Count ) ;
2022-04-25 15:45:02 +02:00
}
else
{
if ( srList . Count > 1 )
{
ReturnMessage = String . Format ( "In dem ausgewählten Zeitraum sind bereits {0} Einträge vorhanden, daher können keine weiteren Einträge automatisch erstellt werden." , srList . Count ) ;
}
else
{
ReturnMessage = String . Format ( "In dem ausgewählten Zeitraum ist bereits ein Eintrag vorhanden, daher können keine weiteren Einträge automatisch erstellt werden." ) ;
}
}
}
return ReturnMessage ;
}
2024-09-17 21:10:47 +02:00
public virtual List < ServiceRecord > ErstelleStundenplanEintraege ( DateTime start , DateTime ende , CostBearer2SupportConcept c2s , VacationService vs , List < ServiceRecord > existingList )
2022-04-25 15:45:02 +02:00
{
var customer = c2s . SupportConcept . Customer ;
List < ServiceRecord > serviceRecords = new List < ServiceRecord > ( ) ;
var defaultSd = GetDefaultServiceDescription ( c2s ) ;
if ( defaultSd = = null )
{
ReturnMessage = "Es konnte keine passende Leistung ermittelt werden." ;
return serviceRecords ;
}
while ( start < = ende )
{
//var ferien = vs.GetFerien(start, "nrw");
2024-01-16 18:42:02 +01:00
var stundenplan = GetStundenplan ( customer , start , start ) ;
2022-04-25 15:45:02 +02:00
var ft = vs . GetFeiertag ( start ) ;
//if (ferien == null && ft == null)
2022-06-03 12:34:41 +02:00
if ( ft = = null & & ! HatAbwesenheit ( start , customer ) )
2022-04-25 15:45:02 +02:00
{
2024-09-17 21:10:47 +02:00
var newServiceRecords = CreateServiceRecords ( stundenplan , start , c2s , defaultSd , existingList ) ;
2022-04-25 15:45:02 +02:00
serviceRecords . AddRange ( newServiceRecords ) ;
}
start = start . AddDays ( 1 ) ;
}
return serviceRecords ;
}
2022-06-03 12:34:41 +02:00
private bool HatAbwesenheit ( DateTime start , Customer customer )
{
foreach ( var at in customer . AbsenceTimes )
{
if ( at . Start < = start & & ( ! at . End . HasValue | | at . End > = start ) )
{
return true ;
}
}
return false ;
}
2024-09-17 21:10:47 +02:00
protected virtual IList < ServiceRecord > CreateServiceRecords ( Arbeitszeit arbeitszeit , DateTime datum , CostBearer2SupportConcept c2s , ServiceDescription defaultSd , List < ServiceRecord > existingList )
2022-04-25 15:45:02 +02:00
{
var records = new List < ServiceRecord > ( ) ;
if ( arbeitszeit ! = null & & arbeitszeit . ArbeitszeitEintraege ! = null )
{
foreach ( var ae in arbeitszeit . ArbeitszeitEintraege )
{
if ( IsSameWeekday ( ae , datum . DayOfWeek ) )
{
2024-09-17 21:10:47 +02:00
if ( existingList = = null | | existingList . Count ( s = > s . Start . Value . Date = = datum . Date ) = = 0 )
{
var sr = CreateServiceRecord ( ae , datum , c2s , defaultSd ) ;
records . Add ( sr ) ;
}
2022-04-25 15:45:02 +02:00
}
}
}
return records ;
}
2022-06-03 12:34:41 +02:00
public virtual ServiceRecord CreateServiceRecord ( ArbeitszeitEintrag ae , DateTime datum , CostBearer2SupportConcept c2s , ServiceDescription defaultSd )
{
ServiceRecord sr = new ServiceRecord ( ) ;
sr . Start = GetDateTime ( ae . UhrzeitVon , datum ) ;
sr . End = GetDateTime ( ae . UhrzeitBis , datum ) ;
sr . RoundedDuration = ( decimal ) sr . End . Value . Subtract ( sr . Start . Value ) . TotalMinutes ;
if ( ae . Employee ! = null )
{
sr . Employee = ae . Employee ;
}
else
2024-09-17 21:10:47 +02:00
{
sr . Employee = GetHauptbetreuung ( c2s . SupportConcept . Customer , datum ) ;
}
if ( sr . Employee = = null )
2022-06-03 12:34:41 +02:00
{
sr . Employee = LoggedInUserOperationContextExt . Current . User . Employee ;
}
sr . Customer = c2s . SupportConcept . Customer ;
sr . SupportConcept = c2s . SupportConcept ;
sr . CostBearer2SupportConcept = c2s ;
sr . ServiceDescription = defaultSd ;
sr . ServiceRecordType = ServiceRecordTypeId . DefaultActivity ;
sr . DistanceInMeter = 0 ;
sr . DurationInStunden = ZeiterfassungsDauer . Minuten ;
sr . ServiceRecordFormat = ServiceRecordFormate . OriginaleZeiterfassung ;
sr . Relevance = 0 ;
return sr ;
}
2024-09-17 21:10:47 +02:00
public virtual Employee GetHauptbetreuung ( Customer customer , DateTime date )
{
return customer . Employee2CustomerList . FirstOrDefault ( e2c = > e2c . IsActive = = ActivationTypeId . Active & &
( ! e2c . StartDate . HasValue | | e2c . StartDate . Value . Date < = date ) & & ( ! e2c . EndDate . HasValue | | e2c . EndDate . Value . Date > = date ) & &
e2c . ValueList . Any ( b = > b . Entry . Type . Equals ( ValueListEntryType . StaffRoleType ) & &
b . Entry . SystemEntryID . HasValue & & b . Entry . SystemEntryID . Value = = SystemEntryID . EmployeeRoleMainAttendant ) ) ? . Employee ;
}
2022-04-25 15:45:02 +02:00
public virtual ServiceDescription GetDefaultServiceDescription ( CostBearer2SupportConcept c2s )
{
foreach ( var ap in c2s . ApprovalPeriodList )
{
if ( ap . ServiceCategory ! = null )
{
var desc = DAOFactory . SearchDAO . FindServiceDescriptionForCategory ( ap . ServiceCategory . Oid . Value ) ;
var sd = desc . OrderBy ( a = > a . Position ) . FirstOrDefault ( ) ;
if ( sd ! = null )
{
return sd ;
}
}
}
return GetDefaultServiceDescription ( ) ;
}
public virtual ServiceDescription GetDefaultServiceDescription ( )
{
return null ;
}
private Arbeitszeit GetStundenplan ( Customer customer , DateTime start , DateTime ende )
{
if ( customer = = null )
{
return null ;
}
var stundenplan = SucheStundenplan ( customer . Arbeitszeiten , start , ende ) ;
return stundenplan ;
}
private static Arbeitszeit SucheStundenplan ( IList < Arbeitszeit > arbeitszeiten , DateTime start , DateTime ende )
{
if ( arbeitszeiten ! = null & & arbeitszeiten . Count > 0 )
{
foreach ( var az in arbeitszeiten )
{
if ( ( ! az . GueltigVon . HasValue | | az . GueltigVon < = ende ) & & ( ! az . GueltigBis . HasValue | | az . GueltigBis > = start ) )
{
return az ;
}
}
}
return null ;
}
public static bool IsSameWeekday ( ArbeitszeitEintrag ae , DayOfWeek day )
{
if ( day = = DayOfWeek . Monday & & ae . Tag = = AppointmentDayOfWeek . Montag )
{
return true ;
}
if ( day = = DayOfWeek . Tuesday & & ae . Tag = = AppointmentDayOfWeek . Dienstag )
{
return true ;
}
if ( day = = DayOfWeek . Wednesday & & ae . Tag = = AppointmentDayOfWeek . Mittwoch )
{
return true ;
}
if ( day = = DayOfWeek . Thursday & & ae . Tag = = AppointmentDayOfWeek . Donnerstag )
{
return true ;
}
if ( day = = DayOfWeek . Friday & & ae . Tag = = AppointmentDayOfWeek . Freitag )
{
return true ;
}
if ( day = = DayOfWeek . Saturday & & ae . Tag = = AppointmentDayOfWeek . Samstag )
{
return true ;
}
return false ;
}
public static DateTime ? GetDateTime ( String timeAsString , DateTime date )
{
String dateStr = String . Format ( "{0:dd.MM.yyyy} {1}" , date , timeAsString ) ;
DateTime dateOut ;
if ( DateTime . TryParse ( dateStr , out dateOut ) )
{
return dateOut ;
}
return null ;
}
2019-07-12 17:36:37 +02:00
}
}