Beispiel #1
0
        private void OnStartOfSimulation(object sender, EventArgs e)
        {
            // determine resource type from name
            TransmuteResourceType = resources.FindResourceType <ResourceBaseWithTransactions, IResourceType>(this, TransmuteResourceTypeName, OnMissingResourceActionTypes.Ignore, OnMissingResourceActionTypes.Ignore);

            if (TransmuteResourceType != null)
            {
                ResourceGroup = (TransmuteResourceType as IModel).Parent as ResourceBaseWithTransactions;

                var shortfallResourceType = (TransmuteResourceType as IModel).FindAncestor <IResourceType>();
                shortfallPacketSize   = (Parent as Transmutation).TransmutationPacketSize;
                shortfallWholePackets = (Parent as Transmutation).UseWholePackets;

                // get pricing of shortfall resource
                if (shortfallResourceType != null && TransmuteStyle == TransmuteStyle.UsePricing)
                {
                    shortfallPricing      = shortfallResourceType.Price(PurchaseOrSalePricingStyleType.Purchase);
                    shortfallPacketSize   = shortfallPricing.PacketSize;
                    shortfallWholePackets = shortfallPricing.UseWholePackets;

                    // get pricing of transmute resource
                    if (!(TransmuteResourceType is FinanceType))
                    {
                        transmutePricing = TransmuteResourceType.Price(PurchaseOrSalePricingStyleType.Sale);
                        if (FinanceTypeForTransactionsName != "No transactions")
                        {
                            // link to first bank account
                            financeType = resources.FindResourceType <Finance, FinanceType>(this, FinanceTypeForTransactionsName, OnMissingResourceActionTypes.Ignore, OnMissingResourceActionTypes.ReportWarning);
                        }
                    }
                }
            }
        }
Beispiel #2
0
        ///<inheritdoc/>
        public bool DoTransmute(ResourceRequest request, double shortfallPacketsNeeded, double requiredByActivities, ResourcesHolder holder, bool queryOnly)
        {
            switch (TransmuteStyle)
            {
            case TransmuteStyle.Direct:
                request.Required = shortfallPacketsNeeded * AmountPerPacket;
                break;

            case TransmuteStyle.UsePricing:
                request.Required = (shortfallPacketsNeeded * shortfallPricing.CurrentPrice) / transmutePricing.CurrentPrice;
                // check that sell whole packets are honoured
                if (transmutePricing.UseWholePackets)
                {
                    double pricingWholePacketAdjusted = Math.Ceiling(request.Required / transmutePricing.PacketSize) * transmutePricing.PacketSize;
                    request.Required = pricingWholePacketAdjusted;
                }
                break;

            default:
                break;
            }

            if (queryOnly)
            {
                return(request.Required + requiredByActivities <= TransmuteResourceType.Amount);
            }
            else
            {
                TransmuteResourceType.Remove(request);
                if (TransmuteStyle == TransmuteStyle.UsePricing && financeType != null)
                {
                    // add finance transaction to sell transmute
                    financeType.Add(request.Required * transmutePricing.CurrentPrice, request.ActivityModel, TransmuteResourceTypeName, request.Category);

                    // add finance transaction to buy shortfall
                    ResourceRequest financeRequest = new ResourceRequest()
                    {
                        Resource          = financeType,
                        Required          = shortfallPacketsNeeded * shortfallPacketSize * shortfallPricing.CurrentPrice,
                        RelatesToResource = request.ResourceTypeName,
                        ResourceType      = typeof(Finance),
                        ActivityModel     = request.ActivityModel,
                        Category          = request.Category,
                    };
                    financeType.Remove(financeRequest);
                }
            }
            return(true);
        }
Beispiel #3
0
        ///<inheritdoc/>
        public bool DoTransmute(ResourceRequest request, double shortfall, double requiredByActivities, ResourcesHolder holder, bool queryOnly)
        {
            double transPackets     = 0;
            double shortfallPackets = shortfall / shortfallPacketSize;

            switch (TransmuteStyle)
            {
            case TransmuteStyle.Direct:
                if ((Parent as Transmutation).UseWholePackets)
                {
                    shortfallPackets = Math.Ceiling(shortfallPackets);
                }
                request.Required = shortfallPackets * AmountPerPacket;
                break;

            case TransmuteStyle.UsePricing:
                if (shortfallPricing.CurrentPrice > 0)
                {
                    if (transmutePricing.CurrentPrice == 0)
                    {
                        // no value of transmute resource
                        request.Required = 0;
                    }
                    else
                    {
                        if (shortfallWholePackets)
                        {
                            shortfallPackets = Math.Ceiling(shortfallPackets);
                        }
                        request.Required = shortfallPackets * shortfallPricing.CurrentPrice;

                        if (transmutePricing != shortfallPricing && transmutePricing.UseWholePackets)
                        {
                            transPackets = shortfall / transmutePricing.PacketSize;
                            if (transmutePricing.UseWholePackets)
                            {
                                transPackets = Math.Ceiling(transPackets);
                            }
                        }
                    }
                }
                break;

            default:
                break;
            }

            if (queryOnly)
            {
                return(request.Required + requiredByActivities <= TransmuteResourceType.Amount);
            }
            else
            {
                if (TransmuteStyle == TransmuteStyle.UsePricing && !(TransmuteResourceType is FinanceType))
                {
                    // add finance transaction to sell transmute
                    financeType.Add(transPackets * transmutePricing.CurrentPrice, request.ActivityModel, TransmuteResourceTypeName, request.Category);

                    // add finance transaction to buy shortfall
                    ResourceRequest financeRequest = new ResourceRequest()
                    {
                        Resource          = financeType,
                        Required          = shortfallPackets * shortfallPricing.CurrentPrice,
                        RelatesToResource = request.ResourceTypeName,
                        ResourceType      = typeof(Finance),
                        ActivityModel     = request.ActivityModel,
                        Category          = request.Category,
                    };
                    financeType.Remove(financeRequest);
                }
                else
                {
                    TransmuteResourceType.Remove(request);
                }
            }
            return(true);
        }