364 lines
15 KiB
C#
364 lines
15 KiB
C#
using BeWo.Report.ReportObjects;
|
|
|
|
using DevExpress.XtraReports.UI;
|
|
using BS.Shared.Core;
|
|
using BeWo.Report;
|
|
using System;
|
|
using BeWo.Service.DCEntityMapper;
|
|
using BeWo.Data.Access;
|
|
using BeWo.Data.Entities;
|
|
using System.Linq;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using ChristopherusHausMID.Invoicing;
|
|
|
|
namespace ChristopherusHausMID
|
|
{
|
|
public partial class Rechnung : XtraReport, IBeWoReport<ServiceInvoiceRO>
|
|
{
|
|
public Rechnung()
|
|
{
|
|
this.InitializeComponent();
|
|
}
|
|
|
|
public void SetReportDataSource(ServiceInvoiceRO pRO)
|
|
{
|
|
lblRechnungsnr.Text = pRO.InvoiceNumber;
|
|
var ro = CreateRechnungsRO(pRO);
|
|
SetzeAdresse(pRO);
|
|
SetzeSchule(pRO);
|
|
SetzeKategorie(pRO);
|
|
|
|
SetzeSollIst(ro);
|
|
|
|
this.bindingSource1.DataSource = ro;
|
|
}
|
|
|
|
private RechnungRO CreateRechnungsRO(ServiceInvoiceRO pRO)
|
|
{
|
|
var ro = new RechnungRO();
|
|
ro.ServiceInvoice = pRO;
|
|
ro.WeitereRechnungspositionen = new List<RechnungsPositionRO>();
|
|
ro.SummenPosition = new RechnungsPositionRO();
|
|
ro.MainRechnungsposition = new RechnungsPositionRO();
|
|
|
|
var kind = DAOFactory.GenericDAO.LoadByID<Customer>(pRO.InvoiceBase.CustomerOid);
|
|
|
|
BerechneRechnungsPositionSummen(kind, ro.MainRechnungsposition, pRO);
|
|
|
|
List<RechnungsPositionRO> poolPositionen = BerechnePoolKinderRechnungen(kind, pRO);
|
|
|
|
foreach (var item in poolPositionen)
|
|
{
|
|
item.Betrag5Prozent10 -= ro.MainRechnungsposition.Betrag5Prozent10;
|
|
item.BetragStunden10 -= ro.MainRechnungsposition.BetragStunden10;
|
|
item.BetragStunden11 -= ro.MainRechnungsposition.BetragStunden11;
|
|
item.BetragStunden12 -= ro.MainRechnungsposition.BetragStunden12;
|
|
item.BetragStunden13 -= ro.MainRechnungsposition.BetragStunden13;
|
|
item.BetragStunden14 -= ro.MainRechnungsposition.BetragStunden14;
|
|
item.BetragStunden15 -= ro.MainRechnungsposition.BetragStunden15;
|
|
item.GesamtBetrag -= ro.MainRechnungsposition.GesamtBetrag;
|
|
|
|
}
|
|
ro.WeitereRechnungspositionen.AddRange(poolPositionen);
|
|
|
|
|
|
|
|
ro.SummenPosition.Rechungsanteil = 100;
|
|
ro.SummenPosition.Stundensatz = ro.MainRechnungsposition.Stundensatz;
|
|
|
|
AddPositionZuGesamt(ro.MainRechnungsposition, ro.SummenPosition);
|
|
|
|
foreach (var item in ro.WeitereRechnungspositionen)
|
|
{
|
|
AddPositionZuGesamt(item, ro.SummenPosition);
|
|
}
|
|
|
|
//Berechne prozentuale Anteile
|
|
if (poolPositionen.Count > 0 && ro.SummenPosition.GesamtBetrag > 0)
|
|
{
|
|
ro.MainRechnungsposition.Rechungsanteil = (ro.MainRechnungsposition.GesamtBetrag / ro.SummenPosition.GesamtBetrag) * 100;
|
|
foreach (var pos in poolPositionen)
|
|
{
|
|
pos.Rechungsanteil = (pos.GesamtBetrag / ro.SummenPosition.GesamtBetrag) * 100;
|
|
}
|
|
}
|
|
|
|
return ro;
|
|
}
|
|
|
|
private void BerechneRechnungsPositionSummen(Customer customer, RechnungsPositionRO ro, ServiceInvoiceRO pRO)
|
|
{
|
|
foreach (var ip in pRO.ServiceInvoicePeriods)
|
|
{
|
|
|
|
foreach (var item in ip.ServiceInvoiceItems)
|
|
{
|
|
decimal betrag = GetBetragFromString(item.GrossAmount);
|
|
|
|
if (!String.IsNullOrEmpty(item.UnitDescription))
|
|
{
|
|
if (item.UnitDescription == "Faktor 1.0")
|
|
{
|
|
ro.BetreuteStunden10 = item.UnitCount ?? 0;
|
|
ro.BetragStunden10 = betrag;
|
|
}
|
|
else if (item.UnitDescription == "Faktor 1.1")
|
|
{
|
|
ro.BetreuteStunden11 = item.UnitCount ?? 0;
|
|
ro.BetragStunden11 = betrag;
|
|
}
|
|
else if (item.UnitDescription == "Faktor 1.2")
|
|
{
|
|
ro.BetreuteStunden12 = item.UnitCount ?? 0;
|
|
ro.BetragStunden12 = betrag;
|
|
}
|
|
else if (item.UnitDescription == "Faktor 1.3")
|
|
{
|
|
ro.BetreuteStunden13 = item.UnitCount ?? 0;
|
|
ro.BetragStunden13 = betrag;
|
|
}
|
|
else if (item.UnitDescription == "Faktor 1.4")
|
|
{
|
|
ro.BetreuteStunden14 = item.UnitCount ?? 0;
|
|
ro.BetragStunden14 = betrag;
|
|
}
|
|
else if (item.UnitDescription == "Faktor 1.5")
|
|
{
|
|
ro.BetreuteStunden15 = item.UnitCount ?? 0;
|
|
ro.BetragStunden15 = betrag;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ro.BetreuteStunden10 = item.UnitCount ?? 0;
|
|
}
|
|
ro.GesamtStunden += item.UnitCount ?? 0;
|
|
ro.GesamtBetrag += betrag;
|
|
ro.Stundensatz = item.AmountPerUnit ?? 0;
|
|
ro.Rechungsanteil = 100;
|
|
if (ip.SupportConceptApprovalPeriod != null)
|
|
{
|
|
ro.BewilligtProWoche = ip.SupportConceptApprovalPeriod.ApprovedBEPerInterval ?? 0;
|
|
}
|
|
if (ip.Customer != null)
|
|
{
|
|
ro.CustomerName = String.Format("{0} {1}", ip.Customer.FirstName, ip.Customer.LastName);
|
|
|
|
}
|
|
|
|
var span = new DateTimeSpan();
|
|
span.StartDate = pRO.AccountingPeriodStart;
|
|
span.EndDate = pRO.AccountingPeriodEnd;
|
|
var fehltage = PoolHelper.GetAbwesenheitsTage(customer, span);
|
|
ro.Fehltage = fehltage * -1;
|
|
}
|
|
ro.GesamtBetrag = GetBetragFromString(pRO.GrossClaim);
|
|
}
|
|
}
|
|
|
|
private decimal GetBetragFromString(string amount)
|
|
{
|
|
decimal betrag = 0;
|
|
if (!String.IsNullOrEmpty(amount))
|
|
{
|
|
if (Decimal.TryParse(amount.Replace("€", "").Trim(), out var b))
|
|
{
|
|
betrag = b;
|
|
}
|
|
}
|
|
return betrag;
|
|
}
|
|
|
|
private List<RechnungsPositionRO> BerechnePoolKinderRechnungen(Customer customer, ServiceInvoiceRO pRO)
|
|
{
|
|
var positionen = new List<RechnungsPositionRO>();
|
|
|
|
if (pRO.InvoiceBase.CustomerOid > 0)
|
|
{
|
|
|
|
var poolKinder = PoolHelper.GetWeiterePoolKinder(customer, pRO.AccountingPeriodStart, pRO.AccountingPeriodEnd);
|
|
|
|
int position = 2;
|
|
foreach (var poolKind in poolKinder)
|
|
{
|
|
var invoice = PoolHelper.ErstelleRechnung(poolKind, pRO.AccountingPeriodStart, pRO.AccountingPeriodEnd);
|
|
|
|
if (invoice != null)
|
|
{
|
|
var ro = new RechnungsPositionRO();
|
|
positionen.Add(ro);
|
|
|
|
var newInvoiceRo = ServiceInvoiceRO.Create(MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(invoice));
|
|
|
|
BerechneRechnungsPositionSummen(poolKind, ro, newInvoiceRo);
|
|
|
|
//ro.GesamtBetrag = pRO.cla
|
|
ro.Position = position++;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
return positionen;
|
|
}
|
|
|
|
private void AddPositionZuGesamt(RechnungsPositionRO item, RechnungsPositionRO summenPosition)
|
|
{
|
|
summenPosition.Stunden5Prozent10 += item.Stunden5Prozent10;
|
|
summenPosition.BetragStunden10 += item.BetragStunden10;
|
|
summenPosition.BetragStunden11 += item.BetragStunden11;
|
|
summenPosition.BetragStunden12 += item.BetragStunden12;
|
|
summenPosition.BetragStunden13 += item.BetragStunden13;
|
|
summenPosition.BetragStunden14 += item.BetragStunden14;
|
|
summenPosition.BetragStunden15 += item.BetragStunden15;
|
|
|
|
summenPosition.BetreuteStunden10 = item.BetreuteStunden10;
|
|
summenPosition.BetreuteStunden11 = item.BetreuteStunden11;
|
|
summenPosition.BetreuteStunden12 = item.BetreuteStunden12;
|
|
summenPosition.BetreuteStunden13 = item.BetreuteStunden13;
|
|
summenPosition.BetreuteStunden14 = item.BetreuteStunden14;
|
|
summenPosition.BetreuteStunden15 = item.BetreuteStunden15;
|
|
|
|
summenPosition.GesamtBetrag += item.GesamtBetrag;
|
|
summenPosition.GesamtStunden = item.GesamtStunden;
|
|
|
|
}
|
|
|
|
private void SetzeSollIst(RechnungRO pRO)
|
|
{
|
|
lblSollstunden.Text = String.Format("{0:0.00} h", pRO.SummenPosition.GesamtStunden);
|
|
lblIstStunden.Text = String.Format("{0:0.00} h", pRO.SummenPosition.GesamtStunden);
|
|
lblAbweichung.Text = String.Format("{0:0.0}%", 0);
|
|
lblAbrechenbareStunden.Text = String.Format("{0:0.00} h", pRO.SummenPosition.GesamtStunden);
|
|
|
|
//foreach (var ip in pRO.ServiceInvoicePeriods)
|
|
//{
|
|
|
|
// if (ip.SupportConceptApprovalPeriod.ApprovedBEInterval == BS.Shared.SupportConceptApprovalInterval.Weekly)
|
|
// continue;
|
|
// if (ip.SupportConceptApprovalPeriod.ApprovedBEInterval == BS.Shared.SupportConceptApprovalInterval.Monthly)
|
|
// ip.SupportConceptApprovalPeriod.ApprovedBEPerInterval /= 4.34m;
|
|
//}
|
|
}
|
|
|
|
private void SetzeKategorie(ServiceInvoiceRO pRO)
|
|
{
|
|
lblKategorie.Text = "";
|
|
foreach (var ip in pRO.ServiceInvoicePeriods)
|
|
{
|
|
if (ip.SupportConceptApprovalPeriod.ServiceCategory != null)
|
|
{
|
|
lblKategorie.Text = ip.SupportConceptApprovalPeriod.ServiceCategory.Name;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SetzeSchule(ServiceInvoiceRO pRO)
|
|
{
|
|
lblSchule.Text = "";
|
|
if (pRO.InvoiceBase.CustomerOid > 0)
|
|
{
|
|
var customer = DAOFactory.GenericDAO.LoadByID<Customer>(pRO.InvoiceBase.CustomerOid);
|
|
foreach (var c2o in customer.Customer2OrganisationList)
|
|
{
|
|
foreach (var v2o in c2o.ValueList)
|
|
{
|
|
if (v2o.Entry.Value != null && v2o.Entry.Value.Contains("Schule"))
|
|
{
|
|
var schule = c2o.Organisation;
|
|
lblSchule.Text = String.Format("{0}\n{1}\n{2} {3}", schule.Name, schule.Address?.Street, schule.Address?.PostalCode, schule.Address?.Town);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SetzeAdresse(ServiceInvoiceRO pRO)
|
|
{
|
|
if (pRO.InvoiceBase.SupportConceptCostBearerRelDc != null)
|
|
{
|
|
if (pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson != null)
|
|
{
|
|
String anrede = pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson.FirstName;
|
|
if (pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson.Geschlecht.HasValue && pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson.Geschlecht.Value == BS.Shared.Sex.Male)
|
|
{
|
|
anrede = "Herr";
|
|
}
|
|
else if (pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson.Geschlecht.HasValue && pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson.Geschlecht.Value == BS.Shared.Sex.Female)
|
|
{
|
|
anrede = "Frau";
|
|
}
|
|
pRO.RecipientContactPerson = String.Format("{0} {1}", anrede, pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson.LastName);
|
|
}
|
|
}
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
if (!String.IsNullOrEmpty(pRO.RecipientOrganisation))
|
|
{
|
|
sb.AppendLine(pRO.RecipientOrganisation);
|
|
}
|
|
if (!String.IsNullOrEmpty(pRO.RecipientContactPerson))
|
|
{
|
|
sb.AppendLine(pRO.RecipientContactPerson);
|
|
}
|
|
if (!String.IsNullOrEmpty(pRO.RecipientDivision))
|
|
{
|
|
sb.AppendLine(pRO.RecipientDivision);
|
|
}
|
|
if (!String.IsNullOrEmpty(pRO.RecipientStreet))
|
|
{
|
|
sb.AppendLine(pRO.RecipientStreet);
|
|
}
|
|
if (!String.IsNullOrEmpty(pRO.RecipientPostCodeAndTown))
|
|
{
|
|
sb.AppendLine(pRO.RecipientPostCodeAndTown);
|
|
}
|
|
lblAdresse.Text = sb.ToString();
|
|
|
|
this.bindingSource1.DataSource = pRO;
|
|
}
|
|
|
|
// Die Rechnungsnummer muss für den FiBu-Export gleich dem PDF-Namen sein!
|
|
private void Change_Name(object sender, EventArgs e)
|
|
{
|
|
PrintingSystem.Document.Name = String.Format("Rechnung {0}", lblRechnungsnr.Text);
|
|
}
|
|
}
|
|
|
|
public class RechnungRO
|
|
{
|
|
public ServiceInvoiceRO ServiceInvoice { get; set; }
|
|
public RechnungsPositionRO MainRechnungsposition { get; set; }
|
|
public List<RechnungsPositionRO> WeitereRechnungspositionen { get; set; }
|
|
public RechnungsPositionRO SummenPosition { get; set; }
|
|
}
|
|
|
|
public class RechnungsPositionRO
|
|
{
|
|
public int Position { get; set; }
|
|
public String CustomerName { get; set; }
|
|
public decimal BewilligtProWoche { get; set; }
|
|
public decimal Fehltage { get; set; }
|
|
public decimal Rechungsanteil { get; set; }
|
|
public decimal Stundensatz { get; set; }
|
|
public decimal Stunden5Prozent10 { get; set; }
|
|
public decimal Betrag5Prozent10 { get; set; }
|
|
public decimal BetreuteStunden10 { get; set; }
|
|
public decimal BetragStunden10 { get; set; }
|
|
public decimal BetreuteStunden11 { get; set; }
|
|
public decimal BetragStunden11 { get; set; }
|
|
public decimal BetreuteStunden12 { get; set; }
|
|
public decimal BetragStunden12 { get; set; }
|
|
public decimal BetreuteStunden13 { get; set; }
|
|
public decimal BetragStunden13 { get; set; }
|
|
public decimal BetreuteStunden14 { get; set; }
|
|
public decimal BetragStunden14 { get; set; }
|
|
public decimal BetreuteStunden15 { get; set; }
|
|
public decimal BetragStunden15 { get; set; }
|
|
public decimal GesamtStunden { get; set; }
|
|
public decimal GesamtBetrag { get; set; }
|
|
}
|
|
} |