protected override ICollection <FADepreciationScheduleItem> Calculate() { SortedDictionary <string, FADepreciationScheduleItem> depreciationSchedule = new SortedDictionary <string, FADepreciationScheduleItem>(); foreach (FAAddition addition in CalculationParameters.Additions) { SLMethodAdditionParameters additionParameters = CalculateAdditionParameters(CalculationParameters, addition); List <FABookPeriod> periods = SelectFrom <FABookPeriod> .Where <FABookPeriod.finPeriodID.IsGreaterEqual <@P.AsString> .And <FABookPeriod.finPeriodID.IsLessEqual <@P.AsString> > .And <FABookPeriod.organizationID.IsEqual <@P.AsInt> > .And <FABookPeriod.bookID.IsEqual <@P.AsInt> > .And <FABookPeriod.startDate.IsNotEqual <FABookPeriod.endDate> > > .OrderBy <FABookPeriod.finPeriodID.Asc> .View .Select( IncomingParameters.Graph, additionParameters.DepreciateFromPeriodID, additionParameters.DepreciateToPeriodID, IncomingParameters.RepositoryHelper.GetFABookPeriodOrganizationID(CalculationParameters.BookID, CalculationParameters.AssetID), CalculationParameters.BookID ) .RowCast <FABookPeriod>() .Where(period => !additionParameters.SuspendedPeriodIDs.Contains(period.FinPeriodID)) .ToList(); decimal periodDepreciationAmount = additionParameters.DepreciationBasis / periods.Count; foreach (FABookPeriod period in periods) { if (string.CompareOrdinal(period.FinPeriodID, CalculationParameters.MaxDepreciateToPeriodID) > 0) { break; } if (depreciationSchedule.TryGetValue(period.FinPeriodID, out FADepreciationScheduleItem scheduleItem)) { scheduleItem.DepreciationAmount += periodDepreciationAmount; } else { depreciationSchedule[period.FinPeriodID] = new FADepreciationScheduleItem { FinPeriodID = period.FinPeriodID, DepreciationAmount = periodDepreciationAmount }; } } } return(depreciationSchedule.Values); }
private SLMethodAdditionParameters CalculateAdditionParameters( CalculationParameters calculationData, FAAddition addition) { FABookBalance bookBalance = calculationData.BookBalance; #region Parameters Contracts if (bookBalance == null) { throw new ArgumentNullException(nameof(calculationData.BookBalance)); } if (bookBalance.DeprFromDate == null) { throw new ArgumentNullException(nameof(bookBalance.DeprFromDate)); } if (bookBalance.UsefulLife == null) { throw new ArgumentNullException(nameof(bookBalance.UsefulLife)); } #endregion int assetID = calculationData.AssetID; int bookID = calculationData.BookID; SLMethodAdditionParameters parameters = new SLMethodAdditionParameters { DepreciationBasis = addition.DepreciationBasis, PlacedInServiceDate = (DateTime)bookBalance.DeprFromDate }; addition.CalculatedAdditionParameters = parameters; FABookPeriod additionPeriod = IncomingParameters.RepositoryHelper.FindFABookPeriodOfDate( addition.IsOriginal ? parameters.PlacedInServiceDate : addition.Date, bookID, assetID); parameters.DepreciateFromDate = (DateTime)additionPeriod?.StartDate.Value; parameters.DepreciateFromPeriodID = additionPeriod.FinPeriodID; DateTime depreciateToDate = AddUsefulLifeToDate(parameters.DepreciateFromDate, bookBalance.UsefulLife.Value); parameters.DepreciateToPeriodID = IncomingParameters.RepositoryHelper.GetFABookPeriodIDOfDate(depreciateToDate, bookID, assetID); // Consider the suspended periods parameters.SuspendedPeriodIDs = SelectFrom <FABookHistory> .Where <FABookHistory.assetID.IsEqual <@P.AsInt> .And <FABookHistory.bookID.IsEqual <@P.AsInt> > .And <FABookHistory.finPeriodID.IsGreaterEqual <@P.AsString> > .And <FABookHistory.finPeriodID.IsLessEqual <@P.AsString> > .And <FABookHistory.suspended.IsEqual <True> > > .OrderBy <FABookHistory.finPeriodID.Desc> .View .Select( IncomingParameters.Graph, calculationData.AssetID, calculationData.BookID, parameters.DepreciateFromPeriodID, parameters.DepreciateToPeriodID) .RowCast <FABookHistory>() .Select(history => history.FinPeriodID) .ToHashSet(); parameters.DepreciateToPeriodID = IncomingParameters.UtilsHelper.PeriodPlusPeriodsCount( parameters.DepreciateToPeriodID, parameters.SuspendedPeriodIDs.Count, bookID, assetID); return(parameters); }