Продскажите, может кто знает как решить проблему со связанными таблицами?

Суть такова, есть главная таблица со списком к примеру продуктов, есть деталь в которую из списка продуктов ложится записи, и есть еще деталь которая выбирает из списка в первой детали и ложет себе в деталь.

 

Вижу два решения задачи:

1) Вариант 1:

 - Создаем три таблицы: базовый справочник "Продукты", базовый объект "Деталь 1" с колонкой привязки к "Продукты", базовый объект "Деталь 2" с колонкой привязки к "Деталь 1".

- Создаем справочник на основе объекта "Продукты", деталь с добавлением из справочника на основе объекта "Деталь 1", деталь с добавлением из справочника на основе объекта "Деталь 2".

- Сталкиваемся с проблемой не рабочей делали "Деталь 2" так как для открытия окна добавления данных из "Деталь 1" необходимо с базовой колонкой текстового типа ("Отображаемое значение")!

2) Вариант 2:

- Создаем три таблицы: базовый справочник "Продукты", базовый объект "Деталь 1" с колонкой привязки к "Продукты" и колонкой "Зарезервировано" (что бы можно было отмечать значения что попадут далее в третью деталь).

- Создаем справочник на основе объекта "Продукты", деталь с добавлением из справочника на основе объекта "Деталь 1", деталь с добавлением из справочника на основе объекта "Деталь 1" (тут нам и пригодилась колонка "Зарезервировано" так как по ней и будет фильтр и мы просто проставляем значение в эту колонку, а точнее по колонке "Заявка" и "Зарезервировано").

- Сталкиваемся с проблемой не рабочей делали "Деталь 2" так как для открытия окна добавления данных из "Деталь 1" необходимо с базовой колонкой текстового типа ("Отображаемое значение")! Была идея сделать Вью для отображения не достающего текстового поля, которое заполнять из колонки "Продукты.Название".

Нравится

4 комментария

Александр, что-то мне не вполне понятно по структуре того, что хотите отобразить. Вы хотите две детали в разделе продуктов или в каком-то другом разделе, которые связывают его с продуктами (вроде раздела «Договоры» и детали развязки «Продукты в договоре»)? Как между собой связаны раздел и первая деталь, раздел и вторая, первая со второй?

 

Сами по себе двухуровневые детали обсуждались тут, тут и тут, но готового описания реализации не видно. Но в 7.Х, в отличие от прошлых версий, детали располагаются одна над другой, так что важнее сначала понять, что хотим отобразить, а потом искать техническую реализацию, через view или как-то ещё.

Зверев Александр,

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

Зверев Александр,

Тут вопрос не столько в настройке привязки деталей к разделу, сколько в логике выбора записей. Это можно сделать модификацией лукапа второй детали, чтобы там фильтр оставлял только пригодные для выбора записи. Либо вместо лукапа сделать в первой детали, где весь доступный выбор, кнопку или действие, при запуске которого выбранная на первой детали запись обрабатывается, по ней создаётся запись на второй.

Показать все комментарии

  Всем доброго времени суток! Подскажите, возможно ли использовать анонимный ws в качестве веб-хука, например для Telegram-bot?

Благодарю.

Нравится

3 комментария
Лучший ответ

1. Создаем анонимный сервис.

2. Добавляем в него метод по аналогии с HandleWebHookEvents в MandrillService:

[OperationContract]

        [WebInvoke(Method = "*", UriTemplate = "HandleWebHookEvents")]

        public void HandleWebHookEvents(Stream mandrill_events) {

}

Он принимает stream, и может ничего не возвращать. 



Как читать raw поста можно погуглить либо взять из того же метода пример.

Алексей, по поводу веб-хуков см. в этом обсуждении. Там упоминаются готовые примеры в системе и сторонних дополнениях.

1. Создаем анонимный сервис.

2. Добавляем в него метод по аналогии с HandleWebHookEvents в MandrillService:

[OperationContract]

        [WebInvoke(Method = "*", UriTemplate = "HandleWebHookEvents")]

        public void HandleWebHookEvents(Stream mandrill_events) {

}

Он принимает stream, и может ничего не возвращать. 



Как читать raw поста можно погуглить либо взять из того же метода пример.

Чтобы быстро понять, что приходить в вебхуке и как это парсить, используйте https://webhook.site/. 

Показать все комментарии

