Files
BeWoPlaner/Service/Plugins/OperationService.cs

262 lines
8.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using BeWo.Data;
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>
{
protected String ReturnMessage { get; set; }
public virtual String CreateDefaultCustomerServiceRecords(DateTime start, DateTime end, IList<long> cb2scOids)
{
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);
if (ReturnMessage.Length > 0)
{
ReturnMessage += "\n";
}
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;
}
public virtual List<ServiceRecord> ErstelleStundenplanEintraege(DateTime start, DateTime ende, CostBearer2SupportConcept c2s, VacationService vs)
{
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)
if (ft == null && !HatAbwesenheit(start, customer))
{
var newServiceRecords = CreateServiceRecords(stundenplan, start, c2s, defaultSd);
serviceRecords.AddRange(newServiceRecords);
}
start = start.AddDays(1);
}
return serviceRecords;
}
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)
{
var records = new List<ServiceRecord>();
if (arbeitszeit != null && arbeitszeit.ArbeitszeitEintraege != null)
{
foreach (var ae in arbeitszeit.ArbeitszeitEintraege)
{
if (IsSameWeekday(ae, datum.DayOfWeek))
{
var sr = CreateServiceRecord(ae, datum, c2s, defaultSd);
records.Add(sr);
}
}
}
return records;
}
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;
}
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;
}
}
}