Требования к демо-версии
Glossary Item Box
Общие сведения
Цель демоверсии — предоставить возможность пользователям увидеть результат работы решения в системе.
Демоверсия решения представляет собой набор демоданных, привязанных в отдельный пакет, который зависит только от пакета решения. Для СНГ и Глобал Marketplace создаются отдельные пакеты демоданных с русским и английским наполнением.
Рекомендованный алгоритм создания демоверсии:
- Развернуть чистую минимальную совместимую сборку Creatio без демо-данных (например, с установленным русским языком).
- Установить пакет решения (например, LabReports).
- Создать пакет с названием вида Название пакета + Demo (например, LabReports_Demo). Выбрать в зависимостях пакет установленного решения.
- Наполнить разделы и справочники демоданными, привязать все в созданный пакет, выполнить дополнительные настройки сортировки для корректного отображения данных (согласно инструкциям ниже).
- Выгрузить готовый пакет из системы.
Аналогичный алгоритм выполнить на отдельной сборке с установленным английским языком.
После выгрузки пакет необходимо обязательно протестировать на полноту и корректность данных на отдельной чистой сборке, установив пакет решения и пакет с демоданными. По результату успешного тестирования пакет с демоданными направляется команде Marketplace.
Например, для решения Advanced excel reports for Creatio необходимо заполнить в системе:
- Записи в разделе [Конструктор отчетов]. При добавлении записей формировать различные комбинации заполнения основных полей объекта (например, [Заголовок в отчете], [Формат вывода отчета], [Начинать со строки], [Создавать заголовки колонок]).
- Для нескольких записей заполнить все детали (например, [Пользовательские фильтры], [Колонки отчета], [Отчеты в разделе], [История формирования отчета]).
- Для одной из заполненных записей добавить шаблонный файл.
- Выполнить импорт отчетов, заполнив при этом записи в блоке [Уведомления].
Основные определения:
- Softkey-данные — примеры заполнения объектов системы, которые добавляются в основной пакет решения. Такие данные создаются на английском языке с добавлением (sample) в названиях записей.
- Демоданные — примеры заполнения объектов системы, которые создаются в отдельном пакете, зависящем от основного пакета решения.
- Эталонные записи — записи в разделах, максимально полно заполнены демоданными. Эталонными считаются первые три записи в каждом разделе.
Полезные ссылки по привязке данных к пакету:
Автор записей:
- Все данные создаются от имени одного демопользователя с привязкой по Id пользователя;
- в русскоязычной сборке: Мирный Евгений — dad159f3-6c2d-446a-98d2-0f4d26662bbe;
- в англоязычной сборке: John Best — 76929f8c-7e15-4c64-bdb0-adc62d383727.
Сортировка и сохранение сортировки:
- Сортировка записей в разделе устанавливается так, чтобы вверху страницы были эталонные записи. Если эталонные записи не выбраны/не заполнены, можно сначала выбрать сортировку, а затем заполнять эталонные записи.
- После установки нужной сортировки нужно по кнопке [Вид] открыть настройку колонок и, нажав на стрелку на кнопке [Сохранить], выбрать пункт [Сохранить для всех пользователей].
- Нужную запись можно отыскать по значению Key, которое будет соответствовать схеме, для которой установлена сортировка. Ее можно посмотреть в URL. Например, для раздела [Договоры] сортировка сохранится в записи с Key=ContractSectionV2GridSettingsGridDataView. После сохранения для всех пользователей там будет ContactId=NULL.
Специфическую/заданную нами сортировку необходимо сохранять по вышеуказанному алгоритму. Сортировка демоданных отменяет сортировку в softkey-данных, имеющихся в схемах.
Наполнение разделов:
- Количество записей в разделах должно быть достаточным, чтобы покрывать экран и давать данные для красивой аналитики (в среднем, 20).
- Необходимо следить, чтобы количество записей в таблице не превышало 1000.
- Первые три записи в разделе (эталонные) должны быть заполнены максимально.
Справочники
- Перед наполнением разделов нужно проверить и обновить наполнение справочников.
- Наполнение справочников может быть softkey (привязывается к основному пакету решения) и демо.
- В справочниках не допускается дублирование записей.
Содержание записей
- Записи должны содержать последовательную и непротиворечивую информацию.
- Записи разделов не должны быть однотипными. Разнообразие записей отображается в группах и в аналитике.
- Записи должны быть логически связаны с другими записями (рекомендуется наполнять «цепочками», а не по разделам).
- Наполняются не только записи в разделах, но и записи в ленте, напоминания, уведомления, email-сообщения, комментарии, лайки и т.п.
- Все демоданные имеют позитивный посыл. Даже обращение в сервисную службу с категорией "жалоба" не должно нести ярко выраженной негативной окраски.
Даты записей
- Множество записей системы содержат поле даты.
- Чтобы информация не устаревала, используется скрипт сдвига дат, который отталкивается от даты актуализации демонаполнения (указывается в системной настройке с кодом [ActualizedDemoDate]).
- При создании демонаполнения даты нужно изменять, ориентируясь на дату, указанную в системной настройке.
- Например, если дата актуализации 11.01.2019, то при актуализации скрипт перезаписывает дату 11.01.2019 в демонаполнении текущей датой выполнения скрипта, дату 10.01.2019 – вчерашним днем и т.п. А запись, у которой в демонаполнении указана дата 11.05.2019, после сдвига дат окажется в будущем, на 4 месяца позже текущей даты выполнения скрипта.
- Даты могут добавляться автоматически при сохранении записи. В сборке не должно быть дат, противоречащих логике.
Скрипт актуализации дат:
/* ** Project: Creatio ** DBMS : MSSQL 2008 ** Type : Script ** Name : Actualize Date For Demo */ IF EXISTS ( SELECT NULL FROM sys.objects WHERE [type] = 'TR' AND [name] = 'TR_BulkEmail_ProcessStatisticAfterUpdate' ) DISABLE TRIGGER [dbo].[TR_BulkEmail_ProcessStatisticAfterUpdate] ON [dbo].[BulkEmail] GO IF EXISTS ( SELECT NULL FROM sys.objects WHERE [type] = 'TR' AND [name] = 'TRCallAI' ) DISABLE TRIGGER [dbo].[TRCallAI] ON [dbo].[Call] GO set nocount on declare @NL char(1) set @NL = char(13) declare @ActualizedDemoDate datetime2 set @ActualizedDemoDate = ( select top 1 sv.DateTimeValue from SysSettings ss, SysSettingsValue sv where ss.Id = sv.SysSettingsId and ss.Code like 'ActualizedDemoDate%' order by sv.ModifiedOn desc ) if (@ActualizedDemoDate is null) begin print 'DemoDate is null.' return end print 'DemoDate is ' + cast(@ActualizedDemoDate as varchar) declare @DaysDiff int set @DaysDiff = datediff(DAY, @ActualizedDemoDate, getdate()) declare @DaysDiffStr varchar(6) set @DaysDiffStr = cast(@DaysDiff as varchar(6)) declare @Table sysname declare @Column sysname declare [c] cursor for select table_name, column_name from INFORMATION_SCHEMA.COLUMNS where (upper(data_type) = 'DATETIME' or upper(data_type) = 'DATETIME2' or upper(data_type) = 'DATE') and (column_name not in ('ModifiedOn') or table_name in ('Opportunity', 'OpportunityInStage', 'SocialMessage', 'Lead', 'Contact', 'Account', 'KnowledgeBase', 'Product', 'ApplicationApproval', 'Campaign', 'BulkEmail', 'CaseMessageHistory', 'Case', 'Activity', 'Invoice')) and (column_name not in ('CreatedOn') or table_name in ('Opportunity', 'OpportunityInStage', 'SocialMessage', 'Lead', 'Contact', 'Account', 'KnowledgeBase', 'Product', 'ApplicationApproval', 'Campaign', 'BulkEmail', 'CaseMessageHistory', 'Case', 'Activity', 'Invoice')) and not table_name in ('SysLic', 'RemindInterval', 'SysRecentEntity', 'PlanYear', 'PlanMonth', 'PlanQuarter', 'Period', 'FinIndicator', 'CampaignPlanner', 'MktgActivity', 'CurrencyRate') and not (table_name in ('ContactAnniversary', 'AccountAnniversary') and column_name = 'Date') and not (table_name in ('Contact') and column_name = 'BirthDate') and not (table_name in ('SysAdminUnit') and column_name = 'PasswordExpireDate') and not (table_name in ('SysImage') and column_name = 'UploadedOn') and objectproperty(object_id(table_name), 'IsTable') = 1 order by table_name, column_name open [c] while (1 = 1) begin fetch next from [c] into @Table, @Column if @@fetch_status = -1 break if @@fetch_status = -2 continue declare @tempExecStr nvarchar(max) set @tempExecStr = ( ' update [' + @Table + '] ' + @NL + ' set [' + @Column + '] = dateadd(DAY, ' + @DaysDiffStr + ', [' + @Column + '])' + @NL + ' where not [' + @Column + '] is null ' + @NL + ' and datediff(DAY, [' + @Column + '], ''99991231'') > ' + @DaysDiffStr) exec (@tempExecStr) set @tempExecStr = ( 'DECLARE @currentDate DATETIME2 = getutcdate();' + ' update [' + @Table + '] ' + @NL + ' set [' + @Column + '] = @currentDate' + @NL + ' where [' + @Column + '] > @currentDate' + @NL + ' and ''' + @Column + ''' in (''CreatedOn'', ''ModifiedOn'')') exec (@tempExecStr) print @Table + ' Column ->' +@Column + ' Diff->' + @DaysDiffStr + '(days) is updated.' end close [c] deallocate [c] GO /* Actualize Date For Demo Forecasts */ IF (OBJECT_ID(N'ForecastSheet') IS NOT NULL) BEGIN /*Actualize opportunity DueDate for demo Forecast*/ --DECLARE @minOpportunityDueDate DATETIME2 = (SELECT MIN(o.DueDate) FROM Opportunity o); --DECLARE @newMinOpportunityDueDate DATETIME2 = DATEADD(MONTH, ((DATEPART(YEAR, GETUTCDATE()) - 2000) * 12) + DATEPART(MONTH, GETUTCDATE()) - 2, CONVERT(DATETIME, '2000.01.13', 102)); --DECLARE @opportunityDueDateDiff INT = DATEDIFF(DAY,@minOpportunityDueDate, @newMinOpportunityDueDate); --IF @opportunityDueDateDiff <> 0 BEGIN -- PRINT 'Will add ' + CAST(@opportunityDueDateDiff AS VARCHAR(10)) + ' days to Opportunity DueDate'; -- UPDATE Opportunity -- SET DueDate = DATEADD(DAY, @opportunityDueDateDiff, DueDate) --END DECLARE @entityForecastMap TABLE( ForecastEntityName NVARCHAR(50) ); INSERT INTO @entityForecastMap VALUES ('AccountForecast'), ('ContactForecast'), ('LeadTypeForecast'), ('OppDepartmentForecast') DECLARE @sql NVARCHAR(max); DECLARE @tableName NVARCHAR(100); DECLARE c CURSOR FOR SELECT ForecastEntityName FROM @entityForecastMap OPEN c WHILE 1 = 1 BEGIN FETCH NEXT FROM c INTO @tableName IF @@FETCH_STATUS = -1 BREAK IF @@FETCH_STATUS = -2 CONTINUE IF (OBJECT_ID(@tableName) IS NOT NULL) BEGIN SET @sql = ' UPDATE f SET PeriodId = ( SELECT inp.Id FROM Period inp WHERE inp.PeriodTypeId = p.PeriodTypeId AND inp.StartDate = DATEADD(year, DATEDIFF(year, p.StartDate, GETDATE()), p.StartDate) AND inp.DueDate = DATEADD(year, DATEDIFF(year, p.DueDate, GETDATE()), p.DueDate) ) FROM '+ @tableName +' f JOIN Period p ON p.Id = f.PeriodId '; EXEC sp_executesql @sql; END; END; CLOSE c DEALLOCATE c END; GO IF EXISTS ( SELECT NULL FROM sys.objects WHERE [type] = 'TR' AND [name] = 'TR_BulkEmail_ProcessStatisticAfterUpdate' ) ENABLE TRIGGER [dbo].[TR_BulkEmail_ProcessStatisticAfterUpdate] ON [dbo].[BulkEmail] GO IF EXISTS ( SELECT NULL FROM sys.objects WHERE [type] = 'TR' AND [name] = 'TRCallAI' ) ENABLE TRIGGER [dbo].[TRCallAI] ON [dbo].[Call] GO
Наглядное представление записей
- Если в процессе добавления данных создаются активности, необходимо проверять записи в расписании активностей.
- Если при наполнении демоданных необходимо отобразить аналитику в Итогах, необходимо проверять построение графиков в каждом разделе с учетом даты актуализации.
- В некоторых разделах есть предустановленные фильтры по ответственному и периоду ([Активности], [Счета] и т.п.). При наполнении необходимо проверять, что в реестре есть записи, соответствующие условию фильтра.
Особенности англоязычного наполнения
- Англоязычное демо-наполнение создается на англоязычной сборке и в отдельном пакете.
- Дата актуализации англоязычной сборки не совпадает с датой актуализации русскоязычной.