- TRIAS Rechnung für Haushaltsnahe Dienstleistungen - LH Frankfurt Oder: Anpassung Abrechnung Verpflegung Tagesstruktur - Bugfix Watermark - Bugfix Perseh Import
723 lines
30 KiB
C#
723 lines
30 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using BeWo.Data.Access;
|
|
using BeWo.Data.Entities;
|
|
using BeWo.Service.DCEntityMapper;
|
|
using BeWo.Service.ServiceImplementations;
|
|
using BS.Shared.DataContracts;
|
|
using BS.Shared.Extensions;
|
|
using BS.Shared;
|
|
using BeWo.Service.Invoicing;
|
|
using BeWo.Data;
|
|
using BeWo.Service.Plugins;
|
|
using BS.Shared.Core;
|
|
using BS.Shared.DataContracts.Compact;
|
|
using BS.Shared.Services;
|
|
using System.Text;
|
|
|
|
namespace BeWo.Report.ReportObjects
|
|
{
|
|
public class FinanceRO : AbstractBeWoReportObject<FinanceRO>
|
|
{
|
|
public DateTime? ReportStartDate { get; set; }
|
|
|
|
public DateTime? ReportEndDate { get; set; }
|
|
|
|
public decimal? RateFactor { get; set; }
|
|
|
|
public bool GruppierungLeistungskategorie { get; set; }
|
|
|
|
public IList<SupportConceptFinanceRO> SupportConceptFinanceList { get; set; }
|
|
|
|
|
|
public class SupportConceptFinanceRO
|
|
{
|
|
public string CustomerName { get; set; }
|
|
|
|
public string SupportConceptTimeSpanString { get; set; }
|
|
|
|
public string CostBearerName { get; set; }
|
|
|
|
public decimal AmountTotal { get; set; }
|
|
|
|
public decimal AmountPaid { get; set; }
|
|
|
|
public decimal AmountPaidInReportTimeSpan { get; set; }
|
|
|
|
public decimal OpenAmount { get; set; }
|
|
|
|
public decimal ApprovedHours { get; set; }
|
|
|
|
public decimal BillableHours { get; set; }
|
|
|
|
public decimal StundenNichtFehlkontakte { get; set; }
|
|
|
|
public decimal StundenFehlkontakte { get; set; }
|
|
|
|
public decimal ApprovedHoursInReportTimeSpan { get; set; }
|
|
|
|
public decimal ApprovedAmountInReportTimeSpan { get; set; }
|
|
|
|
public decimal BillableHoursInReportTimeSpan { get; set; }
|
|
|
|
public decimal BillableHoursInReportTimeSpanWithFactor { get; set; }
|
|
|
|
public decimal StundenNichtFehlkontakteInReportTimeSpan { get; set; }
|
|
|
|
public decimal StundenFehlkontakteInReportTimeSpan { get; set; }
|
|
|
|
public decimal BillableAmountInReportTimeSpan { get; set; }
|
|
|
|
public decimal BillableAmountUntilNow { get; set; }
|
|
|
|
public decimal? RateFactor { get; set; }
|
|
|
|
public decimal? HourlyRate { get; set; }
|
|
|
|
public decimal? AmountInReportTimeSpan { get; set; }
|
|
|
|
public decimal? AmountNichtFehlkontakteInReportTimeSpan { get; set; }
|
|
|
|
public decimal? AmountFehlkontakteInReportTimeSpan { get; set; }
|
|
|
|
public List<ServiceRecordDC> ServiceRecords { get; set; }
|
|
|
|
public bool IsApproved { get; set; }
|
|
|
|
public SupportConceptCostBearerRelDC Costbearer2Supportconcept { get; set; }
|
|
|
|
public SupportConceptApprovalPeriodDC SupportConceptApprovalPeriod { get; set; }
|
|
|
|
public String Leistungskategorie { get; set; }
|
|
|
|
public String GruppierungsKategorie { get; set; }
|
|
|
|
public string Custom1 { get; set; }
|
|
|
|
public string Custom2 { get; set; }
|
|
|
|
public string Custom3 { get; set; }
|
|
|
|
public string Custom4 { get; set; }
|
|
|
|
public string Custom5 { get; set; }
|
|
|
|
}
|
|
|
|
public static FinanceRO Create(DateTime? start, DateTime? end)
|
|
{
|
|
|
|
return Create(start, end, false);
|
|
}
|
|
|
|
public static FinanceRO Create(DateTime? start, DateTime? end, bool onlyNotApproved)
|
|
{
|
|
|
|
return Create(start, end, false, onlyNotApproved);
|
|
}
|
|
|
|
public static FinanceRO Create(DateTime? start, DateTime? end, bool splitByServiceCategory, bool onlyNotApproved)
|
|
{
|
|
var result = new FinanceRO();
|
|
result.ReportStartDate = start;
|
|
result.ReportEndDate = end;
|
|
result.GruppierungLeistungskategorie = splitByServiceCategory;
|
|
result.SupportConceptFinanceList = new List<SupportConceptFinanceRO>();
|
|
|
|
var service = new AnalysisServiceImp();
|
|
var financeList = service.GetOutstandingReceivables(false, false, start, end);
|
|
|
|
foreach (var item in financeList)
|
|
{
|
|
if (item.SupportConcept != null && item.SupportConcept.ActivationType != ActivationTypeId.Deleted)
|
|
{
|
|
var cb2sc = DAOFactory.GenericDAO.LoadByID<CostBearer2SupportConcept>(item.CostBearer.CostBearer2SupportConceptOid);
|
|
var relDC = MapperFactory.SupportConceptCostBearerRelDC_CostBearer2SupportConcept.MapToNewDC(cb2sc);
|
|
|
|
bool istBewilligt = (relDC.ApprovedEndDate.HasValue || relDC.ApprovedStartDate.HasValue);
|
|
|
|
if (onlyNotApproved && istBewilligt)
|
|
{
|
|
continue; // Überspringen, wenn nur die NICHT bewilligten angezeigt werden sollen.
|
|
}
|
|
|
|
if (splitByServiceCategory)
|
|
{
|
|
var financeRO = new FinanceRO();
|
|
financeRO.AddByServiceCategory(result, item, cb2sc, relDC);
|
|
}
|
|
else
|
|
{
|
|
var ro = CreateSupportConceptFinanceRO(item, relDC, null);
|
|
// 2.
|
|
result.SupportConceptFinanceList.Add(ro);
|
|
}
|
|
}
|
|
}
|
|
|
|
StringBuilder oidList = new StringBuilder();
|
|
foreach (var ro in result.SupportConceptFinanceList)
|
|
{
|
|
if (oidList.Length > 0)
|
|
{
|
|
oidList.Append(",");
|
|
}
|
|
oidList.Append(ro.Costbearer2Supportconcept.CostBearer2SupportConceptOid);
|
|
}
|
|
|
|
|
|
var allServiceDescs = DAOFactory.GenericDAO.GetAll<ServiceDescription>();
|
|
Dictionary<long, ServiceDescriptionDC> serviceDict = new Dictionary<long, ServiceDescriptionDC>();
|
|
foreach (var item in allServiceDescs)
|
|
{
|
|
serviceDict.Add(item.Oid.Value, MapperFactory.ServiceDescriptionDC_ServiceDescription.MapToNewDC(item));
|
|
}
|
|
|
|
var cs2ServiceRecords = new Dictionary<long, List<ServiceRecordDC>>();
|
|
|
|
if (oidList.Length > 0)
|
|
{
|
|
String sql = "SELECT Oid, Version, StartDate, EndDate, DistanceInMeter, CostBearer2SupportConceptOid, Betrag, ServiceDescriptionOid, RoundedDuration, GroupEmployeeCount, GroupPersonCount, GroupRoundedDuration, GroupOid FROM servicerecord";
|
|
if (oidList.Length > 0)
|
|
{
|
|
sql += String.Format(" WHERE CostBearer2SupportConceptOid in ({0})", oidList.ToString());
|
|
}
|
|
else
|
|
{
|
|
sql += " WHERE CostBearer2SupportConceptOid is not null";
|
|
}
|
|
|
|
var sqlresult = DAOFactory.SearchDAO.GetSqlResult(sql);
|
|
//
|
|
//update customer set debitornumber = '5' + debitornumber where debitornumber is not null
|
|
foreach (object[] srRow in sqlresult)
|
|
{
|
|
var sr = CreateServiceRecordDC(srRow, serviceDict);
|
|
|
|
if (sr.CostBearer2SupportConceptOid.HasValue)
|
|
{
|
|
if (!cs2ServiceRecords.ContainsKey(sr.CostBearer2SupportConceptOid.Value))
|
|
{
|
|
cs2ServiceRecords.Add(sr.CostBearer2SupportConceptOid.Value, new List<ServiceRecordDC>());
|
|
}
|
|
cs2ServiceRecords[sr.CostBearer2SupportConceptOid.Value].Add(sr);
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach (var ro in result.SupportConceptFinanceList)
|
|
{
|
|
var cb2sc = ro.Costbearer2Supportconcept;
|
|
var costRateDcs = cb2sc.CostBearer.CostRatePeriods;
|
|
var calc = Calculations.GetInstance(cb2sc.CostBearer.CostBearerID);
|
|
List<ServiceRecordDC> records = null;
|
|
|
|
if (cs2ServiceRecords.ContainsKey(cb2sc.CostBearer2SupportConceptOid.Value))
|
|
{
|
|
records = cs2ServiceRecords[cb2sc.CostBearer2SupportConceptOid.Value];
|
|
}
|
|
else
|
|
{
|
|
records = new List<ServiceRecordDC>();
|
|
}
|
|
|
|
|
|
//1.
|
|
if (ro.SupportConceptApprovalPeriod != null && ro.SupportConceptApprovalPeriod.ServiceCategory != null)
|
|
{
|
|
ro.Leistungskategorie = ro.SupportConceptApprovalPeriod.ServiceCategory.Name;
|
|
ro.ServiceRecords = records.Where(sr =>
|
|
sr.ServiceDescription.Category.ServiceCategoryOid == ro.SupportConceptApprovalPeriod.ServiceCategory.ServiceCategoryOid)
|
|
.ToList();
|
|
}
|
|
else
|
|
{
|
|
ro.ServiceRecords = records;
|
|
}
|
|
|
|
var fkRecords = new List<ServiceRecordDC>();
|
|
var flsRecords = new List<ServiceRecordDC>();
|
|
|
|
foreach (var sr in ro.ServiceRecords)
|
|
{
|
|
sr.Employee = new CompactEmployeeDC { ValueListEntries = new Dictionary<long, ValueListEntryType>() }; // hack, damit später bei der Berechnung des Betrags in der InvoiceCreation kein Fehler kommt
|
|
sr.CostBearer = cb2sc.CostBearer;
|
|
sr.SupportConcept = ro.Costbearer2Supportconcept.SupportConcept;
|
|
sr.Customer = sr.SupportConcept.Customer;
|
|
|
|
if (sr.ServiceDescription.Name.ToLower().Contains("fehlkontakt") || sr.ServiceDescription.Category.Name.ToLower().Contains("fehlkontakt") || (sr.ServiceDescription.ProzentAbrechnung.HasValue && sr.ServiceDescription.ProzentAbrechnung.Value < 100))
|
|
{
|
|
fkRecords.Add(sr);
|
|
}
|
|
else
|
|
{
|
|
flsRecords.Add(sr);
|
|
}
|
|
}
|
|
|
|
if (ro.Costbearer2Supportconcept.SupportConcept.Customer.LastName == "Akbulut")
|
|
{
|
|
int test = 0;
|
|
}
|
|
|
|
//Fehlkontakte
|
|
if (end.HasValue && end < DateTime.MaxValue.AddDays(-1))
|
|
{
|
|
if (ro.SupportConceptApprovalPeriod != null)
|
|
{
|
|
ro.ApprovedHours = calc.GetApprovedHoursTillNow(ro.SupportConceptApprovalPeriod, costRateDcs, end.Value, true) ?? 0;
|
|
}
|
|
else
|
|
{
|
|
ro.ApprovedHours = calc.GetApprovedHoursTillNow(ro.Costbearer2Supportconcept, end.Value) ?? 0;
|
|
}
|
|
ro.StundenNichtFehlkontakte = calc.GetBillableDurationInMinutes(flsRecords.Where(sr => sr.Start.Value.Date < end.Value.AddDays(1)).ToList()) / 60;
|
|
ro.StundenFehlkontakte = calc.GetBillableDurationInMinutes(fkRecords.Where(sr => sr.Start.Value.Date < end.Value.AddDays(1)).ToList()) / 60;
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
if (ro.SupportConceptApprovalPeriod != null)
|
|
{
|
|
ro.ApprovedHours = calc.GetApprovedHoursTillNow(ro.SupportConceptApprovalPeriod, costRateDcs, null, true) ?? 0;
|
|
}
|
|
else
|
|
{
|
|
ro.ApprovedHours = calc.GetApprovedHoursTillNow(ro.Costbearer2Supportconcept, null) ?? 0;
|
|
}
|
|
|
|
ro.StundenNichtFehlkontakte = calc.GetBillableDurationInMinutes(flsRecords) / 60;
|
|
ro.StundenFehlkontakte = calc.GetBillableDurationInMinutes(fkRecords) / 60;
|
|
}
|
|
|
|
ro.BillableHours = ro.StundenNichtFehlkontakte + ro.StundenFehlkontakte;
|
|
|
|
if (start.HasValue && end.HasValue)
|
|
{
|
|
var rfcrEnd = costRateDcs.GetCostRatePeriodForDate(CostRatePeriodType.RateFactor, end.Value);
|
|
if (rfcrEnd != null && rfcrEnd.CostRateValue.HasValue)
|
|
{
|
|
ro.RateFactor = (rfcrEnd.CostRateValue.Value + 100m) / 100m;
|
|
|
|
if (!result.RateFactor.HasValue)
|
|
{
|
|
result.RateFactor = ro.RateFactor;
|
|
}
|
|
}
|
|
|
|
var hcrEnd = costRateDcs.GetCostRatePeriodForDate(CostRatePeriodType.HourlyRate, end.Value);
|
|
if (hcrEnd != null && hcrEnd.CostRateValue.HasValue)
|
|
{
|
|
|
|
ro.HourlyRate = hcrEnd.CostRateValue.Value;
|
|
}
|
|
if (ro.SupportConceptApprovalPeriod != null)
|
|
{
|
|
ro.ApprovedHoursInReportTimeSpan = calc.GetApprovedHoursForPeriod(ro.SupportConceptApprovalPeriod, costRateDcs, start, end) ?? 0;
|
|
}
|
|
else
|
|
{
|
|
ro.ApprovedHoursInReportTimeSpan = calc.GetApprovedHoursForPeriod(ro.Costbearer2Supportconcept, start.Value, end.Value);
|
|
}
|
|
|
|
if (splitByServiceCategory && ro.SupportConceptApprovalPeriod != null)
|
|
{
|
|
ro.ApprovedAmountInReportTimeSpan = (decimal)calc.GetApprovedAmountForPeriod(ro.Costbearer2Supportconcept, start.Value, end.Value, ro.SupportConceptApprovalPeriod.ServiceCategory);
|
|
}
|
|
else
|
|
{
|
|
ro.ApprovedAmountInReportTimeSpan = (decimal)calc.GetApprovedAmountForPeriod(ro.Costbearer2Supportconcept, start.Value, end.Value, null);
|
|
}
|
|
ro.AmountInReportTimeSpan = 0;
|
|
ro.AmountNichtFehlkontakteInReportTimeSpan = 0;
|
|
ro.AmountFehlkontakteInReportTimeSpan = 0;
|
|
|
|
foreach (var srDc in flsRecords)
|
|
{
|
|
if (srDc.Start >= start && srDc.Start.Value.Date <= end.Value.Date)
|
|
{
|
|
|
|
var billable = calc.GetBillableDurationInMinutes(srDc, false) / 60;
|
|
ro.StundenNichtFehlkontakteInReportTimeSpan += billable;
|
|
|
|
var rfcr = costRateDcs.GetCostRatePeriodForDate(CostRatePeriodType.RateFactor, srDc.Start.Value);
|
|
if (rfcr != null && rfcr.CostRateValue.HasValue)
|
|
{
|
|
var billableRateFactor = billable * (rfcr.CostRateValue.Value + 100m) / 100m;
|
|
ro.BillableHoursInReportTimeSpanWithFactor += billableRateFactor;
|
|
|
|
billable = billableRateFactor;
|
|
}
|
|
|
|
decimal stundensatz = 0;
|
|
|
|
var hcr = costRateDcs.GetCostRatePeriodForDate(CostRatePeriodType.HourlyRate, srDc.Start.Value);
|
|
if (hcr != null && hcr.CostRateValue.HasValue)
|
|
{
|
|
stundensatz = hcr.CostRateValue.Value;
|
|
}
|
|
|
|
var betrag = billable * stundensatz;
|
|
|
|
ro.AmountNichtFehlkontakteInReportTimeSpan += betrag;
|
|
}
|
|
}
|
|
|
|
|
|
//Fehlkontakte
|
|
foreach (var srDc in fkRecords)
|
|
{
|
|
if (srDc.Start >= start && srDc.Start.Value.Date <= end.Value.Date)
|
|
{
|
|
var billable = calc.GetBillableDurationInMinutes(srDc, false) / 60;
|
|
ro.StundenFehlkontakteInReportTimeSpan += billable;
|
|
decimal stundensatz = 0;
|
|
|
|
var hcr = costRateDcs.GetCostRatePeriodForDate(CostRatePeriodType.HourlyRate, srDc.Start.Value);
|
|
if (hcr != null && hcr.CostRateValue.HasValue)
|
|
{
|
|
stundensatz = hcr.CostRateValue.Value;
|
|
}
|
|
|
|
if (srDc.ServiceDescription.ProzentAbrechnung.HasValue && srDc.ServiceDescription.ProzentAbrechnung.Value < 100)
|
|
{
|
|
stundensatz *= (srDc.ServiceDescription.ProzentAbrechnung.Value / 100);
|
|
}
|
|
|
|
var betrag = billable * stundensatz;
|
|
|
|
ro.AmountFehlkontakteInReportTimeSpan += betrag;
|
|
}
|
|
}
|
|
ro.BillableHoursInReportTimeSpan = ro.StundenNichtFehlkontakteInReportTimeSpan + ro.StundenFehlkontakteInReportTimeSpan;
|
|
ro.AmountInReportTimeSpan = (ro.AmountNichtFehlkontakteInReportTimeSpan ?? 0) + (ro.AmountFehlkontakteInReportTimeSpan ?? 0);
|
|
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
private static ServiceRecordDC CreateServiceRecordDC(object[] sqlRow, Dictionary<long, ServiceDescriptionDC> serviceDict)
|
|
{
|
|
try
|
|
{
|
|
var dc = new ServiceRecordDC();
|
|
|
|
|
|
//DAOFactory.SearchDAO.GetSqlResult("SELECT Oid, Version, Start, End, DistanceInMeter, CostBearer2SupportConceptOid, Betrag, ServiceDescriptionOid, RoundedDuration, GroupEmployeeCount, GroupPersonCount, GroupRoundedDuration, GroupOid FROM servicerecord");
|
|
|
|
|
|
dc.ServiceRecordOid = (long?)sqlRow[0];
|
|
dc.ServiceRecordVersion = (long?)sqlRow[1];
|
|
dc.Start = (DateTime?)sqlRow[2];
|
|
dc.End = (DateTime?)sqlRow[3];
|
|
|
|
var test = sqlRow[4];
|
|
if (test != null)
|
|
{
|
|
decimal meter = 0;
|
|
|
|
if (Decimal.TryParse(test.ToString(), out meter))
|
|
{
|
|
dc.DistanceInMeterDecimal = meter;
|
|
}
|
|
}
|
|
|
|
if (dc.DistanceInMeterDecimal.HasValue)
|
|
{
|
|
dc.DistanceInMeter = (int)dc.DistanceInMeterDecimal;
|
|
}
|
|
dc.CostBearer2SupportConceptOid = (long?)sqlRow[5];
|
|
dc.Betrag = (decimal?)sqlRow[6];
|
|
|
|
long? sdOid = (long?)sqlRow[7];
|
|
if (sdOid.HasValue && serviceDict.ContainsKey(sdOid.Value))
|
|
{
|
|
dc.ServiceDescription = serviceDict[sdOid.Value];
|
|
}
|
|
dc.RoundedDuration = (decimal)sqlRow[8];
|
|
|
|
dc.GroupEmployeeCount = (int?)sqlRow[9];
|
|
dc.GroupPersonCount = (int?)sqlRow[10];
|
|
dc.GroupRoundedDuration = (decimal?)sqlRow[11];
|
|
dc.GroupOid = (long?)sqlRow[12];
|
|
|
|
return dc;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
|
|
throw;
|
|
}
|
|
|
|
}
|
|
|
|
public static SupportConceptFinanceRO CreateSupportConceptFinanceRO(FinanceOverviewItemDC item, SupportConceptCostBearerRelDC relDc, SupportConceptApprovalPeriodDC scapDc, bool SplitServiceCategory = false)
|
|
{
|
|
var ro = new SupportConceptFinanceRO();
|
|
ro.CustomerName = item.CustomerName;
|
|
ro.SupportConceptTimeSpanString = item.SupportConceptTimeSpanString;
|
|
ro.CostBearerName = item.CostBearerName;
|
|
|
|
if (SplitServiceCategory)
|
|
{
|
|
ro.AmountPaid = 0;
|
|
ro.OpenAmount = ro.AmountTotal;
|
|
}
|
|
else
|
|
{
|
|
ro.AmountTotal = item.AmountTotal;
|
|
ro.AmountPaid = item.AmountPaid;
|
|
ro.OpenAmount = item.OpenAmount;
|
|
}
|
|
ro.Costbearer2Supportconcept = relDc;
|
|
ro.SupportConceptApprovalPeriod = scapDc;
|
|
ro.IsApproved = (relDc.ApprovedEndDate.HasValue || relDc.ApprovedStartDate.HasValue);
|
|
|
|
return ro;
|
|
}
|
|
|
|
public virtual void AddByServiceCategory(FinanceRO result, FinanceOverviewItemDC item, CostBearer2SupportConcept cb2sc, SupportConceptCostBearerRelDC relDC)
|
|
{
|
|
if (cb2sc.ApprovalPeriodList.Count > 1) // komplexer Ablauf nur, wenn mehr als eine Bewilligung vorliegt
|
|
{
|
|
Dictionary<string, decimal> key2Value = new Dictionary<string, decimal>();
|
|
var SmallList = new List<SupportConceptFinanceRO>();
|
|
SupportConceptFinanceRO ro;
|
|
var baseRo = CreateSupportConceptFinanceRO(item, relDC, null);
|
|
|
|
foreach (var scap in cb2sc.ApprovalPeriodList)
|
|
{
|
|
var scapDC = MapperFactory.SupportConceptApprovalPeriodDC_SupportConceptApprovalPeriod.MapToNewDC(scap);
|
|
var calc = PluginLoader.FindClass<Calculations>(relDC.CostBearer.CostBearerID) ?? Calculations.GetInstance(relDC.CostBearer.CostBearerID);
|
|
ro = CreateSupportConceptFinanceRO(item, relDC, scapDC, true);
|
|
|
|
// statt dem auskommentierten Bereich
|
|
var amountTotal = calc.GetApprovedAmount(scapDC, relDC.CostBearer.CostRatePeriods) ?? 0;
|
|
ro.AmountTotal = amountTotal;
|
|
ro.OpenAmount = amountTotal;
|
|
|
|
//var approvedAmountInTimeSpan = calc.GetApprovedAmountInTimeSpan(relDC, result.ReportStartDate, result.ReportEndDate) ?? 0;
|
|
|
|
SmallList.Add(ro);
|
|
|
|
|
|
//string key = "";
|
|
|
|
//if (scap.ServiceCategory != null)
|
|
//{
|
|
// key = scap.ServiceCategory.Name;
|
|
//}
|
|
//if (key2Value.ContainsKey(key)) // 1. Summenbildung von Gesamtbewilligung pro ServiceKategorie
|
|
//{
|
|
// key2Value[key] += AmountTotal;
|
|
// foreach (var r in SmallList)
|
|
// {
|
|
// if (key == "" && r.SupportConceptApprovalPeriod.ServiceCategory == null)
|
|
// {
|
|
// r.AmountTotal = key2Value[key];
|
|
// }
|
|
// else if (key != "" && r.SupportConceptApprovalPeriod.ServiceCategory != null && r.SupportConceptApprovalPeriod.ServiceCategory.Name == key)
|
|
// {
|
|
// r.AmountTotal = key2Value[key];
|
|
// }
|
|
// }
|
|
//}
|
|
//else
|
|
//{
|
|
// key2Value.Add(key, AmountTotal);
|
|
// ro.AmountTotal = AmountTotal;
|
|
// SmallList.Add(ro);
|
|
//}
|
|
}
|
|
var flsEntry = SmallList.OrderByDescending(e => e.AmountTotal).FirstOrDefault(); // 2. Zuordnung der Abschlagszahlungen zur betragsmäßig größten Bewilligung
|
|
flsEntry.AmountPaid = baseRo.AmountPaid;
|
|
flsEntry.OpenAmount = flsEntry.AmountTotal - flsEntry.AmountPaid;
|
|
result.SupportConceptFinanceList.AddRange(SmallList);
|
|
}
|
|
else
|
|
{
|
|
var ro = CreateSupportConceptFinanceRO(item, relDC, null);
|
|
result.SupportConceptFinanceList.Add(ro);
|
|
}
|
|
}
|
|
|
|
public void CalculateBillableAmountInReportTimeSpan()
|
|
{
|
|
CalculateBillableAmountInReportTimeSpan("Finanzauswertung");
|
|
|
|
}
|
|
|
|
public void CalculateBillableAmountInReportTimeSpan(String invoiceCreatorId)
|
|
{
|
|
if (this.SupportConceptFinanceList != null)
|
|
{
|
|
foreach (var scRo in SupportConceptFinanceList)
|
|
{
|
|
if (scRo.Costbearer2Supportconcept != null)
|
|
{
|
|
CalculateBillableAmountInReportTimeSpan(scRo, invoiceCreatorId);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void CalculateBillableAmountInTimeSpan()
|
|
{
|
|
CalculateBillableAmountInTimeSpan("Finanzauswertung");
|
|
}
|
|
|
|
public void CalculateBillableAmountInTimeSpan(String invoiceCreatorId)
|
|
{
|
|
if (this.SupportConceptFinanceList != null)
|
|
{
|
|
foreach (var scRo in SupportConceptFinanceList)
|
|
{
|
|
if (scRo.Costbearer2Supportconcept != null)
|
|
{
|
|
CalculateBillableAmountInTimeSpan(scRo, scRo.Costbearer2Supportconcept.StartDate, ReportEndDate, true, invoiceCreatorId);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void CalculateBillableAmountInReportTimeSpan(SupportConceptFinanceRO scRo, String invoiceCreatorId)
|
|
{
|
|
CalculateBillableAmountInTimeSpan(scRo, ReportStartDate, ReportEndDate, false, invoiceCreatorId);
|
|
}
|
|
|
|
private void CalculateBillableAmountInTimeSpan(SupportConceptFinanceRO scRo, DateTime? start, DateTime? end, bool totalOrReportTimeSpan, String invoiceCreatorId)
|
|
{
|
|
String tenant = null;
|
|
|
|
if (MultitenancyOperationContextExt.Current != null)
|
|
tenant = MultitenancyOperationContextExt.Current.Tenant;
|
|
else
|
|
tenant = SessionFacade.Tenant;
|
|
|
|
var factory = PluginLoader.FindClass<InvoiceFactory>(tenant);
|
|
if (factory == null)
|
|
{
|
|
factory = InvoiceFactory.GetInstance(tenant);
|
|
}
|
|
Dictionary<CompactSupportConceptDC, List<ServiceRecordDC>> dict = new Dictionary<CompactSupportConceptDC, List<ServiceRecordDC>>();
|
|
|
|
CompactSupportConceptDC sc = CreateCompactSupportConcept(scRo.Costbearer2Supportconcept);
|
|
if (scRo.ServiceRecords != null)
|
|
{
|
|
foreach (var sr in scRo.ServiceRecords)
|
|
{
|
|
sr.AlreadyAccounted = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
scRo.ServiceRecords = new List<ServiceRecordDC>();
|
|
}
|
|
|
|
dict.Add(sc, scRo.ServiceRecords);
|
|
|
|
var creator = factory.CreateInvoiceCreator(invoiceCreatorId, tenant, dict);
|
|
|
|
//String text = String.Format("Tenant={0}, Context=Null? {1}, Factory = {2}", tenant,
|
|
// MultitenancyOperationContextExt.Current == null, factory);
|
|
|
|
DateTimeSpan span = null;
|
|
if (start.HasValue && end.HasValue)
|
|
{
|
|
span = new DateTimeSpan();
|
|
span.StartDate = start.Value;
|
|
span.EndDate = end.Value;
|
|
}
|
|
|
|
if (scRo.CustomerName.Contains("Löb"))
|
|
{
|
|
int test = 0;
|
|
}
|
|
var invoices = creator.GenerateServiceInvoices(scRo.Costbearer2Supportconcept.CostBearer.CostBearerOid.Value, span, dict);
|
|
|
|
if (invoices != null && invoices.Count == 1)
|
|
{
|
|
//var i = invoices[0];
|
|
if (totalOrReportTimeSpan)
|
|
{
|
|
scRo.BillableAmountUntilNow = invoices[0].ClaimSum ?? 0;
|
|
|
|
}
|
|
else
|
|
{
|
|
scRo.BillableAmountInReportTimeSpan = invoices[0].ClaimSum ?? 0;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
private CompactSupportConceptDC CreateCompactSupportConcept(SupportConceptCostBearerRelDC c2s)
|
|
{
|
|
var dc = new CompactSupportConceptDC();
|
|
dc.SupportConceptOid = c2s.SupportConcept.SupportConceptOid;
|
|
dc.CostBearerRelOids = new List<long>();
|
|
dc.CostBearerRelOids.Add(c2s.CostBearer2SupportConceptOid.Value);
|
|
//dc.IsApproved = c2s.ApprovedStartDate.HasValue && c2s.ApprovedEndDate.HasValue;
|
|
dc.IsApproved = true;
|
|
return dc;
|
|
}
|
|
|
|
public void CalculatePaidAmountInReportTimeSpan()
|
|
{
|
|
if (this.SupportConceptFinanceList != null)
|
|
{
|
|
foreach (var scRo in SupportConceptFinanceList)
|
|
{
|
|
if (scRo.Costbearer2Supportconcept != null)
|
|
{
|
|
CalculatePaidAmountInReportTimeSpan(scRo, this.ReportStartDate ?? DateTime.MinValue, this.ReportEndDate ?? DateTime.MaxValue);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void CalculatePaidAmountInReportTimeSpan(SupportConceptFinanceRO scRo, DateTime start, DateTime end)
|
|
{
|
|
var c2s = DAOFactory.GenericDAO.LoadByID<CostBearer2SupportConcept>(scRo.Costbearer2Supportconcept
|
|
.CostBearer2SupportConceptOid.Value);
|
|
|
|
var bookingList = c2s.AccountingTransactions;
|
|
|
|
bookingList = bookingList.Where(i => i.GueltigkeitsDatum.HasValue && i.GueltigkeitsDatum.Value.Date <= end && i.GueltigkeitsDatum >= start).ToList();
|
|
|
|
decimal abschlZahlungen = 0;
|
|
foreach (var item in bookingList)
|
|
{
|
|
abschlZahlungen += item.Amount;
|
|
}
|
|
|
|
DateTimeSpan span = new DateTimeSpan();
|
|
span.StartDateTime = start;
|
|
span.EndDateTime = end.AddDays(1).AddTicks(-1);
|
|
|
|
decimal rechnungsBetrag = 0;
|
|
|
|
//if (c2s.SupportConcept.Customer.Person.LastName.StartsWith("Art"))
|
|
//{
|
|
// int test = 0;
|
|
//}
|
|
|
|
var invoices = DAOFactory.SearchDAO.GetServiceInvoices(c2s.Oid.Value, span);
|
|
foreach (var i in invoices)
|
|
{
|
|
foreach (var sip in i.ServiceInvoicePeriodList)
|
|
{
|
|
rechnungsBetrag += sip.Claim ?? 0;
|
|
}
|
|
|
|
}
|
|
|
|
scRo.AmountPaidInReportTimeSpan = abschlZahlungen + rechnungsBetrag;
|
|
}
|
|
}
|
|
}
|
|
|