Files

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; }
}
}