/// <summary> /// Provides the description of the model settings for summary (GetFullSummary) /// </summary> /// <param name="formatForParentControl">Use full verbose description</param> /// <returns></returns> public override string ModelSummary(bool formatForParentControl) { using (StringWriter htmlWriter = new StringWriter()) { ZoneCLEM clemParent = FindAncestor <ZoneCLEM>(); ResourcesHolder resHolder; Finance finance = null; if (clemParent != null) { resHolder = clemParent.FindAllChildren <ResourcesHolder>().FirstOrDefault() as ResourcesHolder; finance = resHolder.FinanceResource(); } if (finance == null) { htmlWriter.Write("\r\n<div class=\"activityentry\">This activity is not required as no <span class=\"resourcelink\">Finance</span> resource is available.</div>"); } else { htmlWriter.Write("\r\n<div class=\"activityentry\">Interest rates are set in the <span class=\"resourcelink\">FinanceType</span> component</div>"); foreach (FinanceType accnt in finance.FindAllChildren <FinanceType>()) { if (accnt.InterestRateCharged == 0 & accnt.InterestRatePaid == 0) { htmlWriter.Write("\r\n<div class=\"activityentry\">This activity is not needed for <span class=\"resourcelink\">" + accnt.Name + "</span> as no interest rates are set.</div>"); } else { if (accnt.InterestRateCharged > 0) { htmlWriter.Write("\r\n<div class=\"activityentry\">This activity will calculate interest charged for <span class=\"resourcelink\">" + accnt.Name + "</span> at a rate of <span class=\"setvalue\">" + accnt.InterestRateCharged.ToString("#.00") + "</span>%</div>"); } else { htmlWriter.Write("\r\n<div class=\"activityentry\">This activity will calculate interest paid for <span class=\"resourcelink\">" + accnt.Name + "</span> at a rate of <span class=\"setvalue\">" + accnt.InterestRatePaid.ToString("#.00") + "</span>%</div>"); } } } } return(htmlWriter.ToString()); } }
/// <inheritdoc/> public override void DoActivity() { Status = ActivityStatus.NotNeeded; if (finance != null) { // make interest payments on bank accounts foreach (FinanceType accnt in finance.FindAllChildren <FinanceType>()) { if (accnt.Balance > 0) { if (accnt.InterestRatePaid > 0) { accnt.Add(accnt.Balance * accnt.InterestRatePaid / 1200, this, "", "Interest"); SetStatusSuccess(); } } else if (accnt.Balance < 0) { double interest = Math.Round(Math.Abs(accnt.Balance) * accnt.InterestRateCharged / 1200, 2, MidpointRounding.ToEven); if (Math.Abs(accnt.Balance) * accnt.InterestRateCharged / 1200 != 0) { ResourceRequest interestRequest = new ResourceRequest { ActivityModel = this, Required = interest, AllowTransmutation = false, Category = TransactionCategory }; accnt.Remove(interestRequest); // report status if (interestRequest.Required > interestRequest.Provided) { interestRequest.ResourceType = typeof(Finance); interestRequest.ResourceTypeName = accnt.NameWithParent; interestRequest.Available = accnt.FundsAvailable; ResourceRequestEventArgs rre = new ResourceRequestEventArgs() { Request = interestRequest }; OnShortfallOccurred(rre); switch (OnPartialResourcesAvailableAction) { case OnPartialResourcesAvailableActionTypes.ReportErrorAndStop: throw new ApsimXException(this, String.Format("Insufficient funds in [r={0}] to pay interest charged.\r\nConsider changing OnPartialResourcesAvailableAction to Skip or Use Partial.", accnt.Name)); case OnPartialResourcesAvailableActionTypes.SkipActivity: Status = ActivityStatus.Ignored; break; case OnPartialResourcesAvailableActionTypes.UseResourcesAvailable: Status = ActivityStatus.Partial; break; default: break; } } else { Status = ActivityStatus.Success; } } } } } }