public DepreciationPlanList CalculatePlan(int startMonth, int startYear, int endMonth, int endYear, Dictionary <int, string> monthNames)
        {
            DepreciationCalculations depreciationCalculations = new DepreciationCalculations();
            DepreciationPlanList     depreciationPlanList     = new DepreciationPlanList();

            depreciationPlanList.StartMonth = startMonth;
            depreciationPlanList.StartYear  = startYear;
            depreciationPlanList.EndMonth   = endMonth;
            depreciationPlanList.EndYear    = endYear;

            int no = 1;

            for (int y = startYear; y < endYear + 1; y++)
            {
                if (startYear == endYear)
                {
                    for (int m = startMonth; m <= endMonth; m++)
                    {
                        DepreciationPlan depreciationPlan = preparedepreciationPeriod(no, y, m, monthNames);
                        depreciationPlanList.DepreciationPlans.Add(depreciationPlan);
                        no++;
                    }
                }
                else
                {
                    if (startYear == y)
                    {
                        for (int m = startMonth; m <= 12; m++)
                        {
                            DepreciationPlan depreciationPlan = preparedepreciationPeriod(no, y, m, monthNames);
                            depreciationPlanList.DepreciationPlans.Add(depreciationPlan);
                            no++;
                        }
                    }
                    if (endYear == y)
                    {
                        for (int m = 1; m <= endMonth; m++)
                        {
                            DepreciationPlan depreciationPlan = preparedepreciationPeriod(no, y, m, monthNames);
                            depreciationPlanList.DepreciationPlans.Add(depreciationPlan);
                            no++;
                        }
                    }
                    if (startYear < y && y < endYear)
                    {
                        for (int m = 1; m <= 12; m++)
                        {
                            DepreciationPlan depreciationPlan = preparedepreciationPeriod(no, y, m, monthNames);
                            depreciationPlanList.DepreciationPlans.Add(depreciationPlan);
                            no++;
                        }
                    }
                }
            }
            return(depreciationPlanList);
        }
        public AssetDepreciationPlan CalculateAssetDepreciationPlan(AssetDataSet assetDataSet, Asset asset, bool plan)
        {
            Dictionary <int, int> years = new Dictionary <int, int>();
            int yearIndex = -1;
            AssetDepreciationPlan    assetDepreciationPlan = new AssetDepreciationPlan();
            DepreciationCalculations depCalc = new DepreciationCalculations();
            int fistDepMonth = depCalc.CalculateNextDepreciationMonth(asset.StartUsingDate);
            int fistDepYear  = depCalc.CalculateNextDepreciationYear(asset.StartUsingDate);
            int fistMonth    = asset.StartUsingDate.Month;
            int fistYear     = asset.StartUsingDate.Year;
            int no           = 0;

            assetDepreciationPlan.StartMonth           = assetDataSet.MonthNames[fistDepMonth] + " " + fistDepYear.ToString();
            assetDepreciationPlan.TotalRemainingAmount = asset.InitialValue;
            assetDepreciationPlan.AssetName            = asset.AssetName;
            assetDepreciationPlan.DepreciationRate     = assetDataSet.DepreciationTypes[asset.DepreciationTypeId].Name;
            assetDepreciationPlan.InitialValue         = asset.InitialValue;
            assetDepreciationPlan.YearCharge           = decimal.Round((asset.InitialValue * (assetDataSet.DepreciationTypes[asset.DepreciationTypeId].DepreciationRate / 100)) / 12, 2) * (decimal)12;
            assetDepreciationPlan.MonthlyCharge        = decimal.Round((asset.InitialValue * (assetDataSet.DepreciationTypes[asset.DepreciationTypeId].DepreciationRate / 100)) / 12, 2);

            foreach (DepreciationCharge depreciationCharge in assetDataSet.DepreciationCharges)
            {
                if (!years.ContainsKey(depreciationCharge.Year))
                {
                    yearIndex++;
                    years.Add(depreciationCharge.Year, depreciationCharge.Year);
                    AssetDepreciationYearPlan  assetDepreciationYearPlan  = new AssetDepreciationYearPlan();
                    AssetDepreciationMonthPlan assetDepreciationMonthPlan = new AssetDepreciationMonthPlan();

                    assetDepreciationMonthPlan.No                 = depreciationCharge.No;
                    assetDepreciationMonthPlan.MonthYear          = assetDataSet.MonthNames[depreciationCharge.Month] + " " + depreciationCharge.Year.ToString();
                    assetDepreciationMonthPlan.CurrentCharge      = depreciationCharge.CurrentCharge;
                    assetDepreciationMonthPlan.CumulativelyCharge = depreciationCharge.CumulativelyCharge;
                    assetDepreciationMonthPlan.RemainingAmount    = depreciationCharge.RemainingAmount;

                    assetDepreciationYearPlan.TotalYearCharge += depreciationCharge.CurrentCharge;
                    assetDepreciationYearPlan.Year             = depreciationCharge.Year;
                    assetDepreciationYearPlan.AssetDepreciationMonthPlans.Add(assetDepreciationMonthPlan);

                    assetDepreciationPlan.AssetDepreciationYearPlans.Add(assetDepreciationYearPlan);
                }
                else
                {
                    AssetDepreciationYearPlan  assetDepreciationYearPlan  = assetDepreciationPlan.AssetDepreciationYearPlans[yearIndex];
                    AssetDepreciationMonthPlan assetDepreciationMonthPlan = new AssetDepreciationMonthPlan();

                    assetDepreciationMonthPlan.No                 = depreciationCharge.No;
                    assetDepreciationMonthPlan.MonthYear          = assetDataSet.MonthNames[depreciationCharge.Month] + " " + depreciationCharge.Year.ToString();
                    assetDepreciationMonthPlan.CurrentCharge      = depreciationCharge.CurrentCharge;
                    assetDepreciationMonthPlan.CumulativelyCharge = depreciationCharge.CumulativelyCharge;
                    assetDepreciationMonthPlan.RemainingAmount    = depreciationCharge.RemainingAmount;

                    assetDepreciationYearPlan.TotalYearCharge += depreciationCharge.CurrentCharge;

                    assetDepreciationYearPlan.AssetDepreciationMonthPlans.Add(assetDepreciationMonthPlan);
                }

                assetDepreciationPlan.TotalCurrentCharge      += depreciationCharge.CurrentCharge;
                assetDepreciationPlan.TotalCumulativelyCharge += depreciationCharge.CurrentCharge;
                assetDepreciationPlan.TotalRemainingAmount    -= depreciationCharge.CurrentCharge;

                fistMonth = depreciationCharge.Month;
                fistYear  = depreciationCharge.Year;
                no        = depreciationCharge.No;
            }

            if (!plan || assetDepreciationPlan.TotalCumulativelyCharge == asset.InitialValue)
            {
                return(assetDepreciationPlan);
            }


            bool next = true;

            while (next)
            {
                fistMonth++;
                no++;
                if (fistMonth > 12)
                {
                    fistMonth = 1;
                    fistYear++;
                }
                decimal depreciation = assetDepreciationPlan.MonthlyCharge;
                if (assetDepreciationPlan.TotalCumulativelyCharge + depreciation >= asset.InitialValue)
                {
                    next         = false;
                    depreciation = asset.InitialValue - assetDepreciationPlan.TotalCumulativelyCharge;
                }

                assetDepreciationPlan.TotalCurrentCharge      += depreciation;
                assetDepreciationPlan.TotalCumulativelyCharge += depreciation;
                assetDepreciationPlan.TotalRemainingAmount    -= depreciation;

                if (!years.ContainsKey(fistYear))
                {
                    yearIndex++;
                    years.Add(fistYear, fistYear);
                    AssetDepreciationYearPlan  assetDepreciationYearPlan  = new AssetDepreciationYearPlan();
                    AssetDepreciationMonthPlan assetDepreciationMonthPlan = new AssetDepreciationMonthPlan();

                    assetDepreciationMonthPlan.No                 = no;
                    assetDepreciationMonthPlan.MonthYear          = assetDataSet.MonthNames[fistMonth] + " " + fistYear.ToString();
                    assetDepreciationMonthPlan.CurrentCharge      = depreciation;
                    assetDepreciationMonthPlan.CumulativelyCharge = assetDepreciationPlan.TotalCumulativelyCharge;
                    assetDepreciationMonthPlan.RemainingAmount    = assetDepreciationPlan.TotalRemainingAmount;

                    assetDepreciationYearPlan.TotalYearCharge += depreciation;
                    assetDepreciationYearPlan.Year             = fistYear;
                    assetDepreciationYearPlan.AssetDepreciationMonthPlans.Add(assetDepreciationMonthPlan);

                    assetDepreciationPlan.AssetDepreciationYearPlans.Add(assetDepreciationYearPlan);
                }
                else
                {
                    AssetDepreciationYearPlan  assetDepreciationYearPlan  = assetDepreciationPlan.AssetDepreciationYearPlans[yearIndex];
                    AssetDepreciationMonthPlan assetDepreciationMonthPlan = new AssetDepreciationMonthPlan();

                    assetDepreciationMonthPlan.No                 = no;
                    assetDepreciationMonthPlan.MonthYear          = assetDataSet.MonthNames[fistMonth] + " " + fistYear.ToString();
                    assetDepreciationMonthPlan.CurrentCharge      = depreciation;
                    assetDepreciationMonthPlan.CumulativelyCharge = assetDepreciationPlan.TotalCumulativelyCharge;
                    assetDepreciationMonthPlan.RemainingAmount    = assetDepreciationPlan.TotalRemainingAmount;

                    assetDepreciationYearPlan.TotalYearCharge += depreciation;

                    assetDepreciationYearPlan.AssetDepreciationMonthPlans.Add(assetDepreciationMonthPlan);
                }
            }

            return(assetDepreciationPlan);
        }