Files
BeWoPlaner/ReportImp/VkmAachenSbd/ServiceInvoiceReport.cs
2024-03-04 15:55:19 +01:00

430 lines
15 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Plugins;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Services;
using DevExpress.XtraReports.UI;
namespace VkmAachenSbd
{
[IDSpecificClass(Identifier = "SBD")]
public partial class ServiceInvoiceReport : XtraReport, IBeWoReport<ServiceInvoiceRO>
{
public ServiceInvoiceReport()
{
this.InitializeComponent();
}
public void SetReportDataSource(ServiceInvoiceRO pRO)
{
//CreateAbrechnungsItems(pRO);
SetzeEmpfaengerAdresse(pRO);
SetzeBetraege(pRO);
var varfield = GetRechtsgrundlage(pRO);
String anrede = @"
Sehr geehrte Damen und Herren,
wir haben im o.g. Zeitraum für [CustomerFirstName] [CustomerLastName] Leistungen
im Bereich Schulbegleitender Dienst gem. § 53 SGB XII erbracht.
Wir stellen diese hiermit in Rechnung.";
if (pRO.InvoiceBase.SupportConceptCostBearerRelDc != null && pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearer != null && !String.IsNullOrEmpty(pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearer.Function))
{
if (varfield != null)
{
anrede = @"
Sehr geehrte Damen und Herren,
wir haben im o.g. Zeitraum für [CustomerFirstName] [CustomerLastName] Leistungen
im Bereich Schulbegleitender Dienst gem. [Leistungsart] erbracht.
Wir stellen diese hiermit in Rechnung.";
anrede = anrede.Replace("[Leistungsart]", varfield);
}
else if (pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearer.Function.Contains("Jugendamt"))
{
anrede = @"
Sehr geehrte Damen und Herren,
wir haben im o.g. Zeitraum für [CustomerFirstName] [CustomerLastName] Leistungen
im Bereich Schulbegleitender Dienst gem. § 35a SGB VIII erbracht.
Wir stellen diese hiermit in Rechnung.";
}
else
{
if (pRO.AccountingPeriodStart >= new DateTime(2020, 2, 1))
{
anrede = @"
Sehr geehrte Damen und Herren,
wir haben für den o.g. Zeitraum für [CustomerFirstName] [CustomerLastName] Leistungen
in der Schulbegleitung gem. § 112 in Verbindung mit § 75 SGB IX erbracht.
Wir stellen diese hiermit in Rechnung.
";
}
else if (pRO.AccountingPeriodStart >= new DateTime(2020, 1, 1))
{
anrede = @"
Sehr geehrte Damen und Herren,
wir haben für den o.g. Zeitraum für [CustomerFirstName] [CustomerLastName] Leistungen
in der Schulbegleitung erbracht. Gemäß den gesetzlichen Veränderungen nach dem BTHG
rechnen wir diese ab dem 01.01.2020 nach § 112 in Verbindung mit § 75 SGB IX ab.
";
}
}
}
lblAnrede.Text = anrede;
//var subReport = new VkmAachenSbd.LeistungsnachweisAbrechnung();
//subReport.SetReportDataSource(pRO);
//this.xrSubreport1.ReportSource = subReport;
this.bindingSource1.DataSource = pRO;
}
//private void CreateAbrechnungsItems(ServiceInvoiceRO pRo)
//{
// if (pRo.InvoiceBase.SupportConceptCostBearerRelDc != null)
// {
// var c2s = DAOFactory.GenericDAO.LoadByID<CostBearer2SupportConcept>(pRo.InvoiceBase.SupportConceptCostBearerRelDc.CostBearer2SupportConceptOid.Value);
// var list = ErstelleStundenplanItems(c2s.SupportConcept.Customer, pRo.AccountingPeriodStart, pRo.AccountingPeriodEnd);
// var srList = HoleAbrechenbareServiceRecords(c2s, pRo.AccountingPeriodStart, pRo.AccountingPeriodEnd);
// pRo.BillableServiceRecords = MergeBillableServiceRecords(list, srList);
// }
//}
//private List<ServiceRecordDC> MergeBillableServiceRecords(List<ServiceRecordDC> stundenplanItems, List<ServiceRecordDC> srList)
//{
// List<ServiceRecordDC> result = new List<ServiceRecordDC>();
// Dictionary<int, bool> dayExistDict = new Dictionary<int, bool>();
// foreach (var sr in srList)
// {
// if (!dayExistDict.ContainsKey(sr.Start.Value.Day))
// {
// dayExistDict.Add(sr.Start.Value.Day, true);
// }
// result.Add(sr);
// }
// foreach (var sr in stundenplanItems)
// {
// if (!dayExistDict.ContainsKey(sr.Start.Value.Day))
// {
// result.Add(sr);
// }
// }
// return result;
//}
//private List<ServiceRecordDC> HoleAbrechenbareServiceRecords(CostBearer2SupportConcept c2S, DateTime pRoAccountingPeriodStart, DateTime pRoAccountingPeriodEnd)
//{
// var srList = c2S.ServiceRecords;
// List<ServiceRecordDC> result = new List<ServiceRecordDC>();
// foreach (var sr in srList)
// {
// var dc = MapperFactory.ServiceRecordDC_ServiceRecord.MapToNewDC(sr);
// result.Add(dc);
// }
// return result;
//}
//private List<ServiceRecordDC> ErstelleStundenplanItems(Customer customer, DateTime start, DateTime ende)
//{
// var stundenplan = GetStundenplan(customer, start);
// List<ServiceRecordDC> items = new List<ServiceRecordDC>();
// while (start <= ende)
// {
// var subItems = ErstelleStundenplanEintraege(stundenplan, start);
// items.AddRange(subItems);
// start = start.AddDays(1);
// }
// return items;
//}
private static Organisation SucheSchule(Customer customer)
{
foreach (var c2o in customer.Customer2OrganisationList)
{
foreach (var v2o in c2o.ValueList)
{
if (v2o.Entry.Value != null && v2o.Entry.Value.Contains("Schule"))
{
return c2o.Organisation;
}
}
}
return null;
}
//private static Arbeitszeit GetStundenplan(Customer customer, DateTime date)
//{
// var stundenplan = SucheStundenplan(customer.Arbeitszeiten, date);
// if (stundenplan == null)
// {
// //Kein Stundenplan hinterlegt, suche Stundenplan bei der Organisation (Schule)
// var org = SucheSchule(customer);
// if (org != null)
// {
// return SucheStundenplan(org.Arbeitszeiten, date);
// }
// }
// return stundenplan;
//}
//private static Arbeitszeit SucheStundenplan(IList<Arbeitszeit> arbeitszeiten, DateTime date)
//{
// if (arbeitszeiten != null && arbeitszeiten.Count > 0)
// {
// foreach (var az in arbeitszeiten)
// {
// if ((!az.GueltigVon.HasValue || az.GueltigVon <= date) && (!az.GueltigBis.HasValue || az.GueltigBis >= date))
// {
// return az;
// }
// }
// }
// return null;
//}
//private static List<ServiceRecordDC> ErstelleStundenplanEintraege(Arbeitszeit arbeitszeit, DateTime datum)
//{
// List<ServiceRecordDC> items = new List<ServiceRecordDC>();
// if (arbeitszeit != null && arbeitszeit.ArbeitszeitEintraege != null && arbeitszeit.ArbeitszeitEintraege.Count > 0)
// {
// if (arbeitszeit.GueltigVon <= datum && datum <= arbeitszeit.GueltigBis)
// {
// var day = datum.DayOfWeek;
// foreach (var ae in arbeitszeit.ArbeitszeitEintraege)
// {
// if (SindAmGleichenWochentag(day, ae.Tag))
// {
// String dateStr1 = String.Format("{0:dd.MM.yyyy} {1}", datum, ae.UhrzeitVon);
// String dateStr2 = String.Format("{0:dd.MM.yyyy} {1}", datum, ae.UhrzeitBis);
// DateTime date1;
// DateTime date2;
// if (DateTime.TryParse(dateStr1, out date1) && DateTime.TryParse(dateStr2, out date2))
// {
// var item = new ServiceRecordDC();
// item.Start = date1;
// item.End = date2;
// items.Add(item);
// }
// }
// }
// }
// }
// return items;
//}
//private static decimal BerechneStunden(ArbeitszeitEintrag ae)
//{
// String dateStr1 = String.Format("31.12.2018 {0}", ae.UhrzeitVon);
// String dateStr2 = String.Format("31.12.2018 {0}", ae.UhrzeitBis);
// DateTime date1;
// DateTime date2;
// if (DateTime.TryParse(dateStr1, out date1) && DateTime.TryParse(dateStr2, out date2))
// {
// return (decimal)date2.Subtract(date1).TotalHours;
// }
// return 0;
//}
//private static bool SindAmGleichenWochentag(DayOfWeek day, AppointmentDayOfWeek aeTag)
//{
// if (day == DayOfWeek.Monday && aeTag == AppointmentDayOfWeek.Montag)
// {
// return true;
// }
// if (day == DayOfWeek.Tuesday && aeTag == AppointmentDayOfWeek.Dienstag)
// {
// return true;
// }
// if (day == DayOfWeek.Wednesday && aeTag == AppointmentDayOfWeek.Mittwoch)
// {
// return true;
// }
// if (day == DayOfWeek.Thursday && aeTag == AppointmentDayOfWeek.Donnerstag)
// {
// return true;
// }
// if (day == DayOfWeek.Friday && aeTag == AppointmentDayOfWeek.Freitag)
// {
// return true;
// }
// if (day == DayOfWeek.Saturday && aeTag == AppointmentDayOfWeek.Samstag)
// {
// return true;
// }
// return false;
//}
private void SetzeBetraege(ServiceInvoiceRO pRo)
{
lblGesamtBetrag.Text = pRo.GrossClaim;
}
private void SetzeEmpfaengerAdresse(ServiceInvoiceRO pRO)
{
StringBuilder sb = new StringBuilder();
if (!String.IsNullOrEmpty(pRO.RecipientOrganisation))
{
sb.AppendLine(pRO.RecipientOrganisation);
}
if (!String.IsNullOrEmpty(pRO.RecipientDivision))
{
sb.AppendLine(pRO.RecipientDivision);
}
if (!String.IsNullOrEmpty(pRO.RecipientAddressLine1))
{
sb.AppendLine(pRO.RecipientAddressLine1);
}
if (!String.IsNullOrEmpty(pRO.RecipientStreet))
{
sb.AppendLine(pRO.RecipientStreet);
}
if (!String.IsNullOrEmpty(pRO.RecipientPostCodeAndTown))
{
sb.AppendLine(pRO.RecipientPostCodeAndTown);
}
lblAdresse.Text = sb.ToString();
}
private void Detail1_BeforePrint(object sender, System.ComponentModel.CancelEventArgs e)
{
var row = DetailReport.GetCurrentRow() as ServiceInvoicePeriodRO;
if (row != null)
{
SetzeBetraege(row);
}
}
private void SetzeBetraege(ServiceInvoicePeriodRO sip)
{
lblZuschlagText.Text = "";
lblAnzahlZuschlag.Text = "";
lblBetragEinheitZuschlag.Text = "";
lblGesamtBetragZuschlag.Text = "";
decimal stundenAnzahl = 0;
decimal stundenSatz = 0;
String prozentZuschlag = "";
decimal anzahlZuschlag = 0;
decimal betragEinheitZuschlag = 0;
if (sip.ServiceInvoiceItems != null)
{
foreach (var ii in sip.ServiceInvoiceItems)
{
if (ii.ServiceDescription != null)
{
if (ii.ServiceDescription == "Betreuungseinsätze")
{
stundenAnzahl = ii.UnitCount ?? 0;
stundenSatz = ii.AmountPerUnit ?? 0;
}
else if (ii.ServiceDescription.Contains("Zuschlag auf Betreuungszeit"))
{
anzahlZuschlag = ii.UnitCount ?? 0;
betragEinheitZuschlag = ii.AmountPerUnit ?? 0;
prozentZuschlag = ii.RateFactor;
prozentZuschlag = prozentZuschlag.Replace(",00%", "%");
}
}
}
}
lblStunden.Text = String.Format("{0:0.00}", stundenAnzahl);
lblStundensatz.Text = String.Format("{0:c}", stundenSatz);
lblBetragStunden.Text = String.Format("{0:c}", stundenAnzahl * stundenSatz);
if (!String.IsNullOrWhiteSpace(prozentZuschlag))
{
lblZuschlagText.Text = String.Format("{0} Zuschlag auf Betreuungszeit", prozentZuschlag);
lblAnzahlZuschlag.Text = String.Format("{0:0.00}", anzahlZuschlag);
lblBetragEinheitZuschlag.Text = String.Format("{0:c}", betragEinheitZuschlag);
lblGesamtBetragZuschlag.Text = String.Format("{0:c}", anzahlZuschlag * betragEinheitZuschlag);
}
}
private String GetRechtsgrundlage(ServiceInvoiceRO pRO)
{
if (pRO.InvoiceBase.SupportConceptCostBearerRelDc != null)
{
var org = DAOFactory.GenericDAO.LoadByID<Organisation>(pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearer.OrganisationOid);
foreach (var vv in org.VarFieldValueList)
{
if (vv.VarFieldDefOid.Value == 1)
{
var varFieldValue = BS.Shared.Core.Utils.XMLDeserializeFromString(vv.SerializedValue, Type.GetType(vv.TypeName));
if (varFieldValue != null)
{
return varFieldValue.ToString();
}
}
}
}
return null;
}
}
}