189 lines
8.1 KiB
PowerShell
189 lines
8.1 KiB
PowerShell
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory = $true)][ValidateSet('purchase', 'leave')][string]$Workflow,
|
|
[Parameter(Mandatory = $true)][string]$OutputPath
|
|
)
|
|
|
|
Set-StrictMode -Version 2.0
|
|
$ErrorActionPreference = 'Stop'
|
|
$codes = if ($Workflow -eq 'purchase') {
|
|
@(
|
|
'purchase_unique_match_commit', 'purchase_ambiguous_match_blocked',
|
|
'purchase_overallocation_blocked', 'purchase_permission_denied',
|
|
'purchase_database_permission_recheck_denied',
|
|
'purchase_currency_field_missing_blocked',
|
|
'purchase_currency_crosswalk_unapproved_blocked',
|
|
'purchase_row_scope_denied',
|
|
'purchase_runtime_recheck_blocked', 'purchase_transaction_rollback',
|
|
'purchase_idempotency_replay', 'purchase_idempotency_conflict',
|
|
'purchase_audit_correlated'
|
|
)
|
|
} else {
|
|
@(
|
|
'leave_natural_language_resolution',
|
|
'leave_multi_day_calendar_resolution',
|
|
'leave_resolution_proof_bypass_blocked', 'leave_ambiguous_type_blocked',
|
|
'leave_ambiguous_flow_type_blocked',
|
|
'leave_time_segment_required_blocked',
|
|
'leave_local_time_zone_rejected',
|
|
'leave_other_employee_denied', 'leave_create_draft_commit',
|
|
'leave_permission_denied', 'leave_database_permission_recheck_denied',
|
|
'leave_submit_separate_confirmation', 'leave_overlap_blocked',
|
|
'leave_stale_flow_type_blocked',
|
|
'leave_runtime_recheck_blocked', 'leave_transaction_rollback',
|
|
'leave_idempotency_replay', 'leave_idempotency_conflict',
|
|
'leave_audit_correlated'
|
|
)
|
|
}
|
|
$placeholderHash = 'REPLACE_WITH_SHA256'
|
|
$observedAt = [DateTime]::UtcNow.ToString('yyyy-MM-ddTHH:mm:ss.fffZ')
|
|
$expectedResults = @{
|
|
purchase_unique_match_commit = 'purchase_document_created'
|
|
purchase_ambiguous_match_blocked = 'purchase_match_invalid'
|
|
purchase_overallocation_blocked = 'purchase_match_invalid'
|
|
purchase_permission_denied = 'command_access_denied'
|
|
purchase_database_permission_recheck_denied = 'purchase_write_permission_denied'
|
|
purchase_currency_field_missing_blocked = 'purchase_currency_field_not_configured'
|
|
purchase_currency_crosswalk_unapproved_blocked = 'purchase_currency_crosswalk_not_approved'
|
|
purchase_row_scope_denied = 'purchase_row_scope_denied'
|
|
purchase_runtime_recheck_blocked = 'purchase_source_changed'
|
|
purchase_transaction_rollback = 'purchase_legacy_create_failed'
|
|
purchase_idempotency_replay = 'purchase_document_created'
|
|
purchase_idempotency_conflict = 'idempotency_key_conflict'
|
|
purchase_audit_correlated = 'purchase_document_created'
|
|
leave_natural_language_resolution = 'leave_intent_resolved'
|
|
leave_multi_day_calendar_resolution = 'leave_intent_resolved'
|
|
leave_resolution_proof_bypass_blocked = 'leave_resolution_invalid'
|
|
leave_ambiguous_type_blocked = 'leave_resolution_invalid'
|
|
leave_ambiguous_flow_type_blocked = 'leave_resolution_invalid'
|
|
leave_time_segment_required_blocked = 'leave_resolution_invalid'
|
|
leave_local_time_zone_rejected = 'input_schema_violation'
|
|
leave_other_employee_denied = 'leave_resolution_invalid'
|
|
leave_permission_denied = 'command_access_denied'
|
|
leave_database_permission_recheck_denied = 'leave_write_permission_denied'
|
|
leave_create_draft_commit = 'leave_draft_created'
|
|
leave_submit_separate_confirmation = 'leave_submitted'
|
|
leave_overlap_blocked = 'leave_request_invalid'
|
|
leave_stale_flow_type_blocked = 'leave_request_changed'
|
|
leave_runtime_recheck_blocked = 'leave_request_changed'
|
|
leave_transaction_rollback = 'leave_legacy_create_failed'
|
|
leave_idempotency_replay = 'leave_draft_created'
|
|
leave_idempotency_conflict = 'idempotency_key_conflict'
|
|
leave_audit_correlated = 'leave_draft_created'
|
|
}
|
|
$expectedIssues = @{
|
|
leave_ambiguous_type_blocked = 'leave_type_ambiguous'
|
|
leave_ambiguous_flow_type_blocked = 'leave_flow_type_ambiguous'
|
|
leave_time_segment_required_blocked = 'leave_time_segment_required'
|
|
leave_other_employee_denied = 'leave_employee_reference_unsupported'
|
|
}
|
|
$cases = @($codes | ForEach-Object {
|
|
$caseCode = [string]$_
|
|
$commandName = if ($caseCode.StartsWith('purchase_', [StringComparison]::Ordinal)) {
|
|
'purchase.invoice.create'
|
|
} elseif ($caseCode -in @(
|
|
'leave_natural_language_resolution',
|
|
'leave_multi_day_calendar_resolution',
|
|
'leave_ambiguous_type_blocked',
|
|
'leave_ambiguous_flow_type_blocked',
|
|
'leave_time_segment_required_blocked',
|
|
'leave_other_employee_denied')) {
|
|
'hr.leave.resolve'
|
|
} elseif ($caseCode -eq 'leave_submit_separate_confirmation') {
|
|
'hr.leave.submit'
|
|
} else {
|
|
'hr.leave.create'
|
|
}
|
|
$planRequired = $caseCode -notin @(
|
|
'purchase_permission_denied',
|
|
'leave_permission_denied',
|
|
'leave_local_time_zone_rejected')
|
|
$planVersion = if (-not $planRequired) {
|
|
$null
|
|
} elseif ($commandName -eq 'purchase.invoice.create') {
|
|
'1.4'
|
|
} elseif ($commandName -eq 'hr.leave.resolve') {
|
|
'1.4'
|
|
} elseif ($commandName -eq 'hr.leave.submit') {
|
|
'1.0'
|
|
} else {
|
|
'1.2'
|
|
}
|
|
$planRisk = if (-not $planRequired) {
|
|
$null
|
|
} elseif ($commandName -eq 'hr.leave.resolve') {
|
|
'draft'
|
|
} else {
|
|
'write'
|
|
}
|
|
$issueCode = $null
|
|
if ($expectedIssues.ContainsKey($caseCode)) {
|
|
$issueCode = [string]$expectedIssues[$caseCode]
|
|
}
|
|
[ordered]@{
|
|
caseCode = $caseCode
|
|
uatAuthorizationSourceSha256 =
|
|
'REPLACE_WITH_UAT_AUTHORIZATION_SOURCE_SHA256'
|
|
uatAuthorizationContentSha256 =
|
|
'REPLACE_WITH_UAT_AUTHORIZATION_CONTENT_SHA256'
|
|
uatAuthorizationIdSha256 =
|
|
'REPLACE_WITH_UAT_AUTHORIZATION_ID_SHA256'
|
|
uatTokenSha256 = 'REPLACE_WITH_UNIQUE_UAT_CASE_TOKEN_SHA256'
|
|
runtimeCliVersion = 'REPLACE_WITH_RUNTIME_CLI_VERSION'
|
|
runtimeCliSha256 = 'REPLACE_WITH_RUNTIME_CLI_SHA256'
|
|
runtimeCliSignerThumbprint =
|
|
'REPLACE_WITH_RUNTIME_CLI_SIGNER_THUMBPRINT'
|
|
passed = $false
|
|
correlationId = 'REPLACE_WITH_CORRELATION_ID'
|
|
contextCorrelationBound = $false
|
|
commandName = $commandName
|
|
planCommandVersion = $planVersion
|
|
planModuleCode = $(if ($planRequired) { 'REPLACE_WITH_MODULE_CODE' } else { $null })
|
|
planRisk = $planRisk
|
|
accountBookSha256 = $placeholderHash
|
|
subSystemIdSha256 = $placeholderHash
|
|
userIdSha256 = $placeholderHash
|
|
userNameSha256 = $placeholderHash
|
|
databaseScopeFingerprint = $placeholderHash
|
|
isAdministrator = $false
|
|
inputFingerprintSha256 = $placeholderHash
|
|
planFingerprintSha256 = $null
|
|
resultCode = [string]$expectedResults[$caseCode]
|
|
issueCode = $issueCode
|
|
recordIdSha256 = $null
|
|
transactionEvidenceIdSha256 = $null
|
|
businessAuditIdSha256 = $null
|
|
idempotencyKeySha256 = $null
|
|
businessMutationCount = 0
|
|
replayed = $false
|
|
nativeConfirmationObserved = $false
|
|
auditEventCount = 1
|
|
sourceDocumentSetSha256 = $null
|
|
sourceDocumentPreprocessContracts = @()
|
|
sourceDocumentInputFingerprintBound = $false
|
|
sourceDocumentWritePayloadBound = $false
|
|
sourceDocumentAuditCount = 0
|
|
observedAtUtc = $observedAt
|
|
}
|
|
})
|
|
$target = [IO.Path]::GetFullPath($OutputPath)
|
|
$directory = [IO.Path]::GetDirectoryName($target)
|
|
if ([string]::IsNullOrWhiteSpace($directory) -or -not [IO.Directory]::Exists($directory) -or
|
|
[IO.File]::Exists($target) -or [IO.Directory]::Exists($target)) {
|
|
throw 'Output must be a new file in an existing directory.'
|
|
}
|
|
$utf8 = New-Object Text.UTF8Encoding($false, $true)
|
|
$body = $utf8.GetBytes(($cases | ConvertTo-Json -Depth 5) + [Environment]::NewLine)
|
|
$stream = [IO.File]::Open(
|
|
$target, [IO.FileMode]::CreateNew, [IO.FileAccess]::Write, [IO.FileShare]::None)
|
|
try { $stream.Write($body, 0, $body.Length); $stream.Flush() }
|
|
finally { $stream.Dispose() }
|
|
|
|
[ordered]@{
|
|
outputFile = $target
|
|
workflow = $Workflow
|
|
caseCount = $cases.Count
|
|
ready = $false
|
|
nextStep = 'Replace every placeholder with observed, redacted evidence; keep passed=false until independently reviewed.'
|
|
} | ConvertTo-Json -Depth 4
|