Коллеги, кто нибудь вел разработку по принципу пакет-проект, из статьи мало понятно как действовать. Есть вопросы:

  1. При выгрузки пакетов ФС папка Files не создалась(кастомный пакет) - можно добавить вручную?
  2. Можно ли добавлять данное решение в существующий пакет?
  3. В папку Files добавлять ProjectName.dll или весь solution?
  4. Проект создавать как библиотеку классов + подключать в зависимости пакет Terrasoft? 

В общем что то в этом роде.

Заранее благодарен!

Нравится

14 комментариев

Алексей, насколько помню, всё взаимодействие происходит через консольную программу «clio», а в веб-интерфейсе такой пакет выглядит как пустой, вручную туда добавлять ничего не нужно.

 

На странице clio перечислены её команды для создания, загрузки и выгрузки пакетов.

Зверев Александр,

с установкой пакета разобрался, теперь вот вопрос как использовать встроенные классы при разработке в ФС?

Вот пытаюсь определить переменную с данным типом -https://prnt.sc/tqf1ps

Что делаю не так?

Если брать данную dll - https://prnt.sc/tqf4n0 и вставлять во Внешние сборки(https://prnt.sc/tqf4z5) тогда смысл данного решения?

Зверев Александр,

Перелопатил что только возможно было, так и не нашел примеров как использовать функционал файлового контента, у Вас будет пару примеров?

Недавно было онлайн-обучение «Ускорение разработки с пакетами-проектами и репозиторием данных», но видео с него не встречалось. Возможно, отправляли только записавшимся.

 

Его автор ответил по поводу того, что Вы спрашивали о смысле этого решения: 

Взаимодействие между проектными-классами, и схемами исходного кода происходит через API-проекты.

Основная польза от такого решения – согласовав API, можно поставлять решение без компиляции основного приложения.

Зверев Александр,

По идее данный подход может решить проблему конфликта библиотек, в частности Google.Apis, вот пытаюсь решить данную проблему, но столкнулся с проблемой использования функционала портируемого пакета-проекта, как вызывать те или иные классы и методы.

Здравствуйте, Алексей!

 

Пакет-проект - это пакет который содержит только файловый контент, который в папке пакета располагается в папке Files.

В файловом контенте расположен обычный проект .net, а компиляция у него настроена в папку Bin.

В проекте реализованы сервисы, которые имеют доступ к базе данных.

Приложение загружает библиотеки (dll) из папки Files\Bin и ищет в них сервисы, а найденные сервисы активирует.

В проекте не будут видны конфигурационные классы, так же как и классы из данного проекта не будут видны коду в конфигурации, это изолированные сервисы.

 

Ответы на вопросы:

 При выгрузки пакетов ФС папка Files не создалась(кастомный пакет) - можно добавить вручную?

Ее можно создать вручную

   Можно ли добавлять данное решение в существующий пакет?

Можно.

Однако у нашего приложения есть экспериментальная фича, включив которую, пакет содержащий только файловый  контент будет ставится быстро, без компиляции всего приложения.

Для ее включения надо в Web.config загрузчика добавить

<add key="Feature-UseCompilationByNecessity" value="true" /> 

В этом одно из преимуществ пакетов-проектов, поэтому если в пакете уже находились, схемы, то такой пакет будет ставиться медленно, с  компиляцией.

  В папку Files добавлять ProjectName.dll или весь solution?

Обязательно надо добавить ProjectName.dll в Files\Bin, а solution, на ваше усмотрение, обычно желательно, чтобы вы скачав пакет могли вести в нем разработку.

 Проект создавать как библиотеку классов + подключать в зависимости пакет Terrasoft?

Проект надо создавать как библиотеку классов, которая содержит сервисы. К проекту можно подключить другие библиотеки, как к обычному проекту

Для работы с классами ядра можно к проекту подключить библиотеки из nugget:

 <PackageReference Include="BpmonlineSDK" Version="7.14.4.844-rc" />
 <PackageReference Include="Terrasoft.ServiceModel" Version="1.0.0" />
 <PackageReference Include="Terrasoft.ServiceModel.Primitives" Version="1.0.0">

 

 как использовать встроенные классы при разработке в ФС?

Как и в любом другом проекте .net.

Вот пытаюсь определить переменную с данным типом -https://prnt.sc/tqf1ps

Что делаю не так?

По скриншотам сказать что-то сложно, пришлите пакет, мы тогда объясним что там идет не так.

