LWLDigga - Dateien für Abrechnung LWLDigital 1.0
This commit is contained in:
2054
Report/DefaultReports/BudgetnachweisAnhangDigi.Designer.cs
generated
Normal file
2054
Report/DefaultReports/BudgetnachweisAnhangDigi.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
20
Report/DefaultReports/BudgetnachweisAnhangDigi.cs
Normal file
20
Report/DefaultReports/BudgetnachweisAnhangDigi.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using BeWo.Report;
|
||||||
|
using BeWo.Report.ReportObjects;
|
||||||
|
|
||||||
|
namespace BeWo.Report.DefaultReports
|
||||||
|
{
|
||||||
|
public partial class BudgetnachweisAnhangDigi : DevExpress.XtraReports.UI.XtraReport, IBeWoReport<BudgetnachweisAnhangDigiRO>
|
||||||
|
{
|
||||||
|
public BudgetnachweisAnhangDigi()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetReportDataSource(BudgetnachweisAnhangDigiRO pRO)
|
||||||
|
{
|
||||||
|
bindingSource1.DataSource = pRO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
124
Report/DefaultReports/BudgetnachweisAnhangDigi.resx
Normal file
124
Report/DefaultReports/BudgetnachweisAnhangDigi.resx
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="xrLabel1.Text" xml:space="preserve">
|
||||||
|
<value>Über den Budgetnachweis werden auf Grundlage der Quittierungsbelege im nachstehenden Umfang folgende, im direkten Betreuungskontakt erbrachte Minuten zur Abrechnung beantragt (direkte Fachleistungsminuten = D-FLMin).
|
||||||
|
Der mittelbarere Leistungsberechtigten-bezogener Zeitaufwand (M-FLMin) kann bis zu 20% der direkten Betreuungszeit aufgeschlagen werden. Entsprechnend der Rundungsvariante 2 wird die Summe aus direkter Betreuungszeit und aufgeschlagener mittelbarer Leistung auf volle 10 Minuten gerundet und in der Spalte M-FLMin einschl. Rundung erfasst.</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
@@ -181,6 +181,12 @@
|
|||||||
<Compile Include="DefaultReports\AbwesenheitsPrintReport.Designer.cs">
|
<Compile Include="DefaultReports\AbwesenheitsPrintReport.Designer.cs">
|
||||||
<DependentUpon>AbwesenheitsPrintReport.cs</DependentUpon>
|
<DependentUpon>AbwesenheitsPrintReport.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="DefaultReports\BudgetnachweisAnhangDigi.cs">
|
||||||
|
<SubType>Component</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="DefaultReports\BudgetnachweisAnhangDigi.Designer.cs">
|
||||||
|
<DependentUpon>BudgetnachweisAnhangDigi.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="DefaultReports\Invoices\GkvBegleitzettel.cs">
|
<Compile Include="DefaultReports\Invoices\GkvBegleitzettel.cs">
|
||||||
<SubType>Component</SubType>
|
<SubType>Component</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -540,6 +546,7 @@
|
|||||||
<DependentUpon>Resources.resx</DependentUpon>
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="ReportObjects\AbwesenheitsPrintRO.cs" />
|
<Compile Include="ReportObjects\AbwesenheitsPrintRO.cs" />
|
||||||
|
<Compile Include="ReportObjects\BudgetnachweisAnhangUngerundetRO.cs" />
|
||||||
<Compile Include="ReportObjects\GkvAbrechnungRO.cs" />
|
<Compile Include="ReportObjects\GkvAbrechnungRO.cs" />
|
||||||
<Compile Include="ReportObjects\LwvKASpitzabrechnungRO.cs" />
|
<Compile Include="ReportObjects\LwvKASpitzabrechnungRO.cs" />
|
||||||
<Compile Include="ReportObjects\BudgetnachweisAnhangRO.cs" />
|
<Compile Include="ReportObjects\BudgetnachweisAnhangRO.cs" />
|
||||||
@@ -607,6 +614,9 @@
|
|||||||
<DependentUpon>AbwesenheitsPrintReport.cs</DependentUpon>
|
<DependentUpon>AbwesenheitsPrintReport.cs</DependentUpon>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="DefaultReports\BudgetnachweisAnhangDigi.resx">
|
||||||
|
<DependentUpon>BudgetnachweisAnhangDigi.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="DefaultReports\Invoices\GkvBegleitzettel.resx">
|
<EmbeddedResource Include="DefaultReports\Invoices\GkvBegleitzettel.resx">
|
||||||
<DependentUpon>GkvBegleitzettel.cs</DependentUpon>
|
<DependentUpon>GkvBegleitzettel.cs</DependentUpon>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
|
|||||||
43
Report/ReportObjects/BudgetnachweisAnhangUngerundetRO.cs
Normal file
43
Report/ReportObjects/BudgetnachweisAnhangUngerundetRO.cs
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using BeWo.Data.Access;
|
||||||
|
using BeWo.Data.Entities;
|
||||||
|
using BeWo.Service.DCEntityMapper;
|
||||||
|
using BeWo.Service.Invoicing;
|
||||||
|
using BS.Shared;
|
||||||
|
using BS.Shared.Core;
|
||||||
|
using BS.Shared.DataContracts;
|
||||||
|
using BS.Shared.Extensions;
|
||||||
|
|
||||||
|
namespace BeWo.Report.ReportObjects
|
||||||
|
{
|
||||||
|
public class BudgetnachweisAnhangDigiRO : AbstractBeWoReportObject<BudgetnachweisAnhangDigiRO>
|
||||||
|
{
|
||||||
|
public LWLDiggaBerechnung LWLDiggaBerechnung { get; set; }
|
||||||
|
public Settlement2DC SettlementDC { get; set; }
|
||||||
|
public SupportConceptCostBearerRelDC Costbearer2SupportConceptDC { get; set; }
|
||||||
|
public CustomerDC CustomerDC { get; set; }
|
||||||
|
public DateTime BewilligtStart { get; set; }
|
||||||
|
public DateTime BewilligtEnde { get; set; }
|
||||||
|
public List<EntgeltzeitraumDigga> Entgeltzeitraeume { get; set; }
|
||||||
|
public List<BudgetnachweisDiggaMonatsZeile> MonatsZeilen { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public void Create(Settlement2DC si)
|
||||||
|
{
|
||||||
|
// die gesamte Berechnung ist für Anhang zum Budgetnachweis und für die Berechnung der Rechnung identisch, daher in Extraklasse LWLDiggaBerechnnung gelagert
|
||||||
|
CostBearer2SupportConcept cb2sc = DAOFactory.GenericDAO.LoadByID<CostBearer2SupportConcept>(si.CostBearer2SupportConceptOid.Value);
|
||||||
|
this.BewilligtStart = si.AccountingPeriodStart.Value;
|
||||||
|
this.BewilligtEnde = si.AccountingPeriodEnd.Value;
|
||||||
|
LWLDiggaBerechnung = new LWLDiggaBerechnung();
|
||||||
|
LWLDiggaBerechnung.CreateLWLDiggaBerechnung(si, cb2sc, BewilligtStart, BewilligtEnde);
|
||||||
|
|
||||||
|
Customer customer = cb2sc.SupportConcept.Customer;
|
||||||
|
this.SettlementDC = si;
|
||||||
|
this.Costbearer2SupportConceptDC = MapperFactory.SupportConceptCostBearerRelDC_CostBearer2SupportConcept.MapToNewDC(cb2sc);
|
||||||
|
this.CustomerDC = MapperFactory.CustomerDC_Customer.MapToNewDC(customer);
|
||||||
|
MonatsZeilen = LWLDiggaBerechnung.MonatsZeilen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
298
Service/Invoicing/LWLDiggaBerechnung.cs
Normal file
298
Service/Invoicing/LWLDiggaBerechnung.cs
Normal file
@@ -0,0 +1,298 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using BeWo.Data.Access;
|
||||||
|
using BeWo.Data.Entities;
|
||||||
|
using BeWo.Service.DCEntityMapper;
|
||||||
|
using BeWo.Service.Plugins;
|
||||||
|
using BS.Shared;
|
||||||
|
using BS.Shared.Core;
|
||||||
|
using BS.Shared.DataContracts;
|
||||||
|
using BS.Shared.Extensions;
|
||||||
|
using BS.Shared.Services;
|
||||||
|
|
||||||
|
namespace BeWo.Service.Invoicing
|
||||||
|
{
|
||||||
|
public class LWLDiggaBerechnung : AbstractIDSpecificDefaultClass<LWLDiggaBerechnung>
|
||||||
|
{
|
||||||
|
public virtual DateTime? Umstellungsdatum()
|
||||||
|
{
|
||||||
|
// letzter Tag mit alter Rundung (Variante 1) in Zeitervassung
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual bool EndRundung()
|
||||||
|
{
|
||||||
|
// ursprünglich ist vom LWL angedacht gewesen, dass nur Rundungsvariante 2 erlaubt ist,
|
||||||
|
// das heißt, dass die Rundung vom Zeiterfassungseintrag zum Monatsgesamtwert wechselt in dem Moment, wo die digitalen Belege genutzt werden
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DateTime BewilligtStart { get; set; }
|
||||||
|
public DateTime BewilligtEnde { get; set; }
|
||||||
|
public List<EntgeltzeitraumDigga> Entgeltzeitraeume { get; set; }
|
||||||
|
public List<BudgetnachweisDiggaMonatsZeile> MonatsZeilen { get; set; }
|
||||||
|
public decimal RateFactor { get; set; }
|
||||||
|
public decimal SummeFLMinuten { get; set; }
|
||||||
|
public decimal SummeFaktorMinuten { get; set; }
|
||||||
|
public decimal SummeGesamtMinuten { get; set; }
|
||||||
|
public decimal SummeFLStunden { get; set; }
|
||||||
|
public decimal SummeFehlkontakte { get; set; }
|
||||||
|
public decimal SummeFehlkontakteStunden { get; set; }
|
||||||
|
public decimal SummeFaktorStunden { get; set; }
|
||||||
|
public decimal SummeGesamtStunden { get; set; }
|
||||||
|
public decimal SummeGesamtStundenMitFK { get; set; }
|
||||||
|
|
||||||
|
public virtual void CreateLWLDiggaBerechnung(Settlement2DC si, CostBearer2SupportConcept cb2sc, DateTime? BewilligtStart, DateTime? BewilligtEnde)
|
||||||
|
{
|
||||||
|
var calc = PluginLoader.FindClass<Calculations>(_SpecificID) ?? Calculations.GetInstance(_SpecificID);
|
||||||
|
var serviceRecords = GetBillableServiceRecords(cb2sc);
|
||||||
|
var relDC = cb2sc.MapToNewDC();
|
||||||
|
this.BewilligtStart = si.AccountingPeriodStart.Value;
|
||||||
|
this.BewilligtEnde = si.AccountingPeriodEnd.Value;
|
||||||
|
MonatsZeilen = new List<BudgetnachweisDiggaMonatsZeile>();
|
||||||
|
Entgeltzeitraeume = new List<EntgeltzeitraumDigga>();
|
||||||
|
CreateEntgeltzeitraeume(Entgeltzeitraeume, cb2sc, this.BewilligtStart, this.BewilligtEnde);
|
||||||
|
|
||||||
|
var span = new DateTimeSpan();
|
||||||
|
span.StartDateTime = si.AccountingPeriodStart.Value;
|
||||||
|
span.EndDateTime = si.AccountingPeriodEnd.Value.AddDays(1).AddTicks(-1);
|
||||||
|
Dictionary<string, BudgetnachweisDiggaMonatsZeile> monat2Zeile = new Dictionary<string, BudgetnachweisDiggaMonatsZeile>();
|
||||||
|
DateTime monat = new DateTime(this.BewilligtStart.Year, this.BewilligtStart.Month, this.BewilligtStart.Day);
|
||||||
|
|
||||||
|
CalculateMonatsbasisWerte(Entgeltzeitraeume, cb2sc, serviceRecords, span, monat2Zeile, monat);
|
||||||
|
|
||||||
|
CalculateMonatsMinutenWerteMitRundung(MonatsZeilen);
|
||||||
|
|
||||||
|
foreach (var e in this.Entgeltzeitraeume)
|
||||||
|
{
|
||||||
|
e.SummeFaktorStunden = Math.Round(e.SummeFaktorMinuten / 60, 2, MidpointRounding.AwayFromZero);
|
||||||
|
Math.Round(e.SummeFehlkontakteGerundet / 60, 2, MidpointRounding.AwayFromZero);
|
||||||
|
e.SummeGesamtStunden = Math.Round(e.SummeMinutenGerundet / 60, 2, MidpointRounding.AwayFromZero);
|
||||||
|
e.SummeGesamtStundenMitFK = e.SummeFehlkontakteStunden + e.SummeGesamtStunden;
|
||||||
|
|
||||||
|
SummeFLMinuten += e.SummeFLMinuten;
|
||||||
|
SummeFaktorMinuten += e.SummeFaktorMinuten;
|
||||||
|
SummeGesamtMinuten += e.SummeMinutenGerundet;
|
||||||
|
SummeFLStunden += e.SummeFLStunden;
|
||||||
|
SummeFaktorStunden += e.SummeFaktorStunden;
|
||||||
|
SummeGesamtStunden += e.SummeGesamtStunden;
|
||||||
|
SummeFehlkontakte += e.SummeFehlkontakte;
|
||||||
|
SummeFehlkontakteStunden += e.SummeFehlkontakteStunden;
|
||||||
|
SummeGesamtStundenMitFK += e.SummeGesamtStundenMitFK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IList<ServiceRecord> GetBillableServiceRecords(CostBearer2SupportConcept c2s)
|
||||||
|
{
|
||||||
|
return c2s.ServiceRecords.Where(IsServiceRecordBillable).OrderBy(s => s.Start).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual bool IsServiceRecordBillable(ServiceRecord iRecord)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CalculateMonatsMinutenWerteMitRundung(List<BudgetnachweisDiggaMonatsZeile> MonatsZeilen)
|
||||||
|
{
|
||||||
|
DateTime? uDate = Umstellungsdatum();
|
||||||
|
bool neueRundung = EndRundung();
|
||||||
|
|
||||||
|
foreach (var mz in MonatsZeilen)
|
||||||
|
{
|
||||||
|
if (!uDate.HasValue || uDate.HasValue && mz.Monat > uDate)
|
||||||
|
{
|
||||||
|
mz.SummeMinutenGerundet = Math.Ceiling((mz.SummeFLMinuten + mz.SummeFLMinuten * 0.2m) / 10) * 10;
|
||||||
|
mz.SummeFLStunden = Math.Round(mz.SummeMinutenGerundet / 60, 2, MidpointRounding.AwayFromZero);
|
||||||
|
mz.SummeFaktorMinuten = mz.SummeMinutenGerundet - mz.SummeFLMinuten;
|
||||||
|
mz.SummeFehlkontakteStunden = Math.Round(mz.SummeFehlkontakte / 60, 2, MidpointRounding.AwayFromZero);
|
||||||
|
mz.SummeGesamtMinutenMitFKGerundet = mz.SummeMinutenGerundet + mz.SummeFehlkontakte;
|
||||||
|
mz.SummeGesamtStundenMitFKGerundet = Math.Round(mz.SummeGesamtMinutenMitFKGerundet / 60, 2, MidpointRounding.AwayFromZero);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mz.SummeFaktorMinuten = Math.Round(mz.SummeFLMinuten * 0.2m, 2, MidpointRounding.AwayFromZero);
|
||||||
|
mz.SummeMinutenGerundet = mz.SummeFLMinuten + SummeFaktorMinuten;
|
||||||
|
mz.SummeFLStunden = Math.Round(mz.SummeMinutenGerundet / 60, 2, MidpointRounding.AwayFromZero);
|
||||||
|
mz.SummeFehlkontakteStunden = Math.Round(mz.SummeFehlkontakte / 60, 2, MidpointRounding.AwayFromZero);
|
||||||
|
mz.SummeGesamtMinutenMitFKGerundet = mz.SummeMinutenGerundet + mz.SummeFehlkontakte;
|
||||||
|
mz.SummeGesamtStundenMitFKGerundet = Math.Round(mz.SummeGesamtMinutenMitFKGerundet / 60, 2, MidpointRounding.AwayFromZero);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var e in Entgeltzeitraeume)
|
||||||
|
{
|
||||||
|
if (e.Index == mz.Entgeltzeitraum)
|
||||||
|
{
|
||||||
|
e.ServiceRecords.AddRange(mz.ServiceRecords);
|
||||||
|
e.SummeFLMinuten += mz.SummeFLMinuten;
|
||||||
|
e.SummeFaktorMinuten += mz.SummeFaktorMinuten;
|
||||||
|
e.SummeMinutenGerundet += mz.SummeMinutenGerundet;
|
||||||
|
e.SummeFLStunden += mz.SummeFLStunden;
|
||||||
|
e.SummeFehlkontakte += mz.SummeFehlkontakte;
|
||||||
|
e.SummeFehlkontakteStunden += mz.SummeFehlkontakteStunden;
|
||||||
|
e.SummeGesamtStundenMitFK += mz.SummeGesamtStundenMitFKGerundet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void CreateEntgeltzeitraeume(List<EntgeltzeitraumDigga> entgeltzeitraeume, CostBearer2SupportConcept cb2sc, DateTime bewilligtStart, DateTime bewilligtEnde)
|
||||||
|
{
|
||||||
|
var crList = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(cb2sc.CostBearer.CostRatePeriods.Where(c => c.CostRateType == CostRatePeriodType.HourlyRate));
|
||||||
|
var crRfList = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(cb2sc.CostBearer.CostRatePeriods.Where(c => c.CostRateType == CostRatePeriodType.RateFactor));
|
||||||
|
var rf = crRfList.GetCostRatePeriodForDate(CostRatePeriodType.RateFactor, this.BewilligtEnde);
|
||||||
|
if (rf != null && rf.CostRateValue.HasValue)
|
||||||
|
{
|
||||||
|
this.RateFactor = rf.CostRateValue.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var cr in crList)
|
||||||
|
{
|
||||||
|
if (!cr.EndDate.HasValue)
|
||||||
|
{
|
||||||
|
cr.EndDate = this.BewilligtEnde.AddDays(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
crList = crList.OrderBy(c => c.EndDate).ToList();
|
||||||
|
DateTime start = DateTime.MinValue;
|
||||||
|
int idx = 1;
|
||||||
|
foreach (var cr in crList)
|
||||||
|
{
|
||||||
|
if (!cr.StartDate.HasValue)
|
||||||
|
{
|
||||||
|
cr.StartDate = start;
|
||||||
|
}
|
||||||
|
if (cr.StartDate > DateTime.MinValue)
|
||||||
|
{
|
||||||
|
cr.StartDate = cr.StartDate.Value.AddDays(1);
|
||||||
|
}
|
||||||
|
if (cr.EndDate >= this.BewilligtStart && cr.StartDate <= this.BewilligtEnde)
|
||||||
|
{
|
||||||
|
var ez = new EntgeltzeitraumDigga();
|
||||||
|
ez.Index = idx++;
|
||||||
|
ez.Start = cr.StartDate.Value;
|
||||||
|
ez.Ende = cr.EndDate.Value;
|
||||||
|
|
||||||
|
if (ez.Start == DateTime.MinValue || ez.Start < BewilligtStart)
|
||||||
|
{
|
||||||
|
ez.Start = this.BewilligtStart;
|
||||||
|
}
|
||||||
|
if (ez.Ende == DateTime.MaxValue)
|
||||||
|
{
|
||||||
|
ez.Ende = this.BewilligtEnde;
|
||||||
|
}
|
||||||
|
|
||||||
|
ez.CostRatePeriod = cr;
|
||||||
|
ez.ServiceRecords = new List<ServiceRecordDC>();
|
||||||
|
ez.RateFactor = 0.20m; // Variabel setzen
|
||||||
|
Entgeltzeitraeume.Add(ez);
|
||||||
|
}
|
||||||
|
|
||||||
|
start = cr.EndDate.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public virtual void CalculateMonatsbasisWerte(List<EntgeltzeitraumDigga> entgeltzeitraeume, CostBearer2SupportConcept cb2sc, IList<ServiceRecord> serviceRecords, DateTimeSpan span, Dictionary<string, BudgetnachweisDiggaMonatsZeile> monat2Zeile, DateTime monat)
|
||||||
|
{
|
||||||
|
while (monat <= this.BewilligtEnde)
|
||||||
|
{
|
||||||
|
String key = String.Format("{0:MM.yyyy}", monat);
|
||||||
|
var zeile = new BudgetnachweisDiggaMonatsZeile();
|
||||||
|
zeile.ServiceRecords = new List<ServiceRecordDC>();
|
||||||
|
zeile.Monat = monat;
|
||||||
|
zeile.SummeFLMinuten = 0;
|
||||||
|
zeile.SummeFehlkontakte = 0;
|
||||||
|
zeile.SummeGesamtMinutenMitFKGerundet = 0;
|
||||||
|
zeile.SummeGesamtStundenMitFKGerundet = 0;
|
||||||
|
|
||||||
|
foreach (var e in Entgeltzeitraeume)
|
||||||
|
{
|
||||||
|
if (e.Start <= monat && monat <= e.Ende)
|
||||||
|
{
|
||||||
|
zeile.Entgeltzeitraum = e.Index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (monat.Day != 1)
|
||||||
|
{
|
||||||
|
monat = new DateTime(monat.Year, monat.Month, 1);
|
||||||
|
}
|
||||||
|
monat = monat.AddMonths(1);
|
||||||
|
monat2Zeile.Add(key, zeile);
|
||||||
|
}
|
||||||
|
|
||||||
|
var groupBookingDict = new Dictionary<long, bool>();
|
||||||
|
foreach (var sr in serviceRecords)
|
||||||
|
{
|
||||||
|
if (sr.ServiceDescription.ServiceCategory.IsBillable && (!sr.GroupOid.HasValue || !groupBookingDict.ContainsKey(sr.GroupOid.Value)))
|
||||||
|
{
|
||||||
|
if (sr.GroupOid.HasValue)
|
||||||
|
{
|
||||||
|
groupBookingDict.Add(sr.GroupOid.Value, true);
|
||||||
|
}
|
||||||
|
var srDc = MapperFactory.ServiceRecordDC_ServiceRecord.MapToNewDC(sr);
|
||||||
|
String key = String.Format("{0:MM.yyyy}", sr.Start);
|
||||||
|
|
||||||
|
if (monat2Zeile.ContainsKey(key))
|
||||||
|
{
|
||||||
|
if (monat2Zeile[key].Monat <= sr.Start.Value.Date)
|
||||||
|
{
|
||||||
|
monat2Zeile[key].ServiceRecords.Add(srDc);
|
||||||
|
decimal minuten = sr.RoundedDuration; // Check this
|
||||||
|
decimal prozent = sr.ServiceDescription.ServiceCategory.ProzentAbrechnung;
|
||||||
|
if (sr.ServiceDescription.Name.ToLower().Contains("fehlkontakt"))
|
||||||
|
{
|
||||||
|
monat2Zeile[key].SummeFehlkontakte += minuten;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
monat2Zeile[key].SummeFLMinuten += minuten;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MonatsZeilen.AddRange(monat2Zeile.Values.OrderBy(m => m.Monat));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BudgetnachweisDiggaMonatsZeile
|
||||||
|
{
|
||||||
|
public List<ServiceRecordDC> ServiceRecords { get; set; }
|
||||||
|
public DateTime Monat { get; set; }
|
||||||
|
public decimal SummeFLMinuten { get; set; }
|
||||||
|
public decimal SummeFaktorMinuten { get; set; }
|
||||||
|
public decimal SummeMinutenGerundet { get; set; }
|
||||||
|
public decimal SummeFLStunden { get; set; }
|
||||||
|
public decimal SummeFehlkontakte { get; set; }
|
||||||
|
public decimal SummeFehlkontakteStunden { get; set; }
|
||||||
|
public decimal SummeGesamtMinutenMitFKGerundet { get; set; }
|
||||||
|
public decimal SummeGesamtStundenMitFKGerundet { get; set; }
|
||||||
|
public int Entgeltzeitraum { get; set; }
|
||||||
|
public decimal? Betrag { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EntgeltzeitraumDigga
|
||||||
|
{
|
||||||
|
public List<ServiceRecordDC> ServiceRecords { get; set; }
|
||||||
|
public CostRatePeriodDC CostRatePeriod { get; set; }
|
||||||
|
public DateTime Start { get; set; }
|
||||||
|
public DateTime Ende { get; set; }
|
||||||
|
public decimal RateFactor { get; set; }
|
||||||
|
public decimal SummeFLMinuten { get; set; }
|
||||||
|
public decimal SummeFaktorMinuten { get; set; }
|
||||||
|
public decimal SummeMinutenGerundet { get; set; }
|
||||||
|
public decimal SummeFLStunden { get; set; }
|
||||||
|
public decimal SummeFehlkontakte { get; set; }
|
||||||
|
public decimal SummeFehlkontakteGerundet { get; set; }
|
||||||
|
public decimal SummeFehlkontakteStunden { get; set; }
|
||||||
|
public decimal SummeFaktorStunden { get; set; }
|
||||||
|
public decimal SummeGesamtStunden { get; set; }
|
||||||
|
public decimal SummeGesamtStundenMitFK { get; set; }
|
||||||
|
public int Index { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
98
Service/Invoicing/LWLDiggaSettlementInvoiceCreation.cs
Normal file
98
Service/Invoicing/LWLDiggaSettlementInvoiceCreation.cs
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using BeWo.Data.Access;
|
||||||
|
using BeWo.Data.Entities;
|
||||||
|
using BeWo.Service.DCEntityMapper;
|
||||||
|
using BeWo.Service.Plugins;
|
||||||
|
using BS.Shared;
|
||||||
|
using BS.Shared.Core;
|
||||||
|
using BS.Shared.DataContracts;
|
||||||
|
using BS.Shared.Extensions;
|
||||||
|
using BS.Shared.Services;
|
||||||
|
|
||||||
|
namespace BeWo.Service.Invoicing
|
||||||
|
{
|
||||||
|
[IDSpecificClass(Identifier = "LWLDigga")]
|
||||||
|
public class LWLDiggaSettlementInvoiceCreation : SettlementInvoiceCreation
|
||||||
|
{
|
||||||
|
public override bool CanCreateInvoiceTheOldWay(Settlement2DC si, CostBearer2SupportConcept c2s)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void CreateInvoiceDetails(Settlement2DC si, CostBearer2SupportConcept cb2sc, DateTime? BewilligtStart, DateTime? BewilligtEnde)
|
||||||
|
{
|
||||||
|
// die gesamte Berechnung ist für Anhang zum Budgetnachweis und für die Berechnung der Rechnung identisch, daher in Extraklasse LWLDiggaBerechnnung gelagert
|
||||||
|
LWLDiggaBerechnung lwlCore = new LWLDiggaBerechnung();
|
||||||
|
lwlCore.CreateLWLDiggaBerechnung(si, cb2sc, BewilligtStart, BewilligtEnde);
|
||||||
|
var calc = PluginLoader.FindClass<Calculations>(_SpecificID) ?? Calculations.GetInstance(_SpecificID);
|
||||||
|
var relDC = cb2sc.MapToNewDC();
|
||||||
|
CalculateSettlementInvoiceApprovedAmounts(si, relDC, calc);
|
||||||
|
|
||||||
|
var span = new DateTimeSpan();
|
||||||
|
span.StartDateTime = si.AccountingPeriodStart.Value;
|
||||||
|
span.EndDateTime = si.AccountingPeriodEnd.Value.AddDays(1).AddTicks(-1);
|
||||||
|
si.InvoiceItems = CreateInvoiceItemsForEntgeltzeitraeume(lwlCore.Entgeltzeitraeume);
|
||||||
|
CalculateAdvancedPayments(si, cb2sc);
|
||||||
|
CalculateEquityContribution(si, cb2sc.SupportConcept, BewilligtStart, BewilligtEnde);
|
||||||
|
CalculateSettlementInvoiceAmounts(si);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<InvoiceItemDC> CreateInvoiceItemsForEntgeltzeitraeume(List<EntgeltzeitraumDigga> Entgeltzeitraeume)
|
||||||
|
{
|
||||||
|
Dictionary<long, SupportConceptApprovalPeriodDC> oid2Scap = new Dictionary<long, SupportConceptApprovalPeriodDC>();
|
||||||
|
List<InvoiceItemDC> invoiceItems = new List<InvoiceItemDC>();
|
||||||
|
|
||||||
|
foreach (var e in Entgeltzeitraeume)
|
||||||
|
{
|
||||||
|
var iiList = CreateInvoiceItemsForAccountingPeriod(e);
|
||||||
|
invoiceItems.AddRange(iiList);
|
||||||
|
}
|
||||||
|
return invoiceItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IList<InvoiceItemDC> CreateInvoiceItemsForAccountingPeriod(EntgeltzeitraumDigga e)
|
||||||
|
{
|
||||||
|
List<InvoiceItemDC> list = new List<InvoiceItemDC>();
|
||||||
|
if (e.SummeFLStunden > 0)
|
||||||
|
{
|
||||||
|
InvoiceItemDC ii = new InvoiceItemDC();
|
||||||
|
//ii.AccountingInterval = accountingPeriod.AccountingInterval;
|
||||||
|
ii.ItemPeriodStart = e.Start;
|
||||||
|
ii.ItemPeriodEnd = e.Ende;
|
||||||
|
ii.RateFactor = e.RateFactor;
|
||||||
|
ii.AmountPerUnit = e.CostRatePeriod.CostRateValue;
|
||||||
|
ii.ItemDescription = "Fachleistungsstunden";
|
||||||
|
ii.UnitCount = e.SummeFLStunden;
|
||||||
|
ii.AmountTotal = Math.Round(ii.UnitCount.Value * ii.AmountPerUnit.Value, 2, MidpointRounding.AwayFromZero);
|
||||||
|
ii.GrossAmountTotal = ii.AmountTotal;
|
||||||
|
//ii.MaxApprovedAmount = accountingPeriod.MaxApprovedAmount;
|
||||||
|
//ii.MaxApprovedUnitCount = accountingPeriod.MaxApprovedUnitCount;
|
||||||
|
//ii.ApprovedPerUnit = accountingPeriod.ApprovedPerUnit;
|
||||||
|
//ii.ApprovalUnit = accountingPeriod.ApprovalUnit;
|
||||||
|
list.Add(ii);
|
||||||
|
}
|
||||||
|
if (e.SummeFehlkontakteStunden > 0)
|
||||||
|
{
|
||||||
|
InvoiceItemDC iiF = new InvoiceItemDC();
|
||||||
|
//ii.AccountingInterval = accountingPeriod.AccountingInterval;
|
||||||
|
iiF.ItemPeriodStart = e.Start;
|
||||||
|
iiF.ItemPeriodEnd = e.Ende;
|
||||||
|
iiF.RateFactor = e.RateFactor;
|
||||||
|
iiF.AmountPerUnit = Math.Round(e.CostRatePeriod.CostRateValue.Value * 0.8m, 2, MidpointRounding.AwayFromZero); // Check auf Rundung
|
||||||
|
iiF.ItemDescription = "Fehlkontakte";
|
||||||
|
iiF.UnitCount = e.SummeFehlkontakteStunden;
|
||||||
|
iiF.AmountTotal = Math.Round(iiF.UnitCount.Value * iiF.AmountPerUnit.Value, 2, MidpointRounding.AwayFromZero);
|
||||||
|
iiF.GrossAmountTotal = iiF.AmountTotal;
|
||||||
|
//ii.MaxApprovedAmount = accountingPeriod.MaxApprovedAmount;
|
||||||
|
//ii.MaxApprovedUnitCount = accountingPeriod.MaxApprovedUnitCount;
|
||||||
|
//ii.ApprovedPerUnit = accountingPeriod.ApprovedPerUnit;
|
||||||
|
//ii.ApprovalUnit = accountingPeriod.ApprovalUnit;
|
||||||
|
list.Add(iiF);
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -436,6 +436,8 @@
|
|||||||
<Compile Include="Interfaces\IJsonMapper.cs" />
|
<Compile Include="Interfaces\IJsonMapper.cs" />
|
||||||
<Compile Include="Invoicing\ApprovalPeriod.cs" />
|
<Compile Include="Invoicing\ApprovalPeriod.cs" />
|
||||||
<Compile Include="Invoicing\GeneralInvoiceCreation.cs" />
|
<Compile Include="Invoicing\GeneralInvoiceCreation.cs" />
|
||||||
|
<Compile Include="Invoicing\LWLDiggaBerechnung.cs" />
|
||||||
|
<Compile Include="Invoicing\LWLDiggaSettlementInvoiceCreation.cs" />
|
||||||
<Compile Include="Invoicing\SbdDefaultInvoiceCreation.cs" />
|
<Compile Include="Invoicing\SbdDefaultInvoiceCreation.cs" />
|
||||||
<Compile Include="Invoicing\EquityInvoiceCreation.cs" />
|
<Compile Include="Invoicing\EquityInvoiceCreation.cs" />
|
||||||
<Compile Include="Invoicing\InvoiceCreation.cs" />
|
<Compile Include="Invoicing\InvoiceCreation.cs" />
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ using BS.Shared.Extensions;
|
|||||||
namespace BS.Shared.Services
|
namespace BS.Shared.Services
|
||||||
{
|
{
|
||||||
// LWL: keinen RateFactor einrechnen
|
// LWL: keinen RateFactor einrechnen
|
||||||
[IDSpecificClass(Identifiers = new string[] { "LWL", "LWLMaxAmount", "LWLNEU", "LWLBeWo67" })]
|
[IDSpecificClass(Identifiers = new string[] { "LWL", "LWLMaxAmount", "LWLNEU", "LWLBeWo67", "LWLDigga" })]
|
||||||
public class LWLCalculations : Calculations
|
public class LWLCalculations : Calculations
|
||||||
{
|
{
|
||||||
public override decimal GetIntervalCountForDays(decimal totalDays, SupportConceptApprovalInterval interval)
|
public override decimal GetIntervalCountForDays(decimal totalDays, SupportConceptApprovalInterval interval)
|
||||||
|
|||||||
Reference in New Issue
Block a user