150 lines
5.1 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
}
|