Переглянути джерело

InstallDbCommand, ClearDbCommand

Dalibor Votruba 4 роки тому
батько
коміт
03ac895a71

+ 3 - 65
Console/Commands/Base/BaseCommand.cs

@@ -1,24 +1,13 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.IO.Abstractions;
-using System.Linq;
-using System.Text.Json;
+using System.Collections.Generic;
 using BO.Connector.Console;
-using BO.Console.Options;
-using Quadarax.Foundation.Core.Console;
-using Quadarax.Foundation.Core.Data.Interface.Entity;
-using Quadarax.Foundation.Core.Logging;
-using Quadarax.Foundation.Core.Object.Extensions;
 using Quadarax.Foundation.Core.QConsole;
 using Quadarax.Foundation.Core.QConsole.Argument;
-using Quadarax.Foundation.Core.QConsole.Command.Base;
 using Quadarax.Foundation.Core.QConsole.Value;
 // ReSharper disable InconsistentNaming
 
 namespace BO.Console.Commands.Base
 {
-    internal abstract class BaseCommand : AbstractCommand, ILogHandler
+    internal abstract class BaseCommand : BaseLocalCommand
     {
         #region *** Constants ***
 
@@ -43,12 +32,7 @@ namespace BO.Console.Commands.Base
 
 
         protected Connection Client { get; private set; }
-        protected Configuration Configuration { get; private set; }
-
         protected string UserName { get; private set; }
-        protected bool? IsForce { get; private set; }
-
-        protected IFileSystem FileSystem { get; private set; }
 
         protected BaseCommand(Engine engine) : base(engine)
         {
@@ -58,7 +42,6 @@ namespace BO.Console.Commands.Base
         protected override void OnInitialize()
         {
             base.OnInitialize();
-            Configuration = JsonSerializer.Deserialize<Configuration>(File.ReadAllText(Constants.CS_CONFIGURATION_FILE));
             Client = new Connection(Configuration.ApiBaseUrl, Configuration.ApiTimeout, this, GetArgumentValueOrDefault<bool>(CS_ARG_NAME_DUMP));
             Client.Open(Configuration.ApiUser, Configuration.ApiUserPwd, Configuration.ApiMagic);
         }
@@ -68,58 +51,13 @@ namespace BO.Console.Commands.Base
             base.OnValidateArguments();
             if (ContainsArgument(CS_ARG_NAME_USER))
                 UserName = GetArgumentValueOrDefault<string>(CS_ARG_NAME_USER);
-
-            if (ContainsArgument(CS_ARG_NAME_FORCE))
-            {
-                IsForce = WasArgumentSpecified(CS_ARG_NAME_FORCE);
-                if (IsForce.GetValueOrDefault(false))
-                    WriteWarning("Force flag is set!");
-            }
-
-            if (WasArgumentSpecified(CS_ARG_NAME_DEBUG))
-                DebugConsoleWriter.IsWriteDebugEnabled = true;
-        }
-
-        protected override IEnumerable<AbstractArgument> OnSetupArguments()
-        {
-            FileSystem = new FileSystem();
-            var args = base.OnSetupArguments().ToList();
-            args.Add(new FlagArgument(CS_ARG_NAME_DUMP, CS_ARG_DESC_DUMP, CS_ARG_HINT_DUMP, false));
-            args.Add(new FlagArgument(CS_ARG_NAME_DEBUG, CS_ARG_DESC_DEBUG, CS_ARG_HINT_DEBUG, false));
-            return args;
         }
 
+        
         protected void AppendUserArgument(IList<AbstractArgument> args, string alternativeUserDescription = null)
         {
             args.Add(new NamedArgument(CS_ARG_NAME_USER, string.IsNullOrEmpty(alternativeUserDescription)? CS_ARG_DESC_USER : alternativeUserDescription, CS_ARG_HINT_USER, TypeValuesEnum.String, string.Empty, false));
         }
 
-        protected void AppendForceArgument(IList<AbstractArgument> args, string alternativeUserDescription = null)
-        {
-            args.Add(new FlagArgument(CS_ARG_NAME_FORCE, string.IsNullOrEmpty(alternativeUserDescription) ? CS_ARG_DESC_FORCE : alternativeUserDescription,CS_ARG_HINT_FORCE, false));
-        }
-
-        public void Log(LogSeverityEnum type, string message, Exception e = null)
-        {
-            WriteInfo($"{type}: {message}" + (e == null ? "" : e.Message));
-        }
-
-        protected void WriteDtoToConsole(IDto dto)
-        {
-            var props = dto.GetAllPropertyValues();
-            using (var wName = new ConsoleWriter(ConsoleColor.White))
-            {
-                using (var wValue = new ConsoleWriter(ConsoleColor.Yellow))
-                {
-                    var maxKeyLength = props.Keys.Max(x=>x.Length);
-                    foreach (var prop in props)
-                    {
-                        wName.Write(prop.Key);
-                        wName.Write(new string(' ',maxKeyLength - prop.Key.Length) + " :\t");
-                        wValue.WriteLine(prop.Value?.ToString());
-                    }
-                }
-            }
-        }
     }
 }

+ 106 - 0
Console/Commands/Base/BaseLocalCommand.cs

@@ -0,0 +1,106 @@
+using System;
+using System.Collections.Generic;
+using System.IO.Abstractions;
+using System.Linq;
+using System.Text.Json;
+using BO.Console.Options;
+using Quadarax.Foundation.Core.Console;
+using Quadarax.Foundation.Core.Data.Interface.Entity;
+using Quadarax.Foundation.Core.Logging;
+using Quadarax.Foundation.Core.Object.Extensions;
+using Quadarax.Foundation.Core.QConsole;
+using Quadarax.Foundation.Core.QConsole.Argument;
+using Quadarax.Foundation.Core.QConsole.Command.Base;
+
+namespace BO.Console.Commands.Base
+{
+    internal abstract class BaseLocalCommand : AbstractCommand, ILogHandler
+    {
+        #region *** Constants ***
+
+        protected const string CS_ARG_NAME_DUMP = "dump";
+        private const string CS_ARG_HINT_DUMP = "<is_dump_reponses>";
+        private const string CS_ARG_DESC_DUMP = "Flag if set dumps incomming json messages.";
+
+        protected const string CS_ARG_NAME_DEBUG = "dbg";
+        private const string CS_ARG_HINT_DEBUG = "<is_debug_mode>";
+        private const string CS_ARG_DESC_DEBUG = "Flag if set writes debug messages.";
+
+        protected const string CS_ARG_NAME_FORCE = "force";
+        private const string CS_ARG_HINT_FORCE = "<is_force>";
+        private const string CS_ARG_DESC_FORCE = "Flag if set, then overrite existing entity, otherwise cancel operation.";
+
+
+        #endregion
+
+        protected Configuration Configuration { get; private set; }
+
+        protected bool? IsForce { get; private set; }
+
+        protected IFileSystem FileSystem { get; private set; }
+
+        protected BaseLocalCommand(Engine engine) : base(engine)
+        {
+
+        }
+
+        protected override void OnInitialize()
+        {
+            base.OnInitialize();
+            Configuration = JsonSerializer.Deserialize<Configuration>(FileSystem.File.ReadAllText(Constants.CS_CONFIGURATION_FILE));
+        }
+
+        protected override void OnValidateArguments()
+        {
+            base.OnValidateArguments();
+            
+            if (ContainsArgument(CS_ARG_NAME_FORCE))
+            {
+                IsForce = WasArgumentSpecified(CS_ARG_NAME_FORCE);
+                if (IsForce.GetValueOrDefault(false))
+                    WriteWarning("Force flag is set!");
+            }
+
+            if (WasArgumentSpecified(CS_ARG_NAME_DEBUG))
+                DebugConsoleWriter.IsWriteDebugEnabled = true;
+        }
+
+        protected override IEnumerable<AbstractArgument> OnSetupArguments()
+        {
+            FileSystem = new FileSystem();
+            var args = base.OnSetupArguments().ToList();
+            args.Add(new FlagArgument(CS_ARG_NAME_DUMP, CS_ARG_DESC_DUMP, CS_ARG_HINT_DUMP, false));
+            args.Add(new FlagArgument(CS_ARG_NAME_DEBUG, CS_ARG_DESC_DEBUG, CS_ARG_HINT_DEBUG, false));
+            return args;
+        }
+
+
+        protected void AppendForceArgument(IList<AbstractArgument> args, string alternativeUserDescription = null)
+        {
+            args.Add(new FlagArgument(CS_ARG_NAME_FORCE, string.IsNullOrEmpty(alternativeUserDescription) ? CS_ARG_DESC_FORCE : alternativeUserDescription, CS_ARG_HINT_FORCE, false));
+        }
+
+        public void Log(LogSeverityEnum type, string message, Exception e = null)
+        {
+            WriteInfo($"{type}: {message}" + (e == null ? "" : e.Message));
+        }
+
+        protected void WriteDtoToConsole(IDto dto)
+        {
+            var props = dto.GetAllPropertyValues();
+            using (var wName = new ConsoleWriter(ConsoleColor.White))
+            {
+                using (var wValue = new ConsoleWriter(ConsoleColor.Yellow))
+                {
+                    var maxKeyLength = props.Keys.Max(x => x.Length);
+                    foreach (var prop in props)
+                    {
+                        wName.Write(prop.Key);
+                        wName.Write(new string(' ', maxKeyLength - prop.Key.Length) + " :\t");
+                        wValue.WriteLine(prop.Value?.ToString());
+                    }
+                }
+            }
+        }
+    }
+}

