Files
BeWoPlaner/ReportImp/ProIntegra/Invoicing/CustomInvoiceCreation.cs

150 lines
5.1 KiB
C#

using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.Invoicing;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
using BS.Shared.Services;
using System;
using System.Collections.Generic;
using System.Linq;
namespace ProIntegra.Invoicing
{
public class CustomInvoiceCreation : InvoiceCreation
{
public override void SetInvoiceId(ServiceInvoice invoice)
{
base.SetInvoiceId(invoice);
}
public override InvoiceItem CreateInvoiceItem(ServiceRecordDC iServiceRecord, SupportConceptApprovalPeriod scap, Calculations calc)
{
var invoiceItem = base.CreateInvoiceItem(iServiceRecord, scap, calc);
var crp = scap.CostBearer2SupportConcept.CostBearer.CostRatePeriods;
if (crp != null && crp.Count > 0)
{
var minutesPerServiceUnit = crp.FirstOrDefault(c => c.CostRateType == BS.Shared.CostRatePeriodType.MinutesPerServiceUnit);
var minsProFLS = minutesPerServiceUnit != null ? minutesPerServiceUnit.CostRateValue : 60;
//invoiceItem.UnitCount = invoiceItem.UnitCount * 60 / minsProFLS;
invoiceItem.GrossAmountTotal = invoiceItem.GrossAmountTotal * 60 / minsProFLS;
invoiceItem.AmountTotal = invoiceItem.AmountTotal * 60 / minsProFLS;
}
return invoiceItem;
}
public override IList<InvoiceItem> CreateInvoiceItems(List<ServiceRecordDC> serviceRecordsInPeriod, DateTimeSpan invoicePeriod,
SupportConceptApprovalPeriod scap, BS.Shared.Services.Calculations calc)
{
var list = base.CreateInvoiceItems(serviceRecordsInPeriod, invoicePeriod, scap, calc);
var crp = scap.CostBearer2SupportConcept.CostBearer.CostRatePeriods;
decimal minsProFLS = 60;
if (crp != null && crp.Count > 0)
{
var minutesPerServiceUnit = crp.FirstOrDefault(c => c.CostRateType == BS.Shared.CostRatePeriodType.MinutesPerServiceUnit);
minsProFLS = minutesPerServiceUnit.CostRateValue.Value;
}
if (scap.CostBearer2SupportConcept.CostBearer.Organisation.Name.ToLower().Contains("neu"))
{
List<InvoiceItem> toAdd = new List<InvoiceItem>();
foreach (var item in list)
{
item.UnitCount *= 60 / minsProFLS;
if (item.ItemDescription.ToLower().Contains("face to face") || item.ItemDescription.ToLower().Contains("face to face"))
{
var count = serviceRecordsInPeriod.Where(sr => sr.ServiceDescription.Name.ToLower().Contains("face to face")
|| sr.ServiceDescription.Name.ToLower().Contains("face to face")).ToList().Count;
toAdd.Add(CreateKontaktpauschalenItem(count, item.ItemPeriodStart, item.ItemPeriodEnd));
}
}
if (toAdd.Count > 0)
list.AddRange(toAdd);
}
return list;
}
public override void BerechneSummaryItemsSummen(List<InvoiceItem> newlist, bool addRateFactorToUnitCount)
{
// Rausfinden, ob FLS 50 statt 60 Minuten gehen
//
var oid = newlist.FirstOrDefault(i => i.SupportConceptApprovalPeriodOid != null).SupportConceptApprovalPeriodOid;
SupportConceptApprovalPeriod ap = new SupportConceptApprovalPeriod();
if (oid != null)
ap = DAOFactory.GenericDAO.GetByID<SupportConceptApprovalPeriod>(oid.Value);
List<CostRatePeriod> crp = null;
if (ap != null)
crp = ap.CostBearer2SupportConcept.CostBearer.CostRatePeriods.ToList();
if (crp != null && crp.Count > 0)
{
var minutesPerServiceUnit = crp.FirstOrDefault(c => c.CostRateType == BS.Shared.CostRatePeriodType.MinutesPerServiceUnit);
var minsProFLS = minutesPerServiceUnit != null ? minutesPerServiceUnit.CostRateValue : 60;
foreach (InvoiceItem invoiceItem in newlist)
{
if (!invoiceItem.AmountPerUnit.HasValue)
{
invoiceItem.AmountPerUnit = 0;
}
invoiceItem.AmountPerUnit = Math.Round(invoiceItem.AmountPerUnit.Value, 2, MidpointRounding.AwayFromZero);
if (!invoiceItem.UnitCount.HasValue)
{
invoiceItem.UnitCount = 0;
}
if (addRateFactorToUnitCount && invoiceItem.RateFactor.HasValue)
{
invoiceItem.UnitCount = (invoiceItem.UnitCount ?? 0) * ((invoiceItem.RateFactor + 100) / 100);
}
invoiceItem.UnitCount = Math.Round(invoiceItem.UnitCount.Value, 2, MidpointRounding.AwayFromZero);
// Änderung: Eine FLS hat 50 statt 60 Minuten
invoiceItem.AmountTotal = invoiceItem.AmountPerUnit * (invoiceItem.UnitCount * 60 / minsProFLS);
invoiceItem.AmountTotal = Math.Round(invoiceItem.AmountTotal.Value, 2, MidpointRounding.AwayFromZero);
invoiceItem.GrossAmountTotal = invoiceItem.AmountTotal;
if (!addRateFactorToUnitCount && invoiceItem.RateFactor.HasValue)
{
invoiceItem.GrossAmountTotal *= (invoiceItem.RateFactor + 100) / 100;
}
}
}
}
private InvoiceItem CreateKontaktpauschalenItem(decimal? unitCount, DateTime? itemPeriodStart, DateTime? itemPeriodEnd)
{
var ii = new InvoiceItem()
{
UnitCount = unitCount,
ItemDescription = "Kontaktpauschale",
UnitDescription = "Pauschale pro direktem Kontakt",
AmountPerUnit = PauschalenHelper.PAUSCHALE,
AmountTotal = PauschalenHelper.PAUSCHALE * unitCount,
GrossAmountTotal = PauschalenHelper.PAUSCHALE * unitCount,
ItemPeriodStart = itemPeriodStart,
ItemPeriodEnd = itemPeriodEnd
};
return ii;
}
}
}