Hello, I've developed an application using VAF on my own and added it to my library, but it's not working. Finding resources related to VAF is very limited. How can I improve my skills in this area? My current goal with the code is to automatically open a document based on the given class workflow and state. If I can achieve this, I'd like to create a system that automatically opens documents every day at 8:00 AM.

Vault Application.cs
using System;
using MFiles.VAF.Common;
using MFiles.VAF.Core;
using MFilesAPI;
namespace PersonelDenemeVAF
{
public class VaultApplication : ConfigurableVaultApplicationBase<Configuration>
{
[MFConfiguration("PersonelDenemeVAF", "Configuration")]
private Configuration config = new Configuration();
/// <summary>
/// Nesne check-in olduğunda tetiklenir.
/// Konfigürasyondaki workflow ve state ile karşılaştırma yapılır.
/// </summary>
[EventHandler(MFEventHandlerType.MFEventHandlerAfterCheckInChanges)]
public void AfterCheckIn(EventHandlerEnvironment env)
{
try
{
var obj = new ObjVerEx(env.Vault, env.ObjVer);
// Eğer bu zaten otomatik oluşturulmuş sınıf ise işlemi atla (sonsuz döngü önleme)
if (obj.Class == this.config.Class.ID)
return;
// Workflow ve State property değerlerini oku
var workflowProp = obj.GetProperty(MFBuiltInPropertyDef.MFBuiltInPropertyDefWorkflow);
var stateProp = obj.GetProperty(MFBuiltInPropertyDef.MFBuiltInPropertyDefState);
int currentWorkflowID = workflowProp?.TypedValue.GetLookupID() ?? -1;
int currentStateID = stateProp?.TypedValue.GetLookupID() ?? -1;
// Önceki versiyonu al (version > 1 ise)
int prevStateID = -1;
if (env.ObjVer.Version > 1)
{
var prevObjVer = new ObjVer();
prevObjVer.SetIDs(env.ObjVer.Type, env.ObjVer.ID, env.ObjVer.Version - 1);
var prevObj = new ObjVerEx(env.Vault, prevObjVer);
var prevStateProp = prevObj.GetProperty(MFBuiltInPropertyDef.MFBuiltInPropertyDefState);
prevStateID = prevStateProp?.TypedValue.GetLookupID() ?? -1;
}
// Workflow ve state değişimini kontrol et
// prevStateID == -1 → önceki versiyon yoksa tetikle
// prevStateID != currentStateID → state değişmişse tetikle
if (currentWorkflowID == this.config.Workflow.ID &&
currentStateID == this.config.WorkflowState.ID &&
(prevStateID != this.config.WorkflowState.ID || prevStateID == -1))
{
// Yeni nesne için property değerlerini hazırla
var builder = new MFPropertyValuesBuilder(env.Vault)
.SetClass(this.config.Class)
.SetWorkflowState(this.config.Workflow, this.config.WorkflowState);
env.Vault.ObjectOperations.CreateNewObjectEx(
(int)MFBuiltInObjectType.MFBuiltInObjectTypeDocument, // Doküman tipi
builder.Values,
new SourceObjectFiles(),
false, // SFD değil
true, // Check-in yap
null // ACL
);
SysUtils.ReportInfoToEventLog(
$"PersonelDenemeVAF: Workflow={this.config.Workflow.Alias} ve State={this.config.WorkflowState.Alias} için otomatik doküman oluşturuldu.");
}
}
catch (Exception ex)
{
SysUtils.ReportErrorToEventLog($"PersonelDenemeVAF - Hata: {ex.Message}", ex);
}
}
}
}Configuration.cs
using System;
using System.Runtime.Serialization;
using MFiles.VAF.Configuration;
namespace PersonelDenemeVAF
{
[DataContract]
public class Configuration
{
[DataMember(Order = 1)]
[MFClass(Required = true)]
[JsonConfEditor(
Label = "Class",
HelpText = "Kullanılacak Class (Sınıf).",
DefaultValue = "PersonelDenemeDegerlendirme")]
public MFIdentifier Class { get; set; }
= "PersonelDenemeDegerlendirme";
[DataMember(Order = 2)]
[MFWorkflow(Required = true)]
[JsonConfEditor(
Label = "Workflow",
HelpText = "Nesneye atanacak Workflow.",
DefaultValue = "PersonelDenemeWorkflow")]
public MFIdentifier Workflow { get; set; }
= "PersonelDenemeWorkflow";
[DataMember(Order = 3)]
[MFState(Required = true)]
[JsonConfEditor(
Label = "Başlangıç Workflow State",
HelpText = "Yeni oluşturulan nesnenin başlangıç state'i.",
DefaultValue = "PersonelDenemeWorkflow.Baslangic")]
public MFIdentifier WorkflowState { get; set; }
= "PersonelDenemeWorkflow.Baslangic";
}
}