+ 118 - 0
Console/Commands/Base/DbBaseCommand.cs

@@ -0,0 +1,118 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SqlClient;
+using Quadarax.Foundation.Core.Data.Extensions;
+using Quadarax.Foundation.Core.QConsole;
+using Quadarax.Foundation.Core.QConsole.Argument;
+using Quadarax.Foundation.Core.QConsole.Value;
+
+namespace BO.Console.Commands.Base
+{
+    internal abstract class DbBaseCommand : BaseLocalCommand
+    {
+
+        #region *** Constants ***
+        private const string ARG_SERVER_CODE = "srv";
+        private const string ARG_SERVER_HINT = "database_server";
+        private const string ARG_SERVER_DESC = "Sql Server name and/or instance name";
+        private const string ARG_DB_CODE = "db";
+        private const string ARG_DB_HINT = "database_name";
+        private const string ARG_DB_DESC = "Database name";
+        private const string ARG_ISEC_CODE = "isec";
+        private const string ARG_ISEC_HINT = "is_trusted_security";
+        private const string ARG_ISEC_DESC = "Flag if trusted security, otherwise user credentials must be specified";
+        private const string ARG_USER_CODE = "u";
+        private const string ARG_USER_HINT = "user_name";
+        private const string ARG_USER_DESC = "User name to connect to databse";
+        private const string ARG_PWD_CODE = "p";
+        private const string ARG_PWD_HINT = "user_password";
+        private const string ARG_PWD_DESC = "User password to connect to databse";
+        #endregion
+
+        #region *** Properties ***
+        protected SqlConnectionStringBuilder ConnectionString => GetConnectionString();
+        protected string ServerName => GetArgumentValueOrDefault<string>(ARG_SERVER_CODE);
+        protected string DatabseName => GetArgumentValueOrDefault<string>(ARG_DB_CODE);
+        #endregion
+
+
+        #region *** Constructors ***
+        protected DbBaseCommand(Engine engine) : base(engine)
+        {
+        }
+        #endregion
+
+        #region *** Overrides ***
+        protected override IEnumerable<AbstractArgument> OnSetupArguments()
+        {
+            var arguments =  new List<AbstractArgument>(base.OnSetupArguments());
+            arguments.Add(new NamedArgument(ARG_SERVER_CODE, ARG_SERVER_DESC, ARG_SERVER_HINT, TypeValuesEnum.String,string.Empty,true));
+            arguments.Add(new NamedArgument(ARG_DB_CODE, ARG_DB_DESC, ARG_DB_HINT, TypeValuesEnum.String,string.Empty,true));
+            arguments.Add(new FlagArgument(ARG_ISEC_CODE, ARG_ISEC_DESC, ARG_ISEC_HINT, false));
+            arguments.Add(new NamedArgument(ARG_USER_CODE, ARG_USER_DESC, ARG_USER_HINT, TypeValuesEnum.String,string.Empty,false));
+            arguments.Add(new NamedArgument(ARG_PWD_CODE, ARG_PWD_DESC, ARG_PWD_HINT, TypeValuesEnum.String,string.Empty,false));
+            return arguments;
+        }
+
+        protected override void OnValidateArguments()
+        {
+            base.OnCommandInit();
+            if (!GetArgumentValueOrDefault(ARG_ISEC_CODE, false))
+            {
+                if (!GetArgument(ARG_USER_CODE).Value.HasValue)
+                    throw new ArgumentException($"Argument '{ARG_USER_CODE}' must be set with flag '{ARG_ISEC_CODE}'.", ARG_USER_CODE);
+                if (!GetArgument(ARG_PWD_CODE).Value.HasValue)
+                    throw new ArgumentException($"Argument '{ARG_PWD_CODE}' must be set with flag '{ARG_ISEC_CODE}'.", ARG_PWD_CODE);
+            }
+
+        }
+        #endregion
+
+        #region *** Protected Operations ***
+        protected SqlConnection OpenConnection()
+        {
+            WriteDebugInfo($"Opening connection [{ConnectionString.InitialCatalog}@{ConnectionString.DataSource}]...");
+            var conn = new SqlConnection(ConnectionString.ToString());
+            conn.Open();
+            WriteInfo($"Connection to {ConnectionString.InitialCatalog}@{ConnectionString.DataSource} established.");
+            return conn;
+        }
+
+        protected SqlConnection OpenMasterConnection()
+        {
+            var builder = ConnectionString;
+            builder.InitialCatalog = "master";
+            WriteDebugInfo($"Opening connection [{builder.InitialCatalog}@{builder.DataSource}]...");
+            var conn = new SqlConnection(builder.ToString());
+            conn.Open();
+            WriteInfo($"Connection to {builder.InitialCatalog}@{builder.DataSource} established.");
+            return conn;
+        }
+
+        protected virtual SqlConnectionStringBuilder GetConnectionString()
+        {
+            var builder = new SqlConnectionStringBuilder();
+            builder.DataSource = GetArgumentValueOrDefault<string>(ARG_SERVER_CODE);
+            builder.InitialCatalog = GetArgumentValueOrDefault<string>(ARG_DB_CODE);
+            builder.IntegratedSecurity = GetArgumentValueOrDefault<bool>(ARG_ISEC_CODE);
+            if (!builder.IntegratedSecurity)
+            {
+                builder.UserID = GetArgumentValueOrDefault<string>(ARG_USER_CODE);
+                builder.Password = GetArgumentValueOrDefault<string>(ARG_PWD_CODE);
+            }
+            return builder;
+        }
+
+        protected bool CheckIfDbExists(SqlConnection conn,string databaseName)
+        {
+            var query = $"select count(*) from master.dbo.sysdatabases WHERE ('[' + name + ']' = '{databaseName}' OR name = '{databaseName}')";
+            return conn.ExecuteScalar<int>(CommandType.Text, query) == 1;
+        }
+        #endregion
+
+        #region *** Private Operations ***
+        #endregion
+    }
+
+}

+ 64 - 0
Console/Commands/Install/ClearDbCommand.cs

