Документация по разработке marketplace
PDF

Требования к демо-версии

Glossary Item Box

Общие сведения

Цель демоверсии — предоставить возможность пользователям увидеть результат работы решения в системе.

Демоверсия решения представляет собой набор демоданных, привязанных в отдельный пакет, который зависит только от пакета решения. Для СНГ и Глобал Marketplace создаются отдельные пакеты демоданных с русским и английским наполнением.

Рекомендованный алгоритм создания демоверсии:

  1. Развернуть чистую минимальную совместимую сборку Creatio без демо-данных (например, с установленным русским языком).
  2. Установить пакет решения (например, LabReports).
  3. Создать пакет с названием вида Название пакета + Demo (например, LabReports_Demo). Выбрать в зависимостях пакет установленного решения.
  4. Наполнить разделы и справочники демоданными, привязать все в созданный пакет, выполнить дополнительные настройки сортировки для корректного отображения данных (согласно инструкциям ниже).
  5. Выгрузить готовый пакет из системы.

Аналогичный алгоритм выполнить на отдельной сборке с установленным английским языком.

После выгрузки пакет необходимо обязательно протестировать на полноту и корректность данных на отдельной чистой сборке, установив пакет решения и пакет с демоданными. По результату успешного тестирования пакет с демоданными направляется команде Marketplace.

Например, для решения Advanced excel reports for Creatio необходимо заполнить в системе:

  1. Записи в разделе [Конструктор отчетов]. При добавлении записей формировать различные комбинации заполнения основных полей объекта (например, [Заголовок в отчете], [Формат вывода отчета], [Начинать со строки], [Создавать заголовки колонок]).
  2. Для нескольких записей заполнить все детали (например, [Пользовательские фильтры], [Колонки отчета], [Отчеты в разделе], [История формирования отчета]).
  3. Для одной из заполненных записей добавить шаблонный файл.
  4. Выполнить импорт отчетов, заполнив при этом записи в блоке [Уведомления].

Основные определения:

  • Softkey-данные — примеры заполнения объектов системы, которые добавляются в основной пакет решения. Такие данные создаются на английском языке с добавлением (sample) в названиях записей.
  • Демоданные — примеры заполнения объектов системы, которые создаются в отдельном пакете, зависящем от основного пакета решения.
  • Эталонные записи — записи в разделах, максимально полно заполнены демоданными. Эталонными считаются первые три записи в каждом разделе.

Полезные ссылки по привязке данных к пакету:

Автор записей:

  • Все данные создаются от имени одного демопользователя с привязкой по Id пользователя;
  • в русскоязычной сборке: Мирный Евгений — dad159f3-6c2d-446a-98d2-0f4d26662bbe;
  • в англоязычной сборке: John Best — 76929f8c-7e15-4c64-bdb0-adc62d383727.

Сортировка и сохранение сортировки:

  1. Сортировка записей в разделе устанавливается так, чтобы вверху страницы были эталонные записи. Если эталонные записи не выбраны/не заполнены, можно сначала выбрать сортировку, а затем заполнять эталонные записи.
  2. После установки нужной сортировки нужно по кнопке [Вид] открыть настройку колонок и, нажав на стрелку на кнопке [Сохранить], выбрать пункт [Сохранить для всех пользователей].
  3. Нужную запись можно отыскать по значению 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

Наглядное представление записей

  • Если в процессе добавления данных создаются активности, необходимо проверять записи в расписании активностей.
  • Если при наполнении демоданных необходимо отобразить аналитику в Итогах, необходимо проверять построение графиков в каждом разделе с учетом даты актуализации.
  • В некоторых разделах есть предустановленные фильтры по ответственному и периоду ([Активности], [Счета] и т.п.). При наполнении необходимо проверять, что в реестре есть записи, соответствующие условию фильтра.

Особенности англоязычного наполнения

  • Англоязычное демо-наполнение создается на англоязычной сборке и в отдельном пакете.
  • Дата актуализации англоязычной сборки не совпадает с датой актуализации русскоязычной.
© Terrasoft 2002-2020.

Был ли данный материал полезен?

Как можно улучшить эту статью?