430 lines
15 KiB
C#
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;
|
|
}
|
|
}
|
|
} |