@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Reflection;
+using BO.Console.Commands.Base;
+using Quadarax.Foundation.Core.Data.Extensions;
+using Quadarax.Foundation.Core.QConsole;
+using Quadarax.Foundation.Core.QConsole.Argument;
+using Quadarax.Foundation.Core.Resource.Extensions;
+using Quadarax.Foundation.Core.Value;
+
+namespace BO.Console.Commands.Install
+{
+    internal class ClearDbCommand : DbBaseCommand
+    {
+        #region *** Constants ***
+        private const string CS_CMD_CLEAR_NAME = "dbclear";
+        private const string CS_CMD_CLEAR_DESCR = "clear BO database (keep structure and deletes data).";
+
+        #endregion
+
+        #region *** Properties ***
+
+        public override string Name => CS_CMD_CLEAR_NAME;
+        public override string Description => CS_CMD_CLEAR_DESCR;
+
+        #endregion
+
+        #region *** Constructor ***
+        public ClearDbCommand(Engine engine) : base(engine)
+        {
+        }
+        #endregion
+
+        #region *** EXECUTE ***
+        protected override Result OnExecute()
+        {
+            var result = new Result();
+            using (var conn = OpenMasterConnection())
+            {
+                if (CheckIfDbExists(conn, DatabseName))
+                {
+                    var script = Assembly.GetExecutingAssembly().GetEmbeddedFileContentAsString("BO.Console.Commands.Install.bo_clear_data.sql");
+                    WriteCaption($"Clearing all data in '{DatabseName}'");
+                    var resultExecute = conn.BatchExecute(script);
+                    WriteDebugInfo($"Deploy script returns: {resultExecute}");
+                    if (resultExecute == 0)
+                        throw new Exception($"Database '{DatabseName}' clearing FAILED.");
+
+                    var version = conn.ExecuteScalar<string>(CommandType.Text, "select value from sys.extended_properties where NAME = 'BO_Version'");
+                    WriteCaption($"Database '{DatabseName}' cleared in version '{version}'");
+                }
+            }
+            return new Result();
+        }
+        #endregion
+
+        #region *** Private operations ***
+
+
+        #endregion
+    }
+}

+ 115 - 0
Console/Commands/Install/InstallDbCommand.cs

@@ -0,0 +1,115 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Reflection;
+using BO.Console.Commands.Base;
+using Quadarax.Foundation.Core.Data.Extensions;
+using Quadarax.Foundation.Core.QConsole;
+using Quadarax.Foundation.Core.QConsole.Argument;
+using Quadarax.Foundation.Core.QConsole.Value;
+using Quadarax.Foundation.Core.Resource.Extensions;
+using Quadarax.Foundation.Core.Value;
+
+namespace BO.Console.Commands.Install
+{
+    internal class InstallDbCommand : DbBaseCommand
+    {
+        #region *** Constants ***
+        private const string CS_CMD_INSTALL_NAME = "dbinstall";
+        private const string CS_CMD_INSTALL_DESCR = "install BO database from scratch (supports SqlServer, LocalDB).";
+        
+        
+        private const string ARG_PATH_CODE = "dpath";
+        private const string ARG_PATH_HINT = "data_file_path";
+        private const string ARG_PATH_DESC = "Absolute path to SQL Server datafile directory (ends without \\ character). Use '|' instead of ':'";
+        private const string ARG_ISIZE_CODE = "isize";
+        private const string ARG_ISIZE_HINT = "initial_size";
+        private const string ARG_ISIZE_DESC = "Initial size in MB for Data and Log file";
+        private const string ARG_GROWTH_CODE = "growth";
+        private const string ARG_GROWTH_HINT = "growth";
+        private const string ARG_GROWTH_DESC = "Data file growth in %";
+
+        #endregion
+
+        #region *** Properties ***
+
+        public override string Name => CS_CMD_INSTALL_NAME;
+        public override string Description => CS_CMD_INSTALL_DESCR;
+
+        #endregion
+
+        #region *** Constructor ***
+        public InstallDbCommand(Engine engine) : base(engine)
+        {
+        }
+        #endregion
+
+        #region *** EXECUTE ***
+        protected override Result OnExecute()
+        {
+
+            var result = new Result();
+            using (var conn = OpenMasterConnection())
+            {
+                if (!CheckIfDbExists(conn, DatabseName))
+                {
+                    // database not exists
+                    WriteInfo($"Database '{DatabseName}' not exists creating ...");
+                    var dataPath = GetArgumentValueOrDefault<string>(ARG_PATH_CODE).Replace("|", ":");
+                    var initSize = GetArgumentValueOrDefault<int>(ARG_ISIZE_CODE);
+                    var growth = GetArgumentValueOrDefault<int>(ARG_GROWTH_CODE);
+                    var query = $"CREATE DATABASE {DatabseName} ON PRIMARY " +
+                                $"(NAME = {DatabseName}_Data, " +
+                                $"FILENAME = '{dataPath}\\{DatabseName}.mdf', " +
+                                $"SIZE = {initSize}MB, FILEGROWTH = {growth}%) " +
+                                $"LOG ON (NAME = {DatabseName}_Log, " +
+                                $"FILENAME = '{dataPath}\\{DatabseName}.ldf', " +
+                                $"SIZE = {initSize}MB, " +
+                                $"FILEGROWTH = {growth}%)";
+                    WriteDebugInfo("Using query: " + query);
+                    var resultExecute = conn.Execute(query);
+                    WriteDebugInfo($"Create script returns: {resultExecute}");
+                    if (resultExecute == 0)
+                        throw new Exception($"Database '{DatabseName}' creating FAILED.");
+                    WriteCaption($"Database '{DatabseName}' CREATED");
+
+
+                    using (var connDb = OpenConnection())
+                    {
+                        var script = Assembly.GetExecutingAssembly().GetEmbeddedFileContentAsString("BO.Console.Commands.Install.bo_create_schema.sql");
+                        WriteCaption($"Creating latest DB structure in '{DatabseName}'");
+                        resultExecute = conn.BatchExecute(script);
+                        WriteDebugInfo($"Deploy script returns: {resultExecute}");
+                        if (resultExecute == 0)
+                            throw new Exception($"Database '{DatabseName}' deploying FAILED.");
+
+                        var version = connDb.ExecuteScalar<string>(CommandType.Text, "select value from sys.extended_properties where NAME = 'BO_Version'");
+                        WriteCaption($"Database '{DatabseName}' updated to version '{version}'");
+                    }
+                }
+                else
+                {
+                    // database exists
+                    WriteCaption($"Database '{DatabseName}' exists. SKIPPING");
+                }
+            }
+            return result;
+        }
+        #endregion
+
+        #region *** Private operations ***
+
+
+        protected override IEnumerable<AbstractArgument> OnSetupArguments()
+        {
+            var arguments = new List<AbstractArgument>(base.OnSetupArguments());
+            arguments.Add(new NamedArgument(ARG_PATH_CODE, ARG_PATH_DESC, ARG_PATH_HINT, TypeValuesEnum.String, string.Empty, true));
+            arguments.Add(new NamedArgument(ARG_ISIZE_CODE, ARG_ISIZE_DESC, ARG_ISIZE_HINT, TypeValuesEnum.Integer, "10", false));
+            arguments.Add(new NamedArgument(ARG_GROWTH_CODE, ARG_GROWTH_DESC, ARG_GROWTH_HINT, TypeValuesEnum.Integer, "10", false));
+            return arguments;
+        }
+
+        #endregion
+    }
+}

+ 0 - 5
Console/Commands/Service/VersionCommand.cs

@@ -1,14 +1,9 @@
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
-using System.IO;
 using System.Linq;
-using System.Text;
-using System.Text.Json;
 using BO.AppServer.Metadata.Dto;
-using BO.Connector.Console;
 using BO.Console.Commands.Base;
-using BO.Console.Options;
 using Quadarax.Foundation.Core.QConsole;
 using Quadarax.Foundation.Core.QConsole.Argument;
 using Quadarax.Foundation.Core.QConsole.Attributes;

+ 16 - 0
Console/Console.csproj

@@ -8,9 +8,25 @@
     <LangVersion>default</LangVersion>
   </PropertyGroup>
 
+ 
+  <ItemGroup>
+    <None Remove="Scripts\bo_clear_data.sql" />
+    <None Remove="Scripts\bo_create_schema.sql" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <EmbeddedResource Include="Scripts\bo_clear_data.sql" />
+    <EmbeddedResource Include="Scripts\bo_create_schema.sql" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="System.Data.SqlClient" Version="4.8.3" />
+  </ItemGroup>
+
   <ItemGroup>
     <ProjectReference Include="..\AppServer\Connector.Console\Connector.Console.csproj" />
     <ProjectReference Include="..\AppServer\Metadata\Metadata.csproj" />