Если брать данную dll - https://prnt.sc/tqf4n0 и вставлять во Внешние сборки(https://prnt.sc/tqf4z5) тогда смысл данного решения?

В проекте (пакета-проекта), нельзя подключать сборки добавленные во внешние сборки в конфигурации.

 

Мотков Илья,

Можно ли при использовании данного решения как-то избежать конфликт библиотек Google? А то пока не получается...

 

Мотков Илья,

Мотков Илья пишет:

В проекте (

т.е. я не смогу добавить более новые библиотеки Google.Apis, Google.Analytics.V3, Google.Apis.Core (latest stable version) и т.д.? И затем без проблем использовать?

Здравствуйте, Алексей!

 

Рекомендуем прислать пакет, чтобы можно было посмотреть.

По поводу Clio, лучше установить последнюю версию, после чего проинсталировать новую версию cliogate. Если будут ошибки, еще раз прислать лог, который выдала утилита.

Мотков Илья,

здравствуйте, ссылку на скачивания пакета скидывал Вам в личном сообщении

Мотков Илья пишет:

Здравствуйте, Алексей!

Рекомендуем прислать пакет, чтобы можно было посмотреть.

По поводу Clio, лучше установить последнюю версию, после чего проинсталировать новую версию cliogate. Если будут ошибки, еще раз прислать лог, который выдала утилита.

Что касается clio и инсталяции cliogate в результате выполнения команды возникает следующая ошибка - https://prnt.sc/ttvziv 

Алексей, в соседней теме это Ваш же случай?

Зверев Александр,

да, уже и систему переустанавливал, не помогает

 

Алексей, по поводу конфликта версий, всё как обычно с библиотеками: им или залить себе ту же версию, что у «в коробке» (более старую), или аргументировать, чтобы обновили «в коробке» до более новой. Если используется не самая новая версия системы, прежде всего попробовать обновить, возможно, в актуальной библиотеку тоже обновили.

Показать все комментарии

Коллеги всем доброго времени суток! Подскажите, как правильно добавлять системную настройку кодом и есть ли такая возможность? При добавлении через БП она создаётся но значение не сохраняется. Благодарю.

Нравится

3 комментария
Лучший ответ

Нигрескул Алексей,

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

Добрый вечер.

Системная настройка хранится в таблице SysSettings, а её значения в SysSettingsValue.

Алла Савельева,

здравствуйте, я это знаю, тут дело в другом, переменная создается, но значение не присваивается, по крайней мере через ui в системной настройке в поле значение по умолчанию пусто, и когда заполняеш вручную, то значение не сохраняется.

Нигрескул Алексей,

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

Показать все комментарии

Добрый день!



Помогите разобраться.

Задача: изменить объект привязки в сквозной воронке (по умолчанию воронка строится по Лидам и Продажам). Необходимо изменить продажу на заказ.

Нашёл, что изначально объекты привязки объявляются в FullPipelineDesigner (пакет Platform):

 

_getDefaultEntities: function() {
                return [
                    {
                        "schemaName": "Lead",
                        "connectedWith": null,
                        "calculatedOperations": [{"operation": "Amount", "targetColumnName": "Budget"}],
                        "filters": null
                    },
                    {
                        "schemaName": "Opportunity",
                        "calculatedOperations": [{"operation": "Amount", "targetColumnName": "Budget"}],
                        "connectedWith": {
                            "type": 0,
                            "schemaName": "Lead",
                            "connectionSchemaName": "Lead",
                            "parentSchemaColumnName": "Opportunity",
                            "childSchemaColumnName": "Id"
                        },
                        "filters": null
                    }
                ];
            }



При попытке создать замещающий модуль c переопределенной _getDefaultEntities система говорит: "Замещение модулей запрещено".

Подскажите как решить такую задачу?

Нравится

1 комментарий

Александр, вопрос невозможности замещения модулей обсуждался неоднократно, см. тут и тут.

 

Проще всего будет сделать свою копию всех схем, реализующих сквозную воронку, изменить в ней объект, а затем использовать вместо стандартной.

Показать все комментарии

Всем доброго времени суток! Столкнулся с такой проблемой. При добавлении БП в раздел "съезжает" ранее добавленная кнопка - https://prnt.sc/tn9xut.

Как с этим бороться?

Заранее благодарю.

Нравится

3 комментария

Добрый день, приложите еще и кусок кода, в котором создаете кнопку, чтобы больше понимания было

Вадим Косарев,

	diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "ActionButtonsContainer",
				"propertyName": "items",
				"name": "SimpleInfoButton",
				"values": {
					"layout": { "column": 1, "row": 6, "colSpan": 1},
					"itemType": Terrasoft.ViewItemType.INFORMATION_BUTTON,
					"content": { "bindTo": "Resources.Strings.InfoButtonCaption" }
				}
			}
		]/**SCHEMA_DIFF*/,

 

