2016-06-27 01:45:38 +02:00
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 ;
2018-03-02 16:24:55 +01:00
using BeWo.Service.Plugins ;
using BS.Shared.Core ;
using BS.Shared.DataContracts.Compact ;
2016-06-27 01:45:38 +02:00
using BS.Shared.Services ;
2023-07-04 01:36:06 +02:00
using System.Text ;
2025-10-21 13:25:41 +02:00
using System.Diagnostics ;
2016-06-27 01:45:38 +02:00
namespace BeWo.Report.ReportObjects
{
2017-06-08 14:23:43 +02:00
public class FinanceRO : AbstractBeWoReportObject < FinanceRO >
{
public DateTime ? ReportStartDate { get ; set ; }
2016-06-27 01:45:38 +02:00
2017-06-08 14:23:43 +02:00
public DateTime ? ReportEndDate { get ; set ; }
2016-06-27 01:45:38 +02:00
2017-06-08 14:23:43 +02:00
public decimal? RateFactor { get ; set ; }
2016-06-27 01:45:38 +02:00
2023-10-18 10:54:53 +02:00
public bool GruppierungLeistungskategorie { get ; set ; }
public IList < SupportConceptFinanceRO > SupportConceptFinanceList { get ; set ; }
2016-06-27 01:45:38 +02:00
2025-10-21 13:25:41 +02:00
[DebuggerDisplay("{CustomerName} {SupportConceptTimeSpanString} {AmountTotal} ")]
2016-06-27 01:45:38 +02:00
2025-10-21 13:25:41 +02:00
public class SupportConceptFinanceRO
2017-06-08 14:23:43 +02:00
{
public string CustomerName { get ; set ; }
2016-06-27 01:45:38 +02:00
2017-06-08 14:23:43 +02:00
public string SupportConceptTimeSpanString { get ; set ; }
2016-06-27 01:45:38 +02:00
2017-06-08 14:23:43 +02:00
public string CostBearerName { get ; set ; }
2016-06-27 01:45:38 +02:00
2017-06-08 14:23:43 +02:00
public decimal AmountTotal { get ; set ; }
2016-06-27 01:45:38 +02:00
2017-06-08 14:23:43 +02:00
public decimal AmountPaid { get ; set ; }
2016-06-27 01:45:38 +02:00
2019-07-25 15:59:20 +02:00
public decimal AmountPaidInReportTimeSpan { get ; set ; }
public decimal OpenAmount { get ; set ; }
2016-06-27 01:45:38 +02:00
2017-06-08 14:23:43 +02:00
public decimal ApprovedHours { get ; set ; }
2016-06-27 01:45:38 +02:00
2017-06-08 14:23:43 +02:00
public decimal BillableHours { get ; set ; }
2016-06-27 01:45:38 +02:00
2023-07-04 01:36:06 +02:00
public decimal StundenNichtFehlkontakte { get ; set ; }
public decimal StundenFehlkontakte { get ; set ; }
public decimal ApprovedHoursInReportTimeSpan { get ; set ; }
2016-06-27 01:45:38 +02:00
2024-04-15 16:01:01 +02:00
public decimal ApprovedAmountInReportTimeSpan { get ; set ; }
public decimal BillableHoursInReportTimeSpan { get ; set ; }
2016-06-27 01:45:38 +02:00
2017-06-08 14:23:43 +02:00
public decimal BillableHoursInReportTimeSpanWithFactor { get ; set ; }
2016-06-27 01:45:38 +02:00
2023-07-04 01:36:06 +02:00
public decimal StundenNichtFehlkontakteInReportTimeSpan { get ; set ; }
public decimal StundenFehlkontakteInReportTimeSpan { get ; set ; }
public decimal BillableAmountInReportTimeSpan { get ; set ; }
2018-03-02 16:24:55 +01:00
2019-02-12 19:13:34 +01:00
public decimal BillableAmountUntilNow { get ; set ; }
2018-03-02 16:24:55 +01:00
public decimal? RateFactor { get ; set ; }
2016-06-27 01:45:38 +02:00
2017-02-01 13:53:59 +01:00
public decimal? HourlyRate { get ; set ; }
public decimal? AmountInReportTimeSpan { get ; set ; }
2023-07-04 01:36:06 +02:00
public decimal? AmountNichtFehlkontakteInReportTimeSpan { get ; set ; }
public decimal? AmountFehlkontakteInReportTimeSpan { get ; set ; }
2017-02-01 13:53:59 +01:00
public List < ServiceRecordDC > ServiceRecords { get ; set ; }
2016-06-27 01:45:38 +02:00
2017-06-08 14:23:43 +02:00
public bool IsApproved { get ; set ; }
2016-06-27 01:45:38 +02:00
2017-06-08 14:23:43 +02:00
public SupportConceptCostBearerRelDC Costbearer2Supportconcept { get ; set ; }
2017-02-01 13:53:59 +01:00
2021-02-02 23:23:05 +01:00
public SupportConceptApprovalPeriodDC SupportConceptApprovalPeriod { get ; set ; }
public String Leistungskategorie { get ; set ; }
2023-10-18 10:54:53 +02:00
public String GruppierungsKategorie { get ; set ; }
2017-02-01 13:53:59 +01:00
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 ; }
}
2016-06-27 01:45:38 +02:00
2022-08-25 12:51:53 +02:00
public static FinanceRO Create ( DateTime ? start , DateTime ? end )
{
return Create ( start , end , false ) ;
}
public static FinanceRO Create ( DateTime ? start , DateTime ? end , bool onlyNotApproved )
2023-10-18 10:54:53 +02:00
{
2021-02-02 23:23:05 +01:00
2023-10-18 10:54:53 +02:00
return Create ( start , end , false , onlyNotApproved ) ;
}
2021-02-02 23:23:05 +01:00
2023-10-18 10:54:53 +02:00
public static FinanceRO Create ( DateTime ? start , DateTime ? end , bool splitByServiceCategory , bool onlyNotApproved )
2017-06-08 14:23:43 +02:00
{
var result = new FinanceRO ( ) ;
result . ReportStartDate = start ;
result . ReportEndDate = end ;
2023-10-18 10:54:53 +02:00
result . GruppierungLeistungskategorie = splitByServiceCategory ;
2017-06-08 14:23:43 +02:00
result . SupportConceptFinanceList = new List < SupportConceptFinanceRO > ( ) ;
2016-06-27 01:45:38 +02:00
var service = new AnalysisServiceImp ( ) ;
var financeList = service . GetOutstandingReceivables ( false , false , start , end ) ;
2023-07-04 01:36:06 +02:00
2016-06-27 01:45:38 +02:00
foreach ( var item in financeList )
{
if ( item . SupportConcept ! = null & & item . SupportConcept . ActivationType ! = ActivationTypeId . Deleted )
{
2021-02-02 23:23:05 +01:00
var cb2sc = DAOFactory . GenericDAO . LoadByID < CostBearer2SupportConcept > ( item . CostBearer . CostBearer2SupportConceptOid ) ;
var relDC = MapperFactory . SupportConceptCostBearerRelDC_CostBearer2SupportConcept . MapToNewDC ( cb2sc ) ;
2022-08-10 12:13:18 +02:00
bool istBewilligt = ( relDC . ApprovedEndDate . HasValue | | relDC . ApprovedStartDate . HasValue ) ;
if ( onlyNotApproved & & istBewilligt )
{
continue ; // Überspringen, wenn nur die NICHT bewilligten angezeigt werden sollen.
}
2021-02-02 23:23:05 +01:00
if ( splitByServiceCategory )
2020-09-15 13:23:34 +02:00
{
2023-10-18 10:54:53 +02:00
var financeRO = new FinanceRO ( ) ;
financeRO . AddByServiceCategory ( result , item , cb2sc , relDC ) ;
2023-07-04 01:36:06 +02:00
}
else
{
var ro = CreateSupportConceptFinanceRO ( item , relDC , null ) ;
2023-10-18 10:54:53 +02:00
// 2.
2023-07-04 01:36:06 +02:00
result . SupportConceptFinanceList . Add ( ro ) ;
2023-10-18 10:54:53 +02:00
}
2023-07-04 01:36:06 +02:00
}
}
2018-01-08 22:29:10 +01:00
2023-07-04 01:36:06 +02:00
StringBuilder oidList = new StringBuilder ( ) ;
foreach ( var ro in result . SupportConceptFinanceList )
{
if ( oidList . Length > 0 )
{
oidList . Append ( "," ) ;
}
oidList . Append ( ro . Costbearer2Supportconcept . CostBearer2SupportConceptOid ) ;
}
2016-06-27 01:45:38 +02:00
2023-07-04 01:36:06 +02:00
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 ) ) ;
}
2017-02-01 13:53:59 +01:00
2023-07-04 01:36:06 +02:00
var cs2ServiceRecords = new Dictionary < long , List < ServiceRecordDC > > ( ) ;
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
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" ;
}
2017-03-07 08:46:32 +01:00
2023-07-04 01:36:06 +02:00
var sqlresult = DAOFactory . SearchDAO . GetSqlResult ( sql ) ;
//
//update customer set debitornumber = '5' + debitornumber where debitornumber is not null
foreach ( object [ ] srRow in sqlresult )
{
2023-07-06 13:16:52 +02:00
var sr = CreateServiceRecordDC ( srRow , serviceDict ) ;
2023-07-04 01:36:06 +02:00
if ( sr . CostBearer2SupportConceptOid . HasValue )
{
if ( ! cs2ServiceRecords . ContainsKey ( sr . CostBearer2SupportConceptOid . Value ) )
{
cs2ServiceRecords . Add ( sr . CostBearer2SupportConceptOid . Value , new List < ServiceRecordDC > ( ) ) ;
}
cs2ServiceRecords [ sr . CostBearer2SupportConceptOid . Value ] . Add ( sr ) ;
}
}
}
2017-03-07 08:46:32 +01:00
2023-07-04 01:36:06 +02:00
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 > ( ) ;
}
2026-04-22 14:21:45 +02:00
// AB, 22.04.2026: Bugfix wenn Betreuung beendet und ein Zeitraum über Ende hinweg gewählt wird
var terminationDate = ro . Costbearer2Supportconcept . SupportConcept . Customer . TerminationDate ;
DateTime ? effectiveEnd = end ;
if ( terminationDate . HasValue & & ( ! effectiveEnd . HasValue | | terminationDate . Value < effectiveEnd . Value ) )
{
effectiveEnd = terminationDate . Value ;
}
2017-03-07 08:46:32 +01:00
2023-07-04 01:36:06 +02:00
//1.
if ( ro . SupportConceptApprovalPeriod ! = null & & ro . SupportConceptApprovalPeriod . ServiceCategory ! = null )
{
ro . Leistungskategorie = ro . SupportConceptApprovalPeriod . ServiceCategory . Name ;
2026-04-22 14:21:45 +02:00
ro . ServiceRecords = records . Where ( sr = > sr . ServiceDescription . Category . ServiceCategoryOid = = ro . SupportConceptApprovalPeriod . ServiceCategory . ServiceCategoryOid ) . ToList ( ) ;
2023-07-04 01:36:06 +02:00
}
else
{
ro . ServiceRecords = records ;
}
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
var fkRecords = new List < ServiceRecordDC > ( ) ;
var flsRecords = new List < ServiceRecordDC > ( ) ;
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
foreach ( var sr in ro . ServiceRecords )
{
2023-07-06 13:16:52 +02:00
sr . Employee = new CompactEmployeeDC { ValueListEntries = new Dictionary < long , ValueListEntryType > ( ) } ; // hack, damit später bei der Berechnung des Betrags in der InvoiceCreation kein Fehler kommt
2023-07-04 01:36:06 +02:00
sr . CostBearer = cb2sc . CostBearer ;
2023-07-06 13:16:52 +02:00
sr . SupportConcept = ro . Costbearer2Supportconcept . SupportConcept ;
sr . Customer = sr . SupportConcept . Customer ;
2017-03-07 08:46:32 +01:00
2023-07-04 01:36:06 +02:00
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 ) ;
}
}
2017-03-07 08:46:32 +01:00
2025-01-13 10:10:44 +01:00
if ( ro . Costbearer2Supportconcept . SupportConcept . Customer . LastName = = "Akbulut" )
{
int test = 0 ;
}
2023-07-04 01:36:06 +02:00
//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
{
2026-04-22 14:21:45 +02:00
ro . ApprovedHours = calc . GetApprovedHoursTillNow ( ro . Costbearer2Supportconcept , effectiveEnd . Value ) ? ? 0 ;
2023-07-04 01:36:06 +02:00
}
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 ;
2017-03-07 08:46:32 +01:00
2023-07-04 01:36:06 +02:00
}
else
{
if ( ro . SupportConceptApprovalPeriod ! = null )
{
ro . ApprovedHours = calc . GetApprovedHoursTillNow ( ro . SupportConceptApprovalPeriod , costRateDcs , null , true ) ? ? 0 ;
}
else
{
ro . ApprovedHours = calc . GetApprovedHoursTillNow ( ro . Costbearer2Supportconcept , null ) ? ? 0 ;
}
2017-03-07 08:46:32 +01:00
2023-07-04 01:36:06 +02:00
ro . StundenNichtFehlkontakte = calc . GetBillableDurationInMinutes ( flsRecords ) / 60 ;
ro . StundenFehlkontakte = calc . GetBillableDurationInMinutes ( fkRecords ) / 60 ;
}
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
ro . BillableHours = ro . StundenNichtFehlkontakte + ro . StundenFehlkontakte ;
2017-03-07 08:46:32 +01:00
2023-07-04 01:36:06 +02:00
if ( start . HasValue & & end . HasValue )
{
var rfcrEnd = costRateDcs . GetCostRatePeriodForDate ( CostRatePeriodType . RateFactor , end . Value ) ;
if ( rfcrEnd ! = null & & rfcrEnd . CostRateValue . HasValue )
{
ro . RateFactor = ( rfcrEnd . CostRateValue . Value + 100 m ) / 100 m ;
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
if ( ! result . RateFactor . HasValue )
{
result . RateFactor = ro . RateFactor ;
}
}
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
var hcrEnd = costRateDcs . GetCostRatePeriodForDate ( CostRatePeriodType . HourlyRate , end . Value ) ;
if ( hcrEnd ! = null & & hcrEnd . CostRateValue . HasValue )
{
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
ro . HourlyRate = hcrEnd . CostRateValue . Value ;
}
if ( ro . SupportConceptApprovalPeriod ! = null )
{
2026-04-28 16:41:54 +02:00
var periodStart = start ;
if ( ro . SupportConceptApprovalPeriod . StartDate . HasValue & & ( ! periodStart . HasValue | | ro . SupportConceptApprovalPeriod . StartDate . Value > periodStart . Value ) )
periodStart = ro . SupportConceptApprovalPeriod . StartDate ;
var periodEnd = effectiveEnd ;
if ( ro . SupportConceptApprovalPeriod . EndDate . HasValue & & ( ! periodEnd . HasValue | | ro . SupportConceptApprovalPeriod . EndDate . Value < periodEnd . Value ) )
periodEnd = ro . SupportConceptApprovalPeriod . EndDate ;
ro . ApprovedHoursInReportTimeSpan = calc . GetApprovedHoursForPeriod ( ro . SupportConceptApprovalPeriod , costRateDcs , periodStart , periodEnd ) ? ? 0 ;
2023-07-04 01:36:06 +02:00
}
else
{
2026-04-22 14:21:45 +02:00
ro . ApprovedHoursInReportTimeSpan = calc . GetApprovedHoursForPeriod ( ro . Costbearer2Supportconcept , start . Value , effectiveEnd . Value ) ;
2023-07-04 01:36:06 +02:00
}
2021-02-02 23:23:05 +01:00
2024-04-15 16:01:01 +02:00
if ( splitByServiceCategory & & ro . SupportConceptApprovalPeriod ! = null )
{
2026-04-22 14:21:45 +02:00
ro . ApprovedAmountInReportTimeSpan = ( decimal ) calc . GetApprovedAmountForPeriod ( ro . Costbearer2Supportconcept , start . Value , effectiveEnd . Value , ro . SupportConceptApprovalPeriod . ServiceCategory ) ;
2024-04-15 16:01:01 +02:00
}
else
{
2026-04-22 14:21:45 +02:00
ro . ApprovedAmountInReportTimeSpan = ( decimal ) calc . GetApprovedAmountForPeriod ( ro . Costbearer2Supportconcept , start . Value , effectiveEnd . Value , null ) ;
2024-04-15 16:01:01 +02:00
}
2023-07-04 01:36:06 +02:00
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 )
{
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
var billable = calc . GetBillableDurationInMinutes ( srDc , false ) / 60 ;
ro . StundenNichtFehlkontakteInReportTimeSpan + = billable ;
2017-03-07 08:46:32 +01:00
2023-07-04 01:36:06 +02:00
var rfcr = costRateDcs . GetCostRatePeriodForDate ( CostRatePeriodType . RateFactor , srDc . Start . Value ) ;
if ( rfcr ! = null & & rfcr . CostRateValue . HasValue )
{
var billableRateFactor = billable * ( rfcr . CostRateValue . Value + 100 m ) / 100 m ;
ro . BillableHoursInReportTimeSpanWithFactor + = billableRateFactor ;
2017-03-07 08:46:32 +01:00
2023-07-04 01:36:06 +02:00
billable = billableRateFactor ;
}
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
decimal stundensatz = 0 ;
var hcr = costRateDcs . GetCostRatePeriodForDate ( CostRatePeriodType . HourlyRate , srDc . Start . Value ) ;
if ( hcr ! = null & & hcr . CostRateValue . HasValue )
{
stundensatz = hcr . CostRateValue . Value ;
2017-03-07 08:46:32 +01:00
}
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
var betrag = billable * stundensatz ;
ro . AmountNichtFehlkontakteInReportTimeSpan + = betrag ;
2017-03-07 08:46:32 +01:00
}
2021-02-02 23:23:05 +01:00
}
2023-07-04 01:36:06 +02:00
//Fehlkontakte
foreach ( var srDc in fkRecords )
{
if ( srDc . Start > = start & & srDc . Start . Value . Date < = end . Value . Date )
2021-02-02 23:23:05 +01:00
{
2023-07-04 01:36:06 +02:00
var billable = calc . GetBillableDurationInMinutes ( srDc , false ) / 60 ;
ro . StundenFehlkontakteInReportTimeSpan + = billable ;
decimal stundensatz = 0 ;
2016-06-27 01:45:38 +02:00
2023-07-04 01:36:06 +02:00
var hcr = costRateDcs . GetCostRatePeriodForDate ( CostRatePeriodType . HourlyRate , srDc . Start . Value ) ;
if ( hcr ! = null & & hcr . CostRateValue . HasValue )
2021-02-02 23:23:05 +01:00
{
2023-07-04 01:36:06 +02:00
stundensatz = hcr . CostRateValue . Value ;
2021-02-02 23:23:05 +01:00
}
2023-07-04 01:36:06 +02:00
if ( srDc . ServiceDescription . ProzentAbrechnung . HasValue & & srDc . ServiceDescription . ProzentAbrechnung . Value < 100 )
2021-02-02 23:23:05 +01:00
{
2023-07-04 01:36:06 +02:00
stundensatz * = ( srDc . ServiceDescription . ProzentAbrechnung . Value / 100 ) ;
2021-02-02 23:23:05 +01:00
}
2023-07-04 01:36:06 +02:00
var betrag = billable * stundensatz ;
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
ro . AmountFehlkontakteInReportTimeSpan + = betrag ;
}
}
ro . BillableHoursInReportTimeSpan = ro . StundenNichtFehlkontakteInReportTimeSpan + ro . StundenFehlkontakteInReportTimeSpan ;
ro . AmountInReportTimeSpan = ( ro . AmountNichtFehlkontakteInReportTimeSpan ? ? 0 ) + ( ro . AmountFehlkontakteInReportTimeSpan ? ? 0 ) ;
}
}
return result ;
}
2021-02-02 23:23:05 +01:00
2023-07-06 13:16:52 +02:00
private static ServiceRecordDC CreateServiceRecordDC ( object [ ] sqlRow , Dictionary < long , ServiceDescriptionDC > serviceDict )
2023-07-04 01:36:06 +02:00
{
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 ] ;
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
var test = sqlRow [ 4 ] ;
if ( test ! = null )
{
decimal meter = 0 ;
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
if ( Decimal . TryParse ( test . ToString ( ) , out meter ) )
{
dc . DistanceInMeterDecimal = meter ;
}
}
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
if ( dc . DistanceInMeterDecimal . HasValue )
{
dc . DistanceInMeter = ( int ) dc . DistanceInMeterDecimal ;
}
dc . CostBearer2SupportConceptOid = ( long? ) sqlRow [ 5 ] ;
dc . Betrag = ( decimal? ) sqlRow [ 6 ] ;
2017-03-07 08:46:32 +01:00
2023-07-04 01:36:06 +02:00
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 ] ;
2021-02-02 23:23:05 +01:00
2023-07-04 01:36:06 +02:00
return dc ;
2016-06-27 01:45:38 +02:00
}
2023-07-04 01:36:06 +02:00
catch ( Exception e )
{
throw ;
}
}
2023-10-18 10:54:53 +02:00
public static SupportConceptFinanceRO CreateSupportConceptFinanceRO ( FinanceOverviewItemDC item , SupportConceptCostBearerRelDC relDc , SupportConceptApprovalPeriodDC scapDc , bool SplitServiceCategory = false )
2023-07-04 01:36:06 +02:00
{
var ro = new SupportConceptFinanceRO ( ) ;
ro . CustomerName = item . CustomerName ;
ro . SupportConceptTimeSpanString = item . SupportConceptTimeSpanString ;
ro . CostBearerName = item . CostBearerName ;
2023-10-18 10:54:53 +02:00
if ( SplitServiceCategory )
{
ro . AmountPaid = 0 ;
ro . OpenAmount = ro . AmountTotal ;
}
else
{
ro . AmountTotal = item . AmountTotal ;
ro . AmountPaid = item . AmountPaid ;
ro . OpenAmount = item . OpenAmount ;
}
2023-07-04 01:36:06 +02:00
ro . Costbearer2Supportconcept = relDc ;
ro . SupportConceptApprovalPeriod = scapDc ;
ro . IsApproved = ( relDc . ApprovedEndDate . HasValue | | relDc . ApprovedStartDate . HasValue ) ;
return ro ;
}
2023-10-18 10:54:53 +02:00
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
2024-04-15 16:01:01 +02:00
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;
2023-10-18 10:54:53 +02:00
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 ) ;
}
}
2022-08-10 12:13:18 +02:00
public void CalculateBillableAmountInReportTimeSpan ( )
2018-03-02 16:24:55 +01:00
{
2024-04-11 09:19:36 +02:00
CalculateBillableAmountInReportTimeSpan ( "Finanzauswertung" ) ;
}
public void CalculateBillableAmountInReportTimeSpan ( String invoiceCreatorId )
{
if ( this . SupportConceptFinanceList ! = null )
{
foreach ( var scRo in SupportConceptFinanceList )
{
if ( scRo . Costbearer2Supportconcept ! = null )
{
CalculateBillableAmountInReportTimeSpan ( scRo , invoiceCreatorId ) ;
}
}
}
}
2018-03-02 16:24:55 +01:00
2024-04-11 09:19:36 +02:00
public void CalculateBillableAmountInTimeSpan ( )
2019-02-12 19:13:34 +01:00
{
2024-04-11 09:19:36 +02:00
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 ) ;
}
}
}
}
2019-02-12 19:13:34 +01:00
2024-04-11 09:19:36 +02:00
private void CalculateBillableAmountInReportTimeSpan ( SupportConceptFinanceRO scRo , String invoiceCreatorId )
2018-03-02 16:24:55 +01:00
{
2024-04-11 09:19:36 +02:00
CalculateBillableAmountInTimeSpan ( scRo , ReportStartDate , ReportEndDate , false , invoiceCreatorId ) ;
2019-02-12 19:13:34 +01:00
}
2018-03-02 16:24:55 +01:00
2024-04-11 09:19:36 +02:00
private void CalculateBillableAmountInTimeSpan ( SupportConceptFinanceRO scRo , DateTime ? start , DateTime ? end , bool totalOrReportTimeSpan , String invoiceCreatorId )
2019-02-12 19:13:34 +01:00
{
String tenant = null ;
2018-03-02 16:24:55 +01:00
2024-12-17 11:08:02 +01:00
if ( MultitenancyOperationContextExt . Current ! = null )
2019-02-12 19:13:34 +01:00
tenant = MultitenancyOperationContextExt . Current . Tenant ;
else
tenant = SessionFacade . Tenant ;
2018-03-02 16:24:55 +01:00
2019-02-12 19:13:34 +01:00
var factory = PluginLoader . FindClass < InvoiceFactory > ( tenant ) ;
if ( factory = = null )
{
factory = InvoiceFactory . GetInstance ( tenant ) ;
}
Dictionary < CompactSupportConceptDC , List < ServiceRecordDC > > dict = new Dictionary < CompactSupportConceptDC , List < ServiceRecordDC > > ( ) ;
2018-03-02 16:24:55 +01:00
2019-02-12 19:13:34 +01:00
CompactSupportConceptDC sc = CreateCompactSupportConcept ( scRo . Costbearer2Supportconcept ) ;
if ( scRo . ServiceRecords ! = null )
{
foreach ( var sr in scRo . ServiceRecords )
{
sr . AlreadyAccounted = false ;
}
}
2023-07-12 14:01:58 +02:00
else
{
scRo . ServiceRecords = new List < ServiceRecordDC > ( ) ;
}
2018-03-02 16:24:55 +01:00
2019-02-12 19:13:34 +01:00
dict . Add ( sc , scRo . ServiceRecords ) ;
2018-03-02 16:24:55 +01:00
2024-12-17 11:08:02 +01:00
var creator = factory . CreateInvoiceCreator ( invoiceCreatorId , tenant , dict ) ;
2018-03-02 16:24:55 +01:00
2019-02-12 19:13:34 +01:00
//String text = String.Format("Tenant={0}, Context=Null? {1}, Factory = {2}", tenant,
// MultitenancyOperationContextExt.Current == null, factory);
2018-03-02 16:24:55 +01:00
2019-02-12 19:13:34 +01:00
DateTimeSpan span = null ;
if ( start . HasValue & & end . HasValue )
{
span = new DateTimeSpan ( ) ;
span . StartDate = start . Value ;
span . EndDate = end . Value ;
}
2018-03-02 16:24:55 +01:00
2020-08-17 15:50:00 +02:00
if ( scRo . CustomerName . Contains ( "Löb" ) )
{
int test = 0 ;
}
2019-02-12 19:13:34 +01:00
var invoices = creator . GenerateServiceInvoices ( scRo . Costbearer2Supportconcept . CostBearer . CostBearerOid . Value , span , dict ) ;
if ( invoices ! = null & & invoices . Count = = 1 )
{
2019-10-10 22:07:42 +02:00
//var i = invoices[0];
2019-02-12 19:13:34 +01:00
if ( totalOrReportTimeSpan )
{
scRo . BillableAmountUntilNow = invoices [ 0 ] . ClaimSum ? ? 0 ;
}
else
{
scRo . BillableAmountInReportTimeSpan = invoices [ 0 ] . ClaimSum ? ? 0 ;
}
}
}
2018-03-02 16:24:55 +01:00
2019-02-12 19:13:34 +01:00
private CompactSupportConceptDC CreateCompactSupportConcept ( SupportConceptCostBearerRelDC c2s )
2018-03-02 16:24:55 +01:00
{
var dc = new CompactSupportConceptDC ( ) ;
dc . SupportConceptOid = c2s . SupportConcept . SupportConceptOid ;
dc . CostBearerRelOids = new List < long > ( ) ;
dc . CostBearerRelOids . Add ( c2s . CostBearer2SupportConceptOid . Value ) ;
2021-01-12 01:12:03 +01:00
//dc.IsApproved = c2s.ApprovedStartDate.HasValue && c2s.ApprovedEndDate.HasValue;
dc . IsApproved = true ;
2018-03-02 16:24:55 +01:00
return dc ;
}
2019-07-25 15:59:20 +02:00
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 ) ;
}
}
2023-10-18 10:54:53 +02:00
}
2019-07-25 15:59:20 +02:00
}
2026-01-26 12:41:05 +01:00
// Mittlerweile kann man Rechnungen in der Rechnungsübersicht als "bezahlt" markieren. Zuvor wurden alle geschriebene Rechnungen in AmountPaidInReportTimeSpan
// reingerechnet. Als Option kann man mit nurAlsBezahltMarkierte ausschließlich als "bezahlt" markierte mit einrechnen lassen
public void CalculatePaidAmountInReportTimeSpan ( bool nurAlsBezahltMarkierte )
{
if ( this . SupportConceptFinanceList ! = null )
{
foreach ( var scRo in SupportConceptFinanceList )
{
if ( scRo . Costbearer2Supportconcept ! = null )
{
CalculatePaidAmountInReportTimeSpan ( scRo , this . ReportStartDate ? ? DateTime . MinValue , this . ReportEndDate ? ? DateTime . MaxValue , nurAlsBezahltMarkierte ) ;
}
}
}
}
2019-07-25 15:59:20 +02:00
private void CalculatePaidAmountInReportTimeSpan ( SupportConceptFinanceRO scRo , DateTime start , DateTime end )
2026-01-26 12:41:05 +01:00
{
CalculatePaidAmountInReportTimeSpan ( scRo , start , end , false ) ;
}
// Mittlerweile kann man Rechnungen in der Rechnungsübersicht als "bezahlt" markieren. Zuvor wurden alle geschriebene Rechnungen in AmountPaidInReportTimeSpan
// reingerechnet. Als Option kann man mit nurAlsBezahltMarkierte ausschließlich als "bezahlt" markierte mit einrechnen lassen
private void CalculatePaidAmountInReportTimeSpan ( SupportConceptFinanceRO scRo , DateTime start , DateTime end , bool nurAlsBezahltMarkierte )
2019-07-25 15:59:20 +02:00
{
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 ;
2019-09-17 17:44:57 +02:00
//if (c2s.SupportConcept.Customer.Person.LastName.StartsWith("Art"))
//{
// int test = 0;
//}
2026-01-26 12:41:05 +01:00
2019-09-17 17:44:57 +02:00
var invoices = DAOFactory . SearchDAO . GetServiceInvoices ( c2s . Oid . Value , span ) ;
2019-07-25 15:59:20 +02:00
foreach ( var i in invoices )
{
2026-01-26 12:41:05 +01:00
if ( ! nurAlsBezahltMarkierte )
2019-07-25 15:59:20 +02:00
{
2026-01-26 12:41:05 +01:00
foreach ( var sip in i . ServiceInvoicePeriodList )
{
rechnungsBetrag + = sip . Claim ? ? 0 ;
}
}
else
{
if ( i . InvoiceBase . IsPaid )
{
foreach ( var sip in i . ServiceInvoicePeriodList )
{
rechnungsBetrag + = sip . Claim ? ? 0 ;
}
}
2019-07-25 15:59:20 +02:00
}
}
2026-01-26 12:41:05 +01:00
2019-07-25 15:59:20 +02:00
scRo . AmountPaidInReportTimeSpan = abschlZahlungen + rechnungsBetrag ;
}
}
2016-06-27 01:45:38 +02:00
}
2017-06-08 14:23:43 +02:00