+    <ProjectReference Include="..\Common\qdr.fnd.core.data\qdr.fnd.core.data.csproj" />
     <ProjectReference Include="..\Common\qdr.fnd.core.qconsole\qdr.fnd.core.qconsole.csproj" />
     <ProjectReference Include="..\Common\qdr.fnd.core\qdr.fnd.core.csproj" />
   </ItemGroup>

+ 7 - 0
Console/Console.sln

@@ -19,6 +19,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "qdr.fnd.core.data.itfc", ".
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Connector", "..\AppServer\Connector\Connector.csproj", "{B43D53E6-1EE8-4FE9-B9C6-EC5C0E7C1150}"
 EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "qdr.fnd.core.data", "..\Common\qdr.fnd.core.data\qdr.fnd.core.data.csproj", "{67C3A455-D5EB-4DE9-AB04-197CB9EACAFD}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -53,6 +55,10 @@ Global
 		{B43D53E6-1EE8-4FE9-B9C6-EC5C0E7C1150}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{B43D53E6-1EE8-4FE9-B9C6-EC5C0E7C1150}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{B43D53E6-1EE8-4FE9-B9C6-EC5C0E7C1150}.Release|Any CPU.Build.0 = Release|Any CPU
+		{67C3A455-D5EB-4DE9-AB04-197CB9EACAFD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{67C3A455-D5EB-4DE9-AB04-197CB9EACAFD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{67C3A455-D5EB-4DE9-AB04-197CB9EACAFD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{67C3A455-D5EB-4DE9-AB04-197CB9EACAFD}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -64,6 +70,7 @@ Global
 		{CADFCBD6-1EA8-46CE-BD87-64D152399A08} = {AD700897-2943-432F-B103-E48D5BC3638D}
 		{E2A02B55-7C96-4535-A64E-E86E3E2B3B2A} = {AD700897-2943-432F-B103-E48D5BC3638D}
 		{B43D53E6-1EE8-4FE9-B9C6-EC5C0E7C1150} = {AD700897-2943-432F-B103-E48D5BC3638D}
+		{67C3A455-D5EB-4DE9-AB04-197CB9EACAFD} = {AD700897-2943-432F-B103-E48D5BC3638D}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {C514C82B-7C86-42D4-802E-0DECFE50CA8D}

+ 14 - 0
Console/Scripts/bo_clear_data.sql

@@ -0,0 +1,14 @@
+USE [BO]
+GO
+
+EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
+GO
+
+EXEC sp_msforeachtable "DELETE FROM ?"
+GO
+
+EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
+GO
+
+EXEC sp_msforeachtable "DBCC CHECKIDENT('?', RESEED, 1)"
+GO

+ 1246 - 0
Console/Scripts/bo_create_schema.sql

@@ -0,0 +1,1246 @@
+-- 18.8.2021 1.0.8
+-- Table User --------------------------
+--Defines User identity with statistics informations. Defines if user is enabled and/or user is system account also.
+CREATE TABLE [dbo].[User]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [IFReference] [varchar] (50) NOT NULL,
+    [Name] [nvarchar] (200) NOT NULL,
+    [LastLogged] [datetime] NULL,
+    [LastDisabled] [datetime] NULL,
+    [LastEnabled] [datetime] NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_User_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    [LangLCID] [int] NOT NULL CONSTRAINT DF_User_LangLCID DEFAULT 1033,
+    [IsSystem] [bit] NOT NULL CONSTRAINT DF_User_IsSystem DEFAULT 0,
+    [IsEnabled] [bit] NOT NULL CONSTRAINT DF_User_IsEnabled DEFAULT 0,
+    CONSTRAINT PK_USER_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'User primary key' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to Identity framework IdentityUser.Id' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'IFReference'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Full user name' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'Name'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp of user last successful login' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'LastLogged'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp of last user set to be disabled' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'LastDisabled'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp of last user set to be enabled' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'LastEnabled'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when user was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when user was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'LCID of preffered user language' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'LangLCID'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if user is system only account. Cannot log in.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'IsSystem'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if user can sign on' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'IsEnabled'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'User identity with properties' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User'
+GO
+
+-- Indexes of table User ------------------------------
+CREATE UNIQUE INDEX IDX_IFREFERENCE ON [dbo].[User]
+(IFReference) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
+GO
+
+CREATE UNIQUE INDEX IDX_USER_NAME ON [dbo].[User]
+(Name) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
+GO
+
+
+-- Table UserWorkspace --------------------------
+--Association between User and Workspace. Which Workspace is assigned to user.
+CREATE TABLE [dbo].[UserWorkspace]
+(
+    [UserId] [bigint] NOT NULL,
+    [WorkspaceId] [bigint] NOT NULL,
+    [IsDefault] [bit] NOT NULL CONSTRAINT DF_UserWorkspace_IsDefault DEFAULT 0
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserWorkspace', @level2type=N'COLUMN',@level2name=N'UserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to workspace record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserWorkspace', @level2type=N'COLUMN',@level2name=N'WorkspaceId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if relation is default' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserWorkspace', @level2type=N'COLUMN',@level2name=N'IsDefault'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Association between User and Workspace. Which Workspace is assigned to user.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserWorkspace'
+GO
+
+
+-- Table Workspace --------------------------
+--Main workspace root structure holds information about working space (set of documents) and their business plan
+CREATE TABLE [dbo].[Workspace]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [Name] [nvarchar] (200) NOT NULL,
+    [BillingInfoId] [bigint] NULL,
+    [BillingPlanId] [bigint] NOT NULL,
+    [APIKey] [uniqueidentifier] NOT NULL CONSTRAINT DF_Workspace_APIKey DEFAULT newid(),
+    [APIPassword] [nvarchar] (50) NOT NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_Workspace_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    [CreatedByUserId] [bigint] NOT NULL,
+    [ModifiedByUserId] [bigint] NULL,
+    [IsGold] [bit] NOT NULL CONSTRAINT DF_Workspace_IsGold DEFAULT 0,
+    CONSTRAINT PK_WORKSPACE_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Workspace primary key' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Workspace', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Workspace name' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Workspace', @level2type=N'COLUMN',@level2name=N'Name'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to current billing info record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Workspace', @level2type=N'COLUMN',@level2name=N'BillingInfoId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to current billing plan record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Workspace', @level2type=N'COLUMN',@level2name=N'BillingPlanId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'API Key for access to workspace via B2B interface' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Workspace', @level2type=N'COLUMN',@level2name=N'APIKey'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'API Key Password for access to workspace via B2B interface' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Workspace', @level2type=N'COLUMN',@level2name=N'APIPassword'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when workspace was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Workspace', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when workspace was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Workspace', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who created workspace' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Workspace', @level2type=N'COLUMN',@level2name=N'CreatedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who updated workspace' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Workspace', @level2type=N'COLUMN',@level2name=N'ModifiedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Define if workspace is GOLD mode (has custom billing plan)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Workspace', @level2type=N'COLUMN',@level2name=N'IsGold'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Main workspace root structure holds information about working space (set of documents) and their business plan' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Workspace'
+GO
+
+
+-- Table BillingInfo --------------------------
+--Workspace billing information for invoicing
+CREATE TABLE [dbo].[BillingInfo]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [WorkspaceId] [bigint] NOT NULL,
+    [SubjectName] [nvarchar] (200) NOT NULL,
+    [Address1] [nvarchar] (200) NOT NULL,
+    [Address2] [nvarchar] (200) NULL,
+    [City] [nvarchar] (100) NOT NULL,
+    [ZIP] [nvarchar] (20) NOT NULL,
+    [Country] [nvarchar] (50) NOT NULL,
+    [TaxNumber] [nvarchar] (20) NOT NULL,
+    [VATNumber] [nvarchar] (20) NULL,
+    [Phone] [nvarchar] (20) NULL,
+    [Email] [nvarchar] (20) NOT NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_BillingInfo_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    [CreatedByUserId] [bigint] NOT NULL,
+    [ModifiedByUserId] [bigint] NULL,
+    CONSTRAINT PK_BILLING_INFO_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of billing information record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to owning workspace' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'WorkspaceId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Subject name' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'SubjectName'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address line 1' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'Address1'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address line 2' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'Address2'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address city' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'City'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address ZIP' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'ZIP'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address country' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'Country'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Tax number' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'TaxNumber'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing VAT number' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'VATNumber'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing phone with format +XXXXXXXXX' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'Phone'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing email' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'Email'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing info was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing info was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who created billing info' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'CreatedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who updated billing info' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo', @level2type=N'COLUMN',@level2name=N'ModifiedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Workspace billing information for invoicing' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingInfo'
+GO
+
+
+-- Table Structure --------------------------
+--Abstract repository structure (folder-like) where documents are assignig
+CREATE TABLE [dbo].[Structure]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [Name] [nvarchar] (200) NOT NULL,
+    [WorkspaceId] [bigint] NOT NULL,
+    [ParentId] [bigint] NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_Structure_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    [CreatedByUserId] [bigint] NOT NULL,
+    [ModifiedByUserId] [bigint] NULL,
+    CONSTRAINT PK_STRUCTURE_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Structure primary key' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Structure', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Structure name' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Structure', @level2type=N'COLUMN',@level2name=N'Name'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to owning workspace' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Structure', @level2type=N'COLUMN',@level2name=N'WorkspaceId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to parent structure (folder). If null then record is root' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Structure', @level2type=N'COLUMN',@level2name=N'ParentId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when workspace was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Structure', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when workspace was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Structure', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who created workspace' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Structure', @level2type=N'COLUMN',@level2name=N'CreatedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who updated workspace' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Structure', @level2type=N'COLUMN',@level2name=N'ModifiedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Abstract repository structure (folder-like) where documents are assignig' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Structure'
+GO
+
+
+-- Table Metadocument --------------------------
+--Abstract single document header to process. Has setting parameters for computing and status
+CREATE TABLE [dbo].[Metadocument]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [StructureId] [bigint] NOT NULL,
+    [Name] [nvarchar] (200) NOT NULL,
+    [Status] [int] NOT NULL CONSTRAINT DF_Metadocument_Status DEFAULT 0,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_Metadocument_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    [LastDowloaded] [datetime] NULL,
+    [CreatedByUserId] [bigint] NOT NULL,
+    [ModifiedByUserId] [bigint] NULL,
+    [LastDownloadedByUserId] [bigint] NULL,
+    CONSTRAINT PK_METADOCUMENT_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of metadocument record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Metadocument', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to owning structure (workspace)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Metadocument', @level2type=N'COLUMN',@level2name=N'StructureId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Metadocument name' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Metadocument', @level2type=N'COLUMN',@level2name=N'Name'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Metadocument status' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Metadocument', @level2type=N'COLUMN',@level2name=N'Status'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when metadocument was created (uploaded)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Metadocument', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when metadocument was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Metadocument', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when metadocument was last downloaded' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Metadocument', @level2type=N'COLUMN',@level2name=N'LastDowloaded'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who created (uploaded) metadocument' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Metadocument', @level2type=N'COLUMN',@level2name=N'CreatedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who updated metadocument' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Metadocument', @level2type=N'COLUMN',@level2name=N'ModifiedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who last metadocument dowloaded' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Metadocument', @level2type=N'COLUMN',@level2name=N'LastDownloadedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Abstract single document header to process. Has setting parameters for computing and status' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Metadocument'
+GO
+
+
+-- Table StatusHistory --------------------------
+--Stores metadocument status changing log with messages
+CREATE TABLE [dbo].[StatusHistory]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [MetadocumentId] [bigint] NOT NULL,
+    [Status] [int] NOT NULL CONSTRAINT DF_StatusHistory_Status DEFAULT 0,
+    [Message] [nvarchar] (4000) NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_StatusHistory_Created DEFAULT getdate(),
+    [CreatedByUserId] [bigint] NOT NULL,
+    CONSTRAINT PK_STATUS_HISTORY_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of metadocument status history record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'StatusHistory', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to owning metadocument' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'StatusHistory', @level2type=N'COLUMN',@level2name=N'MetadocumentId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Metadocument status' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'StatusHistory', @level2type=N'COLUMN',@level2name=N'Status'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Status change message or error message. This value is optional.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'StatusHistory', @level2type=N'COLUMN',@level2name=N'Message'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when metadocument was created (uploaded)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'StatusHistory', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who created (uploaded) metadocument' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'StatusHistory', @level2type=N'COLUMN',@level2name=N'CreatedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Stores metadocument status changing log with messages' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'StatusHistory'
+GO
+
+
+-- Table Artifact --------------------------
+--Stores single part of metadocument (called artifact). Refresents fingle physical file included for processing.
+CREATE TABLE [dbo].[Artifact]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [MetadocumentId] [bigint] NOT NULL,
+    [Name] [nvarchar] (200) NOT NULL,
+    [Extension] [nvarchar] (10) NULL,
+    [MimeTypeId] [bigint] NOT NULL,
+    [Type] [int] NOT NULL CONSTRAINT DF_Artifact_Type DEFAULT 0,
+    [Length] [bigint] NOT NULL CONSTRAINT DF_Artifact_Length DEFAULT 0,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_Artifact_Created DEFAULT getdate(),
+    [CreatedByUserId] [bigint] NOT NULL,
+    CONSTRAINT PK_ARTIFACT_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of artifact record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Artifact', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to owning metadocument' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Artifact', @level2type=N'COLUMN',@level2name=N'MetadocumentId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Artifact file name without extension' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Artifact', @level2type=N'COLUMN',@level2name=N'Name'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Artifact file  extension' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Artifact', @level2type=N'COLUMN',@level2name=N'Extension'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to MIME Type enumeration' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Artifact', @level2type=N'COLUMN',@level2name=N'MimeTypeId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Defines type of artifact. 0 - Input, 1 - Output' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Artifact', @level2type=N'COLUMN',@level2name=N'Type'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Defines file content length in bytes' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Artifact', @level2type=N'COLUMN',@level2name=N'Length'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when artifact was created (uploaded)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Artifact', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who created (uploaded) artifact' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Artifact', @level2type=N'COLUMN',@level2name=N'CreatedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Stores single part of metadocument (called artifact). Refresents fingle physical file included for processing.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Artifact'
+GO
+
+
+-- Table MimeType --------------------------
+--MIME Types global enumeration. Defines file extension and MIME type association, This table is managed only with administrator.
+CREATE TABLE [dbo].[MimeType]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [MIMEType] [nvarchar] (500) NOT NULL,
+    [Extensions] [nvarchar] (500) NOT NULL,
+    [Description] [nvarchar] (200) NOT NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_MimeType_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    [CreatedByUserId] [bigint] NOT NULL,
+    [ModifiedByUserId] [bigint] NULL,
+    [IsEnabled] [bit] NOT NULL CONSTRAINT DF_MimeType_IsEnabled DEFAULT 0,
+    CONSTRAINT PK_MIMETYPE_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of MIMEType record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MimeType', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'MIMEType code' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MimeType', @level2type=N'COLUMN',@level2name=N'MIMEType'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Extensions for mime type separated by semicolomn (example cad; cat; txt)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MimeType', @level2type=N'COLUMN',@level2name=N'Extensions'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Short description of MIMEType' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MimeType', @level2type=N'COLUMN',@level2name=N'Description'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when metadocument was created (uploaded)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MimeType', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when metadocument was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MimeType', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who created (uploaded) metadocument' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MimeType', @level2type=N'COLUMN',@level2name=N'CreatedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who updated metadocument' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MimeType', @level2type=N'COLUMN',@level2name=N'ModifiedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if record is active, otherwise shuld be delete' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MimeType', @level2type=N'COLUMN',@level2name=N'IsEnabled'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'MIME Types global enumeration. Defines file extension and MIME type association, This table is managed only with administrator.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MimeType'
+GO
+
+
+-- Table Tag --------------------------
+--Declares tag for workspace scope. Tag is used on metadocument.
+CREATE TABLE [dbo].[Tag]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [WorkspaceId] [bigint] NOT NULL,
+    [Name] [nvarchar] (50) NOT NULL,
+    [RGB] [varchar] (50) NOT NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_Tag_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    [CreatedByUserId] [bigint] NOT NULL,
+    [ModifiedByUserId] [bigint] NULL,
+    CONSTRAINT PK_TAG_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of tag record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tag', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to owning workspace' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tag', @level2type=N'COLUMN',@level2name=N'WorkspaceId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Tag name' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tag', @level2type=N'COLUMN',@level2name=N'Name'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Tag color in RGB format' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tag', @level2type=N'COLUMN',@level2name=N'RGB'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing info was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tag', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing info was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tag', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who created billing info' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tag', @level2type=N'COLUMN',@level2name=N'CreatedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who updated billing info' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tag', @level2type=N'COLUMN',@level2name=N'ModifiedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Declares tag for workspace scope. Tag is used on metadocument.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tag'
+GO
+
+
+-- Table MetadocumentTag --------------------------
+--Association of metadocument and tag
+CREATE TABLE [dbo].[MetadocumentTag]
+(
+    [MetadocumentId] [bigint] NOT NULL,
+    [TagId] [bigint] NOT NULL
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to owning metadocument' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentTag', @level2type=N'COLUMN',@level2name=N'MetadocumentId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to Tag' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentTag', @level2type=N'COLUMN',@level2name=N'TagId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Association of metadocument and tag' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentTag'
+GO
+
+
+-- Table BillingPlan --------------------------
+--Defines global Billing plan strategies (how to bill document processing in workspace). This table is managed only with administrator.
+CREATE TABLE [dbo].[BillingPlan]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [Name] [nvarchar] (200) NOT NULL,
+    [Code] [nvarchar] (10) NOT NULL,
+    [Description] [nvarchar] (200) NOT NULL,
+    [PSTInitialCredits] [int] NOT NULL,
+    [PSTCreditsPerItem] [int] NOT NULL,
+    [PSTWatermark] [bit] NOT NULL CONSTRAINT DF_BillingPlan_PSTWatermark DEFAULT 0,
+    [PSTQuality] [int] NOT NULL CONSTRAINT DF_BillingPlan_PSTQuality DEFAULT 0,
+    [PSTProcessProfile] [varchar] (5) NULL,
+    [PSTTest] [bit] NOT NULL CONSTRAINT DF_BillingPlan_PSTTest DEFAULT 0,
+    [Price] [decimal] NOT NULL CONSTRAINT DF_BillingPlan_Price DEFAULT 0,
+    [Currency] [varchar] (3) NOT NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_BillingPlan_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    [CreatedByUserId] [bigint] NOT NULL,
+    [ModifiedByUserId] [bigint] NULL,
+    [IsCustom] [bit] NOT NULL CONSTRAINT DF_BillingPlan_IsCustom DEFAULT 0,
+    [IsHidden] [bit] NOT NULL CONSTRAINT DF_BillingPlan_IsHidden DEFAULT 0,
+    [IsEnabled] [bit] NOT NULL CONSTRAINT DF_BillingPlan_IsEnabled DEFAULT 0,
+    CONSTRAINT PK_BILLINGPLAN_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of BillingPlan record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing plan name' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'Name'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing plan short code' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'Code'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing plan short description' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'Description'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Preset - initial credit amount' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'PSTInitialCredits'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Preset - single item credit cost' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'PSTCreditsPerItem'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Preset - watermarked' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'PSTWatermark'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Preset - process quality 0 = lowest' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'PSTQuality'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Preset - processing profile code' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'PSTProcessProfile'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Preset - testing mode' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'PSTTest'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing plan price' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'Price'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing plan price currency' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'Currency'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when metadocument was created (uploaded)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when metadocument was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who created (uploaded) metadocument' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'CreatedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who updated metadocument' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'ModifiedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if billing plan is custom dependent' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'IsCustom'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if billing plan is private for use, only SuperAdmin can use it' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'IsHidden'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if record is active, otherwise shuld be delete' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan', @level2type=N'COLUMN',@level2name=N'IsEnabled'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Defines global Billing plan strategies (how to bill document processing in workspace). This table is managed only with administrator.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BillingPlan'
+GO
+
+
+-- Table MetadocumentBilling --------------------------
+--Association of metadocument and billing plan
+CREATE TABLE [dbo].[MetadocumentBilling]
+(
+    [MetadocumentId] [bigint] NULL,
+    [WorkspaceBillingId] [bigint] NOT NULL,
+    [CreditCost] [int] NOT NULL CONSTRAINT DF_MetadocumentBilling_CreditCost DEFAULT 0,
+    [Watermark] [bit] NOT NULL CONSTRAINT DF_MetadocumentBilling_Watermark DEFAULT 0,
+    [Quality] [int] NOT NULL CONSTRAINT DF_MetadocumentBilling_Quality DEFAULT 0,
+    [ProcessProfile] [varchar] (5) NULL,
+    [Test] [bit] NOT NULL CONSTRAINT DF_MetadocumentBilling_Test DEFAULT 0,
+    [Procesed] [datetime] NULL,
+    [ProcessStart] [datetime] NULL,
+    [Downloaded] [datetime] NULL,
+    [ProcessState] [int] NOT NULL,
+    [PSInstance] [varchar] (100) NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_MetadocumentBilling_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to owning metadocument' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'MetadocumentId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to workspace billing plan' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'WorkspaceBillingId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Numeric value of billing plan spending. Depends on BillingPlan.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'CreditCost'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if watermarked' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'Watermark'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Process quality 0 = lowest' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'Quality'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Processing profile code' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'ProcessProfile'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if testing mode' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'Test'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when document was processed' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'Procesed'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when document set to processing state' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'ProcessStart'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when document was last downloaded' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'Downloaded'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Last state of processing (OK,Fail)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'ProcessState'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Process server instance identifier' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'PSInstance'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Association of metadocument and billing plan with properties. Stores information about processed documents (name, status timestamps, etc.) relates to workspace billing plan selection.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MetadocumentBilling'
+GO
+
+
+-- Table WorkspaceBilling --------------------------
+--Deffines current state of billing plan for workspace
+CREATE TABLE [dbo].[WorkspaceBilling]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [WorkspaceId] [bigint] NOT NULL,
+    [BillingPlanId] [bigint] NOT NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_WorkspaceBilling_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    [ValueNumber] [decimal] (16,4) NOT NULL CONSTRAINT DF_WorkspaceBilling_ValueNumber DEFAULT 0,
+    [ValueDate] [datetime] NULL,
+    [CustomPSTInitialCredits] [int] NOT NULL,
+    [CustomPSTCreditsPerItem] [int] NOT NULL,
+    [CustomPSTWatermark] [bit] NOT NULL CONSTRAINT DF_WorkspaceBilling_CustomPSTWatermark DEFAULT 0,
+    [CustomPSTQuality] [int] NOT NULL CONSTRAINT DF_WorkspaceBilling_CustomPSTQuality DEFAULT 0,
+    [CustomPSTProcessProfile] [varchar] (5) NULL,
+    [CustomPSTTest] [bit] NOT NULL CONSTRAINT DF_WorkspaceBilling_CustomPSTTest DEFAULT 0,
+    CONSTRAINT PK_WORKSPACE_BILLINGPLAN_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of WorkspaceBilling record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to owning workspace' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'WorkspaceId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to billing plan' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'BillingPlanId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Numeric value of billing plan spending. Depends on BillingPlan.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'ValueNumber'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'DateTime value of billing plan spending. Depends on BillingPlan' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'ValueDate'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Custom Preset Override - initial credit amount' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'CustomPSTInitialCredits'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Custom Preset Override - single item credit cost' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'CustomPSTCreditsPerItem'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Custom Preset Override - watermarked' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'CustomPSTWatermark'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Custom Preset Override - process quality 0 = lowest' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'CustomPSTQuality'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Custom Preset Override - processing profile code' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'CustomPSTProcessProfile'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Custom Preset Override - testing mode' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling', @level2type=N'COLUMN',@level2name=N'CustomPSTTest'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Deffines current state of billing plan for workspace' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'WorkspaceBilling'
+GO
+
+
+-- Table Invoice --------------------------
+--Stores invoice information of Workspace BusinessPlan 
+CREATE TABLE [dbo].[Invoice]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [WorkspaceId] [bigint] NOT NULL,
+    [InvoiceIssuerId] [bigint] NOT NULL,
+    [Code] [varchar] (12) NOT NULL,
+    [SubjectName] [nvarchar] (200) NOT NULL,
+    [Address1] [nvarchar] (200) NOT NULL,
+    [Address2] [nvarchar] (200) NULL,
+    [City] [nvarchar] (100) NOT NULL,
+    [ZIP] [nvarchar] (20) NOT NULL,
+    [Country] [nvarchar] (50) NOT NULL,
+    [TaxNumber] [nvarchar] (20) NOT NULL,
+    [VATNumber] [nvarchar] (20) NULL,
+    [Phone] [nvarchar] (20) NULL,
+    [Email] [nvarchar] (20) NOT NULL,
+    [TotalBasePrice] [decimal] (16,4) NOT NULL CONSTRAINT DF_Invoice_TotalBasePrice DEFAULT 0,
+    [TotalBaseCurrency] [varchar] (3) NOT NULL,
+    [Channel] [nvarchar] (20) NOT NULL,
+    [ChannelReference] [nvarchar] (50) NOT NULL,
+    [DueDate] [datetime] NOT NULL,
+    [TaxDate] [datetime] NOT NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_Invoice_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    [CreatedByUserId] [bigint] NOT NULL,
+    [ModifiedByUserId] [bigint] NULL,
+    CONSTRAINT PK_INVOICE_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of invoice record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to owning workspace' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'WorkspaceId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to invoice issuer record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'InvoiceIssuerId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Invoice number' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'Code'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Subject name' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'SubjectName'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address line 1' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'Address1'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address line 2' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'Address2'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address city' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'City'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address ZIP' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'ZIP'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address country' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'Country'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Tax number' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'TaxNumber'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing VAT number' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'VATNumber'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing phone with format +XXXXXXXXX' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'Phone'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing email' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'Email'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Total base price (w/o VAT)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'TotalBasePrice'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Total base price currency (w/o VAT)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'TotalBaseCurrency'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Pay channel' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'Channel'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Pay channel reference (account number)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'ChannelReference'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Due date' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'DueDate'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Tax date' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'TaxDate'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing info was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing info was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who created billing info' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'CreatedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who updated billing info' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice', @level2type=N'COLUMN',@level2name=N'ModifiedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Stores invoice information of Workspace BusinessPlan ' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Invoice'
+GO
+
+
+-- Table InvoiceItem --------------------------
+CREATE TABLE [dbo].[InvoiceItem]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [InvoiceId] [bigint] NOT NULL,
+    [BillingPlanId] [bigint] NOT NULL,
+    [BillingPlanCode] [nvarchar] (10) NOT NULL,
+    [UnitQuantity] [int] NOT NULL CONSTRAINT DF_InvoiceItem_UnitQuantity DEFAULT 1,
+    [UnitBasePrice] [decimal] (16,4) NOT NULL CONSTRAINT DF_InvoiceItem_UnitBasePrice DEFAULT 0,
+    [UnitBaseCurrency] [varchar] (3) NOT NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_InvoiceItem_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    [CreatedByUserId] [bigint] NOT NULL,
+    [ModifiedByUserId] [bigint] NULL,
+    CONSTRAINT PK_INVOICE_ITEM PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of invoice item record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceItem', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to owning invoice' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceItem', @level2type=N'COLUMN',@level2name=N'InvoiceId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to billing plan' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceItem', @level2type=N'COLUMN',@level2name=N'BillingPlanId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing plan short code' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceItem', @level2type=N'COLUMN',@level2name=N'BillingPlanCode'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Unit quantity' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceItem', @level2type=N'COLUMN',@level2name=N'UnitQuantity'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Unit base price (w/o VAT)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceItem', @level2type=N'COLUMN',@level2name=N'UnitBasePrice'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Unit base price currency (w/o VAT)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceItem', @level2type=N'COLUMN',@level2name=N'UnitBaseCurrency'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing info was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceItem', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing info was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceItem', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who created billing info' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceItem', @level2type=N'COLUMN',@level2name=N'CreatedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who updated billing info' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceItem', @level2type=N'COLUMN',@level2name=N'ModifiedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Invoice item' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceItem'
+GO
+
+
+-- Table InvoiceIssuer --------------------------
+--Defines information about Invoice Issuer and its contacts information (used in invoice header)
+CREATE TABLE [dbo].[InvoiceIssuer]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [SubjectName] [nvarchar] (200) NOT NULL,
+    [Address1] [nvarchar] (200) NOT NULL,
+    [Address2] [nvarchar] (200) NULL,
+    [City] [nvarchar] (100) NOT NULL,
+    [ZIP] [nvarchar] (20) NOT NULL,
+    [Country] [nvarchar] (50) NOT NULL,
+    [TaxNumber] [nvarchar] (20) NOT NULL,
+    [VATNumber] [nvarchar] (20) NULL,
+    [Phone] [nvarchar] (20) NULL,
+    [Email] [nvarchar] (20) NOT NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_InvoiceIssuer_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    [CreatedByUserId] [bigint] NOT NULL,
+    [ModifiedByUserId] [bigint] NULL,
+    [IsEnabled] [bit] NOT NULL CONSTRAINT DF_InvoiceIssuer_IsEnabled DEFAULT 0,
+    CONSTRAINT PK_INVOICE_ISSUER PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of invoice issuer record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Subject name' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'SubjectName'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address line 1' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'Address1'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address line 2' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'Address2'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address city' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'City'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address ZIP' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'ZIP'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Address country' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'Country'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing Tax number' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'TaxNumber'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing VAT number' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'VATNumber'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing phone with format +XXXXXXXXX' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'Phone'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Billing email' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'Email'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing info was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing info was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who created billing info' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'CreatedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to user who updated billing info' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'ModifiedByUserId'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if record is enabled' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer', @level2type=N'COLUMN',@level2name=N'IsEnabled'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Defines information about Invoice Issuer and its contacts information (used in invoice header)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'InvoiceIssuer'
+GO
+
+
+-- Table Statistic --------------------------
+CREATE TABLE [dbo].[Statistic]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [Year] [int] NOT NULL,
+    [Month] [int] NOT NULL,
+    [Day] [int] NOT NULL,
+    [UserNewCnt] [int] NOT NULL,
+    [UserLoginCnt] [int] NOT NULL,
+    [UserLoginB2BCnt] [int] NOT NULL,
+    [UserTotalCnt] [int] NOT NULL,
+    [WorkspaceNewCnt] [int] NOT NULL,
+    [WorkspaceTotalCnt] [int] NOT NULL,
+    [InvoiceNewCnt] [int] NOT NULL,
+    [DocumentNewCnt] [int] NOT NULL,
+    [DocumentFailedCnt] [int] NOT NULL,
+    [DocumentDownloadedCnt] [int] NOT NULL,
+    [DocumentTotalCnt] [int] NOT NULL,
+    [DocumentProcessedCnt] [int] NOT NULL,
+    [PSActiveCnt] [int] NOT NULL,
+    [YieldWorthSum] [decimal] (16,4) NOT NULL,
+    [YieldWorthCurrency] [varchar] (3) NOT NULL,
+    [YieldWorthTotalSum] [decimal] (16,4) NOT NULL,
+    [YieldWorthTotalCurrency] [varchar] (3) NOT NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_Statistic_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    CONSTRAINT PK_STA_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of Statistic record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Year number' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'Year'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Month number' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'Month'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Day number' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'Day'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of new created users' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'UserNewCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of logged users (incl B2B)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'UserLoginCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of logged B2B users' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'UserLoginB2BCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of all users (incl system)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'UserTotalCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of new created workspaces' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'WorkspaceNewCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of all workspaces' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'WorkspaceTotalCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of new created invoices' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'InvoiceNewCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of new created/uploaded documents' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'DocumentNewCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of failed documents' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'DocumentFailedCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of downloaded documents' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'DocumentDownloadedCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of all available documents' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'DocumentTotalCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of processed documents' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'DocumentProcessedCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of active ProcessServer instances' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'PSActiveCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'sum of daily yield worth' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'YieldWorthSum'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'currency code of yieldworth' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'YieldWorthCurrency'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'sum of daily yield worth' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'YieldWorthTotalSum'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'currency code of yieldworth' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'YieldWorthTotalCurrency'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing info was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when billing info was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Holds statistics information on daily base' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Statistic'
+GO
+
+-- Indexes of table Statistic ------------------------------
+CREATE UNIQUE INDEX IDX_DATE ON [dbo].[Statistic]
+(Year,Month,Day) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
+GO
+
+
+-- Table Registration --------------------------
+CREATE TABLE [dbo].[Registration]
+(
+    [Id] [bigint] NOT NULL IDENTITY (1, 1),
+    [PSInstance] [varchar] (100) NULL,
+    [LocationIP] [varchar] (100) NULL,
+    [LastActivity] [datetime] NULL,
+    [DocumentProcessedCnt] [int] NOT NULL,
+    [DocumentFailedCnt] [int] NOT NULL,
+    [Created] [datetime] NOT NULL CONSTRAINT DF_Registration_Created DEFAULT getdate(),
+    [Modified] [datetime] NULL,
+    CONSTRAINT OK_REGISTRATION_ID PRIMARY KEY (Id)	
+)
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key of Registration record' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Registration', @level2type=N'COLUMN',@level2name=N'Id'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Process server instance identifier' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Registration', @level2type=N'COLUMN',@level2name=N'PSInstance'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Process server instance identifier' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Registration', @level2type=N'COLUMN',@level2name=N'LocationIP'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp latest activity' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Registration', @level2type=N'COLUMN',@level2name=N'LastActivity'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of new processed documents' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Registration', @level2type=N'COLUMN',@level2name=N'DocumentProcessedCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'# of failed documents' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Registration', @level2type=N'COLUMN',@level2name=N'DocumentFailedCnt'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when registration was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Registration', @level2type=N'COLUMN',@level2name=N'Created'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when registration was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Registration', @level2type=N'COLUMN',@level2name=N'Modified'
+GO
+
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Holds Process Server registrations' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Registration'
+GO
+
+
+
+-- References for UserWorkspace --------------------------
+ALTER TABLE [dbo].[UserWorkspace]
+ADD 
+    CONSTRAINT REL_UserWorkspace_User FOREIGN KEY (UserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_UserWorkspace_Workspace FOREIGN KEY (WorkspaceId) REFERENCES [dbo].[Workspace] (Id)
+GO
+
+-- References for Workspace --------------------------
+ALTER TABLE [dbo].[Workspace]
+ADD 
+    CONSTRAINT REL_Workspace_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_Workspace_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_Workspace_BillingInfo FOREIGN KEY (BillingInfoId) REFERENCES [dbo].[BillingInfo] (Id)
+GO
+
+-- References for BillingInfo --------------------------
+ALTER TABLE [dbo].[BillingInfo]
+ADD 
+    CONSTRAINT REL_BillingInfo_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_BillingInfo_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_BillingInfo_Workspace FOREIGN KEY (WorkspaceId) REFERENCES [dbo].[Workspace] (Id)
+GO
+
+-- References for Structure --------------------------
+ALTER TABLE [dbo].[Structure]
+ADD 
+    CONSTRAINT REL_Structure_Workspace FOREIGN KEY (WorkspaceId) REFERENCES [dbo].[Workspace] (Id), 
+    CONSTRAINT REL_Structure_Structure_Parent FOREIGN KEY (ParentId) REFERENCES [dbo].[Structure] (Id)
+GO
+
+-- References for Metadocument --------------------------
+ALTER TABLE [dbo].[Metadocument]
+ADD 
+    CONSTRAINT REL_Metadocument_Structure FOREIGN KEY (StructureId) REFERENCES [dbo].[Structure] (Id), 
+    CONSTRAINT REL_Metadocument_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_Metadocument_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_Metadocument_User_Downloaded FOREIGN KEY (LastDownloadedByUserId) REFERENCES [dbo].[User] (Id)
+GO
+
+-- References for StatusHistory --------------------------
+ALTER TABLE [dbo].[StatusHistory]
+ADD 
+    CONSTRAINT REL_StatusHistory_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_StatusHistory_Metadocument FOREIGN KEY (MetadocumentId) REFERENCES [dbo].[Metadocument] (Id)
+GO
+
+-- References for Artifact --------------------------
+ALTER TABLE [dbo].[Artifact]
+ADD 
+    CONSTRAINT REL_Artifact_Metadocument FOREIGN KEY (MetadocumentId) REFERENCES [dbo].[Metadocument] (Id), 
+    CONSTRAINT REL_Artifact_MimeType FOREIGN KEY (MimeTypeId) REFERENCES [dbo].[MimeType] (Id), 
+    CONSTRAINT REL_Artifact_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id)
+GO
+
+-- References for MimeType --------------------------
+ALTER TABLE [dbo].[MimeType]
+ADD 
+    CONSTRAINT REL_MimeType_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_MimeType_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id)
+GO
+
+-- References for Tag --------------------------
+ALTER TABLE [dbo].[Tag]
+ADD 
+    CONSTRAINT REL_Tag_Workspace FOREIGN KEY (WorkspaceId) REFERENCES [dbo].[Workspace] (Id), 
+    CONSTRAINT REL_Tag_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_Tag_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id)
+GO
+
+-- References for MetadocumentTag --------------------------
+ALTER TABLE [dbo].[MetadocumentTag]
+ADD 
+    CONSTRAINT REL_MetadocumentTag_Metadocument FOREIGN KEY (MetadocumentId) REFERENCES [dbo].[Metadocument] (Id), 
+    CONSTRAINT REL_MetadocumentTag_Tag FOREIGN KEY (TagId) REFERENCES [dbo].[Tag] (Id)
+GO
+
+-- References for BillingPlan --------------------------
+ALTER TABLE [dbo].[BillingPlan]
+ADD 
+    CONSTRAINT REL_BillingPlan_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_BillingPlan_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id)
+GO
+
+-- References for MetadocumentBilling --------------------------
+ALTER TABLE [dbo].[MetadocumentBilling]
+ADD 
+    CONSTRAINT REL_MetadocumentBilling_Metadocument FOREIGN KEY (MetadocumentId) REFERENCES [dbo].[Metadocument] (Id), 
+    CONSTRAINT REL_MetadocumentBilling_WorkspaceBilling FOREIGN KEY (WorkspaceBillingId) REFERENCES [dbo].[WorkspaceBilling] (Id)
+GO
+
+-- References for WorkspaceBilling --------------------------
+ALTER TABLE [dbo].[WorkspaceBilling]
+ADD 
+    CONSTRAINT REL_WorkspaceBilling_Workspace FOREIGN KEY (WorkspaceId) REFERENCES [dbo].[Workspace] (Id), 
+    CONSTRAINT REL_WorkspaceBilling_BillingPlan FOREIGN KEY (BillingPlanId) REFERENCES [dbo].[BillingPlan] (Id)
+GO
+
+-- References for Invoice --------------------------
+ALTER TABLE [dbo].[Invoice]
+ADD 
+    CONSTRAINT REL_Invoice_InvoiceIssuer FOREIGN KEY (InvoiceIssuerId) REFERENCES [dbo].[InvoiceIssuer] (Id), 
+    CONSTRAINT REL_Invoice_Workspace FOREIGN KEY (WorkspaceId) REFERENCES [dbo].[Workspace] (Id), 
+    CONSTRAINT REL_Invoice_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_Invoice_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id)
+GO
+
+-- References for InvoiceItem --------------------------
+ALTER TABLE [dbo].[InvoiceItem]
+ADD 
+    CONSTRAINT REL_InvoiceItem_Invoice FOREIGN KEY (InvoiceId) REFERENCES [dbo].[Invoice] (Id), 
+    CONSTRAINT REL_InvoiceItem_BillingPlan FOREIGN KEY (BillingPlanId) REFERENCES [dbo].[BillingPlan] (Id), 
+    CONSTRAINT REL_InvoiceItem_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_InvoiceItem_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id)
+GO
+
+-- References for InvoiceIssuer --------------------------
+ALTER TABLE [dbo].[InvoiceIssuer]
+ADD 
+    CONSTRAINT REL_InvoiceIssuer_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_InvoiceIssuer_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id)
+GO
+
+EXEC sys.sp_updateextendedproperty @name=N'BO_Version', @value=N'1.0.8'
+GO