Пользовательские обработчики customFields вызываются на стороне BPMSoft.
При создании, обновлении покупки и при создании возврата, после первичного сохранения в базу, но до вызова обработчиков событийного слоя объектов BPMSoft осуществляется вызов пользовательcких обработчиков customFields.
Для создания пользовательского обработчика необходимо выполнить следующие действия:
Перейти в конфигуратор и создать исходный код в пользовательском пакете
В исходном коде должен содержаться класс, реализующий интерфейс IPurchaseCustomFieldHandler в случае обработки кастомных полей покупки или интерфейс IRefundCustomFieldHandler в случае обработки кастомных полей возврата.
Ниже приведен пример обработчика, который по данным кастомных полей из запроса создает записи на детали.
Пример запроса purchase/confirm
Пример обработки покупки
using System;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Samarasoft.Loyalty.BpmOnline.Services.CustomFieldService;
using BPMSoft.Core.Entities;
namespace BPMSoft.Configuration
{
public class PurchaseCreateCustomFieldsHandler: IPurchaseCustomFieldHandler
{
public void OnCreated(Entity purchase, Dictionary<string, object> customFields)
{
if (customFields.TryGetValue("giftCards", out var result))
{
if (result is JArray jObject)
{
var giftCards = jObject.ToObject<GiftCardDto[]>();
if (giftCards != null)
{
var contactColumnValueName = purchase.Schema.Columns.FindByName("Contact").ColumnValueName;
var contactId = purchase.GetTypedColumnValue<Guid>(contactColumnValueName);
foreach (var card in giftCards)
{
var cardSchema = purchase.UserConnection.EntitySchemaManager.GetInstanceByName("UsrGiftCards");
var cardEntity = cardSchema.CreateEntity(purchase.UserConnection);
cardEntity.UseAdminRights = false;
cardEntity.SetDefColumnValues();
cardEntity.SetColumnValue("UsrName", card.UsrName);
cardEntity.SetColumnValue("UsrCertificateHolderId", contactId);
cardEntity.SetColumnValue("UsrCertPurchaseId", purchase.PrimaryColumnValue);
cardEntity.SetColumnValue("UsrCertificateStateId", card.UsrCertificateState);
cardEntity.Save(false);
}
}
}
}
}
public void OnUpdated(Entity purchase, Dictionary<string, object> customFields)
{
}
public class GiftCardDto
{
public Guid UsrCertificateState { get; set; }
public string UsrName { get; set; }
}
}
Пример запроса purchase/refund
Пример обработки возврата
using System;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Samarasoft.Loyalty.BpmOnline.Services.CustomFieldService;
using BPMSoft.Core.Entities;
namespace BPMSoft.Configuration
{
public class RefundCreateCustomFieldsHandler: IRefundCustomFieldHandler
{
public void OnCreated(Entity refund, Dictionary<string, object> customFields)
{
if (customFields.TryGetValue("giftCards", out var result))
{
if (result is JArray jArray)
{
var giftCards = jArray.ToObject<GiftCardDto[]>();
if (giftCards != null)
{
foreach (var card in giftCards)
{
var cardSchema = refund.UserConnection.EntitySchemaManager.GetInstanceByName("UsrGiftCards");
var cardEntity = cardSchema.CreateEntity(refund.UserConnection);
cardEntity.UseAdminRights = false;
cardEntity.SetDefColumnValues();
cardEntity.SetColumnValue("UsrName", card.UsrName);
cardEntity.SetColumnValue("UsrCertRefundId", refund.PrimaryColumnValue);
cardEntity.SetColumnValue("UsrCertificateStateId", card.UsrCertificateState);
cardEntity.Save(false);
}
}
}
}
}
}
public class GiftCardDto
{
public Guid UsrCertificateState { get; set; }
public string UsrName { get; set; }
}
}
В классе, реализующем интерфейс IPurchaseCustomFieldHandler должны быть реализованы методы OnCreated и OnUpdated.