public override void Update([NotNull] params object[] input)
{
if (input == null)
{
throw new ArgumentNullException(nameof(input));
}
if (!ValidateUpdateInput(input))
{
Enabled = false;
return;
}
var statement = (StatementModel) input[0];
var budget = (IBudgetCurrencyContext) input[1];
var filter = (GlobalFilterCriteria) input[2];
var ledgerBook = (LedgerBook) input[3];
var ledgerCalculator = (LedgerCalculation) input[4];
if (budget == null || ledgerBook == null || statement == null || filter == null || filter.Cleared ||
filter.BeginDate == null || filter.EndDate == null)
{
Enabled = false;
return;
}
if (filter.BeginDate.Value.DurationInMonths(filter.EndDate.Value) != 1)
{
Enabled = false;
ToolTip = DesignedForOneMonthOnly;
return;
}
Enabled = true;
IDictionary<BudgetBucket, decimal> overspendingSummary = ledgerCalculator.CalculateCurrentMonthLedgerBalances(ledgerBook, filter, statement);
var warnings = overspendingSummary.Count(s => s.Value < -Tolerance);
// Check other budget buckets that are not represented in the ledger book.
warnings += SearchForOtherNonLedgerBookOverspentBuckets(statement, filter, budget, overspendingSummary);
if (warnings > 0)
{
LargeNumber = warnings.ToString(CultureInfo.CurrentCulture);
var builder = new StringBuilder();
OverSpentSummary = overspendingSummary.Where(kvp => kvp.Value < -Tolerance).OrderBy(kvp => kvp.Key);
foreach (KeyValuePair<BudgetBucket, decimal> ledger in OverSpentSummary)
{
builder.AppendFormat(CultureInfo.CurrentCulture, "{0} is overspent by {1:C}", ledger.Key,
ledger.Value);
builder.AppendLine();
}
ToolTip = builder.ToString();
ColourStyleName = WidgetWarningStyle;
}
else
{
LargeNumber = "0";
ToolTip = "No overspent ledgers for the month beginning " +
filter.BeginDate.Value.ToString("d", CultureInfo.CurrentCulture);
ColourStyleName = WidgetStandardStyle;
}
}