Дерезервирование номеров при автоматизированном создании карточек
Дерезервирование номеров при автоматизированном создании карточек¶
При использовании штатного клиентского API для создания карточек может возникнуть ситуация, при которой для типов карточек с настройкой Автоматическое выделение номера = При создании в последовательности остаются зарезервированные номера при ошибках сохранения карточки вызовом cardRepository.StoreAsync.
Это происходит из-за того, что в некоторых сценариях карточки создаются не через клиентское приложение пользователем, а внешней системой — например, интеграционным микросервисом. Такой сервис использует стандартный API, и при вызове cardRepository.NewAsync веб-сервис по умолчанию считает, что карточка создаётся клиентом (INumberContext.ServiceType = Client). В результате в newResponse.Card.Info формируется очередь numberQueue, содержащая событие ClosingOrRefreshingCard, которое не предполагает автоматическое дерезервирование номера при неуспешной попытке сохранения.
Чтобы избежать этой проблемы, необходимо при создании карточки в Info["ServiceTypeForNumbers"] явно указать тип сервиса CardServiceType, использующего нумерацию. Тогда сервер корректно обработает ситуацию как серверный сценарий, и при ошибке сохранения номер будет успешно дерезервирован, поскольку в очереди номеров будет событие AfterStoreUnsuccessful.
var newRequest = new CardNewRequest { CardTypeName = "Contract" };
// Переопределяем тип сервиса как "default" (т.е. серверный)
newRequest.Info[NumberHelper.ServiceTypeForNumbers] = "default";
var newResponse = await cardRepository.NewAsync(newRequest);
if (!newResponse.ValidationResult.IsSuccessful())
{
return;
}
var card = newResponse.Card;
card.ID = Guid.NewGuid();
card.Sections["SomeSection"].Fields["SomeField"] = "id_from_external_system";
// почему-то обязательное поле "Тема" осталось незаполненным, что приведёт к ошибке сохранения, при котором номер будет дерезервирован
var storeRequest = new CardStoreRequest { Card = card };
var storeResponse = await cardRepository.StoreAsync(storeRequest);