diff --git a/.gitignore b/.gitignore
index d8401e7..cdac152 100644
--- a/.gitignore
+++ b/.gitignore
@@ -268,4 +268,7 @@ profile-*
# Security
.npmrc.local
auth.json
-secrets.json
\ No newline at end of file
+secrets.json
+
+# AI folders
+ai-docs/
\ No newline at end of file
diff --git a/core/Extensions/account-opening/extension-user-session.json b/core/Extensions/account-opening/extension-user-session.json
index ce26f42..746cb0c 100644
--- a/core/Extensions/account-opening/extension-user-session.json
+++ b/core/Extensions/account-opening/extension-user-session.json
@@ -1,8 +1,8 @@
{
"key": "extension-user-session",
- "flow": "sys-extensions",
- "domain": "core",
"version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-extensions",
"flowVersion": "1.0.0",
"tags": [
"system",
diff --git a/core/Tasks/account-opening/get-data-from-workflow.json b/core/Tasks/account-opening/get-data-from-workflow.json
index 59e3a06..f5ebe0e 100644
--- a/core/Tasks/account-opening/get-data-from-workflow.json
+++ b/core/Tasks/account-opening/get-data-from-workflow.json
@@ -14,8 +14,7 @@
"type": "13",
"config": {
"domain": "core",
- "flow": "account-opening",
- "instanceId": ""
+ "flow": "account-opening"
}
}
}
\ No newline at end of file
diff --git a/core/Tasks/account-opening/trigger-scheduled-payments.json b/core/Tasks/account-opening/trigger-scheduled-payments.json
index 946c54c..a8b6040 100644
--- a/core/Tasks/account-opening/trigger-scheduled-payments.json
+++ b/core/Tasks/account-opening/trigger-scheduled-payments.json
@@ -14,7 +14,7 @@
"type": "14",
"config": {
"domain": "core",
- "key": "scheduled-payments",
+ "flow": "scheduled-payments",
"version": "1.0.0"
}
}
diff --git a/core/Tasks/contract/get-contract-documents.json b/core/Tasks/contract/get-contract-documents.json
new file mode 100644
index 0000000..6af2cec
--- /dev/null
+++ b/core/Tasks/contract/get-contract-documents.json
@@ -0,0 +1,27 @@
+{
+ "key": "get-contract-documents",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "contract",
+ "documents",
+ "http",
+ "get-list"
+ ],
+ "attributes": {
+ "type": "6",
+ "config": {
+ "url": "http://localhost:3001/api/contract/get-documents",
+ "method": "POST",
+ "headers": {
+ "Content-Type": "application/json"
+ },
+ "body": {},
+ "timeoutSeconds": 30,
+ "validateSsl": true
+ }
+ }
+}
+
diff --git a/core/Tasks/contract/notify-document-approved.json b/core/Tasks/contract/notify-document-approved.json
new file mode 100644
index 0000000..3a945c2
--- /dev/null
+++ b/core/Tasks/contract/notify-document-approved.json
@@ -0,0 +1,23 @@
+{
+ "key": "notify-document-approved",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "contract",
+ "notification",
+ "direct-trigger",
+ "document-approved"
+ ],
+ "attributes": {
+ "type": "12",
+ "config": {
+ "domain": "core",
+ "flow": "contract-approval-workflow",
+ "transitionName": "document-approved",
+ "body": {}
+ }
+ }
+}
+
diff --git a/core/Tasks/contract/notify-document-ready.json b/core/Tasks/contract/notify-document-ready.json
new file mode 100644
index 0000000..2d66498
--- /dev/null
+++ b/core/Tasks/contract/notify-document-ready.json
@@ -0,0 +1,23 @@
+{
+ "key": "notify-document-ready",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "contract",
+ "notification",
+ "direct-trigger",
+ "document-ready"
+ ],
+ "attributes": {
+ "type": "12",
+ "config": {
+ "domain": "core",
+ "flow": "contract-approval-workflow",
+ "transitionName": "document-ready",
+ "body": {}
+ }
+ }
+}
+
diff --git a/core/Tasks/contract/render-document.json b/core/Tasks/contract/render-document.json
new file mode 100644
index 0000000..1ca4f4c
--- /dev/null
+++ b/core/Tasks/contract/render-document.json
@@ -0,0 +1,27 @@
+{
+ "key": "render-document",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "contract",
+ "document",
+ "render",
+ "http"
+ ],
+ "attributes": {
+ "type": "6",
+ "config": {
+ "url": "http://localhost:3001/api/contract/render-document",
+ "method": "POST",
+ "headers": {
+ "Content-Type": "application/json"
+ },
+ "body": {},
+ "timeoutSeconds": 30,
+ "validateSsl": true
+ }
+ }
+}
+
diff --git a/core/Tasks/contract/start-document-subprocess.json b/core/Tasks/contract/start-document-subprocess.json
new file mode 100644
index 0000000..b1de5d3
--- /dev/null
+++ b/core/Tasks/contract/start-document-subprocess.json
@@ -0,0 +1,22 @@
+{
+ "key": "start-document-subprocess",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "contract",
+ "subprocess",
+ "start",
+ "document-process"
+ ],
+ "attributes": {
+ "type": "14",
+ "config": {
+ "domain": "core",
+ "flow": "contract-document-subflow",
+ "body": {}
+ }
+ }
+}
+
diff --git a/core/Tasks/task-test/test-dapr-pubsub.json b/core/Tasks/task-test/test-dapr-pubsub.json
new file mode 100644
index 0000000..5a67392
--- /dev/null
+++ b/core/Tasks/task-test/test-dapr-pubsub.json
@@ -0,0 +1,27 @@
+{
+ "key": "test-dapr-pubsub",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "task-test",
+ "dapr",
+ "pubsub",
+ "messaging",
+ "event"
+ ],
+ "attributes": {
+ "type": "4",
+ "config": {
+ "pubSubName": "vnext-execution-pubsub",
+ "topic": "vnext.test.events",
+ "data": {},
+ "metadata": {
+ "priority": "normal",
+ "source": "task-test-workflow"
+ }
+ }
+ }
+}
+
diff --git a/core/Tasks/task-test/test-dapr-service-task.json b/core/Tasks/task-test/test-dapr-service-task.json
new file mode 100644
index 0000000..1a02f7f
--- /dev/null
+++ b/core/Tasks/task-test/test-dapr-service-task.json
@@ -0,0 +1,24 @@
+{
+ "key": "test-dapr-service-task",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "task-test",
+ "dapr",
+ "service-invocation",
+ "microservice"
+ ],
+ "attributes": {
+ "type": "3",
+ "config": {
+ "appId": "mockoon",
+ "methodName": "/api/api/task-test/dapr-endpoint",
+ "httpVerb": "POST",
+ "queryString": "",
+ "timeoutSeconds": 30
+ }
+ }
+}
+
diff --git a/core/Tasks/task-test/test-direct-transition.json b/core/Tasks/task-test/test-direct-transition.json
new file mode 100644
index 0000000..bd44b39
--- /dev/null
+++ b/core/Tasks/task-test/test-direct-transition.json
@@ -0,0 +1,23 @@
+{
+ "key": "test-direct-transition",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "task-test",
+ "direct-trigger",
+ "transition",
+ "workflow-communication"
+ ],
+ "attributes": {
+ "type": "12",
+ "config": {
+ "domain": "core",
+ "flow": "task-test-subflow",
+ "transitionName": "complete-subflow",
+ "body": {}
+ }
+ }
+}
+
diff --git a/core/Tasks/task-test/test-get-instance-data.json b/core/Tasks/task-test/test-get-instance-data.json
new file mode 100644
index 0000000..d6e5be6
--- /dev/null
+++ b/core/Tasks/task-test/test-get-instance-data.json
@@ -0,0 +1,22 @@
+{
+ "key": "test-get-instance-data",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "task-test",
+ "instance-data",
+ "workflow-communication",
+ "data-fetch"
+ ],
+ "attributes": {
+ "type": "13",
+ "config": {
+ "domain": "core",
+ "flow": "task-test-subflow",
+ "extensions": []
+ }
+ }
+}
+
diff --git a/core/Tasks/task-test/test-http-items.json b/core/Tasks/task-test/test-http-items.json
new file mode 100644
index 0000000..7cb237d
--- /dev/null
+++ b/core/Tasks/task-test/test-http-items.json
@@ -0,0 +1,27 @@
+{
+ "key": "test-http-items",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "task-test",
+ "http",
+ "api",
+ "external-service"
+ ],
+ "attributes": {
+ "type": "6",
+ "config": {
+ "url": "http://localhost:3001/api/task-test/list-items",
+ "method": "POST",
+ "headers": {
+ "Content-Type": "application/json"
+ },
+ "body": {},
+ "timeoutSeconds": 30,
+ "validateSsl": false
+ }
+ }
+}
+
diff --git a/core/Tasks/task-test/test-http-task.json b/core/Tasks/task-test/test-http-task.json
new file mode 100644
index 0000000..2b3977c
--- /dev/null
+++ b/core/Tasks/task-test/test-http-task.json
@@ -0,0 +1,27 @@
+{
+ "key": "test-http-task",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "task-test",
+ "http",
+ "api",
+ "external-service"
+ ],
+ "attributes": {
+ "type": "6",
+ "config": {
+ "url": "http://localhost:3001/api/task-test/http-endpoint",
+ "method": "POST",
+ "headers": {
+ "Content-Type": "application/json"
+ },
+ "body": {},
+ "timeoutSeconds": 30,
+ "validateSsl": false
+ }
+ }
+}
+
diff --git a/core/Tasks/task-test/test-start-workflow.json b/core/Tasks/task-test/test-start-workflow.json
new file mode 100644
index 0000000..b4c6348
--- /dev/null
+++ b/core/Tasks/task-test/test-start-workflow.json
@@ -0,0 +1,22 @@
+{
+ "key": "test-start-workflow",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "task-test",
+ "start",
+ "workflow-initiation",
+ "new-instance"
+ ],
+ "attributes": {
+ "type": "11",
+ "config": {
+ "domain": "core",
+ "flow": "task-test-subflow",
+ "body": {}
+ }
+ }
+}
+
diff --git a/core/Tasks/task-test/test-subprocess.json b/core/Tasks/task-test/test-subprocess.json
new file mode 100644
index 0000000..d1de4cc
--- /dev/null
+++ b/core/Tasks/task-test/test-subprocess.json
@@ -0,0 +1,23 @@
+{
+ "key": "test-subprocess",
+ "version": "1.0.0",
+ "domain": "core",
+ "flow": "sys-tasks",
+ "flowVersion": "1.0.0",
+ "tags": [
+ "task-test",
+ "subprocess",
+ "fire-and-forget",
+ "background-task"
+ ],
+ "attributes": {
+ "type": "14",
+ "config": {
+ "domain": "core",
+ "flow": "task-test-subflow",
+ "version": "1.0.0",
+ "body": {}
+ }
+ }
+}
+
diff --git a/core/Workflows/account-opening/.meta/account-opening-workflow.diagram.json b/core/Workflows/account-opening/.meta/account-opening-workflow.diagram.json
new file mode 100644
index 0000000..7ad6d7f
--- /dev/null
+++ b/core/Workflows/account-opening/.meta/account-opening-workflow.diagram.json
@@ -0,0 +1,36 @@
+{
+ "nodePos": {
+ "account-type-selection": {
+ "x": 556,
+ "y": 480.5
+ },
+ "account-details-input": {
+ "x": 1080,
+ "y": 400
+ },
+ "account-confirmation": {
+ "x": 1565,
+ "y": 400
+ },
+ "policy-validation": {
+ "x": 331,
+ "y": 240
+ },
+ "account-creation": {
+ "x": 780,
+ "y": 200
+ },
+ "account-opening-success": {
+ "x": 1220,
+ "y": 200
+ },
+ "cancelled": {
+ "x": 100,
+ "y": 100
+ },
+ "__start__": {
+ "x": 130,
+ "y": 480.5
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/Workflows/account-opening/account-opening-workflow.http b/core/Workflows/account-opening/account-opening-workflow.http
new file mode 100644
index 0000000..88259b4
--- /dev/null
+++ b/core/Workflows/account-opening/account-opening-workflow.http
@@ -0,0 +1,209 @@
+###############################################################################
+# Account Opening Workflow - HTTP Test File
+#
+# This file tests the account-opening workflow which handles:
+# - Account type selection (demand deposit, time deposit, etc.)
+# - Account details input and validation
+# - Policy validation
+# - Account creation confirmation
+# - Bank account creation via external API
+#
+# Prerequisites:
+# 1. vNext Runtime running on localhost:4201
+# 2. Mockoon running on localhost:3001
+###############################################################################
+
+@baseUrl = http://localhost:4201
+@apiVersion = 1
+@domain = core
+@workflow = account-opening
+@instanceKey = account-{{$timestamp}}
+
+###############################################################################
+# Step 1: Start Account Opening Workflow
+# Initiates the account opening flow with session information
+###############################################################################
+
+### Start Account Opening Instance
+# @name startAccountOpening
+POST {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/start?sync=true
+Content-Type: application/json
+Accept-Language: tr-TR
+X-Request-Id: {{$guid}}
+X-Device-Id: {{$guid}}
+X-Token-Id: {{$guid}}
+X-Device-Info: IOS 16
+X-Forwarded-For: 192.168.2.1
+user_reference: 34987491018
+
+{
+ "key": "{{instanceKey}}",
+ "tags": [
+ "test",
+ "banking",
+ "account-opening"
+ ],
+ "attributes": {
+ "session": "session-{{$timestamp}}"
+ }
+}
+
+###############################################################################
+# Step 2: Get Current State
+# Check the current state after workflow start
+###############################################################################
+
+### Get Current State
+GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/state
+Accept: application/json
+
+###############################################################################
+# Step 3: Get Current View
+# Retrieve the UI view definition for current state
+###############################################################################
+
+### Get Current View
+GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/view
+Accept: application/json
+
+### Get Transition Schema
+GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/schema?transitionKey=select-demand-deposit
+Accept: application/json
+
+###############################################################################
+# Step 4: Select Account Type - Demand Deposit
+# User selects the type of account to open
+###############################################################################
+
+### Select Demand Deposit Account
+# @name selectDemandDeposit
+PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/select-demand-deposit?sync=true
+Content-Type: application/json
+
+{
+ "key": "{{instanceKey}}",
+ "tags": [
+ "test",
+ "banking",
+ "account-opening",
+ "demand-deposit"
+ ],
+ "attributes": {
+ "accountType": "demand-deposit"
+ }
+}
+
+###############################################################################
+# Step 4.1: Select Account Type - Time Deposit (Alternative)
+# User selects time deposit account instead
+###############################################################################
+
+### Select Time Deposit Account (Alternative)
+# @name selectTimeDeposit
+PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/select-time-deposit?sync=true
+Content-Type: application/json
+
+{
+ "attributes": {
+ "accountType": "time-deposit"
+ }
+}
+
+###############################################################################
+# Step 5: Submit Account Details
+# User provides detailed account configuration
+###############################################################################
+
+### Submit Account Details
+# @name submitAccountDetails
+PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/submit-account-details?sync=true
+Content-Type: application/json
+
+{
+ "attributes": {
+ "accountName": "My Demand Deposit Account",
+ "currency": "TRY",
+ "branchCode": "5436",
+ "initialDeposit": 100,
+ "accountPurpose": "personal-banking",
+ "notifications": {
+ "smsNotifications": true,
+ "emailNotifications": true,
+ "pushNotifications": true
+ }
+ }
+}
+
+###############################################################################
+# Step 6: Confirm Account Opening
+# User confirms all details and accepts terms
+###############################################################################
+
+### Confirm Account Opening
+# @name confirmAccountOpening
+PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/confirm-account-opening?sync=true
+Content-Type: application/json
+
+{
+ "attributes": {
+ "confirmed": true,
+ "termsAccepted": true,
+ "privacyPolicyAccepted": true
+ }
+}
+
+###############################################################################
+# Step 7: Get Instance Data with Extensions
+# Retrieve all instance data including user session extension data
+###############################################################################
+
+### Get Instance Data with User Session Extension
+GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/data?extensions=extension-user-session
+Accept: application/json
+
+###############################################################################
+# Step 8: Get Final Instance Data
+# Retrieve all accumulated data including account details
+###############################################################################
+
+### Get Final Instance Data
+GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/data
+Accept: application/json
+
+###############################################################################
+# Cancel Flow
+###############################################################################
+
+### Cancel Account Opening
+# @name cancelAccountOpening
+PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/cancel?sync=false
+Content-Type: application/json
+
+###############################################################################
+# Back Navigation (Go to Previous State)
+###############################################################################
+
+### Go Back from Account Details
+# @name goBackFromDetails
+PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/transitions/back-to-type-selection?sync=true
+Content-Type: application/json
+
+###############################################################################
+# Account Opening Flow Summary
+###############################################################################
+#
+# | Step | Transition | Description |
+# |------|-------------------------|--------------------------------------|
+# | 1 | start | Start with session info |
+# | 2 | select-demand-deposit | Select demand deposit account type |
+# | | select-time-deposit | OR select time deposit account type |
+# | 3 | submit-account-details | Provide account configuration |
+# | 4 | (auto) | Validate policies |
+# | 5 | confirm-account-opening | Confirm and accept terms |
+# | 6 | (auto) | Create bank account via API |
+# | 7 | (complete) | Workflow completes successfully |
+# | | cancel | Cancel at any point |
+# | | back-to-type-selection | Go back to type selection |
+#
+###############################################################################
+
diff --git a/core/Workflows/account-opening/account-opening-workflow.json b/core/Workflows/account-opening/account-opening-workflow.json
index b35c1d8..386e89f 100644
--- a/core/Workflows/account-opening/account-opening-workflow.json
+++ b/core/Workflows/account-opening/account-opening-workflow.json
@@ -205,7 +205,7 @@
},
{
"key": "account-details-input",
- "stateType": 1,
+ "stateType": 2,
"subType": 0,
"versionStrategy": "Minor",
"labels": [
@@ -271,7 +271,7 @@
},
{
"key": "account-confirmation",
- "stateType": 1,
+ "stateType": 2,
"subType": 0,
"versionStrategy": "Minor",
"labels": [
diff --git a/core/Workflows/contract/.meta/contract-approval-workflow.diagram.json b/core/Workflows/contract/.meta/contract-approval-workflow.diagram.json
new file mode 100644
index 0000000..3f26be9
--- /dev/null
+++ b/core/Workflows/contract/.meta/contract-approval-workflow.diagram.json
@@ -0,0 +1,40 @@
+{
+ "nodePos": {
+ "get-documents": {
+ "x": 832.2613564163169,
+ "y": -59.090639542492255
+ },
+ "process-next-document": {
+ "x": 785.847542225539,
+ "y": 187.31525053290247
+ },
+ "waiting-for-ready": {
+ "x": 1077.8742868701956,
+ "y": 419.9565626003958
+ },
+ "check-all-ready": {
+ "x": 416,
+ "y": 418
+ },
+ "all-ready": {
+ "x": 333.43882559601354,
+ "y": 693.4918284667067
+ },
+ "check-all-approved": {
+ "x": 1395.5109010718922,
+ "y": 693.2832210317742
+ },
+ "contract-completed": {
+ "x": 1396,
+ "y": -60
+ },
+ "contract-rejected": {
+ "x": 448.62784213385794,
+ "y": 952.2279820637636
+ },
+ "__start__": {
+ "x": 262,
+ "y": -52
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/Workflows/contract/.meta/contract-document-subflow.diagram.json b/core/Workflows/contract/.meta/contract-document-subflow.diagram.json
new file mode 100644
index 0000000..7f5cc85
--- /dev/null
+++ b/core/Workflows/contract/.meta/contract-document-subflow.diagram.json
@@ -0,0 +1,40 @@
+{
+ "nodePos": {
+ "render-document": {
+ "x": 100,
+ "y": 300
+ },
+ "notify-parent-ready": {
+ "x": 531,
+ "y": 200
+ },
+ "waiting-for-approval": {
+ "x": 1097,
+ "y": 200
+ },
+ "notify-parent-approved": {
+ "x": 1573,
+ "y": 100
+ },
+ "notify-parent-rejected": {
+ "x": 1573,
+ "y": 300
+ },
+ "document-completed": {
+ "x": 2085,
+ "y": 100
+ },
+ "document-rejected": {
+ "x": 2085,
+ "y": 300
+ },
+ "document-failed": {
+ "x": 391,
+ "y": 500
+ },
+ "__start__": {
+ "x": -296,
+ "y": 300
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/Workflows/contract/contract-approval-workflow.http b/core/Workflows/contract/contract-approval-workflow.http
new file mode 100644
index 0000000..4ab3145
--- /dev/null
+++ b/core/Workflows/contract/contract-approval-workflow.http
@@ -0,0 +1,188 @@
+###############################################################################
+# Contract Approval Workflow - HTTP Test File
+#
+# This file tests the contract-approval workflow which handles:
+# - Contract document fetching
+# - Document rendering via subflow
+# - Document approval/rejection by user
+# - Multi-document processing in a loop
+# - Completion notification
+#
+# Prerequisites:
+# 1. vNext Runtime running on localhost:4201
+# 2. Mockoon running on localhost:3001
+###############################################################################
+
+@baseUrl = http://localhost:4201
+@apiVersion = 1
+@domain = core
+@workflow = contract-approval-workflow
+@subflow = contract-document-subflow
+@instanceKey = contract-{{$timestamp}}
+
+###############################################################################
+# Step 1: Start Contract Approval Workflow
+# Initiates the contract approval flow with group code
+###############################################################################
+
+### Start Contract Approval Instance
+# @name startContractApproval
+POST {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/start?sync=false
+Content-Type: application/json
+Accept-Language: tr-TR
+X-Request-Id: {{$guid}}
+X-Device-Id: {{$guid}}
+X-Token-Id: {{$guid}}
+X-Device-Info: IOS 16
+X-Forwarded-For: 192.168.2.1
+user_reference: 34987491018
+
+{
+ "key": "{{instanceKey}}",
+ "tags": [
+ "contract",
+ "approval",
+ "test"
+ ],
+ "attributes": {
+ "groupCode": "KG-2024-001",
+ "userId": "user-123",
+ "sessionId": "session-456",
+ "requestedAt": "{{$isoTimestamp}}"
+ }
+}
+
+###############################################################################
+# Step 2: Get Main Workflow State
+# Check the current state of the main approval workflow
+###############################################################################
+
+### Get Main Workflow State
+GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/state
+Accept: application/json
+
+###############################################################################
+# Step 3: Get Main Workflow Data
+# Retrieve data including document list
+###############################################################################
+
+### Get Main Workflow Data
+GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/data
+Accept: application/json
+
+###############################################################################
+# Document Subflow Operations
+# Each document is processed in a separate subflow instance
+###############################################################################
+
+@subflowInstanceKey = document-subflow-instance-id
+
+### Get Document Subflow State
+GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{subflow}}/instances/{{subflowInstanceKey}}/functions/state
+Accept: application/json
+
+### Get Document Subflow Data
+GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{subflow}}/instances/{{subflowInstanceKey}}/functions/data
+Accept: application/json
+
+###############################################################################
+# Step 4: Approve Document
+# User approves the rendered document
+###############################################################################
+
+### Approve Document
+# @name approveDocument
+PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{subflow}}/instances/{{subflowInstanceKey}}/transitions/approve-document?sync=true
+Content-Type: application/json
+
+{
+ "attributes": {
+ "approvedBy": "user-123",
+ "approvalNotes": "Document reviewed and approved"
+ }
+}
+
+###############################################################################
+# Step 4.1: Reject Document (Alternative)
+# User rejects the document with reason
+###############################################################################
+
+### Reject Document (Alternative)
+# @name rejectDocument
+PATCH {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{subflow}}/instances/{{subflowInstanceKey}}/transitions/reject-document?sync=true
+Content-Type: application/json
+
+{
+ "attributes": {
+ "rejectedBy": "user-123",
+ "reason": "Document content has missing information"
+ }
+}
+
+###############################################################################
+# Step 5: Check Final State
+# Verify all documents are processed and workflow is complete
+###############################################################################
+
+### Get Final Main Workflow State
+GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/state
+Accept: application/json
+
+### Get Final Main Workflow Data
+GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/{{workflow}}/instances/{{instanceKey}}/functions/data
+Accept: application/json
+
+###############################################################################
+# Contract Approval Flow Summary
+###############################################################################
+#
+# Main Workflow (contract-approval-workflow):
+# | Step | State/Transition | Description |
+# |------|-----------------------|---------------------------------------|
+# | 1 | start | Start with groupCode for documents |
+# | 2 | (auto) | Fetch contract documents |
+# | 3 | (auto) | Start document subflow for each doc |
+# | 4 | (wait) | Wait for all documents to be approved |
+# | 5 | (auto) | Notify completion |
+# | 6 | (complete) | All documents approved |
+#
+# Document Subflow (contract-document-subflow):
+# | Step | Transition | Description |
+# |------|-----------------------|---------------------------------------|
+# | 1 | (start) | Receive document from parent workflow |
+# | 2 | (auto) | Render document for display |
+# | 3 | approve-document | User approves the document |
+# | | reject-document | OR user rejects the document |
+# | 4 | (auto) | Notify parent workflow |
+# | 5 | (complete) | Subflow completes |
+#
+###############################################################################
+
+###############################################################################
+# Mockoon Endpoint Tests - Verify Mock Server is Running
+###############################################################################
+
+### Test Get Contract Documents (Mockoon)
+GET http://localhost:3001/api/contract/documents?groupCode=KG-2024-001
+Accept: application/json
+
+### Test Render Document (Mockoon)
+POST http://localhost:3001/api/contract/documents/render
+Content-Type: application/json
+
+{
+ "documentId": "doc-001",
+ "templateId": "template-standard",
+ "userId": "user-123"
+}
+
+### Test Notify Document Approved (Mockoon)
+POST http://localhost:3001/api/contract/documents/notify-approved
+Content-Type: application/json
+
+{
+ "documentId": "doc-001",
+ "approvedBy": "user-123",
+ "approvedAt": "{{$isoTimestamp}}"
+}
+
diff --git a/core/Workflows/contract/contract-approval-workflow.json b/core/Workflows/contract/contract-approval-workflow.json
new file mode 100644
index 0000000..48d2585
--- /dev/null
+++ b/core/Workflows/contract/contract-approval-workflow.json
@@ -0,0 +1,525 @@
+{
+ "key": "contract-approval-workflow",
+ "flow": "sys-flows",
+ "domain": "core",
+ "version": "1.0.0",
+ "tags": [
+ "contract",
+ "approval",
+ "workflow",
+ "document-management",
+ "sequential-process"
+ ],
+ "attributes": {
+ "type": "F",
+ "timeout": null,
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Contract Approval Workflow"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Kontrat Onay İş Akışı"
+ }
+ ],
+ "functions": [],
+ "features": [],
+ "extensions": [],
+ "sharedTransitions": [],
+ "startTransition": {
+ "key": "start-contract-approval",
+ "target": "get-documents",
+ "triggerType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Start Contract Approval"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Kontrat Onayını Başlat"
+ }
+ ],
+ "onExecutionTasks": [
+ {
+ "order": 1,
+ "task": {
+ "key": "script-task",
+ "domain": "core",
+ "version": "1.0.0",
+ "flow": "sys-tasks"
+ },
+ "mapping": {
+ "location": "./src/InitContractApprovalMapping.csx",
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBJbml0aWFsaXplIENvbnRyYWN0IEFwcHJvdmFsIFdvcmtmbG93IC0gUHJlcGFyZXMgaW5pdGlhbCBkYXRhCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBJbml0Q29udHJhY3RBcHByb3ZhbE1hcHBpbmcgOiBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UoKSk7CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlucHV0RGF0YSA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE7CiAgICAgICAgICAgIHZhciBncm91cENvZGUgPSBpbnB1dERhdGE/Lmdyb3VwQ29kZT8uVG9TdHJpbmcoKSA/PyAiIjsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImluaXQtc3VjY2VzcyIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb2RlID0gZ3JvdXBDb2RlLAogICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gRGF0ZVRpbWUuVXRjTm93LAogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50cyA9IG5ldyBvYmplY3RbXSB7IH0sCiAgICAgICAgICAgICAgICAgICAgY3VycmVudERvY3VtZW50SW5kZXggPSAwLAogICAgICAgICAgICAgICAgICAgIHJlYWR5Q291bnQgPSAwLAogICAgICAgICAgICAgICAgICAgIGFwcHJvdmVkQ291bnQgPSAwLAogICAgICAgICAgICAgICAgICAgIHJlamVjdGVkQ291bnQgPSAwLAogICAgICAgICAgICAgICAgICAgIHRvdGFsRG9jdW1lbnRzID0gMCwKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudEluc3RhbmNlcyA9IG5ldyBvYmplY3RbXSB7IH0sCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gImluaXRpYWxpemVkIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJjb250cmFjdCIsICJpbml0aWFsaXplZCIgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiaW5pdC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9Cn0KCg=="
+ }
+ }
+ ]
+ },
+ "states": [
+ {
+ "key": "get-documents",
+ "stateType": 1,
+ "subType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Get Document List"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Döküman Listesini Al"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [
+ {
+ "order": 1,
+ "task": {
+ "key": "get-contract-documents",
+ "domain": "core",
+ "version": "1.0.0",
+ "flow": "sys-tasks"
+ },
+ "mapping": {
+ "location": "./src/GetContractDocumentsMapping.csx",
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBHZXQgQ29udHJhY3QgRG9jdW1lbnRzIE1hcHBpbmcgLSBSZXRyaWV2ZXMgZG9jdW1lbnQgbGlzdCBmcm9tIEFQSQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0Q29udHJhY3REb2N1bWVudHNNYXBwaW5nIDogSU1hcHBpbmcKewogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IElucHV0SGFuZGxlcihXb3JrZmxvd1Rhc2sgdGFzaywgU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGh0dHBUYXNrID0gdGFzayBhcyBIdHRwVGFzazsKICAgICAgICAgICAgaWYgKGh0dHBUYXNrID09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUYXNrIG11c3QgYmUgYW4gSHR0cFRhc2siKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGdyb3VwQ29kZSA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/Lmdyb3VwQ29kZT8uVG9TdHJpbmcoKSA/PyAiIjsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIE1vY2tvb24gQVBJIGV4cGVjdHMgImdyb3VwQ29kZSIgZmllbGQKICAgICAgICAgICAgdmFyIHJlcXVlc3RCb2R5ID0gbmV3CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGdyb3VwQ29kZSA9IGdyb3VwQ29kZSwKICAgICAgICAgICAgICAgIHJlcXVlc3RJZCA9IEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBEYXRlVGltZS5VdGNOb3cKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGh0dHBUYXNrLlNldEJvZHkocmVxdWVzdEJvZHkpOwoKICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz8+CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFsiQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgICAgICAgICBbIlgtUmVxdWVzdC1JZCJdID0gR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgIFsiWC1Db3JyZWxhdGlvbi1JZCJdID0gY29udGV4dC5JbnN0YW5jZS5JZC5Ub1N0cmluZygpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGh0dHBUYXNrLlNldEhlYWRlcnMoaGVhZGVycyk7CgogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJnZXQtZG9jdW1lbnRzLWlucHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBlcnJvciA9IGV4Lk1lc3NhZ2UgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwogICAgICAgICAgICB2YXIgc3RhdHVzQ29kZSA9IHJlc3BvbnNlPy5zdGF0dXNDb2RlID8/IDUwMDsKCiAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlID49IDIwMCAmJiBzdGF0dXNDb2RlIDwgMzAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBNb2Nrb29uIEFQSSByZXR1cm5zICJjb250cmFjdHMiIGFycmF5LCBub3QgImRvY3VtZW50cyIKICAgICAgICAgICAgICAgIHZhciBjb250cmFjdHMgPSByZXNwb25zZT8uZGF0YT8uZGF0YT8uY29udHJhY3RzID8/IG5ldyBvYmplY3RbXSB7IH07CiAgICAgICAgICAgICAgICB2YXIgY29udHJhY3RMaXN0ID0gbmV3IExpc3Q8b2JqZWN0PigpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoY29udHJhY3RzICE9IG51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNvbnRyYWN0IGluIGNvbnRyYWN0cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0TGlzdC5BZGQoY29udHJhY3QpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB0b3RhbENvbnRyYWN0cyBmcm9tIEFQSSByZXNwb25zZSBvciBjYWxjdWxhdGVkIGZyb20gbGlzdAogICAgICAgICAgICAgICAgdmFyIHRvdGFsQ29udHJhY3RzID0gcmVzcG9uc2U/LmRhdGE/LmRhdGE/LnRvdGFsQ29udHJhY3RzID8/IGNvbnRyYWN0TGlzdC5Db3VudDsKCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gImdldC1kb2N1bWVudHMtc3VjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRzID0gY29udHJhY3RMaXN0LlRvQXJyYXkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxEb2N1bWVudHMgPSAoaW50KXRvdGFsQ29udHJhY3RzLAogICAgICAgICAgICAgICAgICAgICAgICBncm91cENvZGUgPSByZXNwb25zZT8uZGF0YT8uZGF0YT8uZ3JvdXBDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICByZXRyaWV2ZWRBdCA9IHJlc3BvbnNlPy5kYXRhPy5kYXRhPy5yZXRyaWV2ZWRBdCwKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudERvY3VtZW50SW5kZXggPSAwLAogICAgICAgICAgICAgICAgICAgICAgICByZWFkeUNvdW50ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm92ZWRDb3VudCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50SW5zdGFuY2VzID0gbmV3IG9iamVjdFtdIHsgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRzTG9hZGVkQXQgPSBEYXRlVGltZS5VdGNOb3cKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJjb250cmFjdCIsICJkb2N1bWVudHMtbG9hZGVkIiB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJnZXQtZG9jdW1lbnRzLWZhaWxlZCIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZT8uZGF0YT8uZXJyb3I/Lm1lc3NhZ2UgPz8gcmVzcG9uc2U/LmVycm9yID8/ICJGYWlsZWQgdG8gZ2V0IGRvY3VtZW50cyIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gcmVzcG9uc2U/LmRhdGE/LmVycm9yPy5jb2RlLAogICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlLAogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50cyA9IG5ldyBvYmplY3RbXSB7IH0sCiAgICAgICAgICAgICAgICAgICAgdG90YWxEb2N1bWVudHMgPSAwCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJnZXQtZG9jdW1lbnRzLWV4Y2VwdGlvbiIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBleC5NZXNzYWdlLAogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50cyA9IG5ldyBvYmplY3RbXSB7IH0sCiAgICAgICAgICAgICAgICAgICAgdG90YWxEb2N1bWVudHMgPSAwCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo="
+ }
+ }
+ ],
+ "onExits": [],
+ "transitions": [
+ {
+ "key": "documents-loaded",
+ "target": "process-next-document",
+ "triggerType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Documents Loaded"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Dökümanlar Yüklendi"
+ }
+ ],
+ "schema": null,
+ "rule": {
+ "location": "./src/DocumentsLoadedRule.csx",
+ "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIERvY3VtZW50cyBMb2FkZWQgUnVsZSAtIENoZWNrcyBpZiBkb2N1bWVudHMgYXJlIGxvYWRlZCBzdWNjZXNzZnVsbHkKLy8vIDwvc3VtbWFyeT4KcHVibGljIGNsYXNzIERvY3VtZW50c0xvYWRlZFJ1bGUgOiBJQ29uZGl0aW9uTWFwcGluZwp7CiAgICBwdWJsaWMgYXN5bmMgVGFzazxib29sPiBIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0b3RhbERvY3VtZW50cyA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnRvdGFsRG9jdW1lbnRzID8/IDA7CiAgICAgICAgICAgIHJldHVybiAoaW50KXRvdGFsRG9jdW1lbnRzID4gMDsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9Cn0KCg=="
+ },
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ },
+ {
+ "key": "no-documents",
+ "target": "contract-completed",
+ "triggerType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "No Documents Found"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Döküman Bulunamadı"
+ }
+ ],
+ "schema": null,
+ "rule": {
+ "location": "./src/NoDocumentsRule.csx",
+ "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIE5vIERvY3VtZW50cyBSdWxlIC0gQ2hlY2tzIGlmIG5vIGRvY3VtZW50cyBmb3VuZAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgTm9Eb2N1bWVudHNSdWxlIDogSUNvbmRpdGlvbk1hcHBpbmcKewogICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gSGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgdG90YWxEb2N1bWVudHMgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy50b3RhbERvY3VtZW50cyA/PyAwOwogICAgICAgICAgICByZXR1cm4gKGludCl0b3RhbERvY3VtZW50cyA9PSAwOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQp9Cgo="
+ },
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ }
+ ]
+ },
+ {
+ "key": "process-next-document",
+ "stateType": 2,
+ "subType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Process Next Document"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Sonraki Dökümanı İşle"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [
+ {
+ "order": 1,
+ "task": {
+ "key": "start-document-subprocess",
+ "domain": "core",
+ "version": "1.0.0",
+ "flow": "sys-tasks"
+ },
+ "mapping": {
+ "location": "./src/StartDocumentSubprocessMapping.csx",
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBTdGFydCBEb2N1bWVudCBTdWJwcm9jZXNzIE1hcHBpbmcgLSBTdGFydHMgc3VicHJvY2VzcyBmb3IgY3VycmVudCBkb2N1bWVudAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgU3RhcnREb2N1bWVudFN1YnByb2Nlc3NNYXBwaW5nIDogSU1hcHBpbmcKewogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IElucHV0SGFuZGxlcihXb3JrZmxvd1Rhc2sgdGFzaywgU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0YXJ0VGFzayA9IHRhc2sgYXMgU3ViUHJvY2Vzc1Rhc2s7CiAgICAgICAgICAgIGlmIChzdGFydFRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIFN0YXJ0VGFzayIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDb25maWd1cmUgdGFyZ2V0IHdvcmtmbG93CiAgICAgICAgICAgIHN0YXJ0VGFzay5TZXREb21haW4oImNvcmUiKTsKICAgICAgICAgICAgc3RhcnRUYXNrLlNldEZsb3coImNvbnRyYWN0LWRvY3VtZW50LXN1YmZsb3ciKTsKICAgICAgICAgICAgc3RhcnRUYXNrLlNldFZlcnNpb24oIjEuMC4wIik7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBHZXQgY3VycmVudCBkb2N1bWVudAogICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gKGludCkoY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uY3VycmVudERvY3VtZW50SW5kZXggPz8gMCk7CiAgICAgICAgICAgIHZhciBkb2N1bWVudHMgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudHM7CiAgICAgICAgICAgIAogICAgICAgICAgICBvYmplY3QgY3VycmVudERvY3VtZW50ID0gbnVsbDsKICAgICAgICAgICAgaWYgKGRvY3VtZW50cyAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZG9jTGlzdCA9IG5ldyBMaXN0PG9iamVjdD4oKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkb2MgaW4gZG9jdW1lbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRvY0xpc3QuQWRkKGRvYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgZG9jTGlzdC5Db3VudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50RG9jdW1lbnQgPSBkb2NMaXN0W2N1cnJlbnRJbmRleF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBrZXkgZm9yIHN1YnByb2Nlc3MKICAgICAgICAgICAgdmFyIHN1YnByb2Nlc3NLZXkgPSAkIntjb250ZXh0Lkluc3RhbmNlPy5LZXl9LWRvYy17Y3VycmVudEluZGV4fSI7CiAgICAgICAgICAgIHN0YXJ0VGFzay5TZXRLZXkoc3VicHJvY2Vzc0tleSk7CiAgICAgICAgICAgIHN0YXJ0VGFzay5TZXRUYWdzKG5ld1tdIHsgImNvbnRyYWN0IiwgImRvY3VtZW50IiwgInN1YnByb2Nlc3MiIH0pOwoKICAgICAgICAgICAgLy8gUHJlcGFyZSBpbml0aWFsaXphdGlvbiBib2R5CiAgICAgICAgICAgIHZhciBpbml0Qm9keSA9IG5ldwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnRJbnN0YW5jZUlkID0gY29udGV4dC5JbnN0YW5jZT8uSWQsCiAgICAgICAgICAgICAgICBwYXJlbnRJbnN0YW5jZUtleSA9IGNvbnRleHQuSW5zdGFuY2U/LktleSwKICAgICAgICAgICAgICAgIHBhcmVudFdvcmtmbG93S2V5ID0gY29udGV4dC5Xb3JrZmxvdz8uS2V5LAogICAgICAgICAgICAgICAgZG9jdW1lbnQgPSBjdXJyZW50RG9jdW1lbnQsCiAgICAgICAgICAgICAgICBkb2N1bWVudEluZGV4ID0gY3VycmVudEluZGV4LAogICAgICAgICAgICAgICAgZ3JvdXBDb2RlID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZ3JvdXBDb2RlLAogICAgICAgICAgICAgICAgc3RhcnRlZEF0ID0gRGF0ZVRpbWUuVXRjTm93CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHN0YXJ0VGFzay5TZXRCb2R5KGluaXRCb2R5KTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gInN0YXJ0LXN1YnByb2Nlc3MtaW5wdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgYXN5bmMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBjb250ZXh0LkJvZHk7CiAgICAgICAgICAgIHZhciBjdXJyZW50SW5kZXggPSAoaW50KShjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5jdXJyZW50RG9jdW1lbnRJbmRleCA/PyAwKTsKCiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNTdWNjZXNzID09IHRydWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHN1YnByb2Nlc3MgaW5zdGFuY2UgaW5mbwogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nSW5zdGFuY2VzID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnRJbnN0YW5jZXMgPz8gbmV3IG9iamVjdFtdIHsgfTsKICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZUxpc3QgPSBuZXcgTGlzdDxvYmplY3Q+KCk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaW5zdCBpbiBleGlzdGluZ0luc3RhbmNlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUxpc3QuQWRkKGluc3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBHZXQgY3VycmVudCBkb2N1bWVudCBmb3IgY29udHJhY3RJZCByZWZlcmVuY2UKICAgICAgICAgICAgICAgIHZhciBkb2N1bWVudHMgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudHM7CiAgICAgICAgICAgICAgICBvYmplY3QgY3VycmVudERvYyA9IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnRzICE9IG51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRvY0xpc3QgPSBuZXcgTGlzdDxvYmplY3Q+KCk7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGQgaW4gZG9jdW1lbnRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jTGlzdC5BZGQoZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCBkb2NMaXN0LkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudERvYyA9IGRvY0xpc3RbY3VycmVudEluZGV4XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW5zdGFuY2VMaXN0LkFkZChuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkID0gcmVzcG9uc2U/LmRhdGE/LmlkLAogICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0SWQgPSAoKGR5bmFtaWMpY3VycmVudERvYyk/LmNvbnRyYWN0SWQsCiAgICAgICAgICAgICAgICAgICAgY29udHJhY3ROYW1lID0gKChkeW5hbWljKWN1cnJlbnREb2MpPy5jb250cmFjdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRJbmRleCA9IGN1cnJlbnRJbmRleCwKICAgICAgICAgICAgICAgICAgICBzdGFydGVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gInN0YXJ0ZWQiCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInN1YnByb2Nlc3Mtc3RhcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRJbnN0YW5jZXMgPSBpbnN0YW5jZUxpc3QuVG9BcnJheSgpLAogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RG9jdW1lbnRJbmRleCA9IGN1cnJlbnRJbmRleCArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTdWJwcm9jZXNzSWQgPSByZXNwb25zZT8uZGF0YT8uaWQKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJjb250cmFjdCIsICJzdWJwcm9jZXNzLXN0YXJ0ZWQiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gInN1YnByb2Nlc3MtZmFpbGVkIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHJlc3BvbnNlPy5lcnJvck1lc3NhZ2UgPz8gIkZhaWxlZCB0byBzdGFydCBzdWJwcm9jZXNzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAic3VicHJvY2Vzcy1leGNlcHRpb24iLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo="
+ }
+ }
+ ],
+ "onExits": [],
+ "transitions": [
+ {
+ "key": "subprocess-started",
+ "target": "waiting-for-ready",
+ "triggerType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Subprocess Started"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Alt Süreç Başlatıldı"
+ }
+ ],
+ "schema": null,
+ "rule": {
+ "location": "./src/AlwaysTrueRule.csx",
+ "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo="
+ },
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ }
+ ]
+ },
+ {
+ "key": "waiting-for-ready",
+ "stateType": 2,
+ "subType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Waiting for Document Ready"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Döküman Hazır Bekliyor"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [],
+ "onExits": [],
+ "transitions": [
+ {
+ "key": "document-ready",
+ "target": "check-all-ready",
+ "triggerType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Document Ready"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Döküman Hazır"
+ }
+ ],
+ "schema": null,
+ "rule": null,
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": [
+ {
+ "order": 1,
+ "task": {
+ "key": "script-task",
+ "domain": "core",
+ "version": "1.0.0",
+ "flow": "sys-tasks"
+ },
+ "mapping": {
+ "location": "./src/IncrementReadyCountMapping.csx",
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBJbmNyZW1lbnQgUmVhZHkgQ291bnQgTWFwcGluZyAtIEluY3JlbWVudHMgdGhlIHJlYWR5IGRvY3VtZW50IGNvdW50ZXIKLy8vIDwvc3VtbWFyeT4KcHVibGljIGNsYXNzIEluY3JlbWVudFJlYWR5Q291bnRNYXBwaW5nIDogSU1hcHBpbmcKewogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IElucHV0SGFuZGxlcihXb3JrZmxvd1Rhc2sgdGFzaywgU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgfQoKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjdXJyZW50UmVhZHlDb3VudCA9IChpbnQpKGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnJlYWR5Q291bnQgPz8gMCk7CiAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uRGF0YSA9IGNvbnRleHQuQm9keTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIFVzaW5nIE1vY2tvb24gY29udHJhY3Qgc3RydWN0dXJlIC0gY29udHJhY3RJZCBpbnN0ZWFkIG9mIGRvY3VtZW50SWQKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAicmVhZHktY291bnQtaW5jcmVtZW50ZWQiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlYWR5Q291bnQgPSBjdXJyZW50UmVhZHlDb3VudCArIDEsCiAgICAgICAgICAgICAgICAgICAgbGFzdFJlYWR5Q29udHJhY3RJZCA9IHRyYW5zaXRpb25EYXRhPy5jb250cmFjdElkLAogICAgICAgICAgICAgICAgICAgIGxhc3RSZWFkeUNvbnRyYWN0TmFtZSA9IHRyYW5zaXRpb25EYXRhPy5jb250cmFjdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgbGFzdFJlYWR5QXQgPSBEYXRlVGltZS5VdGNOb3cKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY29udHJhY3QiLCAiZG9jdW1lbnQtcmVhZHkiIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImluY3JlbWVudC1yZWFkeS1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9Cn0KCg=="
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "key": "check-all-ready",
+ "stateType": 2,
+ "subType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Check All Documents Ready"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Tüm Dökümanlar Hazır mı Kontrol Et"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [],
+ "onExits": [],
+ "transitions": [
+ {
+ "key": "has-more-documents",
+ "target": "process-next-document",
+ "triggerType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Has More Documents"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Daha Fazla Döküman Var"
+ }
+ ],
+ "schema": null,
+ "rule": {
+ "location": "./src/HasMoreDocumentsRule.csx",
+ "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEhhcyBNb3JlIERvY3VtZW50cyBSdWxlIC0gQ2hlY2tzIGlmIHRoZXJlIGFyZSBtb3JlIGRvY3VtZW50cyB0byBwcm9jZXNzCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBIYXNNb3JlRG9jdW1lbnRzUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IChpbnQpKGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LmN1cnJlbnREb2N1bWVudEluZGV4ID8/IDApOwogICAgICAgICAgICB2YXIgdG90YWxEb2N1bWVudHMgPSAoaW50KShjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy50b3RhbERvY3VtZW50cyA/PyAwKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIElmIGN1cnJlbnQgaW5kZXggaXMgbGVzcyB0aGFuIHRvdGFsLCB0aGVyZSBhcmUgbW9yZSBkb2N1bWVudHMKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleCA8IHRvdGFsRG9jdW1lbnRzOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KfQoK"
+ },
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ },
+ {
+ "key": "all-documents-ready",
+ "target": "all-ready",
+ "triggerType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "All Documents Ready"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Tüm Dökümanlar Hazır"
+ }
+ ],
+ "schema": null,
+ "rule": {
+ "location": "./src/AllDocumentsReadyRule.csx",
+ "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsbCBEb2N1bWVudHMgUmVhZHkgUnVsZSAtIENoZWNrcyBpZiBhbGwgZG9jdW1lbnRzIGFyZSByZWFkeQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgQWxsRG9jdW1lbnRzUmVhZHlSdWxlIDogSUNvbmRpdGlvbk1hcHBpbmcKewogICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gSGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gKGludCkoY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uY3VycmVudERvY3VtZW50SW5kZXggPz8gMCk7CiAgICAgICAgICAgIHZhciB0b3RhbERvY3VtZW50cyA9IChpbnQpKGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnRvdGFsRG9jdW1lbnRzID8/IDApOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gQWxsIGRvY3VtZW50cyBhcmUgcHJvY2Vzc2VkIChzdGFydGVkKSB3aGVuIGN1cnJlbnQgaW5kZXggZXF1YWxzIHRvdGFsCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW5kZXggPj0gdG90YWxEb2N1bWVudHM7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9Cn0KCg=="
+ },
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ }
+ ]
+ },
+ {
+ "key": "all-ready",
+ "stateType": 2,
+ "subType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "All Documents Ready - Waiting for Approvals"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Tüm Dökümanlar Hazır - Onay Bekliyor"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [],
+ "onExits": [],
+ "transitions": [
+ {
+ "key": "document-approved",
+ "target": "check-all-approved",
+ "triggerType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Document Approved"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Döküman Onaylandı"
+ }
+ ],
+ "schema": null,
+ "rule": null,
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": [
+ {
+ "order": 1,
+ "task": {
+ "key": "script-task",
+ "domain": "core",
+ "version": "1.0.0",
+ "flow": "sys-tasks"
+ },
+ "mapping": {
+ "location": "./src/IncrementApprovedCountMapping.csx",
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBJbmNyZW1lbnQgQXBwcm92ZWQgQ291bnQgTWFwcGluZyAtIEluY3JlbWVudHMgdGhlIGFwcHJvdmVkIGRvY3VtZW50IGNvdW50ZXIKLy8vIDwvc3VtbWFyeT4KcHVibGljIGNsYXNzIEluY3JlbWVudEFwcHJvdmVkQ291bnRNYXBwaW5nIDogSU1hcHBpbmcKewogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IElucHV0SGFuZGxlcihXb3JrZmxvd1Rhc2sgdGFzaywgU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgfQoKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjdXJyZW50QXBwcm92ZWRDb3VudCA9IChpbnQpKGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LmFwcHJvdmVkQ291bnQgPz8gMCk7CiAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uRGF0YSA9IGNvbnRleHQuQm9keTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIFVzaW5nIE1vY2tvb24gY29udHJhY3Qgc3RydWN0dXJlIC0gY29udHJhY3RJZCBpbnN0ZWFkIG9mIGRvY3VtZW50SWQKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiYXBwcm92ZWQtY291bnQtaW5jcmVtZW50ZWQiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcHJvdmVkQ291bnQgPSBjdXJyZW50QXBwcm92ZWRDb3VudCArIDEsCiAgICAgICAgICAgICAgICAgICAgbGFzdEFwcHJvdmVkQ29udHJhY3RJZCA9IHRyYW5zaXRpb25EYXRhPy5jb250cmFjdElkLAogICAgICAgICAgICAgICAgICAgIGxhc3RBcHByb3ZlZENvbnRyYWN0TmFtZSA9IHRyYW5zaXRpb25EYXRhPy5jb250cmFjdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgbGFzdEFwcHJvdmVkQXQgPSBEYXRlVGltZS5VdGNOb3cKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY29udHJhY3QiLCAiZG9jdW1lbnQtYXBwcm92ZWQiIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImluY3JlbWVudC1hcHByb3ZlZC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9Cn0KCg=="
+ }
+ }
+ ]
+ },
+ {
+ "key": "document-rejected",
+ "target": "contract-rejected",
+ "triggerType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Document Rejected"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Döküman Reddedildi"
+ }
+ ],
+ "schema": null,
+ "rule": null,
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ }
+ ]
+ },
+ {
+ "key": "check-all-approved",
+ "stateType": 2,
+ "subType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Check All Approved"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Tüm Onaylar Kontrol Et"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [],
+ "onExits": [],
+ "transitions": [
+ {
+ "key": "more-approvals-pending",
+ "target": "all-ready",
+ "triggerType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "More Approvals Pending"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Daha Fazla Onay Bekliyor"
+ }
+ ],
+ "schema": null,
+ "rule": {
+ "location": "./src/MoreApprovalsPendingRule.csx",
+ "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIE1vcmUgQXBwcm92YWxzIFBlbmRpbmcgUnVsZSAtIENoZWNrcyBpZiBtb3JlIGFwcHJvdmFscyBhcmUgcGVuZGluZwovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgTW9yZUFwcHJvdmFsc1BlbmRpbmdSdWxlIDogSUNvbmRpdGlvbk1hcHBpbmcKewogICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gSGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgYXBwcm92ZWRDb3VudCA9IChpbnQpKGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LmFwcHJvdmVkQ291bnQgPz8gMCk7CiAgICAgICAgICAgIHZhciB0b3RhbERvY3VtZW50cyA9IChpbnQpKGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnRvdGFsRG9jdW1lbnRzID8/IDApOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gTW9yZSBhcHByb3ZhbHMgcGVuZGluZyBpZiBhcHByb3ZlZCBjb3VudCBpcyBsZXNzIHRoYW4gdG90YWwKICAgICAgICAgICAgcmV0dXJuIGFwcHJvdmVkQ291bnQgPCB0b3RhbERvY3VtZW50czsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9Cn0KCg=="
+ },
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ },
+ {
+ "key": "all-approved",
+ "target": "contract-completed",
+ "triggerType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "All Documents Approved"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Tüm Dökümanlar Onaylandı"
+ }
+ ],
+ "schema": null,
+ "rule": {
+ "location": "./src/AllApprovedRule.csx",
+ "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsbCBBcHByb3ZlZCBSdWxlIC0gQ2hlY2tzIGlmIGFsbCBkb2N1bWVudHMgYXJlIGFwcHJvdmVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbGxBcHByb3ZlZFJ1bGUgOiBJQ29uZGl0aW9uTWFwcGluZwp7CiAgICBwdWJsaWMgYXN5bmMgVGFzazxib29sPiBIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcHByb3ZlZENvdW50ID0gKGludCkoY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uYXBwcm92ZWRDb3VudCA/PyAwKTsKICAgICAgICAgICAgdmFyIHRvdGFsRG9jdW1lbnRzID0gKGludCkoY29udGV4dC5JbnN0YW5jZT8uRGF0YT8udG90YWxEb2N1bWVudHMgPz8gMCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBBbGwgYXBwcm92ZWQgd2hlbiBhcHByb3ZlZCBjb3VudCBlcXVhbHMgdG90YWwgZG9jdW1lbnRzCiAgICAgICAgICAgIHJldHVybiBhcHByb3ZlZENvdW50ID49IHRvdGFsRG9jdW1lbnRzOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQp9Cgo="
+ },
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ }
+ ]
+ },
+ {
+ "key": "contract-completed",
+ "stateType": 3,
+ "subType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Contract Completed"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Kontrat Tamamlandı"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [],
+ "onExits": [],
+ "transitions": []
+ },
+ {
+ "key": "contract-rejected",
+ "stateType": 3,
+ "subType": 2,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Contract Rejected"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Kontrat Reddedildi"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [],
+ "onExits": [],
+ "transitions": []
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/core/Workflows/contract/contract-document-subflow.json b/core/Workflows/contract/contract-document-subflow.json
new file mode 100644
index 0000000..df14cec
--- /dev/null
+++ b/core/Workflows/contract/contract-document-subflow.json
@@ -0,0 +1,455 @@
+{
+ "key": "contract-document-subflow",
+ "flow": "sys-flows",
+ "domain": "core",
+ "version": "1.0.0",
+ "tags": [
+ "contract",
+ "document",
+ "subflow",
+ "render",
+ "approval"
+ ],
+ "attributes": {
+ "type": "S",
+ "timeout": null,
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Contract Document Subflow"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Kontrat Döküman Alt Akışı"
+ }
+ ],
+ "functions": [],
+ "features": [],
+ "extensions": [],
+ "sharedTransitions": [],
+ "startTransition": {
+ "key": "start-document-process",
+ "target": "render-document",
+ "triggerType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Start Document Process"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Döküman İşlemini Başlat"
+ }
+ ],
+ "onExecutionTasks": [
+ {
+ "order": 1,
+ "task": {
+ "key": "script-task",
+ "domain": "core",
+ "version": "1.0.0",
+ "flow": "sys-tasks"
+ },
+ "mapping": {
+ "location": "./src/InitDocumentMapping.csx",
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBJbml0aWFsaXplIERvY3VtZW50IFByb2Nlc3MgTWFwcGluZyAtIFByZXBhcmVzIGRvY3VtZW50IGRhdGEgZm9yIHN1YnByb2Nlc3MKLy8vIDwvc3VtbWFyeT4KcHVibGljIGNsYXNzIEluaXREb2N1bWVudE1hcHBpbmcgOiBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UoKSk7CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlucHV0RGF0YSA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJpbml0LWRvY3VtZW50LXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhcmVudEluc3RhbmNlSWQgPSBpbnB1dERhdGE/LnBhcmVudEluc3RhbmNlSWQsCiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5zdGFuY2VLZXkgPSBpbnB1dERhdGE/LnBhcmVudEluc3RhbmNlS2V5LAogICAgICAgICAgICAgICAgICAgIHBhcmVudFdvcmtmbG93S2V5ID0gaW5wdXREYXRhPy5wYXJlbnRXb3JrZmxvd0tleSwKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCA9IGlucHV0RGF0YT8uZG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRJbmRleCA9IGlucHV0RGF0YT8uZG9jdW1lbnRJbmRleCwKICAgICAgICAgICAgICAgICAgICBncm91cENvZGUgPSBpbnB1dERhdGE/Lmdyb3VwQ29kZSwKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU3RhcnRlZEF0ID0gRGF0ZVRpbWUuVXRjTm93LAogICAgICAgICAgICAgICAgICAgIHJlbmRlclN0YXR1cyA9ICJwZW5kaW5nIiwKICAgICAgICAgICAgICAgICAgICBhcHByb3ZhbFN0YXR1cyA9ICJwZW5kaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJjb250cmFjdCIsICJkb2N1bWVudCIsICJpbml0aWFsaXplZCIgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiaW5pdC1kb2N1bWVudC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9Cn0KCg=="
+ }
+ }
+ ]
+ },
+ "states": [
+ {
+ "key": "render-document",
+ "stateType": 1,
+ "subType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Render Document"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Dökümanı Hazırla"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [
+ {
+ "order": 1,
+ "task": {
+ "key": "render-document",
+ "domain": "core",
+ "version": "1.0.0",
+ "flow": "sys-tasks"
+ },
+ "mapping": {
+ "location": "./src/RenderDocumentMapping.csx",
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBSZW5kZXIgRG9jdW1lbnQgTWFwcGluZyAtIFJlbmRlcnMgZG9jdW1lbnQgdmlhIEhUVFAgQVBJCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBSZW5kZXJEb2N1bWVudE1hcHBpbmcgOiBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgaHR0cFRhc2sgPSB0YXNrIGFzIEh0dHBUYXNrOwogICAgICAgICAgICBpZiAoaHR0cFRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhbiBIdHRwVGFzayIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZG9jdW1lbnQgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudDsKICAgICAgICAgICAgdmFyIGdyb3VwQ29kZSA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/Lmdyb3VwQ29kZT8uVG9TdHJpbmcoKSA/PyAiIjsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIE1vY2tvb24gQVBJIGNvbnRyYWN0IHN0cnVjdHVyZTogY29udHJhY3RJZCwgY29udHJhY3RUeXBlLCBjb250cmFjdE5hbWUsIHRlbXBsYXRlSWQsIGNvbnRyYWN0RGF0YQogICAgICAgICAgICB2YXIgcmVxdWVzdEJvZHkgPSBuZXcKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZ3JvdXBDb2RlID0gZ3JvdXBDb2RlLAogICAgICAgICAgICAgICAgY29udHJhY3RJZCA9IGRvY3VtZW50Py5jb250cmFjdElkLAogICAgICAgICAgICAgICAgY29udHJhY3RUeXBlID0gZG9jdW1lbnQ/LmNvbnRyYWN0VHlwZSwKICAgICAgICAgICAgICAgIGNvbnRyYWN0TmFtZSA9IGRvY3VtZW50Py5jb250cmFjdE5hbWUsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkID0gZG9jdW1lbnQ/LnRlbXBsYXRlSWQsCiAgICAgICAgICAgICAgICBjb250cmFjdERhdGEgPSBkb2N1bWVudD8uY29udHJhY3REYXRhID8/IG5ldyB7IH0sCiAgICAgICAgICAgICAgICByZXF1ZXN0SWQgPSBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgdGltZXN0YW1wID0gRGF0ZVRpbWUuVXRjTm93CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBodHRwVGFzay5TZXRCb2R5KHJlcXVlc3RCb2R5KTsKCiAgICAgICAgICAgIHZhciBoZWFkZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc/PgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAgICAgWyJYLVJlcXVlc3QtSWQiXSA9IEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICBbIlgtQ29udHJhY3QtSWQiXSA9IGRvY3VtZW50Py5jb250cmFjdElkPy5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgWyJYLUNvcnJlbGF0aW9uLUlkIl0gPSBjb250ZXh0Lkluc3RhbmNlLklkLlRvU3RyaW5nKCkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaHR0cFRhc2suU2V0SGVhZGVycyhoZWFkZXJzKTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gInJlbmRlci1pbnB1dC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKICAgICAgICAgICAgdmFyIHN0YXR1c0NvZGUgPSByZXNwb25zZT8uc3RhdHVzQ29kZSA/PyA1MDA7CgogICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA+PSAyMDAgJiYgc3RhdHVzQ29kZSA8IDMwMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gTW9ja29vbiBBUEkgcmV0dXJuczogZG9jdW1lbnRJZCwgZG9jdW1lbnRVcmwsIGRvY3VtZW50U2l6ZSwgcGFnZUNvdW50LCBjaGVja3N1bSwgZXhwaXJlc0F0LCByZW5kZXJlZEF0LCBmb3JtYXQsIHRlbXBsYXRlVmVyc2lvbgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJyZW5kZXItc3VjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyU3RhdHVzID0gInN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudElkID0gcmVzcG9uc2U/LmRhdGE/LmRhdGE/LmRvY3VtZW50SWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50VXJsID0gcmVzcG9uc2U/LmRhdGE/LmRhdGE/LmRvY3VtZW50VXJsLAogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudFNpemUgPSByZXNwb25zZT8uZGF0YT8uZGF0YT8uZG9jdW1lbnRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICBwYWdlQ291bnQgPSByZXNwb25zZT8uZGF0YT8uZGF0YT8ucGFnZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bSA9IHJlc3BvbnNlPy5kYXRhPy5kYXRhPy5jaGVja3N1bSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlc0F0ID0gcmVzcG9uc2U/LmRhdGE/LmRhdGE/LmV4cGlyZXNBdCwKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gcmVzcG9uc2U/LmRhdGE/LmRhdGE/LmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVWZXJzaW9uID0gcmVzcG9uc2U/LmRhdGE/LmRhdGE/LnRlbXBsYXRlVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRBdCA9IHJlc3BvbnNlPy5kYXRhPy5kYXRhPy5yZW5kZXJlZEF0ID8/IERhdGVUaW1lLlV0Y05vdy5Ub1N0cmluZygibyIpCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY29udHJhY3QiLCAiZG9jdW1lbnQiLCAicmVuZGVyZWQiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gInJlbmRlci1mYWlsZWQiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlbmRlclN0YXR1cyA9ICJmYWlsZWQiLAogICAgICAgICAgICAgICAgICAgIGVycm9yID0gcmVzcG9uc2U/LmRhdGE/LmVycm9yPy5tZXNzYWdlID8/IHJlc3BvbnNlPy5lcnJvciA/PyAiRmFpbGVkIHRvIHJlbmRlciBkb2N1bWVudCIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gcmVzcG9uc2U/LmRhdGE/LmVycm9yPy5jb2RlLAogICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlLAogICAgICAgICAgICAgICAgICAgIGZhaWxlZEF0ID0gRGF0ZVRpbWUuVXRjTm93CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJyZW5kZXItZXhjZXB0aW9uIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJTdGF0dXMgPSAiZmFpbGVkIiwKICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGV4Lk1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgZmFpbGVkQXQgPSBEYXRlVGltZS5VdGNOb3cKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9Cn0KCg=="
+ }
+ }
+ ],
+ "onExits": [],
+ "transitions": [
+ {
+ "key": "render-success",
+ "target": "notify-parent-ready",
+ "triggerType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Render Success"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Hazırlama Başarılı"
+ }
+ ],
+ "schema": null,
+ "rule": {
+ "location": "./src/RenderSuccessRule.csx",
+ "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIFJlbmRlciBTdWNjZXNzIFJ1bGUgLSBDaGVja3MgaWYgZG9jdW1lbnQgcmVuZGVyIHdhcyBzdWNjZXNzZnVsCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBSZW5kZXJTdWNjZXNzUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlbmRlclN0YXR1cyA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnJlbmRlclN0YXR1cz8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgcmV0dXJuIHJlbmRlclN0YXR1cyA9PSAic3VjY2VzcyI7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQp9Cgo="
+ },
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ },
+ {
+ "key": "render-failed",
+ "target": "document-failed",
+ "triggerType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Render Failed"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Hazırlama Başarısız"
+ }
+ ],
+ "schema": null,
+ "rule": {
+ "location": "./src/RenderFailedRule.csx",
+ "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIFJlbmRlciBGYWlsZWQgUnVsZSAtIENoZWNrcyBpZiBkb2N1bWVudCByZW5kZXIgZmFpbGVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBSZW5kZXJGYWlsZWRSdWxlIDogSUNvbmRpdGlvbk1hcHBpbmcKewogICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gSGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVuZGVyU3RhdHVzID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucmVuZGVyU3RhdHVzPy5Ub1N0cmluZygpOwogICAgICAgICAgICByZXR1cm4gcmVuZGVyU3RhdHVzID09ICJmYWlsZWQiOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQp9Cgo="
+ },
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ }
+ ]
+ },
+ {
+ "key": "notify-parent-ready",
+ "stateType": 2,
+ "subType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Notify Parent - Document Ready"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Üst Akışa Bildir - Döküman Hazır"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [
+ {
+ "order": 1,
+ "task": {
+ "key": "notify-document-ready",
+ "domain": "core",
+ "version": "1.0.0",
+ "flow": "sys-tasks"
+ },
+ "mapping": {
+ "location": "./src/NotifyDocumentReadyMapping.csx",
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBOb3RpZnkgRG9jdW1lbnQgUmVhZHkgTWFwcGluZyAtIE5vdGlmaWVzIHBhcmVudCB3b3JrZmxvdyB0aGF0IGRvY3VtZW50IGlzIHJlYWR5Ci8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBOb3RpZnlEb2N1bWVudFJlYWR5TWFwcGluZyA6IElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkaXJlY3RUcmlnZ2VyVGFzayA9IHRhc2sgYXMgRGlyZWN0VHJpZ2dlclRhc2s7CiAgICAgICAgICAgIGlmIChkaXJlY3RUcmlnZ2VyVGFzayA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGFzayBtdXN0IGJlIGEgRGlyZWN0VHJpZ2dlclRhc2siKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ29uZmlndXJlIHRhcmdldCB3b3JrZmxvdwogICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXREb21haW4oImNvcmUiKTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0RmxvdygiY29udHJhY3QtYXBwcm92YWwtd29ya2Zsb3ciKTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0VHJhbnNpdGlvbk5hbWUoImRvY3VtZW50LXJlYWR5Iik7CiAgICAgICAgICAgIGRpcmVjdFRyaWdnZXJUYXNrLlNldFN5bmModHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBTZXQgcGFyZW50IGluc3RhbmNlCiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZUlkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucGFyZW50SW5zdGFuY2VJZD8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlS2V5ID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucGFyZW50SW5zdGFuY2VLZXk/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHBhcmVudEluc3RhbmNlSWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXRJbnN0YW5jZShwYXJlbnRJbnN0YW5jZUlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHBhcmVudEluc3RhbmNlS2V5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0S2V5KHBhcmVudEluc3RhbmNlS2V5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUHJlcGFyZSB0cmFuc2l0aW9uIGJvZHkgLSB1c2luZyBNb2Nrb29uIGNvbnRyYWN0IHN0cnVjdHVyZSAoY29udHJhY3RJZCwgY29udHJhY3ROYW1lLCBjb250cmFjdFR5cGUpCiAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uQm9keSA9IG5ldwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250cmFjdElkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnQ/LmNvbnRyYWN0SWQsCiAgICAgICAgICAgICAgICBjb250cmFjdE5hbWUgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudD8uY29udHJhY3ROYW1lLAogICAgICAgICAgICAgICAgY29udHJhY3RUeXBlID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnQ/LmNvbnRyYWN0VHlwZSwKICAgICAgICAgICAgICAgIGRvY3VtZW50SW5kZXggPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudEluZGV4LAogICAgICAgICAgICAgICAgc3VicHJvY2Vzc0luc3RhbmNlSWQgPSBjb250ZXh0Lkluc3RhbmNlPy5JZCwKICAgICAgICAgICAgICAgIHN1YnByb2Nlc3NJbnN0YW5jZUtleSA9IGNvbnRleHQuSW5zdGFuY2U/LktleSwKICAgICAgICAgICAgICAgIGRvY3VtZW50VXJsID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnRVcmwsCiAgICAgICAgICAgICAgICBkb2N1bWVudElkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnRJZCwKICAgICAgICAgICAgICAgIHBhZ2VDb3VudCA9IGNvbnRleHQuSW5zdGFuY2U/LkRhdGE/LnBhZ2VDb3VudCwKICAgICAgICAgICAgICAgIHJlYWR5QXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICBzdGF0dXMgPSAicmVhZHkiCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRpcmVjdFRyaWdnZXJUYXNrLlNldEJvZHkodHJhbnNpdGlvbkJvZHkpOwoKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UoKSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAibm90aWZ5LXJlYWR5LWlucHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBlcnJvciA9IGV4Lk1lc3NhZ2UgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc1N1Y2Nlc3MgPT0gdHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJub3RpZnktcmVhZHktc3VjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm90aWZpZWQgPSB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllZEF0ID0gRGF0ZVRpbWUuVXRjTm93CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY29udHJhY3QiLCAiZG9jdW1lbnQtcmVhZHkiLCAibm90aWZpZWQiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gIm5vdGlmeS1yZWFkeS1mYWlsZWQiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhcmVudE5vdGlmaWVkID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZT8uZXJyb3JNZXNzYWdlID8/ICJGYWlsZWQgdG8gbm90aWZ5IHBhcmVudCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gIm5vdGlmeS1yZWFkeS1leGNlcHRpb24iLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo="
+ }
+ }
+ ],
+ "onExits": [],
+ "transitions": [
+ {
+ "key": "notify-ready-completed",
+ "target": "waiting-for-approval",
+ "triggerType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Notification Sent"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Bildirim Gönderildi"
+ }
+ ],
+ "schema": null,
+ "rule": {
+ "location": "./src/AlwaysTrueRule.csx",
+ "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo="
+ },
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ }
+ ]
+ },
+ {
+ "key": "waiting-for-approval",
+ "stateType": 2,
+ "subType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Waiting for Approval"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Onay Bekliyor"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [],
+ "onExits": [],
+ "transitions": [
+ {
+ "key": "approve-document",
+ "target": "notify-parent-approved",
+ "triggerType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Approve Document"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Dökümanı Onayla"
+ }
+ ],
+ "schema": null,
+ "rule": null,
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ },
+ {
+ "key": "reject-document",
+ "target": "notify-parent-rejected",
+ "triggerType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Reject Document"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Dökümanı Reddet"
+ }
+ ],
+ "schema": null,
+ "rule": null,
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ }
+ ]
+ },
+ {
+ "key": "notify-parent-approved",
+ "stateType": 2,
+ "subType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Notify Parent - Approved"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Üst Akışa Bildir - Onaylandı"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [
+ {
+ "order": 1,
+ "task": {
+ "key": "notify-document-approved",
+ "domain": "core",
+ "version": "1.0.0",
+ "flow": "sys-tasks"
+ },
+ "mapping": {
+ "location": "./src/NotifyDocumentApprovedMapping.csx",
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBOb3RpZnkgRG9jdW1lbnQgQXBwcm92ZWQgTWFwcGluZyAtIE5vdGlmaWVzIHBhcmVudCB3b3JrZmxvdyB0aGF0IGRvY3VtZW50IGlzIGFwcHJvdmVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBOb3RpZnlEb2N1bWVudEFwcHJvdmVkTWFwcGluZyA6IElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkaXJlY3RUcmlnZ2VyVGFzayA9IHRhc2sgYXMgRGlyZWN0VHJpZ2dlclRhc2s7CiAgICAgICAgICAgIGlmIChkaXJlY3RUcmlnZ2VyVGFzayA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGFzayBtdXN0IGJlIGEgRGlyZWN0VHJpZ2dlclRhc2siKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ29uZmlndXJlIHRhcmdldCB3b3JrZmxvdwogICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXREb21haW4oImNvcmUiKTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0RmxvdygiY29udHJhY3QtYXBwcm92YWwtd29ya2Zsb3ciKTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0VHJhbnNpdGlvbk5hbWUoImRvY3VtZW50LWFwcHJvdmVkIik7CiAgICAgICAgICAgIGRpcmVjdFRyaWdnZXJUYXNrLlNldFN5bmModHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBTZXQgcGFyZW50IGluc3RhbmNlCiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZUlkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucGFyZW50SW5zdGFuY2VJZD8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlS2V5ID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucGFyZW50SW5zdGFuY2VLZXk/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHBhcmVudEluc3RhbmNlSWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXRJbnN0YW5jZShwYXJlbnRJbnN0YW5jZUlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHBhcmVudEluc3RhbmNlS2V5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0S2V5KHBhcmVudEluc3RhbmNlS2V5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUHJlcGFyZSB0cmFuc2l0aW9uIGJvZHkgLSB1c2luZyBNb2Nrb29uIGNvbnRyYWN0IHN0cnVjdHVyZSAoY29udHJhY3RJZCwgY29udHJhY3ROYW1lLCBjb250cmFjdFR5cGUpCiAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uQm9keSA9IG5ldwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250cmFjdElkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnQ/LmNvbnRyYWN0SWQsCiAgICAgICAgICAgICAgICBjb250cmFjdE5hbWUgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudD8uY29udHJhY3ROYW1lLAogICAgICAgICAgICAgICAgY29udHJhY3RUeXBlID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnQ/LmNvbnRyYWN0VHlwZSwKICAgICAgICAgICAgICAgIGRvY3VtZW50SW5kZXggPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudEluZGV4LAogICAgICAgICAgICAgICAgc3VicHJvY2Vzc0luc3RhbmNlSWQgPSBjb250ZXh0Lkluc3RhbmNlPy5JZCwKICAgICAgICAgICAgICAgIHN1YnByb2Nlc3NJbnN0YW5jZUtleSA9IGNvbnRleHQuSW5zdGFuY2U/LktleSwKICAgICAgICAgICAgICAgIGFwcHJvdmVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICBhcHByb3ZlZEJ5ID0gY29udGV4dC5Cb2R5Py5hcHByb3ZlZEJ5ID8/ICJ1c2VyIiwKICAgICAgICAgICAgICAgIHN0YXR1cyA9ICJhcHByb3ZlZCIKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0Qm9keSh0cmFuc2l0aW9uQm9keSk7CgogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJub3RpZnktYXBwcm92ZWQtaW5wdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgYXN5bmMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBjb250ZXh0LkJvZHk7CgogICAgICAgICAgICBpZiAocmVzcG9uc2U/LmlzU3VjY2VzcyA9PSB0cnVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gIm5vdGlmeS1hcHByb3ZlZC1zdWNjZXNzIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb3RpZmllZCA9IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmFsU3RhdHVzID0gImFwcHJvdmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWRBdCA9IERhdGVUaW1lLlV0Y05vdwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImNvbnRyYWN0IiwgImRvY3VtZW50LWFwcHJvdmVkIiwgIm5vdGlmaWVkIiB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJub3RpZnktYXBwcm92ZWQtZmFpbGVkIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwYXJlbnROb3RpZmllZCA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVycm9yID0gcmVzcG9uc2U/LmVycm9yTWVzc2FnZSA/PyAiRmFpbGVkIHRvIG5vdGlmeSBwYXJlbnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJub3RpZnktYXBwcm92ZWQtZXhjZXB0aW9uIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBlcnJvciA9IGV4Lk1lc3NhZ2UgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KfQoK"
+ }
+ }
+ ],
+ "onExits": [],
+ "transitions": [
+ {
+ "key": "approval-notified",
+ "target": "document-completed",
+ "triggerType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Approval Notified"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Onay Bildirildi"
+ }
+ ],
+ "schema": null,
+ "rule": {
+ "location": "./src/AlwaysTrueRule.csx",
+ "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo="
+ },
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ }
+ ]
+ },
+ {
+ "key": "notify-parent-rejected",
+ "stateType": 2,
+ "subType": 0,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Notify Parent - Rejected"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Üst Akışa Bildir - Reddedildi"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [
+ {
+ "order": 1,
+ "task": {
+ "key": "notify-document-approved",
+ "domain": "core",
+ "version": "1.0.0",
+ "flow": "sys-tasks"
+ },
+ "mapping": {
+ "location": "./src/NotifyDocumentRejectedMapping.csx",
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBOb3RpZnkgRG9jdW1lbnQgUmVqZWN0ZWQgTWFwcGluZyAtIE5vdGlmaWVzIHBhcmVudCB3b3JrZmxvdyB0aGF0IGRvY3VtZW50IGlzIHJlamVjdGVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBOb3RpZnlEb2N1bWVudFJlamVjdGVkTWFwcGluZyA6IElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkaXJlY3RUcmlnZ2VyVGFzayA9IHRhc2sgYXMgRGlyZWN0VHJpZ2dlclRhc2s7CiAgICAgICAgICAgIGlmIChkaXJlY3RUcmlnZ2VyVGFzayA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGFzayBtdXN0IGJlIGEgRGlyZWN0VHJpZ2dlclRhc2siKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ29uZmlndXJlIHRhcmdldCB3b3JrZmxvdwogICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXREb21haW4oImNvcmUiKTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0RmxvdygiY29udHJhY3QtYXBwcm92YWwtd29ya2Zsb3ciKTsKICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0VHJhbnNpdGlvbk5hbWUoImRvY3VtZW50LXJlamVjdGVkIik7CiAgICAgICAgICAgIGRpcmVjdFRyaWdnZXJUYXNrLlNldFN5bmModHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBTZXQgcGFyZW50IGluc3RhbmNlCiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZUlkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucGFyZW50SW5zdGFuY2VJZD8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlS2V5ID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8ucGFyZW50SW5zdGFuY2VLZXk/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHBhcmVudEluc3RhbmNlSWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXRJbnN0YW5jZShwYXJlbnRJbnN0YW5jZUlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHBhcmVudEluc3RhbmNlS2V5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGlyZWN0VHJpZ2dlclRhc2suU2V0S2V5KHBhcmVudEluc3RhbmNlS2V5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUHJlcGFyZSB0cmFuc2l0aW9uIGJvZHkgLSB1c2luZyBNb2Nrb29uIGNvbnRyYWN0IHN0cnVjdHVyZSAoY29udHJhY3RJZCwgY29udHJhY3ROYW1lLCBjb250cmFjdFR5cGUpCiAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uQm9keSA9IG5ldwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250cmFjdElkID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnQ/LmNvbnRyYWN0SWQsCiAgICAgICAgICAgICAgICBjb250cmFjdE5hbWUgPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudD8uY29udHJhY3ROYW1lLAogICAgICAgICAgICAgICAgY29udHJhY3RUeXBlID0gY29udGV4dC5JbnN0YW5jZT8uRGF0YT8uZG9jdW1lbnQ/LmNvbnRyYWN0VHlwZSwKICAgICAgICAgICAgICAgIGRvY3VtZW50SW5kZXggPSBjb250ZXh0Lkluc3RhbmNlPy5EYXRhPy5kb2N1bWVudEluZGV4LAogICAgICAgICAgICAgICAgc3VicHJvY2Vzc0luc3RhbmNlSWQgPSBjb250ZXh0Lkluc3RhbmNlPy5JZCwKICAgICAgICAgICAgICAgIHN1YnByb2Nlc3NJbnN0YW5jZUtleSA9IGNvbnRleHQuSW5zdGFuY2U/LktleSwKICAgICAgICAgICAgICAgIHJlamVjdGVkQXQgPSBEYXRlVGltZS5VdGNOb3csCiAgICAgICAgICAgICAgICByZWplY3RlZEJ5ID0gY29udGV4dC5Cb2R5Py5yZWplY3RlZEJ5ID8/ICJ1c2VyIiwKICAgICAgICAgICAgICAgIHJlamVjdGlvblJlYXNvbiA9IGNvbnRleHQuQm9keT8ucmVhc29uID8/ICJObyByZWFzb24gcHJvdmlkZWQiLAogICAgICAgICAgICAgICAgc3RhdHVzID0gInJlamVjdGVkIgogICAgICAgICAgICB9OwogICAgICAgICAgICBkaXJlY3RUcmlnZ2VyVGFzay5TZXRCb2R5KHRyYW5zaXRpb25Cb2R5KTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gIm5vdGlmeS1yZWplY3RlZC1pbnB1dC1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgZXJyb3IgPSBleC5NZXNzYWdlIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKCiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNTdWNjZXNzID09IHRydWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPSAibm90aWZ5LXJlamVjdGVkLXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vdGlmaWVkID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm92YWxTdGF0dXMgPSAicmVqZWN0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllZEF0ID0gRGF0ZVRpbWUuVXRjTm93CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiY29udHJhY3QiLCAiZG9jdW1lbnQtcmVqZWN0ZWQiLCAibm90aWZpZWQiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gIm5vdGlmeS1yZWplY3RlZC1mYWlsZWQiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhcmVudE5vdGlmaWVkID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZT8uZXJyb3JNZXNzYWdlID8/ICJGYWlsZWQgdG8gbm90aWZ5IHBhcmVudCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gIm5vdGlmeS1yZWplY3RlZC1leGNlcHRpb24iLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGVycm9yID0gZXguTWVzc2FnZSB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQp9Cgo="
+ }
+ }
+ ],
+ "onExits": [],
+ "transitions": [
+ {
+ "key": "rejection-notified",
+ "target": "document-rejected",
+ "triggerType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Rejection Notified"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Red Bildirildi"
+ }
+ ],
+ "schema": null,
+ "rule": {
+ "location": "./src/AlwaysTrueRule.csx",
+ "code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIEFsd2F5cyBUcnVlIFJ1bGUgLSBVc2VkIGZvciBhdXRvIHRyYW5zaXRpb25zIHRoYXQgc2hvdWxkIGFsd2F5cyBwcm9jZWVkCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBBbHdheXNUcnVlUnVsZSA6IElDb25kaXRpb25NYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cgo="
+ },
+ "timer": null,
+ "view": null,
+ "onExecutionTasks": []
+ }
+ ]
+ },
+ {
+ "key": "document-completed",
+ "stateType": 3,
+ "subType": 1,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Document Approved"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Döküman Onaylandı"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [],
+ "onExits": [],
+ "transitions": []
+ },
+ {
+ "key": "document-rejected",
+ "stateType": 3,
+ "subType": 2,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Document Rejected"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Döküman Reddedildi"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [],
+ "onExits": [],
+ "transitions": []
+ },
+ {
+ "key": "document-failed",
+ "stateType": 3,
+ "subType": 2,
+ "versionStrategy": "Minor",
+ "labels": [
+ {
+ "language": "en-US",
+ "label": "Document Failed"
+ },
+ {
+ "language": "tr-TR",
+ "label": "Döküman Başarısız"
+ }
+ ],
+ "view": null,
+ "subFlow": null,
+ "onEntries": [],
+ "onExits": [],
+ "transitions": []
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/core/Workflows/contract/src/AllApprovedRule.csx b/core/Workflows/contract/src/AllApprovedRule.csx
new file mode 100644
index 0000000..d685540
--- /dev/null
+++ b/core/Workflows/contract/src/AllApprovedRule.csx
@@ -0,0 +1,25 @@
+using System.Threading.Tasks;
+using BBT.Workflow.Scripting;
+
+///
+/// All Approved Rule - Checks if all documents are approved
+///
+public class AllApprovedRule : IConditionMapping
+{
+ public async Task Handler(ScriptContext context)
+ {
+ try
+ {
+ var approvedCount = (int)(context.Instance?.Data?.approvedCount ?? 0);
+ var totalDocuments = (int)(context.Instance?.Data?.totalDocuments ?? 0);
+
+ // All approved when approved count equals total documents
+ return approvedCount >= totalDocuments;
+ }
+ catch (Exception)
+ {
+ return true;
+ }
+ }
+}
+
diff --git a/core/Workflows/contract/src/AllDocumentsReadyRule.csx b/core/Workflows/contract/src/AllDocumentsReadyRule.csx
new file mode 100644
index 0000000..9678ce0
--- /dev/null
+++ b/core/Workflows/contract/src/AllDocumentsReadyRule.csx
@@ -0,0 +1,25 @@
+using System.Threading.Tasks;
+using BBT.Workflow.Scripting;
+
+///
+/// All Documents Ready Rule - Checks if all documents are ready
+///
+public class AllDocumentsReadyRule : IConditionMapping
+{
+ public async Task Handler(ScriptContext context)
+ {
+ try
+ {
+ var currentIndex = (int)(context.Instance?.Data?.currentDocumentIndex ?? 0);
+ var totalDocuments = (int)(context.Instance?.Data?.totalDocuments ?? 0);
+
+ // All documents are processed (started) when current index equals total
+ return currentIndex >= totalDocuments;
+ }
+ catch (Exception)
+ {
+ return true;
+ }
+ }
+}
+
diff --git a/core/Workflows/contract/src/AlwaysTrueRule.csx b/core/Workflows/contract/src/AlwaysTrueRule.csx
new file mode 100644
index 0000000..44e727b
--- /dev/null
+++ b/core/Workflows/contract/src/AlwaysTrueRule.csx
@@ -0,0 +1,14 @@
+using System.Threading.Tasks;
+using BBT.Workflow.Scripting;
+
+///
+/// Always True Rule - Used for auto transitions that should always proceed
+///
+public class AlwaysTrueRule : IConditionMapping
+{
+ public async Task Handler(ScriptContext context)
+ {
+ return true;
+ }
+}
+
diff --git a/core/Workflows/contract/src/DocumentsLoadedRule.csx b/core/Workflows/contract/src/DocumentsLoadedRule.csx
new file mode 100644
index 0000000..d9efb05
--- /dev/null
+++ b/core/Workflows/contract/src/DocumentsLoadedRule.csx
@@ -0,0 +1,22 @@
+using System.Threading.Tasks;
+using BBT.Workflow.Scripting;
+
+///
+/// Documents Loaded Rule - Checks if documents are loaded successfully
+///
+public class DocumentsLoadedRule : IConditionMapping
+{
+ public async Task Handler(ScriptContext context)
+ {
+ try
+ {
+ var totalDocuments = context.Instance?.Data?.totalDocuments ?? 0;
+ return (int)totalDocuments > 0;
+ }
+ catch (Exception)
+ {
+ return false;
+ }
+ }
+}
+
diff --git a/core/Workflows/contract/src/GetContractDocumentsMapping.csx b/core/Workflows/contract/src/GetContractDocumentsMapping.csx
new file mode 100644
index 0000000..f42b81c
--- /dev/null
+++ b/core/Workflows/contract/src/GetContractDocumentsMapping.csx
@@ -0,0 +1,124 @@
+using System;
+using System.Threading.Tasks;
+using BBT.Workflow.Definitions;
+using BBT.Workflow.Scripting;
+
+///
+/// Get Contract Documents Mapping - Retrieves document list from API
+///
+public class GetContractDocumentsMapping : IMapping
+{
+ public Task InputHandler(WorkflowTask task, ScriptContext context)
+ {
+ try
+ {
+ var httpTask = task as HttpTask;
+ if (httpTask == null)
+ {
+ throw new InvalidOperationException("Task must be an HttpTask");
+ }
+
+ var groupCode = context.Instance?.Data?.groupCode?.ToString() ?? "";
+
+ // Mockoon API expects "groupCode" field
+ var requestBody = new
+ {
+ groupCode = groupCode,
+ requestId = Guid.NewGuid().ToString(),
+ timestamp = DateTime.UtcNow
+ };
+
+ httpTask.SetBody(requestBody);
+
+ var headers = new Dictionary
+ {
+ ["Content-Type"] = "application/json",
+ ["X-Request-Id"] = Guid.NewGuid().ToString(),
+ ["X-Correlation-Id"] = context.Instance.Id.ToString()
+ };
+ httpTask.SetHeaders(headers);
+
+ return Task.FromResult(new ScriptResponse());
+ }
+ catch (Exception ex)
+ {
+ return Task.FromResult(new ScriptResponse
+ {
+ Key = "get-documents-input-error",
+ Data = new { error = ex.Message }
+ });
+ }
+ }
+
+ public async Task OutputHandler(ScriptContext context)
+ {
+ try
+ {
+ var response = context.Body;
+ var statusCode = response?.statusCode ?? 500;
+
+ if (statusCode >= 200 && statusCode < 300)
+ {
+ // Mockoon API returns "contracts" array, not "documents"
+ var contracts = response?.data?.data?.contracts ?? new object[] { };
+ var contractList = new List