Алексей, процессы открывает кнопка ProcessRunButton. Она реализована в BaseDataView (базовой схеме раздела) кодом:

{
	"operation": "insert",
	"name": "ProcessRunButton",
	"parentName": "SeparateModeActionButtonsContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.BUTTON,
		"caption": {"bindTo": "Resources.Strings.RunProsessButtonCaption"},
		"imageConfig": {"bindTo": "Resources.Images.ProcessButtonImage"},
		"iconAlign": Terrasoft.controls.ButtonEnums.iconAlign.LEFT,
		"classes": {
			"imageClass": ["t-btn-image left-12px t-btn-image-left proc-btn-img-top"],
			"textClass": ["t-btn-text t-btn-left actions-button-margin-right"]
		},
		"menu": {"items": {"bindTo": "getFilteredBySectionProcesses"}},
		"visible": {"bindTo": "getIsRunProcessButtonVisible"}
	}
},

В отличие от Вашего элемента, она входит в SeparateModeActionButtonsContainer, а уже тот —в ActionButtonsContainer:

{
	"operation": "insert",
	"name": "SeparateModeActionButtonsContainer",
	"parentName": "ActionButtonsContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.CONTAINER,
		"visible": {
			"bindTo": "IsCardVisible",
			"bindConfig": {
				"converter": function(value) {
					return !value;
				}
			}
		},
		"wrapClass": ["separate-action-buttons-container-wrapClass"],
		"items": []
	}
},

Возможно, Ваша кнопка с учётом иерархии контейнеров не там, где должна была находиться? Или дело в «"layout": { "column": 1, "row": 6, "colSpan": 1}», ведь нумерация идёт с нуля и 1 — это уже второй, с учётом видимой кнопки процессов?

Показать все комментарии

Исходные данные.

Два типа пользователей системы: сотрудник компании, пользователь портала.

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

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

Вопрос.

Как и что сделать, чтобы отобразить эту панель инструментов под учетной записью пользователя портала?Изображение удалено.

Нравится

4 комментария

Дамиан, эта логика реализована в схеме HtmlEditModule, в функции:

updateToolbar: function() {
	var id = this.id;
	var toolbar = this.toolbar;
	var memo = this.memo;
	if (!toolbar || !memo) {
		return;
	}
	var plainTextMode = this.plainTextMode;
	var enabled = this.enabled;
	var enabledInRichTextMode = !plainTextMode && enabled;
	var enabledInPlainTextMode = plainTextMode && enabled;
	var hideModeButtons = this.hideModeButtons;
	toolbar.fontFamily.setEnabled(enabledInRichTextMode);
	toolbar.fontSize.setEnabled(enabledInRichTextMode);
	toolbar.fontStyleBold.setEnabled(enabledInRichTextMode);
	toolbar.fontStyleItalic.setEnabled(enabledInRichTextMode);
	toolbar.fontStyleUnderline.setEnabled(enabledInRichTextMode);
	toolbar.fontColor.setEnabled(enabledInRichTextMode);
	toolbar.hightlightColor.setEnabled(enabledInRichTextMode);
	toolbar.numberedList.setEnabled(enabledInRichTextMode);
	toolbar.bulletedList.setEnabled(enabledInRichTextMode);
	toolbar.maximized.setEnabled(enabledInRichTextMode);
	toolbar.indentList.setEnabled(enabledInRichTextMode);
	toolbar.outdentList.setEnabled(enabledInRichTextMode);
	toolbar.justifyLeft.setEnabled(enabledInRichTextMode);
	toolbar.justifyCenter.setEnabled(enabledInRichTextMode);
	toolbar.justifyRight.setEnabled(enabledInRichTextMode);
	toolbar.image.setEnabled(enabledInRichTextMode);
	toolbar.link.setEnabled(enabledInRichTextMode);
	toolbar.htmlMode.setEnabled(enabledInPlainTextMode);
	toolbar.plainMode.setEnabled(enabledInRichTextMode);
	toolbar.htmlMode.setPressed(enabledInRichTextMode);
	toolbar.plainMode.setPressed(enabledInPlainTextMode);
	toolbar.htmlMode.setVisible(!hideModeButtons);
	toolbar.plainMode.setVisible(!hideModeButtons);
	memo.setReadonly(!enabled);
	var extToolbar = Ext.get(id + "-" + this.controlElementPrefix + "-toolbar");
	if (extToolbar) {
		extToolbar.dom.style.display = !enabled ? "none" : "table-cell";
	}
	var extHtmlEdit = Ext.get(id + "-" + this.controlElementPrefix + "-htmltext");
	if (extHtmlEdit) {
		extHtmlEdit.dom.style.display = plainTextMode ? "none" : "table-cell";
	}
	var extPlainText = Ext.get(id + "-" + this.controlElementPrefix + "-plaintext");
	if (extPlainText) {
		extPlainText.dom.style.display = !plainTextMode ? "none" : "table-cell";
	}
	var editor = this.editor;
	if (editor) {
		// TODO: 200083
		try {
			editor.setReadOnly(!enabled);
		} catch (e) {
			if (editor.document) {
				editor.document.getBody().$.contentEditable = enabled;
			}
		}
		if (extHtmlEdit) {
			extHtmlEdit.dom.style.backgroundColor = enabled ? "#ffffff" : "#f9f9f9";
		}
	}
},

