public override object Invoke(object[] args)
            {
                Debug.Assert(args.Length == 9);
                if (args.Any(x => x == null || Convert.IsDBNull(x)))
                {
                    return(0.0);
                }

                var frameTime = TimeSpan.FromSeconds((long)args[0]);
                // unbox then cast to int
                var      frames        = (int)((long)args[1]);
                var      baseCredit    = (double)args[2];
                var      kFactor       = (double)args[3];
                var      preferredDays = (double)args[4];
                var      maximumDays   = (double)args[5];
                DateTime downloadDateTime;

                DateTime.TryParseExact((string)args[6], "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture,
                                       DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
                                       out downloadDateTime);
                DateTime completionDateTime;

                DateTime.TryParseExact((string)args[7], "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture,
                                       DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
                                       out completionDateTime);
                var calcOption = (long)args[8];

                TimeSpan unitTime = TimeSpan.Zero;

                switch (BonusCalculation)
                {
                case BonusCalculationType.FrameTime:
                    unitTime = TimeSpan.FromSeconds(frameTime.TotalSeconds * frames);
                    break;

                case BonusCalculationType.DownloadTime:
                    unitTime = completionDateTime.Subtract(downloadDateTime);
                    break;
                }

                if (calcOption != 0)
                {
                    return(ProductionCalculator.GetBonusCredit(baseCredit, kFactor, preferredDays, maximumDays, unitTime));
                }
                return(ProductionCalculator.GetBonusPPD(frameTime, frames, baseCredit, kFactor, preferredDays, maximumDays, unitTime));
            }