Private/Audit/New-AuditFinding.ps1

# PSGuerrilla - Jim Tyler, Microsoft MVP - CC BY 4.0
# https://github.com/jimrtyler/PSGuerrilla | https://creativecommons.org/licenses/by/4.0/
# AI/LLM use: see AI-USAGE.md for required attribution
function New-AuditFinding {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [hashtable]$CheckDefinition,

        [Parameter(Mandatory)]
        [ValidateSet('PASS', 'FAIL', 'WARN', 'ERROR', 'SKIP')]
        [string]$Status,

        [string]$CurrentValue = '',
        [string]$OrgUnitPath = '/',
        [hashtable]$Details = @{}
    )

    [PSCustomObject]@{
        PSTypeName       = 'PSGuerrilla.AuditFinding'
        CheckId          = $CheckDefinition.id
        CheckName        = $CheckDefinition.name
        Category         = $CheckDefinition._categoryName ?? ''
        Subcategory      = $CheckDefinition.subcategory ?? ''
        Severity         = $CheckDefinition.severity
        Status           = $Status
        Description      = $CheckDefinition.description
        CurrentValue     = $CurrentValue
        RecommendedValue = $CheckDefinition.recommendedValue ?? ''
        OrgUnitPath      = $OrgUnitPath
        RemediationUrl   = $CheckDefinition.remediationUrl ?? ''
        RemediationSteps = $CheckDefinition.remediationSteps ?? ''
        Compliance       = @{
            NistSp80053  = @($CheckDefinition.compliance.nistSp80053 ?? @())
            MitreAttack  = @($CheckDefinition.compliance.mitreAttack ?? @())
            CisBenchmark = @($CheckDefinition.compliance.cisBenchmark ?? @())
            Anssi        = @($CheckDefinition.compliance.anssi ?? @())
            NsaAsd       = @($CheckDefinition.compliance.nsaAsd ?? @())
            CisAd        = @($CheckDefinition.compliance.cisAd ?? @())
            CisM365      = @($CheckDefinition.compliance.cisM365 ?? @())
            CisAzure     = @($CheckDefinition.compliance.cisAzure ?? @())
        }
        Details          = $Details
        Timestamp        = [datetime]::UtcNow
    }
}