private void OnCommencing(object sender, EventArgs e) { int lossModifier = 1; if (ReportLossesAsNegative) { lossModifier = -1; } // check if running from a CLEM.Market bool market = (FindAncestor <Zone>().GetType() == typeof(Market)); List <string> variableNames = new List <string> { "[Clock].Today as Date" }; if (IncludeFinancialYear) { Finance financeStore = resources.FindResourceGroup <Finance>(); if (financeStore != null) { variableNames.Add($"[Resources].{financeStore.Name}.FinancialYear as FY"); } } List <string> eventNames = new List <string>(); if (ResourceGroupsToReport != null && ResourceGroupsToReport.Trim() != "") { // check it is a ResourceGroup CLEMModel model = resources.FindResource <ResourceBaseWithTransactions>(ResourceGroupsToReport); if (model == null) { summary.WriteMessage(this, String.Format("Invalid resource group [{0}] in ReportResourceBalances [{1}]\r\nEntry has been ignored", this.ResourceGroupsToReport, this.Name), MessageType.Warning); } else { bool pricingIncluded = false; if (model.GetType() == typeof(RuminantHerd)) { pricingIncluded = model.FindAllDescendants <AnimalPricing>().Where(a => a.Enabled).Count() > 0; variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastIndividualChanged.ID as uID"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastIndividualChanged.Breed as Breed"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastIndividualChanged.Sex as Sex"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastIndividualChanged.Age as Age"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastIndividualChanged.Weight as Weight"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastIndividualChanged.AdultEquivalent as AE"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastIndividualChanged.SaleFlag as Category"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastIndividualChanged.Class as Class"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastIndividualChanged.HerdName as RelatesTo"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastIndividualChanged.PopulationChangeDirection as Change"); // ToDo: add pricing for ruminants including buy and sell pricing // Needs update in CLEMResourceTypeBase and link between ResourcePricing and AnimalPricing. } else { pricingIncluded = model.FindAllDescendants <ResourcePricing>().Where(a => a.Enabled).Count() > 0; if (ReportStyle == ReportTransactionStyle.GainAndLossColumns) { variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastTransaction.Gain as Gain"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + $".LastTransaction.Loss * {lossModifier} as Loss"); } else { variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastTransaction.TransactionType as Type"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + $".LastTransaction.AmountModifiedForLoss({ReportLossesAsNegative}) as Amount"); } // get all converters for this type of resource if (IncludeConversions) { var converterList = model.FindAllDescendants <ResourceUnitsConverter>().Select(a => a.Name).Distinct(); if (converterList != null) { foreach (var item in converterList) { if (ReportStyle == ReportTransactionStyle.GainAndLossColumns) { variableNames.Add($"[Resources].{this.ResourceGroupsToReport}.LastTransaction.ConvertTo(\"{item}\",\"gain\",{ReportLossesAsNegative}) as {item}_Gain"); variableNames.Add($"[Resources].{this.ResourceGroupsToReport}.LastTransaction.ConvertTo(\"{item}\",\"loss\",{ReportLossesAsNegative}) as {item}_Loss"); } else { variableNames.Add($"[Resources].{this.ResourceGroupsToReport}.LastTransaction.ConvertTo(\"{item}\", {ReportLossesAsNegative}) as {item}_Amount"); } } } } // add pricing if (IncludePrice && pricingIncluded) { if (ReportStyle == ReportTransactionStyle.GainAndLossColumns) { variableNames.Add("[Resources]." + this.ResourceGroupsToReport + $".LastTransaction.ConvertTo(\"$gain\",\"gain\", {ReportLossesAsNegative}) as Price_Gain"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + $".LastTransaction.ConvertTo(\"$loss\",\"loss\", {ReportLossesAsNegative}) as Price_Loss"); } else { variableNames.Add("[Resources]." + this.ResourceGroupsToReport + $".LastTransaction.ConvertTo(\"$gain\", {ReportLossesAsNegative}) as Price_Amount"); } } variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastTransaction.ResourceType.Name as Resource"); // if this is a multi CLEM model simulation then add a new column with the parent Zone name if (FindAncestor <Simulation>().FindChild <Market>() != null) { variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastTransaction.Activity.CLEMParentName as Source"); } variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastTransaction.Activity.Name as Activity"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastTransaction.RelatesToResource as RelatesTo"); variableNames.Add("[Resources]." + this.ResourceGroupsToReport + ".LastTransaction.Category as Category"); } } eventNames.Add("[Resources]." + this.ResourceGroupsToReport + ".TransactionOccurred"); } VariableNames = variableNames.ToArray(); EventNames = eventNames.ToArray(); SubscribeToEvents(); }
[EventSubscribe("FinalInitialise")] // "Commencing" private void OnCommencing(object sender, EventArgs e) { if (ResourceGroupsToReport is null || !ResourceGroupsToReport.Any()) { return; } timers = FindAllChildren <IActivityTimer>(); List <string> variableNames = new List <string>(); if (ResourceGroupsToReport.Where(a => a.Contains("[Clock].Today")).Any() is false) { variableNames.Add("[Clock].Today as Date"); } if (ResourceGroupsToReport != null) { for (int i = 0; i < this.ResourceGroupsToReport.Length; i++) { // each variable name is now a ResourceGroup bool isDuplicate = StringUtilities.IndexOfCaseInsensitive(variableNames, this.ResourceGroupsToReport[i].Trim()) != -1; if (!isDuplicate && this.ResourceGroupsToReport[i] != string.Empty) { if (this.ResourceGroupsToReport[i].StartsWith("[")) { variableNames.Add(this.ResourceGroupsToReport[i]); } else { // check it is a ResourceGroup CLEMModel model = resources.FindResource <ResourceBaseWithTransactions>(this.ResourceGroupsToReport[i]); if (model == null) { summary.WriteMessage(this, $"Invalid resource group [r={this.ResourceGroupsToReport[i]}] in ReportResourceBalances [{this.Name}]{Environment.NewLine}Entry has been ignored", MessageType.Warning); } else { if (model is Labour) { string amountStr = "Amount"; if (ReportLabourIndividuals) { amountStr = "Individuals"; } for (int j = 0; j < (model as Labour).Items.Count; j++) { if (ReportAmount) { variableNames.Add("[Resources]." + this.ResourceGroupsToReport[i] + ".Items[" + (j + 1).ToString() + $"].{amountStr} as " + (model as Labour).Items[j].Name); } //TODO: what economic metric is needed for labour //TODO: add ability to report labour value if required } } else { foreach (CLEMModel item in model.FindAllChildren <CLEMModel>()) { string amountStr = "Amount"; switch (item) { case FinanceType ftype: amountStr = "Balance"; break; case LandType ltype: if (ReportLandEntire) { amountStr = "LandArea"; } break; default: break; } if (item is RuminantType) { // add each variable needed foreach (var category in (model as RuminantHerd).GetReportingGroups(item as RuminantType)) { if (ReportAmount) { variableNames.Add($"[Resources].{this.ResourceGroupsToReport[i]}.GetRuminantReportGroup(\"{(item as IModel).Name}\",\"{category}\").Count as {item.Name.Replace(" ", "_")}{(((model as RuminantHerd).TransactionStyle != RuminantTransactionsGroupingStyle.Combined) ? $".{category.Replace(" ", "_")}" : "")}.Count"); } if (ReportAnimalEquivalents) { variableNames.Add($"[Resources].{this.ResourceGroupsToReport[i]}.GetRuminantReportGroup(\"{(item as IModel).Name}\",\"{category}\").TotalAdultEquivalent as {item.Name.Replace(" ", "_")}{(((model as RuminantHerd).TransactionStyle != RuminantTransactionsGroupingStyle.Combined) ? $".{category.Replace(" ", "_")}" : "")}.TotalAdultEquivalent"); } if (ReportAnimalWeight) { variableNames.Add($"[Resources].{this.ResourceGroupsToReport[i]}.GetRuminantReportGroup(\"{(item as IModel).Name}\",\"{category}\").TotalWeight as {item.Name.Replace(" ", "_")}{(((model as RuminantHerd).TransactionStyle != RuminantTransactionsGroupingStyle.Combined) ? $".{category.Replace(" ", "_")}" : "")}.TotalWeight"); } if (ReportValue) { variableNames.Add($"[Resources].{this.ResourceGroupsToReport[i]}.GetRuminantReportGroup(\"{(item as IModel).Name}\",\"{category}\").TotalPrice as {item.Name.Replace(" ", "_")}{(((model as RuminantHerd).TransactionStyle != RuminantTransactionsGroupingStyle.Combined) ? $".{category.Replace(" ", "_")}" : "")}.TotalPrice"); } } } else { if (ReportAmount) { variableNames.Add($"[Resources].{this.ResourceGroupsToReport[i]}.{ item.Name}.{ amountStr } as { item.Name.Replace(" ", "_") }_Amount"); } if (ReportValue & item.GetType() != typeof(FinanceType)) { variableNames.Add($"[Resources].{this.ResourceGroupsToReport[i]}.{item.Name}.Value as { item.Name.Replace(" ", "_") }_DollarValue"); } } } } } } } } } VariableNames = variableNames.ToArray(); // Subscribe to events. if (EventNames == null || !EventNames.Where(a => a.Trim() != "").Any()) { EventNames = new string[] { "[Clock].CLEMFinalizeTimeStep" } } ; SubscribeToEvents(); }