/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> public override List <ResourceRequest> DetermineResourcesNeeded() { ResourceRequestList = null; if (Clock.Today.Month == Month) { // if labour item(s) found labour will be requested for this activity. if (LabourRequired > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } // determine head to be mustered RuminantHerd ruminantHerd = Resources.RuminantHerd(); List <Ruminant> herd = ruminantHerd.Herd; int head = herd.Filter(this).Count(); ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = true, Required = Math.Ceiling(head / this.LabourHeadUnit) * this.LabourRequired, ResourceName = "Labour", ResourceTypeName = "", Requestor = this.Name, FilterSortDetails = LabourFilterList } ); } } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { ResourceRequestList = null; if (this.TimingOK) { // get all potential dry breeders List <RuminantFemale> herd = this.CurrentHerd(false).Where(a => a.Gender == Sex.Female).Cast <RuminantFemale>().Where(a => a.Age - a.AgeAtLastBirth >= MonthsSinceBirth & a.PreviousConceptionRate >= MinimumConceptionBeforeSell & a.AgeAtLastBirth > 0).ToList(); int head = herd.Count(); double AE = herd.Sum(a => a.AdultEquivalent); if (head == 0) { return(null); } // for each labour item specified foreach (var item in labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; break; case LabourUnitType.perHead: daysNeeded = Math.Ceiling(head / item.UnitSize) * item.LabourPerUnit; break; case LabourUnitType.perAE: daysNeeded = Math.Ceiling(AE / item.UnitSize) * item.LabourPerUnit; break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, FilterDetails = new List <object>() { item } } ); } } } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns></returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { // zero based month index for array int month = Clock.Today.Month - 1; if (DaysWorkAvailableEachMonth[month] > 0) { foreach (LabourFilterGroup filter in Apsim.Children(this, typeof(LabourFilterGroup))) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = DaysWorkAvailableEachMonth[month], ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, Reason = this.Name, FilterDetails = new List <object>() { filter } // filter.ToList<object>() // this.Children.Where(a => a.GetType() == typeof(LabourFilterGroup)).ToList<object>() } ); } } else { return(null); } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { ResourceRequestList = null; if (this.TimingOK) { List <Ruminant> herd = this.CurrentHerd(false); int head = herd.Count(); double AE = herd.Sum(a => a.AdultEquivalent); if (head == 0) { return(null); } // for each labour item specified foreach (var item in labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; break; case LabourUnitType.perHead: daysNeeded = Math.Ceiling(head / item.UnitSize) * item.LabourPerUnit; break; case LabourUnitType.perAE: daysNeeded = Math.Ceiling(AE / item.UnitSize) * item.LabourPerUnit; break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, FilterDetails = new List <object>() { item } } ); } } } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> private List <ResourceRequest> GetResourcesNeededForActivityLocal() { ResourceRequestList = null; double amountAvailable = 0; // determine wet weight to move if (manureStore != null) { ManureStoreUncollected msu = manureStore.UncollectedStores.Where(a => a.Name.ToLower() == GrazeFoodStoreTypeName.ToLower()).FirstOrDefault(); if (msu != null) { amountAvailable = msu.Pools.Sum(a => a.WetWeight(manureStore.MoistureDecayRate, manureStore.ProportionMoistureFresh)); } } // determine labour required if (amountAvailable > 0) { // for each labour item specified foreach (var item in labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.perKg: daysNeeded = item.LabourPerUnit * amountAvailable; break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, Reason = "Manure collection", FilterDetails = new List <object>() { item } } ); } } } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns></returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { ResourceRequestList = null; if (this.TimingOK) { double breeders = SelectedOtherAnimalsType.Cohorts.Where(a => a.Age >= this.BreedingAge).Sum(b => b.Number); if (breeders == 0) { return(null); } // for each labour item specified foreach (var item in labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; break; case LabourUnitType.perHead: daysNeeded = Math.Ceiling(breeders / item.UnitSize) * item.LabourPerUnit; break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, FilterDetails = new List <object>() { item } } ); } } } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { ResourceRequestList = null; if (this.TimingOK) { double units = UnitsAvailableForSale; if (units > 0) { // for each labour item specified foreach (var item in Labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; break; case LabourUnitType.perUnit: daysNeeded = units * item.LabourPerUnit; break; default: break; } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, Reason = "Sales", FilterDetails = new List <object>() { item } } ); } } } } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { ResourceRequestList = null; List <RuminantFemale> herd = this.CurrentHerd(true).Where(a => a.Gender == Sex.Female).Cast <RuminantFemale>().Where(a => a.IsLactating == true & a.SucklingOffspring.Count() == 0).ToList(); int head = herd.Count(); if (head > 0) { // for each labour item specified foreach (var item in labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; break; case LabourUnitType.perHead: daysNeeded = Math.Ceiling(head / item.UnitSize) * item.LabourPerUnit; break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, Reason = "Milking", FilterDetails = new List <object>() { item } } ); } } } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { ResourceRequestList = null; // for each labour item specified foreach (var item in labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, FilterDetails = new List <object>() { item } } ); } } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { ResourceRequestList = null; double kgPerHa = grazeType.Amount / paddockActivity.Area; RuminantHerd ruminantHerd = Resources.RuminantHerd(); List <Ruminant> herd = ruminantHerd.Herd.Where(a => a.Location == PaddockName).ToList(); if (herd.Count() > 0) { double amount = 0; // get list of all Ruminants in this paddock foreach (Ruminant ind in herd) { // Reduce potential intake based on pasture quality for the proportion consumed. // TODO: build in pasture quality intake correction // calculate intake from potential modified by pasture availability and hours grazed amount += ind.PotentialIntake * (1 - Math.Exp(-ind.BreedParams.IntakeCoefficientBiomass * kgPerHa)) * (HoursGrazed / 8); } if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = true, Required = amount, ResourceType = typeof(GrazeFoodStore), ResourceTypeName = this.grazeType.Name, ActivityModel = this } ); } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { ResourceRequestList = null; for (int i = 0; i < 2; i++) { string BuySellString = (i == 0) ? "Purchase" : "Sell"; List <Ruminant> herd = Resources.RuminantHerd().Herd.Where(a => a.SaleFlag.ToString().Contains(BuySellString) & a.Breed == this.PredictedHerdBreed).ToList(); int head = herd.Count(); double AE = herd.Sum(a => a.AdultEquivalent); if (head > 0) { // for each labour item specified foreach (var item in labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; break; case LabourUnitType.perHead: daysNeeded = Math.Ceiling(head / item.UnitSize) * item.LabourPerUnit; break; case LabourUnitType.perAE: daysNeeded = Math.Ceiling(AE / item.UnitSize) * item.LabourPerUnit; break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, Reason = BuySellString, FilterDetails = new List <object>() { item } } ); } } } } return(ResourceRequestList); }
/// <summary> /// Resources needed for Activity /// </summary> /// <returns></returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { List <ResourceRequest> resourcesNeeded = new List <ResourceRequest>(); double amountToProcess = resourceTypeProcessModel.Amount; if (Reserve > 0) { amountToProcess = Math.Min(amountToProcess, Reserve); } // get finances required. foreach (ResourceActivityFee item in Apsim.Children(this, typeof(ResourceActivityFee))) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } double sumneeded = 0; switch (item.PaymentStyle) { case ResourcePaymentStyleType.Fixed: sumneeded = item.Amount; break; case ResourcePaymentStyleType.perUnit: sumneeded = amountToProcess * item.Amount; break; case ResourcePaymentStyleType.perBlock: ResourcePricing price = resourceTypeProcessModel.Price; double blocks = amountToProcess / price.PacketSize; if (price.UseWholePackets) { blocks = Math.Truncate(blocks); } sumneeded = blocks * item.Amount; break; default: throw new Exception(String.Format("PaymentStyle ({0}) is not supported for ({1}) in ({2})", item.PaymentStyle, item.Name, this.Name)); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = sumneeded, ResourceType = typeof(Finance), ResourceTypeName = item.BankAccount.Name, ActivityModel = this, FilterDetails = null, Reason = item.Name } ); } // get process resource required if (amountToProcess > 0) { resourcesNeeded.Add( new ResourceRequest() { AllowTransmutation = true, Required = amountToProcess, ResourceType = (resourceTypeProcessModel as Model).Parent.GetType(), ResourceTypeName = (resourceTypeProcessModel as Model).Name, ActivityModel = this, Reason = "Process " + (resourceTypeProcessModel as Model).Name } ); } return(resourcesNeeded); }
/// <inheritdoc/> public override List <ResourceRequest> GetResourcesNeededForActivity() { List <ResourceRequest> resourcesNeeded = new List <ResourceRequest>(); double amountToProcess = resourceTypeProcessModel.Amount; if (Reserve > 0) { amountToProcess = Math.Min(amountToProcess, Reserve); } // get finances required. foreach (ResourceActivityFee item in this.FindAllChildren <ResourceActivityFee>()) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } double sumneeded = 0; switch (item.PaymentStyle) { case ResourcePaymentStyleType.Fixed: sumneeded = item.Amount; break; case ResourcePaymentStyleType.perUnit: sumneeded = amountToProcess * item.Amount; break; case ResourcePaymentStyleType.perBlock: ResourcePricing price = resourceTypeProcessModel.Price(PurchaseOrSalePricingStyleType.Both); double blocks = amountToProcess / price.PacketSize; if (price.UseWholePackets) { blocks = Math.Truncate(blocks); } sumneeded = blocks * item.Amount; break; default: throw new Exception(String.Format("PaymentStyle [{0}] is not supported for [{1}] in [a={2}]", item.PaymentStyle, item.Name, this.Name)); } if (sumneeded > 0) { ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = sumneeded, Resource = item.BankAccount, ResourceType = typeof(Finance), ResourceTypeName = item.BankAccount.Name, ActivityModel = this, FilterDetails = null, Category = TransactionCategory, RelatesToResource = (resourceTypeCreatedModel as CLEMModel).NameWithParent } ); } } // get process resource required if (amountToProcess > 0) { resourcesNeeded.Add( new ResourceRequest() { AllowTransmutation = true, Required = amountToProcess, Resource = resourceTypeProcessModel, ResourceType = (resourceTypeProcessModel as Model).Parent.GetType(), ResourceTypeName = (resourceTypeProcessModel as Model).Name, ActivityModel = this, Category = TransactionCategory, RelatesToResource = (resourceTypeCreatedModel as CLEMModel).NameWithParent } ); } return(resourcesNeeded); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> public override List <ResourceRequest> DetermineResourcesNeeded() { ResourceRequestList = null; RuminantHerd ruminantHerd = Resources.RuminantHerd(); List <Ruminant> herd = ruminantHerd.Herd; if (herd != null && herd.Count > 0) { // labour if (LabourRequired > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } // determine head to be fed int head = 0; foreach (RuminantFilterGroup child in this.Children.Where(a => a.GetType() == typeof(RuminantFilterGroup))) { head += herd.Filter(child as RuminantFilterGroup).Count(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = true, Required = Math.Ceiling(head / this.LabourHeadUnit) * this.LabourRequired, ResourceName = "Labour", ResourceTypeName = "", Requestor = this.Name, FilterSortDetails = LabourFilterList } ); } // feed double feedRequired = 0; // get zero limited month from clock int month = Clock.Today.Month - 1; // get list from filters foreach (RuminantFilterGroup child in this.Children.Where(a => a.GetType() == typeof(RuminantFilterGroup))) { foreach (Ruminant ind in herd.Filter(child as RuminantFilterGroup)) { switch (FeedStyle) { case RuminantFeedActivityTypes.SpecifiedDailyAmount: feedRequired += (child as RuminantFilterGroup).MonthlyValues[month] * 30.4; break; case RuminantFeedActivityTypes.ProportionOfWeight: feedRequired += (child as RuminantFilterGroup).MonthlyValues[month] * ind.Weight * 30.4; break; case RuminantFeedActivityTypes.ProportionOfPotentialIntake: feedRequired += (child as RuminantFilterGroup).MonthlyValues[month] * ind.PotentialIntake; break; case RuminantFeedActivityTypes.ProportionOfRemainingIntakeRequired: feedRequired += (child as RuminantFilterGroup).MonthlyValues[month] * (ind.PotentialIntake - ind.Intake); break; default: break; } } } if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = true, Required = feedRequired, ResourceName = "AnimalFoodStore", ResourceTypeName = this.FeedTypeName, Requestor = this.Name } ); } return(ResourceRequestList); }
/// <summary> /// Private method to determine resources required for this activity in the current month /// This method is local to this activity and not called with CLEMGetResourcesRequired event /// </summary> /// <returns>List of required resource requests</returns> private List <ResourceRequest> GetResourcesNeededForActivityLocal() { ResourceRequestList = null; RuminantHerd ruminantHerd = Resources.RuminantHerd(); // get only breeders for labour calculations List <Ruminant> herd = CurrentHerd(true).Where(a => a.Gender == Sex.Female & a.Age >= a.BreedParams.MinimumAge1stMating & a.Weight >= (a.BreedParams.MinimumSize1stMating * a.StandardReferenceWeight)).ToList(); int head = herd.Count(); double AE = herd.Sum(a => a.AdultEquivalent); if (head == 0) { return(null); } // get all fees for breeding foreach (RuminantActivityFee item in Apsim.Children(this, typeof(RuminantActivityFee))) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } double sumneeded = 0; switch (item.PaymentStyle) { case AnimalPaymentStyleType.Fixed: sumneeded = item.Amount; break; case AnimalPaymentStyleType.perHead: sumneeded = head * item.Amount; break; case AnimalPaymentStyleType.perAE: sumneeded = AE * item.Amount; break; default: throw new Exception(String.Format("PaymentStyle ({0}) is not supported for ({1}) in ({2})", item.PaymentStyle, item.Name, this.Name)); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = sumneeded, ResourceType = typeof(Finance), ResourceTypeName = "General account", ActivityModel = this, FilterDetails = null, Reason = item.Name } ); } // for each labour item specified foreach (var item in labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; break; case LabourUnitType.perHead: daysNeeded = Math.Ceiling(head / item.UnitSize) * item.LabourPerUnit; break; case LabourUnitType.perAE: daysNeeded = Math.Ceiling(AE / item.UnitSize) * item.LabourPerUnit; break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, FilterDetails = new List <object>() { item } } ); } } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { ResourceRequestList = null; if ((costDate.Year == Clock.Today.Year) && (costDate.Month == Clock.Today.Month)) { string cropName = parentGrowCrop.CropName; double daysNeeded = 0; string reason; // for each labour item specified foreach (var item in labour) { switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; reason = "Crop labour (fixed) - " + cropName; break; case LabourUnitType.perHa: daysNeeded = item.LabourPerUnit * MathUtilities.Divide(grandParentCropLand.Area, item.UnitSize, 0); reason = "Crop labour (perHa) - " + cropName; break; case LabourUnitType.perTree: if (parentGrowCrop.IsTreeCrop) { daysNeeded = item.LabourPerUnit * MathUtilities.Divide((parentGrowCrop.TreesPerHa * grandParentCropLand.Area), item.UnitSize, 0); reason = "Crop labour (perTree) - " + cropName; } else { throw new Exception(String.Format("{0} is not a Tree Crop, so LabourUnitType {1} is not supported for {2}", parentGrowCrop.Name, item.UnitType, this.Name)); } break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, Reason = reason, FilterDetails = new List <object>() { item } } ); } } } costDate = CostDateFromHarvestDate(); return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { ResourceRequestList = null; List <Ruminant> herd = CurrentHerd(false); int head = 0; double AE = 0; foreach (RuminantFeedGroup child in Apsim.Children(this, typeof(RuminantFeedGroup))) { var subherd = herd.Filter(child).ToList(); head += subherd.Count(); AE += subherd.Sum(a => a.AdultEquivalent); } // for each labour item specified foreach (var item in labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; break; case LabourUnitType.perHead: daysNeeded = Math.Ceiling(head / item.UnitSize) * item.LabourPerUnit; break; case LabourUnitType.perAE: daysNeeded = Math.Ceiling(AE / item.UnitSize) * item.LabourPerUnit; break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, FilterDetails = new List <object>() { item } } ); } } herd = CurrentHerd(false); // feed double feedRequired = 0; // get zero limited month from clock int month = Clock.Today.Month - 1; // get list from filters foreach (RuminantFeedGroup child in Apsim.Children(this, typeof(RuminantFeedGroup))) { foreach (Ruminant ind in herd.Filter(child as RuminantFeedGroup)) { switch (FeedStyle) { case RuminantFeedActivityTypes.SpecifiedDailyAmount: feedRequired += (child as RuminantFeedGroup).MonthlyValues[month] * 30.4; break; case RuminantFeedActivityTypes.ProportionOfWeight: feedRequired += (child as RuminantFeedGroup).MonthlyValues[month] * ind.Weight * 30.4; break; case RuminantFeedActivityTypes.ProportionOfPotentialIntake: feedRequired += (child as RuminantFeedGroup).MonthlyValues[month] * ind.PotentialIntake; break; case RuminantFeedActivityTypes.ProportionOfRemainingIntakeRequired: feedRequired += (child as RuminantFeedGroup).MonthlyValues[month] * (ind.PotentialIntake - ind.Intake); break; default: break; } } } if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = true, Required = feedRequired, ResourceType = typeof(AnimalFoodStore), ResourceTypeName = this.FeedTypeName, ActivityModel = this } ); return(ResourceRequestList); }
/// <summary> /// Private method to determine resources required for this activity in the current month /// This method is local to this activity and not called with CLEMGetResourcesRequired event /// </summary> /// <returns>List of required resource requests</returns> private List <ResourceRequest> GetResourcesNeededForActivityLocal() { ResourceRequestList = null; RuminantHerd ruminantHerd = Resources.RuminantHerd(); // get only breeders for labour calculations List <Ruminant> herd = CurrentHerd(true).Where(a => a.Gender == Sex.Female && a.IsBreedingCondition).ToList(); int head = herd.Count(); double adultEquivalents = herd.Sum(a => a.AdultEquivalent); if (head == 0) { return(null); } // get all fees for breeding foreach (RuminantActivityFee item in this.FindAllChildren <RuminantActivityFee>()) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } double sumneeded = 0; switch (item.PaymentStyle) { case AnimalPaymentStyleType.Fixed: sumneeded = item.Amount; break; case AnimalPaymentStyleType.perHead: sumneeded = head * item.Amount; break; case AnimalPaymentStyleType.perAE: sumneeded = adultEquivalents * item.Amount; break; default: throw new Exception(String.Format("PaymentStyle ({0}) is not supported for ({1}) in ({2})", item.PaymentStyle, item.Name, this.Name)); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = sumneeded, ResourceType = typeof(Finance), ResourceTypeName = item.BankAccountName.Split('.').Last(), ActivityModel = this, FilterDetails = null, Category = item.Name } ); } // for each labour item specified foreach (var item in labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; break; case LabourUnitType.perHead: daysNeeded = Math.Ceiling(head / item.UnitSize) * item.LabourPerUnit; break; case LabourUnitType.perAE: daysNeeded = Math.Ceiling(adultEquivalents / item.UnitSize) * item.LabourPerUnit; break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, FilterDetails = new List <object>() { item } } ); } } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns></returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { ResourceRequestList = null; // get feed required // zero based month index for array int month = Clock.Today.Month - 1; double allIndividuals = 0; double amount = 0; foreach (OtherAnimalsFilterGroup filtergroup in Apsim.Children(this, typeof(OtherAnimalsFilterGroup))) { double total = 0; foreach (OtherAnimalsTypeCohort item in (filtergroup as OtherAnimalsFilterGroup).SelectedOtherAnimalsType.Cohorts.Filter(filtergroup as OtherAnimalsFilterGroup)) { total += item.Number * ((item.Age < (filtergroup as OtherAnimalsFilterGroup).SelectedOtherAnimalsType.AgeWhenAdult)?0.1:1); } allIndividuals += total; switch (FeedStyle) { case OtherAnimalsFeedActivityTypes.SpecifiedDailyAmount: amount += (filtergroup as OtherAnimalsFilterGroup).MonthlyValues[month] * 30.4 * total; break; case OtherAnimalsFeedActivityTypes.ProportionOfWeight: throw new NotImplementedException("Proportion of weight is not implemented as a feed style for other animals"); default: amount += 0; break; } if (amount > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = true, Required = amount, ResourceType = typeof(AnimalFoodStore), ResourceTypeName = FeedTypeName, ActivityModel = this, // ActivityName = "Feed " + (child as OtherAnimalsFilterGroup).AnimalType, Reason = "oops", FilterDetails = null } ); } } if (amount == 0) { return(ResourceRequestList); } // for each labour item specified foreach (var item in labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; break; case LabourUnitType.perHead: daysNeeded = Math.Ceiling(allIndividuals / item.UnitSize) * item.LabourPerUnit; break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, FilterDetails = new List <object>() { item } } ); } } return(ResourceRequestList); }
/// <summary> /// Method to determine resources required for this activity in the current month /// </summary> /// <returns>List of required resource requests</returns> public override List <ResourceRequest> GetResourcesNeededForActivity() { ResourceRequestList = null; if (this.TimingOK) { // get all crop fees for task foreach (CropActivityFee item in Apsim.Children(this, typeof(CropActivityFee))) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } double sumneeded = 0; switch (item.PaymentStyle) { case CropPaymentStyleType.Fixed: sumneeded = item.Amount; break; case CropPaymentStyleType.perHa: CropActivityManageCrop CropParent = Parent.Parent as CropActivityManageCrop; CropActivityManageProduct ProductParent = Parent as CropActivityManageProduct; sumneeded = CropParent.Area * ProductParent.UnitsToHaConverter * item.Amount; break; case CropPaymentStyleType.perTree: CropParent = Parent.Parent as CropActivityManageCrop; ProductParent = Parent as CropActivityManageProduct; sumneeded = ProductParent.TreesPerHa * CropParent.Area * ProductParent.UnitsToHaConverter * item.Amount; break; default: throw new Exception(String.Format("PaymentStyle ({0}) is not supported for ({1}) in ({2})", item.PaymentStyle, item.Name, this.Name)); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = sumneeded, ResourceType = typeof(Finance), ResourceTypeName = "General account", ActivityModel = this, FilterDetails = null, Reason = item.Name } ); } // for each labour item specified foreach (var item in labour) { double daysNeeded = 0; switch (item.UnitType) { case LabourUnitType.Fixed: daysNeeded = item.LabourPerUnit; break; case LabourUnitType.perHa: CropActivityManageCrop CropParent = Parent.Parent as CropActivityManageCrop; CropActivityManageProduct ProductParent = Parent as CropActivityManageProduct; daysNeeded = Math.Ceiling(CropParent.Area * ProductParent.UnitsToHaConverter / item.UnitSize) * item.LabourPerUnit; break; case LabourUnitType.perTree: CropParent = Parent.Parent as CropActivityManageCrop; ProductParent = Parent as CropActivityManageProduct; daysNeeded = Math.Ceiling(ProductParent.TreesPerHa * CropParent.Area * ProductParent.UnitsToHaConverter / item.UnitSize) * item.LabourPerUnit; break; default: throw new Exception(String.Format("LabourUnitType {0} is not supported for {1} in {2}", item.UnitType, item.Name, this.Name)); } if (daysNeeded > 0) { if (ResourceRequestList == null) { ResourceRequestList = new List <ResourceRequest>(); } ResourceRequestList.Add(new ResourceRequest() { AllowTransmutation = false, Required = daysNeeded, ResourceType = typeof(Labour), ResourceTypeName = "", ActivityModel = this, FilterDetails = new List <object>() { item } } ); } } } return(ResourceRequestList); }