Esempio n. 1
0
 /// <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);
 }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 7
0
        /// <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);
        }
Esempio n. 8
0
        /// <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);
        }
Esempio n. 9
0
        /// <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);
        }
Esempio n. 10
0
        /// <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);
        }
Esempio n. 11
0
        /// <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);
        }
Esempio n. 13
0
        /// <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);
        }
Esempio n. 14
0
        /// <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);
        }
Esempio n. 15
0
        /// <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);
        }
Esempio n. 16
0
        /// <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);
        }
Esempio n. 17
0
        /// <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);
        }
Esempio n. 18
0
        /// <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);
        }
Esempio n. 20
0
        /// <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);
        }