Проверка условий видимости панели делается в 10 и 11 строках. То есть либо у поля установлено свойство plainTextMode, либо он неактивен. Если у Вас не было никаких доработок, вероятнее всего, вторая причина. По умолчанию в разделе базы знаний для портальных пользователей записи доступны только для чтения, и это, и другие поля просто заблокированы. В таком случае панель форматирования и не нужна. Чтобы она появилась, надо портальным пользователям дать права на создание/изменение статей БЗ:

Выставил права доступа согласно рекомендациям - не помогло.

Дамиан, как оказалось, свойство «enabled» не относится к правам, а задаётся непосредственно кодом в схеме карточки.

 

В PortalKnowledgeBasePage у трёх полей (название, тип и заметки) оно определено как false:

{
	"operation": "merge",
	"name": "Name",
	"values": {
		"enabled": false
	}
},
{
	"operation": "merge",
	"name": "Type",
	"values": {
		"enabled": false
	}
},
{
	"operation": "merge",
	"name": "Notes",
	"values": {
		"layout": {
			"column": 0,
			"row": 0,
			"colSpan": 24,
			"rowSpan": 1
		},
		"enabled": false
	}
},

Если в пакете Custom переопределить эту страницу, поменять на true, то поля (или только заметки, если менять лишь последнее) разблокируются. 

Спасибо, то что нужно. Разобрался с этим только сейчас.

Создал замещающую схему страницы портального раздела "Базы знаний" (PortalKnowledgeBasePage). Внутри неё в блоке diff прописал ваш код для заметок. Всё заработало, панель с кнопкой "развернуть во весь экран" появилась.

diff: /**SCHEMA_DIFF*/[
// Заметки.
{
  "operation": "merge",
  "name": "Notes",
  "values": {
    "layout": {
      "column": 0,
      "row": 0,
      "colSpan": 24,
      "rowSpan": 1
    },
    "enabled": true
  }
},
]/**SCHEMA_DIFF*/

 

Показать все комментарии

Добрый день!

Сегодня возникла проблема с подключением к веб-сокету Terrasoft Messaging Service из браузера Chrome с использованием защищенного соединения. Возникает ошибка ERR_SSL_OBSOLETE_VERSION. 

Вероятно Terrasoft Messaging Service использует протокол TLS версии ниже 1.2, которые Chrome перестал поддерживать.

Возможно ли в файле Terrasoft.Messaging.Service.exe.config указать версию TLS?

Нравится

4 комментария
Лучший ответ

Проблему для себя решили следующим образом:

1) Обновили TMS до последней актуальной версии.

2) В конфиге указали security="Tls12"

Так же столкнулся с этой проблемой, вопрос адресовал еще в ТП террасофта, если там дадут ответ раньше, продублирую сюда.

Литвинко Павел пишет:

Так же столкнулся с этой проблемой, вопрос адресовал еще в ТП террасофта, если там дадут ответ раньше, продублирую сюда.

