2024-10-09 14:36:14 +02:00
|
|
|
|
using BeWo.Data.Access;
|
|
|
|
|
|
using BeWo.Data.Entities;
|
|
|
|
|
|
using BeWo.Report;
|
|
|
|
|
|
using BeWo.Report.ReportObjects;
|
|
|
|
|
|
using BeWo.Service.DCEntityMapper;
|
|
|
|
|
|
using BS.Shared.Core;
|
|
|
|
|
|
using BS.Shared.DataContracts;
|
2025-03-20 08:12:29 +01:00
|
|
|
|
using BS.Shared.Extensions;
|
2026-06-12 13:52:34 +02:00
|
|
|
|
using DevExpress.XtraCharts.GLGraphics.Platform;
|
2024-10-09 14:36:14 +02:00
|
|
|
|
using DevExpress.XtraReports.UI;
|
2026-06-12 13:52:34 +02:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text.RegularExpressions;
|
2024-10-09 14:36:14 +02:00
|
|
|
|
|
|
|
|
|
|
namespace LebenshilfeStadeMID
|
|
|
|
|
|
{
|
|
|
|
|
|
public partial class Quittierungsbeleg : XtraReport, IBeWoReport<ServicesOverviewRO>
|
|
|
|
|
|
{
|
|
|
|
|
|
public Quittierungsbeleg()
|
|
|
|
|
|
{
|
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void SetReportDataSource(ServicesOverviewRO pRO)
|
|
|
|
|
|
{
|
2024-11-13 12:50:40 +01:00
|
|
|
|
double summeVerfuegungszeit = 0;
|
2025-06-20 12:54:08 +02:00
|
|
|
|
double summeZusatzleistung1 = 0;
|
|
|
|
|
|
double summeZusatzleistung2 = 0;
|
2025-06-24 13:18:43 +02:00
|
|
|
|
double gesamteZeit = 0;
|
2024-11-13 12:50:40 +01:00
|
|
|
|
|
2024-10-09 14:36:14 +02:00
|
|
|
|
if (pRO.Services != null)
|
|
|
|
|
|
{
|
2025-03-20 08:12:29 +01:00
|
|
|
|
// Verf<72>gungszeiten und Zusatzleistungen aus der Liste rauskopieren, weil die Werte am Ende alle in einer Zeile stehen sollen
|
|
|
|
|
|
List<ServicesOverviewRO.ServiceDetail> verfuegungszeiten = new List<ServicesOverviewRO.ServiceDetail>();
|
|
|
|
|
|
List<ServicesOverviewRO.ServiceDetail> zusatzleistungen = new List<ServicesOverviewRO.ServiceDetail>();
|
2025-08-20 08:13:23 +02:00
|
|
|
|
verfuegungszeiten.AddRange(pRO.Services.Where(s => s.ServiceDescription.ToLower().Contains("verf<72>gungszeit") || s.ServiceDescription.ToLower().Contains("vorbereitungszeit")).ToList());
|
2026-02-26 15:01:14 +01:00
|
|
|
|
zusatzleistungen.AddRange(pRO.Services.Where(s => s.ServiceDescription.ToLower().Contains("zusatzleistung")).ToList());
|
2025-08-20 15:28:11 +02:00
|
|
|
|
|
2025-03-20 08:12:29 +01:00
|
|
|
|
pRO.Services.RemoveRange(verfuegungszeiten);
|
2025-08-20 15:28:11 +02:00
|
|
|
|
// Zusatzleistungen pauschal entfernen geht nicht, da Zusatzleistungen auch an Tagen existieren k<>nnen an denen es keine anderen Leistungen gibt.
|
|
|
|
|
|
//pRO.Services.RemoveRange(zusatzleistungen);
|
|
|
|
|
|
foreach (var zsl in zusatzleistungen)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pRO.Services.Any(s => s.StartDate.Date == zsl.StartDate.Date && s.ServiceDescription != zsl.ServiceDescription))
|
|
|
|
|
|
pRO.Services.Remove(zsl);
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-03-20 08:12:29 +01:00
|
|
|
|
|
2024-10-09 14:36:14 +02:00
|
|
|
|
var customer = MapperFactory.CustomerDC_Customer.MapToNewDC(DAOFactory.GenericDAO.GetByID<Customer>(pRO.CustomerOid));
|
|
|
|
|
|
if (customer.RelatedEmployees != null && customer.RelatedEmployees.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
var vertretung = customer.RelatedEmployees.FirstOrDefault(e => e.RelationRole.DisplayName == "Vertretung");
|
|
|
|
|
|
if (vertretung != null)
|
|
|
|
|
|
lblVertretung.Text = vertretung.Employee.FirstNameLastName;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Im Beleg muss jede Klienten- und Mitarbeiterabwesenheit dargestellt werden, egal ob da ein Termin stattgefunden hat oder nicht
|
|
|
|
|
|
// Klientenabwesenheiten markieren bzw. hinzuf<75>gen
|
|
|
|
|
|
pRO = MarkiereAbwesenheiten(customer, pRO);
|
|
|
|
|
|
List<ServicesOverviewRO.ServiceDetail> servicesBillable = new List<ServicesOverviewRO.ServiceDetail>();
|
|
|
|
|
|
foreach (var sd in pRO.Services)
|
|
|
|
|
|
{
|
2024-11-21 13:02:51 +01:00
|
|
|
|
sd.Notice = "";
|
|
|
|
|
|
sd.Notice2 = "";
|
2025-06-20 12:54:08 +02:00
|
|
|
|
sd.Notice3 = "";
|
2025-04-22 13:30:52 +02:00
|
|
|
|
sd.Notice5 = "";
|
|
|
|
|
|
|
2025-06-20 12:54:08 +02:00
|
|
|
|
|
2024-11-21 13:02:51 +01:00
|
|
|
|
|
2025-03-20 08:12:29 +01:00
|
|
|
|
// Verf<72>gungszeit in eigentlichen ServiceRecord eintragen und aus Liste entfernen, dass der nicht mehrfach <20>bertragen wird
|
2026-06-12 13:52:34 +02:00
|
|
|
|
var vz = verfuegungszeiten.FirstOrDefault(s => s.StartDate.Date == sd.StartDate.Date && !s.ServiceDescription.ToLower().Contains("vorbereitungszeit fachlich egh"));
|
2025-06-20 12:54:08 +02:00
|
|
|
|
var zls = zusatzleistungen.Where(s => s.StartDate.Date == sd.StartDate.Date).ToList();
|
2025-03-20 08:12:29 +01:00
|
|
|
|
if (vz != null)
|
2024-11-13 12:50:40 +01:00
|
|
|
|
{
|
2025-04-08 17:22:59 +02:00
|
|
|
|
sd.Notice = string.Format("{0:0.00}", vz.Minutes / 60);
|
2025-03-20 08:12:29 +01:00
|
|
|
|
sd.Minutes += vz.Minutes;
|
|
|
|
|
|
summeVerfuegungszeit += vz.Minutes;
|
|
|
|
|
|
verfuegungszeiten.Remove(vz);
|
|
|
|
|
|
}
|
|
|
|
|
|
// Zusatzleistung in eigentlichen ServiceRecord eintragen und aus Liste entfernen, dass der nicht mehrfach <20>bertragen wird
|
2025-08-20 15:28:11 +02:00
|
|
|
|
// is zsl[x] = servicerecord gibt es an dem Tag keinen Eintrag, bei dem man die Zusatzleistung eintragen k<>nnte, dann werden die Min
|
|
|
|
|
|
// nicht erh<72>ht sondern einfach die Zusatzleistung als Zeit angezeigt
|
2025-06-20 12:54:08 +02:00
|
|
|
|
if (zls != null)
|
2024-11-13 12:50:40 +01:00
|
|
|
|
{
|
2025-06-20 12:54:08 +02:00
|
|
|
|
if (zls.Count > 0)
|
|
|
|
|
|
{
|
2025-08-20 15:28:11 +02:00
|
|
|
|
if (zls[0] != sd)
|
|
|
|
|
|
sd.Minutes += zls[0].Minutes;
|
|
|
|
|
|
|
2025-06-20 12:54:08 +02:00
|
|
|
|
sd.Notice2 = string.Format("{0:0.00} ({1:0})", zls[0].Minutes / 60, zls[0].ServiceDescription);
|
|
|
|
|
|
summeZusatzleistung1 += zls[0].Minutes;
|
|
|
|
|
|
zusatzleistungen.Remove(zls[0]);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (zls.Count > 1)
|
|
|
|
|
|
{
|
2025-08-20 15:28:11 +02:00
|
|
|
|
if (zls[1] != sd)
|
|
|
|
|
|
sd.Minutes += zls[1].Minutes;
|
|
|
|
|
|
|
2025-06-20 12:54:08 +02:00
|
|
|
|
sd.Notice3 = string.Format("{0:0.00} ({1:0})", zls[1].Minutes / 60, zls[1].ServiceDescription);
|
|
|
|
|
|
summeZusatzleistung2 += zls[1].Minutes;
|
|
|
|
|
|
zusatzleistungen.Remove(zls[1]);
|
|
|
|
|
|
}
|
2024-11-13 12:50:40 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-20 12:54:08 +02:00
|
|
|
|
// Notice5 ist Zeit in Stunden, au<61>er es in der Leistung steht "Klassenfahrt" drin, dann ist Notice5 Klassenfahrt
|
|
|
|
|
|
if (sd.ServiceDescription.ToLower().Contains("klassenfahrt"))
|
|
|
|
|
|
sd.Notice5 = "Klassenfahrt";
|
|
|
|
|
|
else
|
2025-06-24 13:18:43 +02:00
|
|
|
|
{
|
2025-07-01 16:34:48 +02:00
|
|
|
|
//sd.Notice5 = string.Format("{0:0.00}", Math.Round(sd.Minutes / 60, 2));
|
|
|
|
|
|
//gesamteZeit += Math.Round(sd.Minutes / 60, 2);
|
|
|
|
|
|
sd.Notice5 = string.Format("{0}", sd.Minutes);
|
|
|
|
|
|
gesamteZeit += sd.Minutes;
|
2025-06-24 13:18:43 +02:00
|
|
|
|
}
|
2025-06-20 12:54:08 +02:00
|
|
|
|
|
2024-10-09 14:36:14 +02:00
|
|
|
|
if (sd.IsBillable || sd.ServiceDescription.ToLower().Contains("fehlkontakt") || sd.ServiceCategory.ToLower().Contains("fehlkontakt"))
|
2025-03-20 08:12:29 +01:00
|
|
|
|
if (!sd.ServiceDescription.IsNullOrEmpty())
|
|
|
|
|
|
servicesBillable.Add(sd);
|
2024-10-09 14:36:14 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pRO.Services = servicesBillable;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-01 16:34:48 +02:00
|
|
|
|
tcSumVerfuegungszeitMin.Text = string.Format("{0:0}", summeVerfuegungszeit);
|
|
|
|
|
|
tcSumZusatzleistung1Min.Text = string.Format("{0:0}", summeZusatzleistung1);
|
|
|
|
|
|
tcSumZusatzleistung2Min.Text = string.Format("{0:0}", summeZusatzleistung2);
|
|
|
|
|
|
lblGesamtzeitMin.Text = string.Format("{0:0}", gesamteZeit);
|
|
|
|
|
|
|
|
|
|
|
|
tcSumVerfuegungszeitStd.Text = string.Format("{0:0.00}", summeVerfuegungszeit / 60);
|
|
|
|
|
|
tcSumZusatzleistung1Std.Text = string.Format("{0:0.00}", summeZusatzleistung1 / 60);
|
|
|
|
|
|
tcSumZusatzleistung2Std.Text = string.Format("{0:0.00}", summeZusatzleistung2 / 60);
|
|
|
|
|
|
lblGesamtzeitStd.Text = string.Format("{0:0.00}", gesamteZeit / 60);
|
2024-11-13 12:50:40 +01:00
|
|
|
|
|
2024-10-09 14:36:14 +02:00
|
|
|
|
bindingSource1.DataSource = pRO;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private ServicesOverviewRO MarkiereAbwesenheiten(CustomerDC customer, ServicesOverviewRO pRO)
|
|
|
|
|
|
{
|
2025-03-05 10:45:58 +01:00
|
|
|
|
//pRO = ErstelleAbwesenheitenFuerKlientenAlt(customer, pRO);
|
2024-10-09 14:36:14 +02:00
|
|
|
|
pRO = ErstelleAbwesenheitenFuerKlienten(customer, pRO);
|
|
|
|
|
|
pRO = ErstelleAbwesenheitenFuerMitarbeiter(customer, pRO);
|
|
|
|
|
|
|
|
|
|
|
|
return pRO;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private ServicesOverviewRO ErstelleAbwesenheitenFuerKlienten(CustomerDC customer, ServicesOverviewRO pRO)
|
2025-03-05 10:45:58 +01:00
|
|
|
|
{
|
|
|
|
|
|
foreach (var service in pRO.Services)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (service.ServiceDescription.ToLower().Contains("krank"))
|
|
|
|
|
|
service.Notice4 = "x";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return pRO;
|
|
|
|
|
|
}
|
|
|
|
|
|
// Die tragen die Abwesenheiten nicht in den Klienten ein, sondern als Zeiterfassung. Daher wird das hier nicht mehr benutzt
|
|
|
|
|
|
private ServicesOverviewRO ErstelleAbwesenheitenFuerKlientenAlt(CustomerDC customer, ServicesOverviewRO pRO)
|
2024-10-09 14:36:14 +02:00
|
|
|
|
{
|
|
|
|
|
|
foreach (var abs in pRO.Abwesenheiten)
|
|
|
|
|
|
{
|
|
|
|
|
|
var ende = abs.End.HasValue ? abs.End.Value : pRO.EndDate;
|
|
|
|
|
|
var start = new DateTime(abs.Start.Value.Year, abs.Start.Value.Month, abs.Start.Value.Day);
|
|
|
|
|
|
|
|
|
|
|
|
// Jeden Abwesenheitstag durchlaufen
|
|
|
|
|
|
while (start <= ende)
|
|
|
|
|
|
{
|
|
|
|
|
|
var services = pRO.Services.Where(s => s.StartDate.Date == start.Date).ToList();
|
|
|
|
|
|
if (services != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Gibt es am Abwesenheitstag einen Termin, einfach x setzen
|
|
|
|
|
|
if (services.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var service in services)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (abs.AbsenceReason.Description.ToLower().Contains("krank"))
|
|
|
|
|
|
service.Notice4 = "x";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// Gibt es keinen Termin, neuen Tag erzeugen und nur Datum und x setzen
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
pRO.Services.Add(new ServicesOverviewRO.ServiceDetail()
|
|
|
|
|
|
{
|
|
|
|
|
|
StartDate = new DateTime(start.Year, start.Month, start.Day),
|
|
|
|
|
|
Notice4 = "x",
|
|
|
|
|
|
ServiceCategory = "",
|
|
|
|
|
|
ServiceDescription = "",
|
|
|
|
|
|
IsBillable = true
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
start = start.AddDays(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return pRO;
|
|
|
|
|
|
}
|
|
|
|
|
|
private ServicesOverviewRO ErstelleAbwesenheitenFuerMitarbeiter(CustomerDC customer, ServicesOverviewRO pRO)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Mitarbeiterabwesenheiten markieren bzw. hinzuf<75>gen
|
|
|
|
|
|
if (customer.RelatedEmployees != null && customer.RelatedEmployees.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
var mainAttendant = customer.RelatedEmployees.FirstOrDefault(e => e.RelationRole.DisplayName == "Hauptbetreuung");
|
|
|
|
|
|
if (mainAttendant != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var employee = MapperFactory.EmployeeDC_Employee.MapToNewDC(DAOFactory.GenericDAO.GetByID<Employee>(mainAttendant.Employee.EmployeeOid));
|
|
|
|
|
|
|
2024-11-13 12:50:40 +01:00
|
|
|
|
|
|
|
|
|
|
employee.AbsenceTimes = employee.AbsenceTimes
|
|
|
|
|
|
.Where(a => a.Start >= pRO.StartDate && a.Start <= pRO.EndDate || a.End >= pRO.StartDate && a.End <= pRO.EndDate)
|
|
|
|
|
|
.OrderBy(a => a.Start).ToList();
|
2024-10-09 14:36:14 +02:00
|
|
|
|
foreach (var abs in employee.AbsenceTimes)
|
|
|
|
|
|
{
|
|
|
|
|
|
var ende = abs.End.HasValue ? abs.End.Value : pRO.EndDate;
|
|
|
|
|
|
var start = new DateTime(abs.Start.Value.Year, abs.Start.Value.Month, abs.Start.Value.Day);
|
|
|
|
|
|
|
|
|
|
|
|
// Jeden Abwesenheitstag durchlaufen
|
|
|
|
|
|
while (start <= ende)
|
|
|
|
|
|
{
|
|
|
|
|
|
var services = pRO.Services.Where(s => s.StartDate.Date == start.Date).ToList();
|
|
|
|
|
|
if (services != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Gibt es am Abwesenheitstag einen Termin, einfach x setzen
|
|
|
|
|
|
if (services.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var service in services)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (abs.Reason.Description.ToLower().Contains("krank"))
|
|
|
|
|
|
service.Notice3 = "x";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// Gibt es keinen Termin, neuen Tag erzeugen und nur Datum und x setzen
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
pRO.Services.Add(new ServicesOverviewRO.ServiceDetail()
|
|
|
|
|
|
{
|
|
|
|
|
|
StartDate = new DateTime(start.Year, start.Month, start.Day),
|
|
|
|
|
|
Notice3 = "x",
|
|
|
|
|
|
ServiceCategory = "",
|
|
|
|
|
|
ServiceDescription = "",
|
|
|
|
|
|
IsBillable = true
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
start = start.AddDays(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return pRO;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void picSignature_BeforePrint(object sender, System.ComponentModel.CancelEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
XRPictureBox xrBox = sender as XRPictureBox;
|
|
|
|
|
|
//var test = this.GetCurrent
|
|
|
|
|
|
string base64String = xrBox.Tag as string;
|
|
|
|
|
|
if (!String.IsNullOrWhiteSpace(base64String))
|
|
|
|
|
|
{
|
|
|
|
|
|
var base64Data = Regex.Match(base64String, @"data:image/(?<type>.+?),(?<data>.+)").Groups["data"].Value;
|
|
|
|
|
|
var binData = Convert.FromBase64String(base64Data);
|
|
|
|
|
|
System.Drawing.Image img = ByteArrayToImage(binData);
|
|
|
|
|
|
xrBox.Image = Utils.CropImage(img);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
xrBox.Image = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public System.Drawing.Image ByteArrayToImage(byte[] byteArrayIn)
|
|
|
|
|
|
{
|
|
|
|
|
|
using(var memoryStream = new MemoryStream(byteArrayIn))
|
|
|
|
|
|
{
|
|
|
|
|
|
return System.Drawing.Image.FromStream(memoryStream);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|