/// <summary>
        /// Deletes the database.
        /// </summary>
        /// <param name="recreate">
        /// if set to <c>true</c> [recreate].
        /// </param>
        /// <returns>
        /// The <see cref="bool"/>.
        /// </returns>
        public bool DeleteDatabase(bool recreate)
        {
            var platform = SimpleIoc.Default.GetInstance <IPlatformService>();

            if (!platform.StorageProvider.FileExists(this.databaseFilename))
            {
                return(false);
            }

            if (this.DatabaseInstance != null)
            {
                this.DatabaseInstance.Dispose();
                this.DatabaseInstance = null;
            }

            Exception error;

            platform.StorageProvider.TryDelete(this.databaseFilename, out error);
            if (!recreate)
            {
                return(true);
            }

            this.DatabaseInstance = CRMDatabase.Create(this.isUpdateCrm, this.databaseFilename);
            if (ConfigurationUnitStore.DefaultStore.ConfigValueIsSetDefaultValue("System.DisplayFixCatBySortInfo", true))
            {
                this.DatabaseInstance.FixedCatSortBySortInfoAndCode = true;
            }

            this.Reps = new UPCRMReps();
            return(true);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="UPCRMDataStore"/> class.
        /// </summary>
        /// <param name="baseDirectoryPath">
        /// The base directory path.
        /// </param>
        /// <param name="fileName">
        /// Name of the file.
        /// </param>
        /// <param name="recreate">
        /// if set to <c>true</c> [recreate].
        /// </param>
        /// <param name="isUpdateCrm">
        /// if set to <c>true</c> [is update CRM].
        /// </param>
        /// <param name="configStore">
        /// The configuration store.
        /// </param>
        public UPCRMDataStore(
            string baseDirectoryPath,
            string fileName,
            bool recreate,
            bool isUpdateCrm,
            IConfigurationUnitStore configStore)
        {
            this.BaseDirectoryPath = baseDirectoryPath;
            this.isUpdateCrm       = isUpdateCrm;
            this.databaseFilename  = Path.Combine(this.BaseDirectoryPath, fileName);
            if (recreate)
            {
                var platformService = SimpleIoc.Default.GetInstance <IPlatformService>();
                if (platformService.StorageProvider.FileExists(this.databaseFilename))
                {
                    Exception error = null;

                    platformService.StorageProvider.TryDelete(databaseFilename, out error);
                    if (error != null)
                    {
                        Logger.LogError(error);
                    }
                }
            }

            var db = CRMDatabase.Create(isUpdateCrm, this.databaseFilename);

            this.DatabaseInstance = db;
            if (configStore.ConfigValueIsSetDefaultValue("System.DisplayFixCatBySortInfo", true))
            {
                this.DatabaseInstance.FixedCatSortBySortInfoAndCode = true;
            }

            if (recreate && !this.UpdateDDL())
            {
                return;
            }

            this.AddVirtualLinks();
            this.Reps = new UPCRMReps();

            this.VirtualInfoAreaCache = new UPVirtualInfoAreaCache();
            this.Disable86326         = configStore.ConfigValueIsSet("Disable.86326");
        }
        /// <summary>
        /// Undoes the record.
        /// </summary>
        /// <param name="record">The record.</param>
        /// <returns></returns>
        public int UndoRecord(UPCRMRecord record)
        {
            CRMDatabase database = this.DatabaseInstance;
            Record      rec      = this.CreateRecord(record, true);

            if (rec == null)
            {
                return(-1);
            }

            database.BeginTransaction();
            int ret = rec.Update();

            if (ret == 0 && !this.Disable86326)
            {
                this.UpdateParticipantsTablesForRecord(rec, database);
            }

            database.Commit();
            return(ret);
        }
        /// <summary>
        /// Saves the record rollback request nr.
        /// </summary>
        /// <param name="record">The record.</param>
        /// <param name="requestNr">The request nr.</param>
        /// <returns></returns>
        public int SaveRecordRollbackRequestNr(UPCRMRecord record, int requestNr)
        {
            CRMDatabase database = this.DatabaseInstance;
            Record      rec      = this.CreateRecord(record);

            if (rec == null)
            {
                return(-1);
            }

            database.BeginTransaction();
            int ret = rec.InsertOrUpdate();

            if (ret == 0 && !this.Disable86326)
            {
                this.UpdateParticipantsTablesForRecord(rec, database);
            }

            database.Commit();
            return(ret);
        }