Обновление полного номера карточки для учёта изменившихся плейсхолдеров
Обновление полного номера карточки для учёта изменившихся плейсхолдеров¶
Если требуется обновить полный номер FullNumber карточки, чтобы учесть в нём изменившиеся значения плейсхолдеров, то в одном из расширений (серверных или клиентских) требуется написать код, взаимодействующий с API номеров. Таким расширением может быть обработчик плитки TileExtension, кастомный запрос RequestExtension, расширение при сохранении карточки CardStoreExtension (метод BeforeRequest) и пр.
Note
Если изменение выполняется в CardStoreExtension.BeforeRequest на сервере, то следует учесть, что в контексте карточки присутствуют только явно изменённые поля, поэтому полей номера здесь скорее всего не будет. В этом случае рекомендуется выполнять вложенную загрузку карточки с возможным сохранением, см. Изменение поля карточки через низкоуровневое API. Если в системе включена возможность регистрации для типа карточки, то поля карточки следует загружать не через ICardGetStrategy
, а используя расширения ICardRepository ExtendedWithoutTransaction
. При этом загрузится информация по состоянию документа в виртуальных полях, которая уже будет задействована в NumberDirector для определения того, какой формат номера использовать: проектный номер или регистрационный. Сохранение можно выполнять без расширений через низкоуровневое API.
using Tessa.Cards;
using Tessa.Cards.Numbers;
// получаем из Unity в конструкторе расширения:
IUnityContainer unityContainer = ...;
var numberDirectorContainer = unityContainer.Resolve<INumberDirectorContainer>();
// получаем информацию по карточке и её типу
Card card = ...;
CardType cardType = ...;
// инициализируем контекст действий с номерами
INumberDirectorProvider numberProvider = numberDirectorContainer.GetProvider(cardType.ID);
INumberDirector numberDirector = numberProvider.GetDirector();
INumberComposer numberComposer = numberProvider.GetComposer();
INumberContext numberContext = numberDirector.CreateContext(numberComposer, card, cardType);
numberContext.Initialize(numberDirector, NumberEventTypes.CustomAction);
// получаем номер Primary, т.е. основной номер карточки, отображаемый во всех представлениях и в заголовке карточки
INumberObject currentNumber = numberComposer.GetNumber(numberContext, NumberTypes.Primary);
// создаём объект номера с обновлённым полем FullNumber
INumberObject newNumber = currentNumber.RefreshFullNumber(numberContext);
// сохраняем поля номера в карточку, перезаписывая предыдущие поля
if (newNumber.Store(numberContext))
{
// сохраняем карточку card, выполнив RemoveAllButChanged и затем cardRepository.Store
// (если мы уже не в расширении CardStoreExtension)
}