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 ; }
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 ( ) ;
if ( srList . Count = = 0 )
{
srList = ErstelleStundenplanEintraege ( span . StartDateTime . Date , span . EndDate . Date , c2s , vs ) ;
DAOFactory . GenericDAO . Insert ( srList ) ;
ReturnMessage + = String . Format ( "Es wurden {0} Einträge erstellt." , srList . Count ) ;
}
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 ;
}
2022-06-03 12:34:41 +02:00
public virtual List < ServiceRecord > ErstelleStundenplanEintraege ( DateTime start , DateTime ende , CostBearer2SupportConcept c2s , VacationService vs )
2022-04-25 15:45:02 +02:00
{
var customer = c2s . SupportConcept . Customer ;
var stundenplan = GetStundenplan ( customer , start , ende ) ;
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");
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
{
2022-06-03 12:34:41 +02:00
var newServiceRecords = CreateServiceRecords ( stundenplan , start , c2s , defaultSd ) ;
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 ;
}
protected virtual IList < ServiceRecord > CreateServiceRecords ( Arbeitszeit arbeitszeit , DateTime datum , CostBearer2SupportConcept c2s , ServiceDescription defaultSd )
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 ) )
{
2022-06-03 12:34:41 +02:00
var sr = CreateServiceRecord ( ae , datum , c2s , defaultSd ) ;
2022-04-25 15:45:02 +02:00
records . Add ( sr ) ;
}
}
}
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
{
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 ;
}
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
}
}