Chrome обновил политику безопасности и требует использование более новой версии SSL сертификатов. 

Поэтому, если у Вас старый алгоритм шифрования на сертификате.



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



Тут необходимо обновить сертификат SSL на сервере с TMS. 

Как обходное решение, можно открыть в соседней вкладке браузера адрес https://[адрес TMS]:2013 

После разрешить переход на небезопасный сайт и обновить вкладку с Creatio. 

Дело может быть не только в сертификате. Если наблюдается с нормальным сертификатом, попробуйте обновить версию TMS. Либо же на уровне сервера отключена поддержка 1.2.

Проблему для себя решили следующим образом:

1) Обновили TMS до последней актуальной версии.

2) В конфиге указали security="Tls12"

Показать все комментарии

А кто-нибудь пользовался https://marketplace.terrasoft.ru/app/kanban-view-creatio ? А то их техподдержка не отвечает.

Проблема в том, что не могу понять как она настраивается. Сделал свой раздел с кейсами и на доске только названия и пустые кружочки. Не выводит ни фото, ни какие-либо другие значения из объекта. Как сделать, чтобы выводились еще какие-то параметры?

Нравится

3 комментария

Алексей, привет!

 

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

 

Список колонок, которые отображаются в представлении канбан, можно настроить следующим образом: перейдите в представление канбан - в меню Вид выберите пункт Настроить колонки. В одном ряду должна быть указана только одна колонка.

 

Отображение фото не настраивается. Если в разделе добавлено поле с точным названием Owner и ссылается на раздел Контакты, тогда отобразится фото контакта.

Ирина Лазоренко,

Отображение фото не настраивается. Если в разделе добавлено поле с точным названием Owner и ссылается на раздел Контакты, тогда отобразится фото контакта.

Это я нашел в ваших исходниках, но не отображается всё равно.

Алексей, привет!

 

пришлите скриншот с настройками поля Owner в конфигурации.

 

Укажите также продукт Creatio и его версию.

Показать все комментарии

Здравствуйте!

Подскажите, пожалуйста, есть базовый функционал, в котором можно зафиксировать стоимость доставки?

Как правильно организовать решение такого кейса?

Нравится

1 комментарий

Дарья, насколько понимаю, стандартно такого не ведётся, добавлялось в ходе различных проектов.

 

Можно в мастере раздела открыть раздел «Заказ» и добавить требуемое дробное поле в основную часть карточки или на вкладку «Доставка». Но нужно учесть, что в объекте этого раздела много логики на встроенных БП разных пакетов и в отдельных схемах (вроде ProductEntryUtils, OrderCalculator, OrderAmountHelper и др.), нужно будет всё это проанализировать и при необходимости доработать с учётом нового поля. Например, сейчас состояние заказа меняется в зависимости от ненулевого значения «Сумма оплаты» или совпадения его с «Итого».

public virtual bool ChangeStatus() {
	if (Entity.StoringState == StoringObjectState.New) {
return true;
	}
	List<string> changedColumnNames = Entity.GetChangedColumnValues()
	.Where(cv=>cv.Value != cv.OldValue)
	.ToList().ConvertAll(cv => cv.Column.Name);
	NeedFinRecalc = changedColumnNames.Intersect(new[] {"CurrencyRate", "Currency"}).Any();
	var securityEngine = UserConnection.DBSecurityEngine;
	bool hasRight = securityEngine.GetIsEntitySchemaColumnEditingAllowed("Order", "PaymentStatus");
	if (changedColumnNames.Intersect(new[] {"Amount", "PaymentAmount"}).Any() && hasRight) {
		var amount = Entity.GetTypedColumnValue<decimal>("Amount");
		var paymentAmount = Entity.GetTypedColumnValue<decimal>("PaymentAmount");
		if (amount > 0 && amount == paymentAmount) {
			Entity.SetColumnValue("PaymentStatusId", OrderPackage.Constants.Order.OrderPaymentStatus.Paid);
		} else if (paymentAmount > 0) {
			Entity.SetColumnValue("PaymentStatusId", OrderPackage.Constants.Order.OrderPaymentStatus.PartiallyPaid);
		}
	}
	return true;
}

Если появится новое поле, стоит либо в «Итого» и подобных полях считать сумму по продуктам уже вместе с добавленной доставкой, или сравнивать с суммой двух полей.

Показать все комментарии