private string GetWorkItemDir()
        {
            var dir = Path.Combine(this.BaseOutputDirectory,
                                   string.Format(@"{0}\{0}-{1}\WI {2}", DateTime.Now.Year, DateTime.Now.Month.ToString("00"), this.WorkItem.Id));

            // we might pickup something leftover from a previous run that is no longer valid
            if (Directory.Exists(dir))
            {
                DirUtility.DeleteDirectory(dir);
            }

            DirUtility.EnsureDir(dir);
            return(dir);
        }
        private void Package()
        {
            this.Save();

            if (this.Changes.IncludedChanges.Any(x => string.IsNullOrWhiteSpace(x.Schema)))
            {
                IoC.Get <IMessageBoxService>().ShowOKDispatch("One or more database objects are missing required Schema values.",
                                                              "Required Data Missing");
                return;
            }

            var packageDir = Path.Combine(this.Changes.RootDatabaseFolder, "_Package");
            var di         = new DirectoryInfo(packageDir);

            if (di.Exists)
            {
                DirUtility.DeleteDirectory(di.FullName);
            }
            di.Create();

            var schemaCounts = new Dictionary <string, int>();

            // this should be a user configurable setting. this allows gaps between changes should others need to be inserted
            const int skipBetween = 5;
            var       warnings    = new List <string>();

            this.Changes.IncludedChanges.OrderBy(x => x.Index).ToList().ForEach(x =>
            {
                var sourceFilename = Path.Combine(Changes.RootDatabaseFolder, x.FilePath);
                var delim          = !x.File.StartsWith("_") ? "_" : string.Empty;
                var schemaDir      = string.Empty;

                if (!schemaCounts.ContainsKey(x.Schema))
                {
                    schemaCounts.Add(x.Schema, 0);
                    schemaDir = Path.Combine(packageDir, schemaCounts.Count.ToString("00") + "_" + x.Schema);
                    DirUtility.EnsureDir(schemaDir);
                }
                else
                {
                    var keys  = schemaCounts.Keys.ToList();
                    var index = keys.IndexOf(x.Schema) + 1;
                    schemaDir = Path.Combine(packageDir, index.ToString("00") + "_" + x.Schema);
                }

                if (!File.Exists(sourceFilename))
                {
                    warnings.Add(string.Format("The following file does not exist. Perhaps it was deleted and should not have been included: {0}", sourceFilename));
                }
                else
                {
                    var schemaIndex         = schemaCounts[x.Schema] * skipBetween;
                    schemaCounts[x.Schema] += 1;

                    var targetFilename = Path.Combine(schemaDir, string.Format("{0:000}{1}{2}", schemaIndex, delim, x.File));
                    File.Copy(sourceFilename, targetFilename);
                }
            });

            Process.Start(packageDir);

            if (warnings.Any())
            {
                var warningsFile = Path.Combine(packageDir, "PackageWarnings.txt");
                File.WriteAllText(warningsFile, string.Join(Environment.NewLine, warnings));
                Process.Start(warningsFile);
            }
        }