@auditcore/ui-core 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -1
- package/dist/dataprotection/assistant.d.ts +76 -0
- package/dist/dataprotection/assistantMessages.d.ts +106 -0
- package/dist/dataprotection/assistantTypes.d.ts +147 -0
- package/dist/dataprotection/index.d.ts +2 -0
- package/dist/dataprotection/messages.d.ts +1 -1
- package/dist/documents/messages.d.ts +1 -1
- package/dist/extrapolation/messages.d.ts +1 -1
- package/dist/geo/messages.d.ts +1 -1
- package/dist/index.js +1707 -1377
- package/dist/index.js.map +1 -1
- package/dist/risk/messages.d.ts +1 -1
- package/dist/runner/messages.d.ts +1 -1
- package/package.json +1 -1
- package/styles/dataprotection.css +28 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["STATUS_KEYS","statusLabel","fieldValue","parse","INITIAL","segment","escapeHtml","INITIAL","writeActions","INITIAL","writeActions","formatNumber","escapeHtml","INITIAL","formatNumber","formatPercent","errorText","CONTRACT","formatNumber","INITIAL","errorText","formatNumber","formatPercent","TONES","errorText","formatNumber","formatPercent","replaceAt","EMPTY_FORM","errorText","TONES","formatNumber","formatPercent","isRecord","titleOf","titleOf","errorText","formatBytes","TONES","errorText","errorText","formatNumber","formatPercent","cellText","cellText","errorText","percent","formatPercent","formatNumber","strataColumns","errorText","formatPercent","strataColumns","formatNumber","formatPercent","formatNumber","errorText","errorText","errorText","escapeHtml$2","formatBytes$1","LOCALES","DEFAULT_LOCALE","defineMessages","catalogs","interpolate","params","template","value","name","match","translate","locale","key","translator","isLocale","defaultLocale","listeners","setDefaultLocale","listener","getDefaultLocale","subscribeDefaultLocale","baseMessages","changes","patch","state","createStore","initial","next","IDLE","createRunner","active","port","kind","task","caught","error","toError","store","onError","createDelay","timer","ms","downloadText","saveFile","content","mimeType","printHtml","frame","target","html","deliverExport","payload","FOCUSABLE","focusableWithin","container","element","wrapTarget","first","items","last","backwards","current","createFocusTrap","previous","onKeydown","root","event","ICONS","isIconName","cellText","row","column","sortIcon","ariaSort","sort","rowKeyOf","rowKey","index","cellAlignClass","synopsisMessages","ROW_STATUSES","CHANGE_STATUSES","WORD_LIMIT","words","text","pushWord","out","word","visible","side","toSegments","operations","ndiffOperations","line","lines","prefix","lcsTable","width","b","table","a","j","walk","at","i","left","right","lcsOperations","oldText","newText","diffSegments","ndiff","wholeSegments","plainSegments","segmentsText","segments","segment","STATUS_KEYS$1","FIELDS","statusLabel$1","status","sides","highlight","inline","fieldValue$1","field","fieldViews","views","oldValue","newValue","t","haystack","parts","buildRowView","modeLabel","mode","notices","meta","result","list","countsText","labels","options","buildSynopsisView","DEFAULT_SYNOPSIS_FILTER","filterRows","query","filter","rows","changeIds","stepChange","ids","direction","positionText","applyRowOverrides","overrides","HTML_ESCAPES","escapeHtml","char","escapeMarkdown","exportFilename","title","extension","outputRows","htmlSegments","empty","htmlFields","htmlRow","input","reason","withReason","HTML_STYLE","htmlCommands","view","command","toHtml","reasonHead","notice","body","generated","markdownSegments","markdownRow","toMarkdown","parse$1","response","detail","message","RestError","formFields","fields","asFile","blob","createSynopsisRestClient","base","fetchImpl","init","request","url","path","item","id","json","format","form","oldFile","oldName","newFile","newName","SERVER_FORMATS","synopsisId","inputs","synopsisBase","serverExports","buildView","navigation","activeId","selectedText","all","highlightOf","selectSynopsis","currentId","buildSynopsisExport","selection","INITIAL$5","createSynopsisController","setFilter","reload","updateRow","update","toggleStatus","enabled","go","NEXT_KEYS","PREV_KEYS","isEditable","prefersReducedMotion","navigationDirection","focusRow","dataprotectionMessages","segment$1","createDataProtectionRestPort","one","action","requestJson","expectedRevision","requestFile","activityId","survey","decision","requestedFrom","requestedOn","CONTRACT","asError","raw","hooks","statusLabel","prefixedLabel","fallback","NO_DEPARTMENT","emptyActivity","activity","columns","department","emptyContent","cloneContent","groupByDepartment","needle","activityText","named","known","unknown","split","subject","activityKey","issuesFor","issues","issue","fieldIssues","coverIssues","completeness","blocking","completenessTone","statusTone","currentVersion","prefer","withField","withActivity","withoutActivity","withPerson","part","person","withDepartments","departments","d","displayValue","texts","parseCount","trimmed","editedBy","actor","version","ANSWER_VALUES","residualFrom","scenarioFrom","middle","profile","emptyScenario","surveyFrom","answers","answer","scenario","sameSurvey","answerOf","withAnswer","withJustification","blockProgress","values","block","question","withScenario","scenarios","addScenario","removeScenario","position","toggleMeasure","measures","measure","levelLabel","levels","level","bandTone","rank","band","bands","RECOMMENDATION_TONES","recommendationTone","recommendation","screeningTone","outcome","decisionTitle","isDeviation","proposal","parseConditions","mayRelease","decisionForm","canReleaseAssessment","dirty","cell","registerCsv","keys","titles","toCsv","issueLine","registerMarkdown","md","group","PRINT_CSS","escape","coverHtml","activitiesHtml","issuesHtml","registerHtml","registerFilename","editingOf","editBase","register","shownContent","editing","shownIssues","vvtView","vvtFourEyes","vvtVersionLabel","vvtExportTexts","MIME","buildVvtExport","render","lang","INITIAL$4","reset","editable","editActions","delay","check","run","show","draft","which","startDraft","discard","contentActions","selected","writeActions$2","save","expected","saved","release","released","createVvtController","edit","load","loaded","exportAs","dsfaDerived","dsfaReadonly","dsfaTabs","DSFA_NOTICES","INITIAL$3","readActions","open","found","assessmentId","openActivity","entry","calculate","writeActions$1","refreshRows","overview","step","changed","start","created","data","from","on","createDsfaController","exportReport","file","connect","read","geoMessages","TOLERANCE_STEPS","parseDegrees","parseLatLon","la","lat","lo","lon","parseMetres","parseUtm","number","zone","ost","east","nord","north","utmErrorKey","formatDistance","metres","intlFormatNumber","formatDegrees","formatMetres","vertexCount","geometry","sum","rings","inner","ring","areasFromGeoPackage","origin","area","displayName","uploadError","upload","createGeoRestPort","escapeHtml$1","textElement","span","tileLayer","tiles","L","drawAreas","layers","drawPoints","point","hit","reference","createLeafletView","map","bounds","layersOf","geocodingAvailable","selectGeo","areas","hitIds","INITIAL$2","rounded","factor","digits","utmTexts","missing","what","prepare","model","hint","needsArea","referenceActions","refreshUtm","setReference","callbacks","applyTexts","parsed","geocode","utmActions","applyUtm","zoneText","eastText","northText","northern","areaActions","simplifyArea","einheit","toleranz","accept","added","selectArea","setSimplifyUnit","unit","loadFile","loadSource","calculations","searchRadius","given","punkte","checkLocation","boundaryInside","toleranceMetres","ellipsoid","createGeoController","runner","references","riskMessages","FLAG_STATES","flagState","code","skipped","flag","record","evaluationRules","evaluation","codes","recordRules","rule","summaryVolume","volume","summary","countStates","counts","distribution","total","totals","triggeredDataset","finding","DEFAULT_FILTER","matchesState","wanted","states","recordLabel","matchesQuery","filterRecords","hitEntry","ruleFacts","undeterminedEntry","recordEntries","byCode","rules","order","pairs","BOOLEAN_TEXT","formatBoolean","yes","no","formatValue","formatShare","intlFormatPercent","share","formatAmount","SEVERITY_TONES","severityTone","severity","STATE_ICONS","stateTone","PARAMETER_LABELS","parameterLabel","label","STATE_KEYS","STATE_FILTER_KEYS","STATUS_KEYS","STATUS_HINTS","statusKey","statusHintKey","REQUIREMENT_KEYS","requirementKey","requirement","WHEN_MISSING_KEYS","whenMissingKey","profilePath","createRiskRestPort","EMPTY_EVALUATION","riskTableColumns","recordText","riskTableRows","records","selectRisk","profileStatusText","profileHintText","errorText$12","failure","createRiskController","loadProfile","latest","screeningMessages","codeLabel","withQuery","createScreeningRestPort","runId","hitId","review","CONTRACT$1","emptyFilter","matchesText","acceptsHit","allowed","filterSubjects","subjects","filterOptions","lists","confidences","s","decimals","scale","formatScore","formatPoints","scorePercent","stepTone","breakdownRows","breakdown","isDelta","points","DATE","formatDate","year","month","day","hour","minute","date","freshnessTone","formatAge","days","compareState","notCompared","conflict","orDash","comparisonRows","f","aliases","more","findingState","indicatorLabels","requiresFourEyes","settings","canDecide","awaitsSecondReview","validateDecision","errors","nextOpenHit","hits","h","findHit","parseSubjects","birthDate","country","p","replaceHit","updated","selectScreening","asScreeningError","events","delegate","loadActions","guard","sources","client","openRun","log","createRun","decisionActions","refresh","submit","send","fourEyes","INITIAL$1","createScreeningController","context","selectedHitId","SCREENING_KINDS","profileKeyOf","kindProfiles","kindSources","source","selectedProfile","runFormDefaults","profiles","preferred","buildRunRequest","tabularMessages","INITIAL","importPreview","numberColumn","rejected","kept","pick","importDelimiterText","tab","importRejectedLines","preview","importOptionalColumn","createTableImportController","reparse","parseTable","valueColumn","guessNumberColumn","detectDecimal","columnCells","samplingMessages","isPercent","spec","parseInput","parseNumber","lowerBound","upperBound","inRange","fieldValue","min","max","buildSizeRequest","confidence","populationSuggestions","positive","initialTexts","formatter","strataOf","stratum","population","hasPartialStrata","stratified","optionalSeed","seed","sampleSizeOf","size","selectionProblem","buildSelectionRequest","problem","mus","itemsFromImport","positiveSum","createSamplingRestPort","INITIAL_SAMPLING","samplingProfile","method","samplingPopulation","isStratifiedPopulation","errorText$11","createActions","checked","draw","freshSeed","createSamplingController","selectMethod","applySuggestions","suggestions","exportSelection","parameterUnit","rangeText","fmt","samplingFieldError","selectionErrorKey","confidenceText","methodGroups","catalogue","methodTone","methodStatusKey","populationText","strata","numberFormat","amountFormat","plain","derivationColumns","derivationRows","sizeTexts","selectionColumns","strataColumns","amount","strataRows","selectionRows","excludedLines","selectionTexts","samplingInputNumber","benfordMessages","DEFAULT_BOX","axisMaximum","maximum","candidate","labelEvery","count","chartGeometry","plot","box","axis","slot","gap","scaleY","centre","bars","y","expectedPath","tickCount","yTicks","every","BENFORD_METRIC_IDS","activeMetrics","disabled","offeredMetrics","needsShortValues","test","buildAnalyseRequest","twoDigits","TONES$3","levelTone","digitLabel","digit","createBenfordRestPort","INITIAL_BENFORD","benfordValues","benfordProfile","errorText$10","createBenfordController","automatic","analyse","analysed","analyseErrorKey","benfordValuesText","benfordBarTitle","conformity","benfordChartTitle","testLabel","benfordTickText","benfordMetricTexts","analysis","excluded","bound","benfordDigitColumns","benfordDigitRows","benfordMetricLabel","pText","benfordChiTexts","metric","alpha","verdict","benfordDigitZTexts","correction","exceeding","largest","top","extrapolationMessages","designOf","stratumPart","periodNames","designRequest","units","design","populationUnits","systemAssessment","stratumKey","SAMPLED_PART","EXHAUSTIVE_PART","MAX_SUBSAMPLE_DEPTH","emptySubItem","emptySubStratum","emptySubsample","isSimple","sub","subsampleRows","simple","sampled","readItem","book","nested","depth","readSubsample","readItems","seen","names","simpleStrata","exhaustive","unitBook","ownStrata","EMPTY_RESIDUAL","emptyStratum","emptyUnit","optional","stratumRows","unitRows","violates","readExtrapolationAmount","Collector","withPart","readStrata","systemic","readUnit","anomalous","period","formError","materiality","checkPeriodGroups","buildEvaluationRequest","extra","residualFormFrom","ter","buildResidualRequest","materialityRate","extrapolationMethodById","confidenceChoices","createExtrapolationRestPort","patchUnit","replaceAt$1","change","openSubsample","createSubsampleActions","fresh","EMPTY_FORM$1","INITIAL_EXTRAPOLATION","extrapolationMethod","errorText$9","replaceAt","createRows","counter","patchForm","createRequests","evaluate","computeResidual","exportEvaluation","createExtrapolationController","applyInputs","methodId","keep","TONES$2","conclusionTone","conclusion","conclusionLabel","extrapolationAmount","extrapolationRate","extrapolationInputNumber","extrapolationIssueKey","extrapolationFormErrorKey","extrapolationMethodGroups","statistical","extrapolationConfidenceLabel","limitMetrics","metrics","terMetrics","stepValue","extrapolationStepColumns","extrapolationStepRows","residualColumns","residualRows","residual","residualMetrics","rate","STRATUM_FIELDS","UNIT_FIELDS","UNIT_FLAGS","RESIDUAL_FIELDS","extrapolationIssueText","extrapolationFormMessage","extrapolationCellLabel","DESIGNS","ESTIMATORS","extrapolationDesignChoices","subsampleEstimatorChoices","systemAssessmentChoices","SUB_ITEM_FIELDS","SUB_STRATUM_FIELDS","subsampleEditorView","unitLabel","periodColumns","periodRows","groupColumns","groupRows","subsampleColumns","subsampleResultRows","detailWarnings","recalculationView","recalculation","hasExtrapolationDetails","comparisonsMessages","COMPARISON_KINDS","COMPARISON_MODES","ACCEPTED_EXTENSIONS","DEFAULT_MAX_UPLOAD_BYTES","MIN_THRESHOLD","MAX_THRESHOLD","MAX_TITLE","DEFAULT_FORM","formatBytes","bytes","hasAcceptedExtension","lower","fileProblems","maxBytes","optionProblems","problems","threshold","formProblems","involvesPdf","toCompareFields","sections","common","toggleSection","defaultProfile","isRecord$1","looksLikeResult","withTitle","parseImport","kindLabel","formatDateTime","iso","summaryView","filterSummaries","sorted","summaryOf","comparison","synopsisPortOf","INITIAL_COMPARISONS","asComparisonsError","titleOf$2","formActions","writeActions","importText","fail","imported","confirmRemove","done","createComparisonsController","fileText","profileOptions","emptyText","shown","titleOf$1","comparisonsView","articleLaw","reportingMessages","createReportingRestPort","INITIAL_REPORTING","reportingProfile","buildWorkbookRequest","tables","filename","errorText$8","createReportingController","built","exportWorkbook","reportCellText","EMPTY_VALUE","reportingTablesText","reportingWorkbookText","reportingSheetHeading","reportingSampleNote","reportingErrorKey","identifierMessages","findIdentifierProfile","identifierProfileKinds","profileId","identifierProfileLabel","kindNeedsCountry","buildIdentifierCheck","land","resolveIdentifierKind","batchItem","mapping","buildIdentifierBatch","identifierErrorKey","TONES$1","identifierStatusTone","identifierStatusText","identifierReasonText","profileTitle","detailValue","identifierFacts","identifierRowStatus","identifierRowReason","identifierRowKind","identifierRowValue","visibleIdentifierRows","onlyIssues","identifierBatchSummary","notChecked","identifierBatchLines","identifierBatchCsv","recordsToCsv","identifierColumnFields","createIdentifiersRestPort","INITIAL_IDENTIFIERS","errorText$7","identifierBatchMapping","keepKind","offered","tableActions","hasHeader","createIdentifierController","setProfile","batchKind","checkBatch","extractionMessages","parse","createExtractionRestPort","headers","INITIAL_EXTRACTION","errorText$6","extractionValidation","createExtractionController","extract","validation","KNOWN","extractionSizeText","extractionProfileText","extractionFieldLabel","extractionRuleLabel","extractionValueText","extractionConfidenceText","extractionConfidenceTone","extractionDecisionText","extractionDecisionTone","extractionStatusText","extractionStatusTone","extractionDocumentText","pages","page_count","mime_type","extractionOcrText","ocr","avg","OUTCOME_ORDER","SEVERITY_ORDER","splitExtractionFindings","findings","extractionOutcomeTone","extractionFieldThreshold","extractionAccept","types","extractionProposalText","extractionValidationText","kanbanMessages","kanbanDialogMessages","dbKanbanMessages","cellText$1","titleProperty","property","columnLabel","cardView","groupBy","titleText","matchesRecord","groupRecords","groupOptions","option","dbKanbanView","groupableProperties","INITIAL_DB_KANBAN","asDbKanbanError","initialGroupBy","titleOf","rowId","moveActions","movable","groupOf","announce","move","dropValue","withCell","withRow","moveBy","groups","neighbourGroup","addCard","cells","createDbKanbanController","preferredGroupBy","setGroupBy","propertyId","batchchecksMessages","createBatchchecksMemoryPort","createBatchchecksRestPort","normalize","batchchecksAutoMapping","header","used","batchchecksDecimal","batchchecksLooksLikeJson","isRecord","jsonItems","batchchecksJsonDocuments","batchchecksCellValue","percent","decimal","batchchecksTableDocuments","mapped","totalVolume","documentsOf","buildBatchchecksRequest","documents","INITIAL_BATCHCHECKS","errorText$5","fileActions","remap","loadText","createBatchchecksController","exportRun","BATCHCHECKS_LISTED_DOCUMENTS","LEVEL_TONES","batchchecksLevelText","batchchecksLevelTone","batchchecksHasTable","batchchecksSourceText","batchchecksColumnFields","ruleStatus","ruleTone","batchchecksRuleRows","batchchecksFilterOptions","batchchecksAffectedText","refs","rest","batchchecksFindingRows","ruleFilter","batchchecksSummaryText","affected","percent$1","batchchecksMetricRows","m","samplesizeMessages","createSamplesizeRestPort","createSamplesizeMemoryPort","plan","plans","EMPTY_FORM","EMPTY_STRATUM","CHOICE_FIELDS","PERCENT_FIELDS","SPECIAL_FIELDS","OPTIONAL_FIELDS","INTEGER_FIELDS","methodById","scalarFields","hasStrata","hasFiniteCorrection","strataColumns$1","formFor","parseField","parseDecimal","scalarValue","germanText","optionalNumber","stratumRequest","sd","buildRequest","formFromRequest","INITIAL_SAMPLESIZE","errorText$4","createSamplesizeController","samplesizeMethod","choices","samplesizeFields","choice","COLUMN_LABELS","samplesizeStrataColumns","samplesizeNumber","samplesizeSummary","samplesizeAllocation","samplesizeDerivation","samplesizePercentFields","attributesMessages","createAttributesRestPort","EMPTY_ATTRIBUTES_FORM","APPROACHES","attributesApproachChoices","whole","minimum","selectionIssues","buildAttributesRequest","take","deviations","attributesConfidenceChoices","attributesPercent","attributesIssueKey","TONES","attributesConclusionTone","attributesMetrics","attributesStepColumns","attributesStepRows","ATTRIBUTE_FIELDS","attributesFieldLabel","approach","attributesFormMessage","INITIAL_ATTRIBUTES","errorText$3","createAttributesController","reporttemplatesMessages","createReportTemplatesRestPort","suffix","INITIAL_REPORTTEMPLATES","errorText$2","reporttemplatesData","buildTemplateRequest","firstFormat","createReporttemplatesController","select","templateId","typeText","schema","schemaFields","properties","required","textBlockRows","formatOptions","reporttemplatesCanRender","reporttemplatesIsEmpty","runnerMessages","RUNNER_SCHREIB_KOPF","RUNNER_WERKZEUG_SCHEMA","createRunnerMemoryPort","stand","werkzeuge","pruefen","versionOf","profil","aktuell","ergebnis","erwarteteVersion","fehlerHuelle","basis","fehler","createRunnerRestPort","schreiben","VERWALTET","isObject","runnerWert","teil","pfad","setzeIn","wert","kopf","liste","objekt","runnerSetze","flach","ziel","runnerUnterschiede","entwurf","gespeichert","runnerGeaendert","runnerVersion","runnerPrioritaeten","eintrag","x","runnerVerschiebe","richtung","neu","runnerPrioritaetSetze","aenderung","runnerWeichtZuerst","RUNNER_KLASSEN_NAME","runnerKlassen","klassen","runnerKlassenArt","runnerKlassenNameFehler","alt","runnerKlasseHinzu","runnerKlasseUmbenennen","umbenannt","l","k","v","eintraege","runnerEingabe","feldArt","roh","zahlWert","runnerWerkzeugFeldId","werkzeug","feld","uebernimmStand","aendere","konfliktLaden","nachAnwenden","applied","anwendenMit","kontext","erwartet","profilAktionen","art","pruefung","konflikt","werkzeugAktionen","alle","bisher","zahl","klassenAktionen","neueKlasse","klassenNamen","INITIAL_RUNNER","RUNNER_ANSICHTEN","errorText$1","resolvePort","api","createRunnerController","daten","TAB_KEYS","runnerTabs","runnerNachbarTab","runnerNurLesen","runnerIstGeaendert","runnerMeta","sync","runnerHinweise","hinweise","jaNein","ja","nein","runnerUeberblick","runnerKlassenZeilen","klasse","runnerHatWarteschlange","kurz","namen","runnerHardware","hardware","SOLL_QUELLEN","ALLGEMEIN","REGELUNG","THERMIK","NETZ","KLASSE","anzeige","def","eingaben","abschnitt","felder","defs","runnerFeldId","runnerProbleme","namensFehler","klassenAbschnitt","gpu","schluessel","runnerAbschnitte","gpuKlassen","gpus","optionen","karte","runnerNeueKlasse","runnerVorschau","runnerWerkzeugGruppen","katalog","w","einstellung","runnerWerkzeugeGeaendert","runnerPrioritaetZeilen","runnerWeichtZuerstText","accountMessages","createAccountMemoryPort","document","revision","createAccountRestPort","transport","createAccountCamera","stream","generation","stop","track","acquired","video","canvas","edge","resolve","reject","cropAccountImage","zoom","image","accountPreviewStyle","color","fonts","accountImageUrl","accountWelcomePreview","INITIAL_ACCOUNT","errorText","requests","epoch","ticket","createAccountController","invalidate","fieldId","accountRows","accountSelection","accountIsEmpty"],"sources":["../src/i18n.ts","../src/messages.ts","../src/store.ts","../src/download.ts","../src/focus.ts","../src/base/icons.ts","../src/table/index.ts","../src/synopsis/messages.ts","../src/synopsis/types.ts","../src/synopsis/wordDiff.ts","../src/synopsis/viewModel.ts","../src/synopsis/exporters.ts","../src/synopsis/port.ts","../src/synopsis/controller.ts","../src/synopsis/navigation.ts","../src/dataprotection/messages.ts","../src/dataprotection/rest-port.ts","../src/dataprotection/types.ts","../src/dataprotection/requests.ts","../src/dataprotection/registerView.ts","../src/dataprotection/dsfaView.ts","../src/dataprotection/exporters.ts","../src/dataprotection/vvt.ts","../src/dataprotection/dsfa.ts","../src/geo/messages.ts","../src/geo/model.ts","../src/geo/rest-port.ts","../src/geo/mapView.ts","../src/geo/controller.ts","../src/risk/messages.ts","../src/risk/state.ts","../src/risk/format.ts","../src/risk/labels.ts","../src/risk/port.ts","../src/risk/controller.ts","../src/screening/messages.ts","../src/screening/rest-port.ts","../src/screening/types.ts","../src/screening/view.ts","../src/screening/controller.ts","../src/screening/runForm.ts","../src/tabular/messages.ts","../src/tabular/tableImport.ts","../src/sampling/messages.ts","../src/sampling/model.ts","../src/sampling/rest-port.ts","../src/sampling/controller.ts","../src/sampling/view.ts","../src/benford/messages.ts","../src/benford/chart.ts","../src/benford/model.ts","../src/benford/rest-port.ts","../src/benford/controller.ts","../src/benford/view.ts","../src/extrapolation/messages.ts","../src/extrapolation/model-design.ts","../src/extrapolation/model-subsample.ts","../src/extrapolation/model.ts","../src/extrapolation/rest-port.ts","../src/extrapolation/controller-subsample.ts","../src/extrapolation/controller.ts","../src/extrapolation/view.ts","../src/extrapolation/view-details.ts","../src/documents/messages.ts","../src/documents/form.ts","../src/documents/importing.ts","../src/documents/list.ts","../src/documents/controller.ts","../src/documents/view.ts","../src/reporting/messages.ts","../src/reporting/rest-port.ts","../src/reporting/controller.ts","../src/reporting/view.ts","../src/identifiers/messages.ts","../src/identifiers/model.ts","../src/identifiers/rest-port.ts","../src/identifiers/controller.ts","../src/extraction/messages.ts","../src/extraction/rest-port.ts","../src/extraction/controller.ts","../src/extraction/view.ts","../src/kanban/messages.ts","../src/dbkanban/messages.ts","../src/dbkanban/view.ts","../src/dbkanban/controller.ts","../src/batchchecks/messages.ts","../src/batchchecks/port.ts","../src/batchchecks/rest-port.ts","../src/batchchecks/model.ts","../src/batchchecks/controller.ts","../src/batchchecks/view.ts","../src/samplesize/messages.ts","../src/samplesize/port.ts","../src/samplesize/model.ts","../src/samplesize/controller.ts","../src/samplesize/view.ts","../src/attributes/messages.ts","../src/attributes/port.ts","../src/attributes/view.ts","../src/attributes/controller.ts","../src/reporttemplates/messages.ts","../src/reporttemplates/port.ts","../src/reporttemplates/controller.ts","../src/reporttemplates/view.ts","../src/runner/messages.ts","../src/runner/port.ts","../src/runner/profil.ts","../src/runner/eingabe.ts","../src/runner/aktionen.ts","../src/runner/controller.ts","../src/runner/view.ts","../src/runner/view-listen.ts","../src/account/messages.ts","../src/account/port.ts","../src/account/camera.ts","../src/account/presentation.ts","../src/account/controller.ts","../src/account/view.ts"],"sourcesContent":["/**\n * Framework-freier Kern der Sprachunterstützung: Kataloge, Platzhalter,\n * Rückfall auf Deutsch. Vue (`useI18n` in `@auditcore/ui`) und React\n * (`useTranslation` in `@auditcore/ui-react`) setzen darauf auf.\n */\nexport type Locale = 'de' | 'en'\nexport const LOCALES: readonly Locale[] = ['de', 'en']\nexport const DEFAULT_LOCALE: Locale = 'de'\n\nexport type MessageParams = Readonly<Record<string, string | number>>\n\n/** Kataloge je Sprache; Deutsch ist vollständig, Englisch darf (noch) lückenhaft sein. */\nexport interface Catalogs<K extends string> {\n de: Readonly<Record<K, string>>\n en: Readonly<Partial<Record<K, string>>>\n}\n\nexport type Translate<K extends string> = (key: K, params?: MessageParams) => string\n\n/** Typisiert Kataloge einer Komponente; die Schlüssel ergeben sich aus dem deutschen Katalog. */\nexport function defineMessages<K extends string>(catalogs: Catalogs<K>): Catalogs<K> {\n return catalogs\n}\n\n/** Ersetzt {name}-Platzhalter; unbekannte Platzhalter bleiben sichtbar stehen. */\nexport function interpolate(template: string, params?: MessageParams): string {\n if (!params) return template\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => {\n const value = params[name]\n return value === undefined ? match : String(value)\n })\n}\n\n/** Übersetzt mit Rückfall auf Deutsch und zuletzt auf den Schlüssel. */\nexport function translate<K extends string>(\n catalogs: Catalogs<K>,\n locale: Locale,\n key: K,\n params?: MessageParams,\n): string {\n const template = (locale === 'en' ? catalogs.en[key] : undefined) ?? catalogs.de[key] ?? key\n return interpolate(template, params)\n}\n\n/** Übersetzungsfunktion für eine feste Sprache. */\nexport function translator<K extends string>(catalogs: Catalogs<K>, locale: Locale): Translate<K> {\n return (key, params) => translate(catalogs, locale, key, params)\n}\n\nexport function isLocale(value: unknown): value is Locale {\n return typeof value === 'string' && (LOCALES as readonly string[]).includes(value)\n}\n\nlet defaultLocale: Locale = DEFAULT_LOCALE\nconst listeners = new Set<() => void>()\n\n/** Sprache ohne Provider (Web Components, React ohne `LocaleProvider`). */\nexport function setDefaultLocale(locale: Locale): void {\n if (locale === defaultLocale) return\n defaultLocale = locale\n for (const listener of listeners) listener()\n}\n\nexport function getDefaultLocale(): Locale {\n return defaultLocale\n}\n\n/** Meldet Änderungen der Standardsprache; liefert die Abmeldung. */\nexport function subscribeDefaultLocale(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n","import { defineMessages } from './i18n'\n\n/** Texte der Basiskomponenten. */\nexport const baseMessages = defineMessages({\n de: {\n close: 'Schließen',\n loading: 'Wird geladen …',\n tableEmpty: 'Keine Einträge',\n sortAscending: 'aufsteigend sortiert',\n sortDescending: 'absteigend sortiert',\n sortBy: 'Nach {column} sortieren',\n },\n en: {\n close: 'Close',\n loading: 'Loading …',\n tableEmpty: 'No entries',\n sortAscending: 'sorted ascending',\n sortDescending: 'sorted descending',\n sortBy: 'Sort by {column}',\n },\n})\n","/**\n * Kleinster gemeinsamer Zustandsspeicher der Controller. Jeder Stand ist ein\n * neues, unveränderliches Objekt; React liest ihn über\n * `useSyncExternalStore`, Vue spiegelt ihn in ein `shallowRef`.\n */\nexport interface Store<S extends object> {\n get: () => S\n /** Teilstand übernehmen; Beobachter werden nur bei einer Änderung benachrichtigt. */\n set: (patch: Partial<S> | ((state: S) => Partial<S>)) => void\n subscribe: (listener: () => void) => () => void\n}\n\nfunction changes<S extends object>(state: S, patch: Partial<S>): boolean {\n return (Object.keys(patch) as (keyof S)[]).some((key) => !Object.is(state[key], patch[key]))\n}\n\nexport function createStore<S extends object>(initial: S): Store<S> {\n let state = initial\n const listeners = new Set<() => void>()\n return {\n get: () => state,\n set(patch) {\n const next = typeof patch === 'function' ? patch(state) : patch\n if (!changes(state, next)) return\n state = { ...state, ...next }\n for (const listener of [...listeners]) listener()\n },\n subscribe(listener) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n\n/** Beschäftigt-Status, Fehler und Erfolgsmeldung einer Portanfrage (gemeinsam für alle Controller). */\nexport interface RequestState<E> {\n busy: string | null\n error: E | null\n /** Letzte Erfolgsmeldung (für `aria-live`). */\n notice: string\n}\n\nexport const IDLE: RequestState<never> = { busy: null, error: null, notice: '' }\n\n/**\n * Führt eine Portanfrage aus: setzt `busy`, fängt Fehler (über `toError`) und\n * meldet sie an `onError`. Ohne Port geschieht nichts (`null`).\n */\nexport function createRunner<P, E, S extends RequestState<E>>(\n store: Store<S>,\n port: () => P | null,\n toError: (error: unknown) => E,\n onError?: (error: E) => void,\n) {\n return async function run<T>(kind: string, task: (active: P) => Promise<T>): Promise<T | null> {\n const active = port()\n if (!active) return null\n store.set({ busy: kind, error: null } as Partial<S>)\n try {\n return await task(active)\n } catch (caught) {\n const error = toError(caught)\n store.set({ error } as Partial<S>)\n onError?.(error)\n return null\n } finally {\n store.set({ busy: null } as Partial<S>)\n }\n }\n}\n\n/** Verzögerter Aufruf, der bei jeder neuen Eingabe neu startet (Vorschau, Vollständigkeitsprüfung). */\nexport function createDelay(ms: () => number) {\n let timer: ReturnType<typeof setTimeout> | undefined\n return {\n schedule(task: () => void): void {\n clearTimeout(timer)\n timer = setTimeout(task, ms())\n },\n cancel(): void {\n clearTimeout(timer)\n timer = undefined\n },\n }\n}\n","/**\n * Browser-Helfer für Exporte (DOM, aber framework-frei): Datei anbieten und\n * Druckansicht öffnen. Vue- und React-Fassung rufen dieselben Funktionen.\n */\nimport { saveFile } from '@auditcore/common/browser'\n\n/** Text als Datei anbieten (Blob-URL); ohne Blob-Unterstützung geschieht nichts. */\nexport function downloadText(content: string, filename: string, mimeType: string): boolean {\n if (typeof URL.createObjectURL !== 'function') return false\n saveFile({ blob: new Blob([content], { type: mimeType }), filename, mediaType: mimeType })\n return true\n}\n\n/**\n * Druckansicht in einem unsichtbaren Rahmen öffnen („Als PDF speichern“ im\n * Druckdialog). Kein Pop-up, daher auch mit Pop-up-Blocker nutzbar.\n */\nexport function printHtml(html: string): HTMLIFrameElement {\n const frame = document.createElement('iframe')\n frame.setAttribute('aria-hidden', 'true')\n frame.tabIndex = -1\n frame.style.cssText = 'position:fixed;width:0;height:0;border:0;right:0;bottom:0'\n frame.addEventListener('load', () => {\n const target = frame.contentWindow\n if (!target) return\n target.addEventListener('afterprint', () => frame.remove())\n target.focus()\n target.print()\n })\n frame.srcdoc = html\n document.body.append(frame)\n return frame\n}\n\n/** Export ausliefern: Druckansicht (`print`) oder Datei. */\nexport function deliverExport(payload: { format: string; content: string; filename: string; mimeType: string }): void {\n if (payload.format === 'print') printHtml(payload.content)\n else downloadText(payload.content, payload.filename, payload.mimeType)\n}\n","/** Fokusfalle für Dialoge (framework-frei, von Vue und React genutzt). */\nconst FOCUSABLE = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',')\n\nexport function focusableWithin(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (element) => !element.hasAttribute('inert') && element.getAttribute('aria-hidden') !== 'true',\n )\n}\n\n/** Nächstes Fokusziel beim Tabben am Rand des Containers, sonst null (Browser übernimmt). */\nexport function wrapTarget(items: HTMLElement[], current: Element | null, backwards: boolean): HTMLElement | null {\n const first = items[0]\n const last = items[items.length - 1]\n if (!first || !last) return null\n if (backwards && (current === first || !items.includes(current as HTMLElement))) return last\n if (!backwards && (current === last || !items.includes(current as HTMLElement))) return first\n return null\n}\n\nexport interface FocusTrap {\n /** Fokus in den Container (Element mit `autofocus`, sonst erstes fokussierbares) und Tab-Taste einfangen. */\n activate: () => void\n /** Falle lösen und den Fokus an das vorher fokussierte Element zurückgeben. */\n deactivate: () => void\n}\n\nexport function createFocusTrap(container: () => HTMLElement | null): FocusTrap {\n let previous: HTMLElement | null = null\n let active = false\n\n function onKeydown(event: KeyboardEvent): void {\n const root = container()\n if (event.key !== 'Tab' || !root) return\n const target = wrapTarget(focusableWithin(root), document.activeElement, event.shiftKey)\n if (target) {\n event.preventDefault()\n target.focus()\n }\n }\n\n return {\n activate() {\n const root = container()\n if (!root || active) return\n active = true\n previous = document.activeElement instanceof HTMLElement ? document.activeElement : null\n const autofocus = root.querySelector<HTMLElement>('[autofocus]')\n ;(autofocus ?? focusableWithin(root)[0] ?? root).focus()\n document.addEventListener('keydown', onKeydown, true)\n },\n deactivate() {\n if (!active) return\n active = false\n document.removeEventListener('keydown', onKeydown, true)\n previous?.focus()\n previous = null\n },\n }\n}\n","/**\n * Eigene Strichsymbole (24er-Raster, Strichstärke über CSS). Jede Zeile ist\n * eine Liste von SVG-Pfaden; neue Symbole nur hier ergänzen.\n */\nexport const ICONS = {\n close: ['M6 6l12 12', 'M18 6L6 18'],\n plus: ['M12 5v14', 'M5 12h14'],\n minus: ['M5 12h14'],\n check: ['M5 12.5l4.5 4.5L19 7.5'],\n search: ['M10.5 17a6.5 6.5 0 1 0 0-13 6.5 6.5 0 0 0 0 13z', 'M15.5 15.5L20 20'],\n filter: ['M4 5h16', 'M7 12h10', 'M10 19h4'],\n settings: ['M4 6h9', 'M17 6h3', 'M15 4v4', 'M4 12h3', 'M11 12h9', 'M9 10v4', 'M4 18h11', 'M19 18h1', 'M17 16v4'],\n share: ['M6 14a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z', 'M18 8a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z', 'M18 21a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z', 'M8.2 10.4l7.6-4.3', 'M8.2 12.6l7.6 4.3'],\n trash: ['M4 7h16', 'M9 7V4.5h6V7', 'M6.5 7l1 13h9l1-13', 'M10 11v6', 'M14 11v6'],\n edit: ['M4 20h4L19 9l-4-4L4 16v4z', 'M13.5 6.5l4 4'],\n 'chevron-down': ['M6 9l6 6 6-6'],\n 'chevron-up': ['M6 15l6-6 6 6'],\n 'chevron-left': ['M15 6l-6 6 6 6'],\n 'chevron-right': ['M9 6l6 6-6 6'],\n sort: ['M8 4v16', 'M4.5 7.5L8 4l3.5 3.5', 'M16 20V4', 'M12.5 16.5L16 20l3.5-3.5'],\n 'sort-asc': ['M12 19V5', 'M6.5 10.5L12 5l5.5 5.5'],\n 'sort-desc': ['M12 5v14', 'M6.5 13.5L12 19l5.5-5.5'],\n grip: ['M9 6h.01', 'M15 6h.01', 'M9 12h.01', 'M15 12h.01', 'M9 18h.01', 'M15 18h.01'],\n calendar: ['M4.5 6.5h15v13h-15z', 'M4.5 10.5h15', 'M8.5 4v4', 'M15.5 4v4'],\n clock: ['M12 20.5a8.5 8.5 0 1 0 0-17 8.5 8.5 0 0 0 0 17z', 'M12 7.5V12l3 2'],\n paperclip: ['M19 11.5l-7.2 7.2a4.5 4.5 0 0 1-6.4-6.4l7.8-7.8a3 3 0 0 1 4.2 4.2l-7.6 7.6a1.5 1.5 0 0 1-2.1-2.1l6.9-6.9'],\n user: ['M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8z', 'M4.5 20.5a7.5 7.5 0 0 1 15 0'],\n lock: ['M6 11h12v9H6z', 'M8.5 11V8a3.5 3.5 0 0 1 7 0v3'],\n pin: ['M9 4h6l-1 6 3 3H7l3-3-1-6z', 'M12 13v7'],\n sun: ['M12 16.5a4.5 4.5 0 1 0 0-9 4.5 4.5 0 0 0 0 9z', 'M12 2.5v2', 'M12 19.5v2', 'M2.5 12h2', 'M19.5 12h2', 'M5.3 5.3l1.4 1.4', 'M17.3 17.3l1.4 1.4', 'M5.3 18.7l1.4-1.4', 'M17.3 6.7l1.4-1.4'],\n moon: ['M19.5 14.5A8 8 0 0 1 9.5 4.5a8 8 0 1 0 10 10z'],\n warning: ['M12 4l9 16H3z', 'M12 10v4.5', 'M12 17.5h.01'],\n info: ['M12 20.5a8.5 8.5 0 1 0 0-17 8.5 8.5 0 0 0 0 17z', 'M12 11v5.5', 'M12 7.5h.01'],\n expand: ['M4 9V4h5', 'M20 9V4h-5', 'M4 15v5h5', 'M20 15v5h-5'],\n 'more-vertical': ['M12 5.5h.01', 'M12 12h.01', 'M12 18.5h.01'],\n} as const satisfies Readonly<Record<string, readonly string[]>>\n\nexport type IconName = keyof typeof ICONS\n\nexport function isIconName(value: string): value is IconName {\n return Object.prototype.hasOwnProperty.call(ICONS, value)\n}\n","/** Anzeige-Logik von FaTable/FlowauditTable; Sortierung selbst aus `@auditcore/common`. */\nimport { ariaSort, type SortState, type TableColumn, type TableRow } from '@auditcore/common'\n\nexport function cellText(column: TableColumn, row: TableRow): string {\n const value = row[column.key]\n if (column.format) return column.format(value, row)\n return value === null || value === undefined ? '' : String(value)\n}\n\nexport function sortIcon(sort: SortState | null, key: string): 'sort' | 'sort-asc' | 'sort-desc' {\n const state = ariaSort(sort, key)\n return state === 'ascending' ? 'sort-asc' : state === 'descending' ? 'sort-desc' : 'sort'\n}\n\n/** Schlüssel einer Zeile aus `rowKey`, sonst Position. */\nexport function rowKeyOf(row: TableRow, rowKey: string, index: number): string {\n const value = row[rowKey]\n return typeof value === 'string' || typeof value === 'number' ? String(value) : `row-${index}`\n}\n\nexport function cellAlignClass(column: TableColumn): string {\n return `fa-table__cell--${column.align ?? 'start'}`\n}\n","import { defineMessages } from '../i18n'\n\n/** Sichtbare Texte der Synopse; Begriffe wie im audit_designer und in ecohesion. */\nexport const synopsisMessages = defineMessages({\n de: {\n title: 'Synopse',\n statusChanged: 'Geändert',\n statusRemoved: 'Entfallen',\n statusAdded: 'Neu',\n statusMoved: 'Verschoben',\n statusUnchanged: 'Unverändert',\n oldLabel: 'Bisherige Fassung',\n newLabel: 'Neue Fassung',\n reasonLabel: 'Grund',\n location: 'Fundstelle',\n emptyOld: 'nicht vorhanden',\n emptyNew: 'nicht mehr enthalten',\n fieldAnswer: 'Antwort',\n fieldComment: 'Bemerkung',\n fieldNote: 'Hinweis',\n counts: '{changed} geändert · {removed} entfallen · {added} neu · {moved} verschoben · {matched} zugeordnet',\n modeChecklist: 'Checkliste',\n modeText: 'Fließtext',\n detected: 'Erkannte Dokumentart: {mode} · Vergleichsmodul {version}',\n files: '{old} → {new}',\n hashes: 'SHA-256 bisher {old} · neu {new}',\n workAid:\n 'Die Maschine stellt Unterschiede fest, trifft aber keine Prüfungsentscheidung. Zuordnung, Hervorhebungen und Begründungsvorschläge sind vor Verwendung fachlich zu prüfen.',\n commands: '{recognised} Änderungsbefehle erkannt; {open} müssen von Hand bearbeitet werden.',\n openCommands: 'Offene Änderungsbefehle',\n consolidated: 'Konsolidierte Arbeitsfassung',\n consolidatedEntry: '{section} Abs. {paragraph}',\n repealed: '(aufgehoben)',\n inserted: '(neu eingefügt)',\n toolbar: 'Ansicht, Filter und Export',\n layout: 'Darstellung',\n layoutSideBySide: 'Nebeneinander',\n layoutInline: 'Im Text',\n filterLegend: 'Änderungsart',\n filterAll: 'Alle Änderungen',\n search: 'Im Vergleich suchen',\n onlySelected: 'Nur ausgewählte Zeilen',\n highlight: 'Geänderte Wörter hervorheben',\n prevChange: 'Vorige Änderung',\n nextChange: 'Nächste Änderung',\n position: 'Änderung {current} von {total}',\n positionNone: '{total} Änderungen in dieser Ansicht',\n keyboardHint: 'Tasten: N oder J nächste, P oder K vorige Änderung',\n noMatches: 'Keine passenden Unterschiede in dieser Ansicht. Unveränderte Stellen lassen sich über den Filter einblenden.',\n exportLabel: 'Exportieren',\n exportHtml: 'HTML',\n exportMarkdown: 'Markdown',\n exportPrint: 'Druckansicht / PDF',\n serverDocx: 'Word (DOCX)',\n serverPdf: 'PDF (Server)',\n serverJson: 'JSON',\n include: 'In Ausgabe übernehmen',\n reasonPlaceholder: 'Optionaler Grund',\n flowagent: 'FlowAgent-Vorschlag',\n flowagentVerified: 'Fundstellen belegt',\n flowagentCheck: 'bitte Fundstellen prüfen',\n srRemoved: 'gestrichen:',\n srAdded: 'eingefügt:',\n srEnd: 'Ende',\n selectedCount: '{count} von {total} Zeilen für die Ausgabe ausgewählt',\n loading: 'Vergleich wird geladen …',\n loadError: 'Der Vergleich konnte nicht geladen werden.',\n saveError: 'Die Änderung konnte nicht gespeichert werden.',\n empty: 'Kein Vergleich ausgewählt.',\n generated: 'Erstellt am {date}',\n },\n en: {\n title: 'Synopsis',\n statusChanged: 'Changed',\n statusRemoved: 'Removed',\n statusAdded: 'Added',\n statusMoved: 'Moved',\n statusUnchanged: 'Unchanged',\n oldLabel: 'Previous version',\n newLabel: 'New version',\n reasonLabel: 'Reason',\n location: 'Location',\n emptyOld: 'not present',\n emptyNew: 'no longer present',\n fieldAnswer: 'Answer',\n fieldComment: 'Comment',\n fieldNote: 'Note',\n counts: '{changed} changed · {removed} removed · {added} added · {moved} moved · {matched} matched',\n modeChecklist: 'Checklist',\n modeText: 'Running text',\n detected: 'Detected document type: {mode} · comparison module {version}',\n hashes: 'SHA-256 previous {old} · new {new}',\n workAid: 'The comparison finds differences but makes no audit decision. Review matches, highlights and suggested reasons before use.',\n commands: '{recognised} amendment commands recognised; {open} need manual work.',\n openCommands: 'Open amendment commands',\n consolidated: 'Consolidated working version',\n consolidatedEntry: '{section} para. {paragraph}',\n repealed: '(repealed)',\n inserted: '(inserted)',\n toolbar: 'View, filter and export',\n layout: 'Layout',\n layoutSideBySide: 'Side by side',\n layoutInline: 'Inline',\n filterLegend: 'Change type',\n filterAll: 'All changes',\n search: 'Search comparison',\n onlySelected: 'Selected rows only',\n highlight: 'Highlight changed words',\n prevChange: 'Previous change',\n nextChange: 'Next change',\n position: 'Change {current} of {total}',\n positionNone: '{total} changes in this view',\n keyboardHint: 'Keys: N or J next, P or K previous change',\n noMatches: 'No matching differences in this view. Use the filter to show unchanged passages.',\n exportLabel: 'Export',\n exportPrint: 'Print view / PDF',\n include: 'Include in output',\n reasonPlaceholder: 'Optional reason',\n flowagent: 'FlowAgent suggestion',\n flowagentVerified: 'references verified',\n flowagentCheck: 'please check references',\n srRemoved: 'deleted:',\n srAdded: 'inserted:',\n srEnd: 'end',\n selectedCount: '{count} of {total} rows selected for output',\n loading: 'Loading comparison …',\n loadError: 'The comparison could not be loaded.',\n saveError: 'The change could not be saved.',\n empty: 'No comparison selected.',\n generated: 'Created on {date}',\n },\n})\n\nexport type SynopsisMessageKey = keyof typeof synopsisMessages.de\n","/**\n * JSON-Formen des REST-Vertrags (docs/ui/synopsis-rest.md). Sie entsprechen\n * `ComparisonResult.to_dict()` aus `auditcore_documents`; die Oberfläche kennt\n * keine zweite Datenform.\n */\n\nexport type RowStatus = 'changed' | 'removed' | 'added' | 'moved' | 'unchanged'\nexport const ROW_STATUSES: readonly RowStatus[] = ['changed', 'removed', 'added', 'moved', 'unchanged']\n/** Vorgabe des Filters „Alle Änderungen“: alles außer unverändert. */\nexport const CHANGE_STATUSES: readonly RowStatus[] = ['changed', 'removed', 'added', 'moved']\n\nexport type DiffField = 'text' | 'answer' | 'comment' | 'note'\n\nexport interface CompareRow {\n row_id: string\n status: RowStatus | string\n location: string\n old_text: string\n new_text: string\n old_answer?: string\n new_answer?: string\n old_comment?: string\n new_comment?: string\n old_note?: string\n new_note?: string\n reason?: string\n /** `''`, `flowagent` (KI-Vorschlag) oder `article_law` (Änderungsbefehl). */\n reason_source?: string\n reason_verified?: boolean | null\n reason_warning?: string\n selected?: boolean\n /** Wortdifferenz im Format von `difflib.ndiff` je Feld. */\n diff?: Partial<Record<DiffField, readonly string[]>>\n}\n\nexport interface ConsolidatedParagraph {\n section: string\n paragraph: number\n text: string\n repealed: boolean\n inserted: boolean\n}\n\nexport interface ComparisonMetadata {\n comparison_type?: 'standard' | 'article_law' | string\n detected_mode?: string\n highlight_words?: boolean\n output_sections?: readonly string[]\n pdf_notice?: string\n profile?: { id: string; version: string; fingerprint: string }\n old_label?: string\n new_label?: string\n reason_label?: string\n recognised_commands?: number\n open_commands?: readonly string[]\n open_command_count?: number\n consolidated_text?: readonly ConsolidatedParagraph[]\n work_aid_notice?: string\n [key: string]: unknown\n}\n\nexport interface ComparisonResult {\n version: string\n mode: 'checklist' | 'text' | string\n old_filename: string\n new_filename: string\n old_sha256: string\n new_sha256: string\n old_count: number\n new_count: number\n matched_count: number\n changed_count: number\n removed_count: number\n added_count: number\n moved_count?: number\n rows: readonly CompareRow[]\n created_at: string\n metadata?: ComparisonMetadata\n}\n\n/** Ein gespeicherter Vergleich (`GET /comparisons/{id}`). */\nexport interface Comparison {\n id: string\n title: string\n created_at: string\n result: ComparisonResult\n}\n\nexport interface ComparisonSummary {\n id: string\n title: string\n created_at: string\n old_filename: string\n new_filename: string\n comparison_type: string\n counts: { changed: number; removed: number; added: number; moved: number }\n}\n\nexport interface ComparisonProfile {\n id: string\n version: string\n fingerprint: string\n status: string\n default: boolean\n}\n\n/** Änderung einer Zeile (`PATCH /comparisons/{id}/rows`). */\nexport interface RowUpdate {\n row_id: string\n selected?: boolean\n reason?: string\n}\n\nexport type SynopsisLayout = 'side-by-side' | 'inline'\nexport type ClientExportFormat = 'html' | 'markdown' | 'print'\nexport type ServerExportFormat = 'json' | 'markdown' | 'docx' | 'pdf'\n\n/** Ergebnis eines Exports in der Oberfläche (Ereignis `export`). */\nexport interface ExportPayload {\n format: ClientExportFormat\n filename: string\n mimeType: string\n content: string\n}\n","/**\n * Wortdifferenz für die Anzeige, ohne Vue. Bevorzugt die vom Server gelieferte\n * `difflib.ndiff`-Folge (`\" \"` gleich, `\"- \"` entfallen, `\"+ \"` neu,\n * `\"? \"` Hinweis); fehlt sie (Gesetzessynopse), rechnet eine längste gemeinsame\n * Teilfolge über Wörter nach – wie `regulierung/frontend/src/lib/textDiff.ts`\n * mit einer Obergrenze, damit die Oberfläche nicht einfriert.\n */\n\nexport type SegmentKind = 'same' | 'removed' | 'added'\nexport type DiffSide = 'old' | 'new' | 'inline'\n\nexport interface DiffSegment {\n text: string\n kind: SegmentKind\n}\n\n/** Oberhalb dieser Wortzahl je Seite wird nicht wortweise verglichen. */\nexport const WORD_LIMIT = 1200\n\ntype Operation = readonly [SegmentKind, string]\n\nfunction words(text: string): string[] {\n return text.split(/\\s+/).filter(Boolean)\n}\n\nfunction pushWord(out: DiffSegment[], word: string, kind: SegmentKind): void {\n const last = out[out.length - 1]\n if (!last) {\n out.push({ text: word, kind })\n return\n }\n if (last.kind === kind) {\n last.text += ` ${word}`\n return\n }\n if (last.kind === 'same') {\n last.text += ' '\n out.push({ text: word, kind })\n return\n }\n if (kind === 'same') {\n out.push({ text: ` ${word}`, kind })\n return\n }\n out.push({ text: ' ', kind: 'same' }, { text: word, kind })\n}\n\nfunction visible(kind: SegmentKind, side: DiffSide): boolean {\n if (side === 'old') return kind !== 'added'\n if (side === 'new') return kind !== 'removed'\n return true\n}\n\nfunction toSegments(operations: readonly Operation[], side: DiffSide): DiffSegment[] {\n const out: DiffSegment[] = []\n for (const [kind, word] of operations) {\n if (visible(kind, side)) pushWord(out, word, kind)\n }\n return out\n}\n\n/** ndiff-Zeilen in Operationen übersetzen; Hinweiszeilen (`? `) entfallen. */\nexport function ndiffOperations(lines: readonly string[]): Operation[] {\n const operations: Operation[] = []\n for (const line of lines) {\n const prefix = line.slice(0, 2)\n const word = line.slice(2)\n if (prefix === ' ') operations.push(['same', word])\n else if (prefix === '- ') operations.push(['removed', word])\n else if (prefix === '+ ') operations.push(['added', word])\n }\n return operations\n}\n\nfunction lcsTable(a: readonly string[], b: readonly string[]): Int32Array {\n const width = b.length + 1\n const table = new Int32Array((a.length + 1) * width)\n for (let i = a.length - 1; i >= 0; i -= 1) {\n for (let j = b.length - 1; j >= 0; j -= 1) {\n const index = i * width + j\n table[index] =\n a[i] === b[j]\n ? (table[index + width + 1] ?? 0) + 1\n : Math.max(table[index + width] ?? 0, table[index + 1] ?? 0)\n }\n }\n return table\n}\n\nfunction walk(a: readonly string[], b: readonly string[], table: Int32Array): Operation[] {\n const width = b.length + 1\n const at = (i: number, j: number): number => table[i * width + j] ?? 0\n const operations: Operation[] = []\n let i = 0\n let j = 0\n while (i < a.length && j < b.length) {\n const left = a[i] as string\n const right = b[j] as string\n if (left === right) {\n operations.push(['same', left])\n i += 1\n j += 1\n } else if (at(i + 1, j) >= at(i, j + 1)) {\n operations.push(['removed', left])\n i += 1\n } else {\n operations.push(['added', right])\n j += 1\n }\n }\n for (const word of a.slice(i)) operations.push(['removed', word])\n for (const word of b.slice(j)) operations.push(['added', word])\n return operations\n}\n\n/** Längste gemeinsame Teilfolge über Wörter; `null` oberhalb von {@link WORD_LIMIT}. */\nexport function lcsOperations(oldText: string, newText: string): Operation[] | null {\n const a = words(oldText)\n const b = words(newText)\n if (a.length > WORD_LIMIT || b.length > WORD_LIMIT) return null\n return walk(a, b, lcsTable(a, b))\n}\n\n/**\n * Segmente einer Seite. `ndiff` hat Vorrang; ohne sie wird nachgerechnet.\n * Ist keine Wortdifferenz möglich, bleibt der Text unmarkiert (seitenweise)\n * bzw. erscheint inline als Streichung plus Einfügung.\n */\nexport function diffSegments(\n oldText: string,\n newText: string,\n side: DiffSide,\n ndiff?: readonly string[],\n): DiffSegment[] {\n const operations = ndiff && ndiff.length > 0 ? ndiffOperations(ndiff) : lcsOperations(oldText, newText)\n if (operations) return toSegments(operations, side)\n if (side === 'old') return oldText ? [{ text: oldText, kind: 'same' }] : []\n if (side === 'new') return newText ? [{ text: newText, kind: 'same' }] : []\n return wholeSegments(oldText, newText)\n}\n\n/** Ganze Texte als Streichung und Einfügung (neue/entfallene Stellen, Rückfall). */\nexport function wholeSegments(oldText: string, newText: string): DiffSegment[] {\n const out: DiffSegment[] = []\n if (oldText) out.push({ text: oldText, kind: 'removed' })\n if (oldText && newText) out.push({ text: ' ', kind: 'same' })\n if (newText) out.push({ text: newText, kind: 'added' })\n return out\n}\n\nexport function plainSegments(text: string): DiffSegment[] {\n return text ? [{ text, kind: 'same' }] : []\n}\n\nexport function segmentsText(segments: readonly DiffSegment[]): string {\n return segments.map((segment) => segment.text).join('')\n}\n","/**\n * Framework-freie Anzeige-Logik der Synopse: aus einem `ComparisonResult`\n * entsteht ein View-Model mit Beschriftungen, Wortsegmenten je Seite,\n * Filter und Navigation. Vue-Komponenten und Exporte nutzen nur dieses Modell.\n */\nimport type { MessageParams } from '../i18n'\nimport type { SynopsisMessageKey } from './messages'\nimport { CHANGE_STATUSES, type CompareRow, type ComparisonResult, type ConsolidatedParagraph, type DiffField, type RowStatus } from './types'\nimport { diffSegments, plainSegments, wholeSegments, type DiffSegment } from './wordDiff'\n\nexport type SynopsisTranslate = (key: SynopsisMessageKey, params?: MessageParams) => string\n\nexport interface FieldView {\n field: Exclude<DiffField, 'text'>\n label: string\n old: DiffSegment[]\n new: DiffSegment[]\n inline: DiffSegment[]\n}\n\nexport interface RowView {\n id: string\n status: RowStatus | string\n statusLabel: string\n location: string\n old: DiffSegment[]\n new: DiffSegment[]\n inline: DiffSegment[]\n fields: FieldView[]\n reason: string\n reasonSource: string\n reasonVerified: boolean | null\n reasonWarning: string\n selected: boolean\n isChange: boolean\n /** Suchtext: Fundstelle, beide Fassungen, Nebenfelder und Grund, kleingeschrieben. */\n haystack: string\n}\n\nexport interface SynopsisView {\n title: string\n oldLabel: string\n newLabel: string\n reasonLabel: string\n isArticleLaw: boolean\n countsText: string\n detectedText: string\n filesText: string\n hashesText: string\n createdAt: string\n notices: string[]\n recognisedCommands: number\n openCommands: string[]\n consolidated: readonly ConsolidatedParagraph[]\n rows: RowView[]\n}\n\nexport interface ViewOptions {\n title?: string\n oldLabel?: string\n newLabel?: string\n /** Wortweise Hervorhebung; ohne sie bleiben Texte unmarkiert. */\n highlight?: boolean\n}\n\nconst STATUS_KEYS: Record<RowStatus, SynopsisMessageKey> = {\n changed: 'statusChanged',\n removed: 'statusRemoved',\n added: 'statusAdded',\n moved: 'statusMoved',\n unchanged: 'statusUnchanged',\n}\n\nconst FIELDS: ReadonlyArray<[Exclude<DiffField, 'text'>, SynopsisMessageKey]> = [\n ['answer', 'fieldAnswer'],\n ['comment', 'fieldComment'],\n ['note', 'fieldNote'],\n]\n\nexport function statusLabel(status: string, t: SynopsisTranslate): string {\n const key = STATUS_KEYS[status as RowStatus]\n return key ? t(key) : status\n}\n\ninterface Sides {\n old: DiffSegment[]\n new: DiffSegment[]\n inline: DiffSegment[]\n}\n\nfunction sides(oldText: string, newText: string, status: string, ndiff: readonly string[] | undefined, highlight: boolean): Sides {\n if (!highlight || oldText === newText) {\n const inline = oldText === newText ? plainSegments(newText) : wholeSegments(oldText, newText)\n return { old: plainSegments(oldText), new: plainSegments(newText), inline }\n }\n if (status === 'added' || status === 'removed' || !oldText || !newText) {\n return { old: plainSegments(oldText), new: plainSegments(newText), inline: wholeSegments(oldText, newText) }\n }\n return {\n old: diffSegments(oldText, newText, 'old', ndiff),\n new: diffSegments(oldText, newText, 'new', ndiff),\n inline: diffSegments(oldText, newText, 'inline', ndiff),\n }\n}\n\nfunction fieldValue(row: CompareRow, side: 'old' | 'new', field: Exclude<DiffField, 'text'>): string {\n return row[`${side}_${field}`] ?? ''\n}\n\nfunction fieldViews(row: CompareRow, highlight: boolean, t: SynopsisTranslate): FieldView[] {\n const views: FieldView[] = []\n for (const [field, key] of FIELDS) {\n const oldValue = fieldValue(row, 'old', field)\n const newValue = fieldValue(row, 'new', field)\n if (!oldValue && !newValue) continue\n views.push({ field, label: t(key), ...sides(oldValue, newValue, row.status, row.diff?.[field], highlight) })\n }\n return views\n}\n\nfunction haystack(row: CompareRow): string {\n const parts = [row.location, row.old_text, row.new_text, row.reason ?? '']\n for (const [field] of FIELDS) parts.push(fieldValue(row, 'old', field), fieldValue(row, 'new', field))\n return parts.join('\\n').toLocaleLowerCase('de')\n}\n\nexport function buildRowView(row: CompareRow, highlight: boolean, t: SynopsisTranslate): RowView {\n return {\n id: row.row_id,\n status: row.status,\n statusLabel: statusLabel(row.status, t),\n location: row.location,\n ...sides(row.old_text, row.new_text, row.status, row.diff?.text, highlight),\n fields: fieldViews(row, highlight, t),\n reason: row.reason ?? '',\n reasonSource: row.reason_source ?? '',\n reasonVerified: row.reason_verified ?? null,\n reasonWarning: row.reason_warning ?? '',\n selected: row.selected ?? true,\n isChange: (CHANGE_STATUSES as readonly string[]).includes(row.status),\n haystack: haystack(row),\n }\n}\n\nfunction modeLabel(mode: string, t: SynopsisTranslate): string {\n if (mode === 'checklist') return t('modeChecklist')\n if (mode === 'text') return t('modeText')\n return mode\n}\n\nfunction notices(result: ComparisonResult, t: SynopsisTranslate): string[] {\n const meta = result.metadata ?? {}\n const list = [t('workAid')]\n for (const value of [meta.work_aid_notice, meta.pdf_notice]) {\n if (typeof value === 'string' && value) list.push(value)\n }\n return list\n}\n\nfunction countsText(result: ComparisonResult, t: SynopsisTranslate): string {\n return t('counts', {\n changed: result.changed_count,\n removed: result.removed_count,\n added: result.added_count,\n moved: result.moved_count ?? 0,\n matched: result.matched_count,\n })\n}\n\ntype Labels = Pick<SynopsisView, 'title' | 'oldLabel' | 'newLabel' | 'reasonLabel'>\n\nfunction labels(result: ComparisonResult, t: SynopsisTranslate, options: ViewOptions): Labels {\n const meta = result.metadata ?? {}\n return {\n title: options.title || t('files', { old: result.old_filename, new: result.new_filename }),\n oldLabel: options.oldLabel || meta.old_label || t('oldLabel'),\n newLabel: options.newLabel || meta.new_label || t('newLabel'),\n reasonLabel: meta.reason_label || t('reasonLabel'),\n }\n}\n\nexport function buildSynopsisView(result: ComparisonResult, t: SynopsisTranslate, options: ViewOptions = {}): SynopsisView {\n const meta = result.metadata ?? {}\n const highlight = options.highlight ?? meta.highlight_words ?? true\n return {\n ...labels(result, t, options),\n isArticleLaw: meta.comparison_type === 'article_law',\n countsText: countsText(result, t),\n detectedText: t('detected', { mode: modeLabel(result.mode, t), version: result.version }),\n filesText: t('files', { old: result.old_filename, new: result.new_filename }),\n hashesText: t('hashes', { old: result.old_sha256 || '–', new: result.new_sha256 || '–' }),\n createdAt: result.created_at,\n notices: notices(result, t),\n recognisedCommands: meta.recognised_commands ?? 0,\n openCommands: [...(meta.open_commands ?? [])],\n consolidated: meta.consolidated_text ?? [],\n rows: result.rows.map((row) => buildRowView(row, highlight, t)),\n }\n}\n\nexport interface SynopsisRowFilter {\n statuses: readonly string[]\n query: string\n onlySelected: boolean\n}\n\nexport const DEFAULT_SYNOPSIS_FILTER: SynopsisRowFilter = { statuses: CHANGE_STATUSES, query: '', onlySelected: false }\n\nexport function filterRows(rows: readonly RowView[], filter: SynopsisRowFilter): RowView[] {\n const query = filter.query.trim().toLocaleLowerCase('de')\n return rows.filter(\n (row) =>\n filter.statuses.includes(row.status) &&\n (!filter.onlySelected || row.selected) &&\n (!query || row.haystack.includes(query)),\n )\n}\n\n/** Kennungen der Änderungszeilen in Anzeigereihenfolge (Ziel der Navigation). */\nexport function changeIds(rows: readonly RowView[]): string[] {\n return rows.filter((row) => row.isChange).map((row) => row.id)\n}\n\n/**\n * Nächste bzw. vorige Änderung; ohne aktuelle Position beginnt `+1` bei der\n * ersten und `-1` bei der letzten. Am Rand bleibt die Position stehen.\n */\nexport function stepChange(ids: readonly string[], current: string | null, direction: 1 | -1): string | null {\n if (ids.length === 0) return null\n const index = current === null ? -1 : ids.indexOf(current)\n if (index === -1) return direction === 1 ? (ids[0] ?? null) : (ids[ids.length - 1] ?? null)\n const next = Math.min(ids.length - 1, Math.max(0, index + direction))\n return ids[next] ?? null\n}\n\nexport function positionText(ids: readonly string[], current: string | null, t: SynopsisTranslate): string {\n const index = current === null ? -1 : ids.indexOf(current)\n if (index === -1) return t('positionNone', { total: ids.length })\n return t('position', { current: index + 1, total: ids.length })\n}\n\n/** Zeilen mit lokalen Änderungen (Auswahl, Grund) zusammenführen. */\nexport function applyRowOverrides(rows: readonly CompareRow[], overrides: ReadonlyMap<string, Partial<CompareRow>>): CompareRow[] {\n if (overrides.size === 0) return [...rows]\n return rows.map((row) => {\n const patch = overrides.get(row.row_id)\n return patch ? { ...row, ...patch } : row\n })\n}\n","/**\n * Exporte aus dem View-Model, ohne Vue: eigenständiges HTML (auch als\n * Druckansicht für „Als PDF speichern“) und Markdown. Exportiert werden die\n * angezeigten Zeilen, die für die Ausgabe ausgewählt sind.\n */\nimport type { SynopsisTranslate, RowView, SynopsisView } from './viewModel'\nimport type { DiffSegment } from './wordDiff'\n\nexport interface ExportInput {\n view: SynopsisView\n rows: readonly RowView[]\n t: SynopsisTranslate\n /** Zeitpunkt der Ausgabe (Standard: jetzt), für reproduzierbare Tests injizierbar. */\n generatedAt?: string\n lang?: string\n}\n\nconst HTML_ESCAPES: Record<string, string> = { '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' }\n\nexport function escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (char) => HTML_ESCAPES[char] ?? char)\n}\n\nexport function escapeMarkdown(text: string): string {\n return text.replace(/([\\\\`*_[\\]<>#|])/g, '\\\\$1')\n}\n\nexport function exportFilename(title: string, extension: string): string {\n const stem = title.replace(/[^\\p{L}\\p{N}._-]+/gu, '_').replace(/^[._]+|[._]+$/g, '') || 'Synopse'\n return `${stem.slice(0, 80)}.${extension}`\n}\n\nfunction outputRows(rows: readonly RowView[]): RowView[] {\n return rows.filter((row) => row.selected)\n}\n\nfunction htmlSegments(segments: readonly DiffSegment[], empty: string): string {\n if (segments.length === 0) return `<span class=\"empty\">${escapeHtml(empty)}</span>`\n return segments\n .map((segment) => {\n const text = escapeHtml(segment.text)\n if (segment.kind === 'removed') return `<del>${text}</del>`\n if (segment.kind === 'added') return `<ins>${text}</ins>`\n return text\n })\n .join('')\n}\n\nfunction htmlFields(row: RowView, side: 'old' | 'new'): string {\n return row.fields\n .filter((field) => field[side].length > 0)\n .map((field) => `<p class=\"field\"><strong>${escapeHtml(field.label)}:</strong> ${htmlSegments(field[side], '')}</p>`)\n .join('')\n}\n\nfunction htmlRow(row: RowView, input: ExportInput, withReason: boolean): string {\n const { t } = input\n const reason = withReason ? `<td>${escapeHtml(row.reason)}</td>` : ''\n return (\n `<tr><th scope=\"row\">${escapeHtml(row.location || '—')}<br><span class=\"status\">${escapeHtml(row.statusLabel)}</span></th>` +\n `<td>${htmlSegments(row.old, t('emptyOld'))}${htmlFields(row, 'old')}</td>` +\n `<td>${htmlSegments(row.new, t('emptyNew'))}${htmlFields(row, 'new')}</td>${reason}</tr>`\n )\n}\n\nconst HTML_STYLE = `\nbody{font:11pt/1.45 'IBM Plex Sans',system-ui,sans-serif;color:#1b2230;margin:2rem}\nh1{font-size:16pt;margin:0 0 .5rem}p.meta{color:#5b6474;margin:.2rem 0}\n.notice{border-left:4px solid #a15c07;background:#fdf1dc;padding:.5rem .75rem;margin:.75rem 0}\ntable{border-collapse:collapse;width:100%;margin-top:1rem}th,td{border:1px solid #a9aea4;padding:.4rem .5rem;vertical-align:top;text-align:left;white-space:pre-wrap}\nthead th{background:#eceee9}.status{font-weight:400;color:#5b6474;font-size:9pt}.field{margin:.35rem 0 0;font-size:9.5pt}\ndel{background:#fdecea;color:#8a1c12;text-decoration:line-through}ins{background:#e3f4ea;color:#14532d;text-decoration:underline}\n.empty{color:#5b6474;font-style:italic}\n@media print{body{margin:0}thead{display:table-header-group}tr{break-inside:avoid}.notice{break-inside:avoid}}\n`\n\nfunction htmlCommands(view: SynopsisView, t: SynopsisTranslate): string {\n if (view.openCommands.length === 0) return ''\n const items = view.openCommands.map((command) => `<li>${escapeHtml(command)}</li>`).join('')\n return `<h2>${escapeHtml(t('openCommands'))}</h2><ul>${items}</ul>`\n}\n\n/** Eigenständiges HTML-Dokument mit Druck-CSS (keine externen Ressourcen). */\nexport function toHtml(input: ExportInput): string {\n const { view, t } = input\n const rows = outputRows(input.rows)\n const withReason = view.isArticleLaw || rows.some((row) => row.reason)\n const reasonHead = withReason ? `<th scope=\"col\">${escapeHtml(view.reasonLabel)}</th>` : ''\n const notices = view.notices.map((notice) => `<p class=\"notice\">${escapeHtml(notice)}</p>`).join('')\n const body = rows.length\n ? rows.map((row) => htmlRow(row, input, withReason)).join('')\n : `<tr><td colspan=\"${withReason ? 4 : 3}\">${escapeHtml(t('noMatches'))}</td></tr>`\n const generated = t('generated', { date: input.generatedAt ?? new Date().toISOString() })\n return (\n `<!doctype html><html lang=\"${escapeHtml(input.lang ?? 'de')}\"><head><meta charset=\"utf-8\">` +\n `<title>${escapeHtml(view.title)}</title><style>${HTML_STYLE}</style></head><body>` +\n `<h1>${escapeHtml(view.title)}</h1><p class=\"meta\">${escapeHtml(view.filesText)}</p>` +\n `<p class=\"meta\">${escapeHtml(view.countsText)}</p><p class=\"meta\">${escapeHtml(view.hashesText)}</p>` +\n `<p class=\"meta\">${escapeHtml(generated)}</p>${notices}` +\n `<table><thead><tr><th scope=\"col\">${escapeHtml(t('location'))}</th><th scope=\"col\">${escapeHtml(view.oldLabel)}</th>` +\n `<th scope=\"col\">${escapeHtml(view.newLabel)}</th>${reasonHead}</tr></thead><tbody>${body}</tbody></table>` +\n `${htmlCommands(view, t)}</body></html>`\n )\n}\n\nfunction markdownSegments(segments: readonly DiffSegment[], empty: string): string {\n if (segments.length === 0) return `_${escapeMarkdown(empty)}_`\n return segments\n .map((segment) => {\n const text = escapeMarkdown(segment.text)\n if (!text.trim() || segment.kind === 'same') return text\n return segment.kind === 'removed' ? `~~${text.trim()}~~` : `**${text.trim()}**`\n })\n .join('')\n}\n\nfunction markdownRow(row: RowView, input: ExportInput): string[] {\n const { view, t } = input\n const lines = [`### ${escapeMarkdown(row.location || '—')} (${row.statusLabel})`, '']\n lines.push(`**${view.oldLabel}:** ${markdownSegments(row.old, t('emptyOld'))}`, '')\n lines.push(`**${view.newLabel}:** ${markdownSegments(row.new, t('emptyNew'))}`, '')\n for (const field of row.fields) {\n lines.push(`- ${field.label}: ${markdownSegments(field.inline, '—')}`)\n }\n if (row.fields.length) lines.push('')\n if (row.reason) lines.push(`**${view.reasonLabel}:** ${escapeMarkdown(row.reason)}`, '')\n return lines\n}\n\n/** Markdown: gestrichene Wörter als ~~…~~, neue als **…**. */\nexport function toMarkdown(input: ExportInput): string {\n const { view, t } = input\n const rows = outputRows(input.rows)\n const lines = [`# ${escapeMarkdown(view.title)}`, '', `- ${escapeMarkdown(view.filesText)}`, `- ${view.countsText}`, `- ${view.hashesText}`, '']\n for (const notice of view.notices) lines.push(`> ${escapeMarkdown(notice)}`, '')\n if (rows.length === 0) lines.push(t('noMatches'), '')\n for (const row of rows) lines.push(...markdownRow(row, input))\n if (view.openCommands.length) {\n lines.push(`## ${t('openCommands')}`, '', ...view.openCommands.map((command) => `- ${escapeMarkdown(command)}`), '')\n }\n return `${lines.join('\\n').trimEnd()}\\n`\n}\n","/**\n * Port zur Anwendung. Die Komponente ruft nie selbst `fetch` auf: Anwendungen\n * übergeben einen Port – etwa {@link createSynopsisRestClient} für den\n * REST-Vertrag aus `auditcore_documents.web` – oder eigene Implementierungen.\n */\nimport { RestError, type FetchLike, type RestOptions } from '@auditcore/common'\nimport type { Comparison, ComparisonProfile, ComparisonResult, ComparisonSummary, RowUpdate, ServerExportFormat } from './types'\n\nexport interface SynopsisPort {\n /** Vergleich laden (`GET /comparisons/{id}`). */\n load(id: string): Promise<Comparison>\n /** Auswahl/Grund speichern (`PATCH /comparisons/{id}/rows`); liefert den neuen Stand. */\n updateRows?(id: string, rows: readonly RowUpdate[]): Promise<Comparison>\n /** Adresse einer Server-Ausgabe (DOCX, PDF, JSON, Markdown) für einen Download-Link. */\n exportUrl?(id: string, format: ServerExportFormat): string\n}\n\n/** Optionen wie bei `src/rest`: `baseUrl` (z. B. `/api/synopsis`), injizierbares `fetch`, Kopfzeilen. */\nexport type RestClientOptions = RestOptions\n\nexport interface CompareFields {\n title?: string\n comparison_type?: 'standard' | 'article_law'\n mode?: 'auto' | 'checklist' | 'text'\n threshold?: number\n include_answers?: boolean\n include_notes?: boolean\n include_editorial?: boolean\n highlight_words?: boolean\n output_sections?: readonly string[]\n profile?: string\n}\n\n/** Anfrage von `POST /comparisons/import`: ein fertiges Ergebnis aus der Auftragssteuerung ablegen. */\nexport interface ImportRequest {\n title?: string\n result: ComparisonResult\n}\n\nexport interface SynopsisRestClient extends Required<SynopsisPort> {\n profiles(): Promise<ComparisonProfile[]>\n list(): Promise<ComparisonSummary[]>\n create(oldFile: Blob, oldName: string, newFile: Blob, newName: string, fields?: CompareFields): Promise<Comparison>\n /** `POST /comparisons/import`. */\n importResult(request: ImportRequest): Promise<Comparison>\n remove(id: string): Promise<void>\n}\n\nasync function parse<T>(response: Response): Promise<T> {\n if (response.ok) return (response.status === 204 ? undefined : await response.json()) as T\n let detail = `HTTP ${response.status}`\n try {\n // auditcore_documents.web: {\"detail\": …}; andere Router: {\"error\": {\"message\": …}}.\n const body = (await response.json()) as { detail?: unknown; error?: { message?: unknown } }\n const message = body.detail ?? body.error?.message\n if (typeof message === 'string') detail = message\n } catch {\n // Kein JSON-Körper: Statuszeile genügt.\n }\n throw new RestError(detail, response.status, 'http_error')\n}\n\nfunction formFields(fields: CompareFields): Array<[string, string]> {\n return Object.entries(fields)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, Array.isArray(value) ? value.join(',') : String(value)])\n}\n\nfunction asFile(blob: Blob, name: string): File {\n return blob instanceof File && blob.name === name ? blob : new File([blob], name, { type: blob.type })\n}\n\nexport function createSynopsisRestClient(options: RestClientOptions): SynopsisRestClient {\n const base = options.baseUrl.replace(/\\/+$/, '')\n const fetchImpl: FetchLike = options.fetch ?? ((input, init) => globalThis.fetch(input, init))\n const request: FetchLike = (input, init) =>\n fetchImpl(input, { ...init, headers: { Accept: 'application/json', ...options.headers, ...init?.headers } })\n const url = (path: string): string => `${base}${path}`\n const item = (id: string): string => url(`/comparisons/${encodeURIComponent(id)}`)\n const json = { 'Content-Type': 'application/json' }\n return {\n load: async (id) => parse<Comparison>(await request(item(id))),\n updateRows: async (id, rows) =>\n parse<Comparison>(await request(`${item(id)}/rows`, { method: 'PATCH', headers: json, body: JSON.stringify({ rows }) })),\n exportUrl: (id, format) => `${item(id)}/export?format=${encodeURIComponent(format)}`,\n profiles: async () => (await parse<{ items: ComparisonProfile[] }>(await request(url('/profiles')))).items,\n list: async () => (await parse<{ items: ComparisonSummary[] }>(await request(url('/comparisons')))).items,\n async create(oldFile, oldName, newFile, newName, fields = {}) {\n const form = new FormData()\n form.append('old_file', asFile(oldFile, oldName))\n form.append('new_file', asFile(newFile, newName))\n for (const [key, value] of formFields(fields)) form.append(key, value)\n return parse<Comparison>(await request(url('/comparisons'), { method: 'POST', body: form }))\n },\n importResult: async (body) =>\n parse<Comparison>(await request(url('/comparisons/import'), { method: 'POST', headers: json, body: JSON.stringify(body) })),\n async remove(id) {\n await parse<undefined>(await request(item(id), { method: 'DELETE' }))\n },\n }\n}\n","// Zustandsautomat von <flowaudit-synopsis> (Vue und React): Laden über den\n// Port, lokale Zeilenänderungen, Filter, Navigation zwischen Änderungen, Exporte.\n\nimport { createStore } from '../store'\nimport { exportFilename, toHtml, toMarkdown } from './exporters'\nimport type { SynopsisPort } from './port'\nimport {\n CHANGE_STATUSES,\n type ClientExportFormat,\n type Comparison,\n type ComparisonResult,\n type CompareRow,\n type ExportPayload,\n type RowUpdate,\n type ServerExportFormat,\n} from './types'\nimport {\n applyRowOverrides,\n buildSynopsisView,\n changeIds,\n filterRows,\n positionText,\n stepChange,\n type RowView,\n type SynopsisTranslate,\n type SynopsisView,\n} from './viewModel'\n\n/** Eingaben der Komponente (Props). */\nexport interface SynopsisInputs {\n comparison?: Comparison | null\n result?: ComparisonResult | null\n comparisonId?: string\n port?: SynopsisPort | null\n title?: string\n oldLabel?: string\n newLabel?: string\n}\n\nexport interface SynopsisFilterState {\n statuses: string[]\n query: string\n onlySelected: boolean\n /** `null`: Vorgabe aus `metadata.highlight_words`. */\n highlight: boolean | null\n}\n\nexport interface SynopsisData {\n loaded: Comparison | null\n loading: boolean\n error: string\n overrides: ReadonlyMap<string, Partial<CompareRow>>\n filter: SynopsisFilterState\n activeId: string | null\n}\n\nexport interface ServerExportLink {\n label: string\n href: string\n}\n\n/** Alles, was die Oberfläche aus Stand und Eingaben anzeigt (reine Funktion). */\nexport interface SynopsisSelection {\n currentId: string | undefined\n result: ComparisonResult | null\n view: SynopsisView | null\n rows: RowView[]\n selectedText: string\n highlight: boolean\n activeId: string | null\n position: string\n canPrev: boolean\n canNext: boolean\n serverExports: ServerExportLink[]\n}\n\nconst SERVER_FORMATS: ReadonlyArray<[ServerExportFormat, 'serverDocx' | 'serverPdf' | 'serverJson']> = [\n ['docx', 'serverDocx'],\n ['pdf', 'serverPdf'],\n ['json', 'serverJson'],\n]\n\n/** Kennung des angezeigten Vergleichs (für Speichern und Server-Exporte). */\nexport function synopsisId(state: SynopsisData, inputs: SynopsisInputs): string | undefined {\n return (inputs.comparison ?? state.loaded)?.id ?? inputs.comparisonId\n}\n\n/** Ergebnisobjekt vor lokalen Änderungen: Prop `result`, sonst gespeicherter oder geladener Vergleich. */\nexport function synopsisBase(state: SynopsisData, inputs: SynopsisInputs): ComparisonResult | null {\n return inputs.result ?? (inputs.comparison ?? state.loaded)?.result ?? null\n}\n\nfunction serverExports(port: SynopsisPort | null | undefined, id: string | undefined, t: SynopsisTranslate): ServerExportLink[] {\n if (!id || !port?.exportUrl) return []\n return SERVER_FORMATS.map(([format, key]) => ({ label: t(key), href: port.exportUrl?.(id, format) ?? '' }))\n}\n\nfunction buildView(state: SynopsisData, inputs: SynopsisInputs, result: ComparisonResult, t: SynopsisTranslate): SynopsisView {\n return buildSynopsisView(result, t, {\n title: inputs.title || (inputs.comparison ?? state.loaded)?.title,\n oldLabel: inputs.oldLabel,\n newLabel: inputs.newLabel,\n highlight: state.filter.highlight ?? undefined,\n })\n}\n\ninterface Navigation {\n activeId: string | null\n position: string\n canPrev: boolean\n canNext: boolean\n}\n\n/** Position unter den sichtbaren Änderungen; eine ausgeblendete aktive Zeile gilt als keine. */\nfunction navigation(rows: readonly RowView[], active: string | null, t: SynopsisTranslate): Navigation {\n const ids = changeIds(rows)\n const activeId = active !== null && ids.includes(active) ? active : null\n const index = activeId === null ? -1 : ids.indexOf(activeId)\n return {\n activeId,\n position: positionText(ids, activeId, t),\n canPrev: ids.length > 0 && index !== 0,\n canNext: ids.length > 0 && index !== ids.length - 1,\n }\n}\n\nfunction selectedText(view: SynopsisView | null, t: SynopsisTranslate): string {\n const all = view?.rows ?? []\n return t('selectedCount', { count: all.filter((row) => row.selected).length, total: all.length })\n}\n\n/** Wortweise Hervorhebung: Auswahl der Werkzeugleiste, sonst Vorgabe des Ergebnisses, sonst an. */\nfunction highlightOf(state: SynopsisData, result: ComparisonResult | null): boolean {\n return state.filter.highlight ?? result?.metadata?.highlight_words ?? true\n}\n\nexport function selectSynopsis(state: SynopsisData, inputs: SynopsisInputs, t: SynopsisTranslate): SynopsisSelection {\n const currentId = synopsisId(state, inputs)\n const base = synopsisBase(state, inputs)\n const result = base ? { ...base, rows: applyRowOverrides(base.rows, state.overrides) } : null\n const view = result ? buildView(state, inputs, result, t) : null\n const rows = view ? filterRows(view.rows, state.filter) : []\n return {\n currentId,\n result,\n view,\n rows,\n selectedText: selectedText(view, t),\n highlight: highlightOf(state, result),\n ...navigation(rows, state.activeId, t),\n serverExports: serverExports(inputs.port, currentId, t),\n }\n}\n\n/** Export der sichtbaren Zeilen (HTML, Markdown, Druckansicht). */\nexport function buildSynopsisExport(selection: SynopsisSelection, format: ClientExportFormat, t: SynopsisTranslate, lang: string): ExportPayload | null {\n const view = selection.view\n if (!view) return null\n const input = { view, rows: selection.rows, t, lang }\n if (format === 'markdown') {\n return { format, filename: exportFilename(view.title, 'md'), mimeType: 'text/markdown;charset=utf-8', content: toMarkdown(input) }\n }\n return { format, filename: exportFilename(view.title, 'html'), mimeType: 'text/html;charset=utf-8', content: toHtml(input) }\n}\n\nconst INITIAL: SynopsisData = {\n loaded: null,\n loading: false,\n error: '',\n overrides: new Map(),\n filter: { statuses: [...CHANGE_STATUSES], query: '', onlySelected: false, highlight: null },\n activeId: null,\n}\n\nexport function createSynopsisController(t: () => SynopsisTranslate) {\n const store = createStore<SynopsisData>(INITIAL)\n const setFilter = (patch: Partial<SynopsisFilterState>): void => store.set((state) => ({ filter: { ...state.filter, ...patch } }))\n\n /** Mit `comparisonId` und `port`, aber ohne `comparison`/`result`: Vergleich laden. */\n async function reload(inputs: SynopsisInputs): Promise<void> {\n const { comparisonId: id, port } = inputs\n if (!id || !port || inputs.comparison || inputs.result) return\n store.set({ loading: true, error: '' })\n try {\n store.set({ loaded: await port.load(id) })\n } catch {\n store.set({ error: t()('loadError') })\n } finally {\n store.set({ loading: false })\n }\n }\n\n async function updateRow(inputs: SynopsisInputs, id: string, patch: Omit<RowUpdate, 'row_id'>): Promise<RowUpdate> {\n store.set((state) => {\n const overrides = new Map(state.overrides)\n overrides.set(id, { ...overrides.get(id), ...patch })\n return { overrides }\n })\n const update: RowUpdate = { row_id: id, ...patch }\n const target = synopsisId(store.get(), inputs)\n if (inputs.port?.updateRows && target) {\n try {\n await inputs.port.updateRows(target, [update])\n store.set({ error: '' })\n } catch {\n store.set({ error: t()('saveError') })\n }\n }\n return update\n }\n\n function toggleStatus(status: string, enabled: boolean): void {\n const next = new Set(store.get().filter.statuses)\n if (enabled) next.add(status)\n else next.delete(status)\n setFilter({ statuses: [...next] })\n }\n\n /** Zur nächsten/vorigen Änderung; liefert die neue Zeile oder `null`. */\n function go(selection: SynopsisSelection, direction: 1 | -1): string | null {\n const next = stepChange(changeIds(selection.rows), selection.activeId, direction)\n if (next !== null) store.set({ activeId: next })\n return next\n }\n\n return {\n store,\n reload,\n updateRow,\n toggleStatus,\n go,\n setAllChanges: () => setFilter({ statuses: [...CHANGE_STATUSES] }),\n setQuery: (query: string) => setFilter({ query }),\n setOnlySelected: (onlySelected: boolean) => setFilter({ onlySelected }),\n setHighlight: (highlight: boolean) => setFilter({ highlight }),\n activate: (id: string | null) => store.set({ activeId: id }),\n /** Neues Ergebnisobjekt: lokale Zeilenänderungen verwerfen. */\n resetOverrides: () => {\n if (store.get().overrides.size) store.set({ overrides: new Map() })\n },\n }\n}\n\nexport type SynopsisController = ReturnType<typeof createSynopsisController>\n","/** Tastatur- und Fokussteuerung der Synopse (framework-frei). */\n\nconst NEXT_KEYS = new Set(['n', 'j'])\nconst PREV_KEYS = new Set(['p', 'k'])\n\nfunction isEditable(target: EventTarget | null): boolean {\n if (typeof HTMLElement === 'undefined' || !(target instanceof HTMLElement)) return false\n return target.isContentEditable || ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName)\n}\n\nfunction prefersReducedMotion(): boolean {\n return typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/** Richtung für N/J (nächste) bzw. P/K (vorige Änderung); in Eingabefeldern und mit Modifikatoren `null`. */\nexport function navigationDirection(event: Pick<KeyboardEvent, 'key' | 'altKey' | 'ctrlKey' | 'metaKey' | 'target'>): 1 | -1 | null {\n if (event.altKey || event.ctrlKey || event.metaKey || isEditable(event.target)) return null\n const key = event.key.toLowerCase()\n if (NEXT_KEYS.has(key)) return 1\n return PREV_KEYS.has(key) ? -1 : null\n}\n\n/** Zeile fokussieren und sichtbar machen; Zeilen tragen `data-row-id` und `tabindex=\"-1\"`. */\nexport function focusRow(root: HTMLElement | null, id: string): void {\n const target = Array.from(root?.querySelectorAll<HTMLElement>('[data-row-id]') ?? []).find(\n (element) => element.dataset.rowId === id,\n )\n if (!target) return\n target.focus({ preventScroll: true })\n if (typeof target.scrollIntoView === 'function') {\n target.scrollIntoView({ block: 'center', behavior: prefersReducedMotion() ? 'auto' : 'smooth' })\n }\n}\n","import { defineMessages, type Translate } from '../i18n'\n\n/** Texte von `<flowaudit-vvt>` und `<flowaudit-dsfa>`. */\nexport const dataprotectionMessages = defineMessages({\n de: {\n vvtTitle: 'Verzeichnis von Verarbeitungstätigkeiten',\n vvtNorm: 'Art. 30 DSGVO',\n dsfaTitle: 'Datenschutz-Folgenabschätzung',\n dsfaNorm: 'Art. 35 DSGVO',\n profile: 'Regelprofil {id} {version}',\n noPort: 'Kein Port übergeben: Eigenschaft „port“ setzen (z. B. createDataProtectionRestPort).',\n networkError: 'Verbindung fehlgeschlagen: {message}',\n loading: 'Wird geladen …',\n yes: 'ja',\n no: 'nein',\n open: 'nicht angegeben',\n empty: '—',\n status_entwurf: 'Entwurf',\n status_freigegeben: 'freigegeben',\n status_abgeloest: 'abgelöst',\n status_dsb_beteiligung: 'Stellungnahme eingeholt',\n versionLabel: 'Fassung {version} – {status}',\n noVersion: 'Noch keine Fassung angelegt.',\n createdBy: 'Bearbeitet von {person} am {date}',\n releasedBy: 'Freigegeben von {person} am {date}',\n revision: 'Revision {revision}',\n save: 'Entwurf speichern',\n saving: 'Speichert …',\n discard: 'Änderungen verwerfen',\n release: 'Freigeben (Vier-Augen-Prinzip)',\n fourEyesHint: 'Vier-Augen-Prinzip: Wer den Entwurf bearbeitet hat, kann ihn nicht freigeben.',\n saveFirst: 'Zuerst die Änderungen speichern.',\n newDraft: 'Neuen Entwurf anlegen',\n showDraft: 'Entwurf anzeigen',\n showReleased: 'Freigegebene Fassung anzeigen',\n history: 'Versionshistorie',\n hideHistory: 'Historie ausblenden',\n exportLabel: 'Ausgabe',\n exportPrint: 'Druckansicht (PDF)',\n exportMarkdown: 'Markdown',\n exportCsv: 'CSV',\n unsaved: 'Ungespeicherte Änderungen',\n saved: 'Entwurf gespeichert (Fassung {version}, Revision {revision}).',\n released: 'Fassung {version} freigegeben.',\n exported: 'Datei „{filename}“ erstellt.',\n colVersion: 'Fassung',\n colStatus: 'Status',\n colCreated: 'Bearbeitet',\n colReleased: 'Freigegeben',\n colActivities: 'Tätigkeiten',\n noHistory: 'Noch keine Fassung erfasst.',\n cover: 'Deckblatt (Art. 30 Abs. 1 lit. a DSGVO)',\n controller: 'Verantwortlicher',\n dpo: 'Datenschutzbeauftragte/r',\n departments: 'Referate / Abteilungen',\n departmentNew: 'Neues Referat',\n departmentAdd: 'Referat hinzufügen',\n departmentRemove: '{name} entfernen',\n withoutDepartment: 'Ohne Referat',\n activities: 'Verarbeitungstätigkeiten ({count})',\n search: 'Tätigkeiten durchsuchen',\n noMatches: 'Keine Tätigkeit passt zur Suche.',\n noActivities: 'Noch keine Verarbeitungstätigkeit erfasst.',\n addActivity: 'Verarbeitungstätigkeit hinzufügen',\n removeActivity: 'Tätigkeit entfernen',\n unnamed: 'Tätigkeit ohne Bezeichnung',\n selectActivity: 'Tätigkeit auswählen, um die Angaben nach Art. 30 DSGVO zu sehen.',\n complete: 'vollständig',\n missing: '{count} Pflichtangaben fehlen',\n missingOne: '1 Pflichtangabe fehlt',\n hints: '{count} Hinweise',\n hintOne: '1 Hinweis',\n requiredMark: 'Pflichtangabe',\n invalidCount: 'Bitte eine ganze Zahl ab 0 eingeben.',\n completenessTitle: 'Vollständigkeitsprüfung',\n completenessSummary: '{blocking} Pflichtangaben fehlen, {hints} Hinweise',\n completenessOk: 'Alle Pflichtangaben nach Art. 30 Abs. 1 DSGVO sind ausgefüllt.',\n blockingLabel: 'Pflicht',\n hintLabel: 'Hinweis',\n issuesExport: 'Hinweise der Vollständigkeitsprüfung',\n noIssues: 'Keine offenen Angaben.',\n field: 'Angabe',\n content: 'Inhalt',\n generated: 'Erstellt am',\n overview: 'Verarbeitungstätigkeiten und Stand der Folgenabschätzung',\n colActivity: 'Tätigkeit',\n colDepartment: 'Referat',\n colState: 'Stand',\n colResult: 'Ergebnis',\n colAction: 'Aktion',\n noDsfa: 'keine Abschätzung',\n reviewRequired: 'Überprüfung erforderlich',\n openAssessment: 'Öffnen',\n startAssessment: 'Abschätzung beginnen',\n noRegister: 'Die Folgenabschätzung setzt auf das Verzeichnis von Verarbeitungstätigkeiten auf; es ist noch keines angelegt.',\n stepScreening: '1. Schwellwertanalyse',\n stepRisk: '2. Risiko und Maßnahmen',\n stepResult: '3. Ergebnis und Freigabe',\n steps: 'Abschnitte der Folgenabschätzung',\n lockedNotice: 'Diese Fassung ist freigegeben und gesperrt. Änderungen erfordern eine Neubewertung.',\n reassess: 'Neubewertung beginnen',\n preview: 'Vorschau der Bibliothek, noch nicht gespeichert',\n screeningResult: 'Ergebnis der Schwellwertanalyse',\n outcome_pflicht: 'DSFA erforderlich',\n outcome_keine_pflicht: 'keine DSFA erforderlich',\n outcome_unvollstaendig: 'unvollständig',\n points: '{points} von 9 Kriterien bejaht (ab {threshold} erforderlich)',\n hardTriggers: '{count} Muss-Kriterien bejaht',\n openAnswers: '{count} Fragen offen',\n progress: '{answered} von {total} beantwortet, {yes} × ja',\n effect_hart: 'Muss-Kriterium',\n effect_punkt: 'Kriterium WP 248',\n effect_fria: 'Hochrisiko-KI',\n answer_ja: 'Ja',\n answer_nein: 'Nein',\n answer_unbekannt: 'Unbekannt',\n justification: 'Begründung',\n explanation: 'Erläuterung',\n scenarios: 'Risikoszenarien',\n addScenario: 'Szenario hinzufügen',\n removeScenario: 'Szenario {index} entfernen',\n scenario: 'Szenario {index}',\n noScenarios: 'Noch kein Risikoszenario erfasst.',\n dimension: 'Schutzziel',\n description: 'Beschreibung des Risikos',\n severity: 'Schwere vor Maßnahmen',\n likelihood: 'Eintrittswahrscheinlichkeit vor Maßnahmen',\n measures: 'Maßnahmen',\n residual: 'Restrisiko ausdrücklich setzen',\n residualSeverity: 'Schwere nach Maßnahmen',\n residualLikelihood: 'Wahrscheinlichkeit nach Maßnahmen',\n computed: 'berechnet',\n residualJustification: 'Begründung des Restwerts',\n scenarioResult: 'brutto {gross} ({grossBand}) → netto {net} ({netBand})',\n riskSummary: 'Höchstes Risiko: brutto {gross}, netto {net} – Stufe {band}',\n necessityTitle: 'Notwendigkeit und Verhältnismäßigkeit (Art. 35 Abs. 7 lit. b DSGVO)',\n necessity: 'Notwendigkeit',\n proportionality: 'Verhältnismäßigkeit',\n dossierTitle: 'Angaben zur Abschätzung',\n proposalTitle: 'Vorschlag des Systems',\n recommendation_unvollstaendig: 'unvollständig',\n consultation: 'Konsultation der Aufsichtsbehörde',\n issuesTitle: 'Offene Punkte',\n decisionTitle: 'Entscheidung',\n decision: 'Entscheidung',\n chooseDecision: 'Entscheidung wählen',\n deviationHint: 'Die Entscheidung weicht vom Vorschlag ab; eine Begründung ist Pflicht.',\n decisionJustification: 'Begründung der Entscheidung',\n conditions: 'Auflagen (eine je Zeile)',\n decide: 'Entscheidung speichern',\n decidedBy: 'Entschieden von {person} am {date}: {decision}',\n dpoTitle: 'Beteiligung der oder des Datenschutzbeauftragten (Art. 35 Abs. 2 DSGVO)',\n dpoFrom: 'Eingeholt bei',\n dpoOn: 'Datum der Anfrage',\n dpoRecord: 'Einholung dokumentieren',\n dpoRecorded: 'Stellungnahme eingeholt bei {person} am {date}',\n releaseTitle: 'Freigabe',\n releaseOpenPoints: 'Mit der Freigabe dokumentierte offene Punkte',\n releaseInfo: 'Die offenen Punkte verhindern die Freigabe nicht; sie werden mit ihr gespeichert.',\n releaseBlockers: 'Die Freigabe ist noch nicht möglich:',\n assessmentSaved: 'Folgenabschätzung gespeichert (Revision {revision}).',\n assessmentReleased: 'Folgenabschätzung Fassung {version} freigegeben.',\n decisionSaved: 'Entscheidung gespeichert.',\n dpoSaved: 'Einholung der Stellungnahme dokumentiert.',\n versions: 'Fassungen dieser Tätigkeit',\n reportHtml: 'Bericht (Druckansicht)',\n reportMarkdown: 'Bericht (Markdown)',\n colDecision: 'Entscheidung',\n },\n en: {\n vvtTitle: 'Record of processing activities',\n vvtNorm: 'Art. 30 GDPR',\n dsfaTitle: 'Data protection impact assessment',\n dsfaNorm: 'Art. 35 GDPR',\n profile: 'Rule profile {id} {version}',\n loading: 'Loading …',\n yes: 'yes',\n no: 'no',\n open: 'not specified',\n save: 'Save draft',\n release: 'Release (four-eyes principle)',\n newDraft: 'Create new draft',\n history: 'Version history',\n cover: 'Cover sheet (Art. 30(1)(a) GDPR)',\n controller: 'Controller',\n dpo: 'Data protection officer',\n search: 'Search activities',\n addActivity: 'Add processing activity',\n stepScreening: '1. Threshold analysis',\n stepRisk: '2. Risk and measures',\n stepResult: '3. Result and release',\n answer_ja: 'Yes',\n answer_nein: 'No',\n answer_unbekannt: 'Unknown',\n },\n})\n\nexport type DataProtectionKey = keyof typeof dataprotectionMessages.de\nexport type DataProtectionTranslate = Translate<DataProtectionKey>\n","import { requestFile, requestJson, type RestOptions } from '@auditcore/common'\nimport type { DataProtectionPort } from './types'\n\nconst segment = encodeURIComponent\n\n/** Port auf den REST-Vertrag `dataprotection_ui/1` von `auditcore_dataprotection.web`. */\nexport function createDataProtectionRestPort(options: RestOptions): DataProtectionPort {\n const one = (id: string, action = ''): string => `/assessments/${segment(id)}${action}`\n return {\n profile: () => requestJson(options, '/profile'),\n register: () => requestJson(options, '/register'),\n checkRegister: (content) => requestJson(options, '/register/check', { content }),\n saveDraft: (content, expectedRevision) =>\n requestJson(options, '/register/draft', { content, expected_revision: expectedRevision }),\n releaseRegister: (expectedRevision) => requestJson(options, '/register/release', { expected_revision: expectedRevision }),\n exportRegister: (format, source) =>\n requestFile(options, '/register/export', { format, source }, `verarbeitungsverzeichnis.${format === 'markdown' ? 'md' : format}`),\n overview: () => requestJson(options, '/assessments'),\n startAssessment: (activityId) => requestJson(options, '/assessments', { activity_id: activityId }),\n assessment: (id) => requestJson(options, one(id)),\n calculate: (answers, scenarios) => requestJson(options, '/calculate', { answers, scenarios }),\n updateAssessment: (id, expectedRevision, survey) => requestJson(options, one(id), { expected_revision: expectedRevision, ...survey }),\n decide: (id, expectedRevision, decision) => requestJson(options, one(id, '/decide'), { expected_revision: expectedRevision, ...decision }),\n requestDpo: (id, expectedRevision, requestedFrom, requestedOn) =>\n requestJson(options, one(id, '/dpo-request'), {\n expected_revision: expectedRevision,\n requested_from: requestedFrom,\n requested_on: requestedOn,\n }),\n releaseAssessment: (id, expectedRevision) => requestJson(options, one(id, '/release'), { expected_revision: expectedRevision }),\n reassess: (id) => requestJson(options, one(id, '/reassess'), {}),\n exportAssessment: (id, format) => requestFile(options, one(id, '/export'), { format }, `dsfa.${format === 'markdown' ? 'md' : 'html'}`),\n }\n}\n","// Vertrag `dataprotection_ui/1` von `auditcore_dataprotection.web` (docs/ui/dataprotection-rest.md).\n// Feldnamen wie im JSON des Servers; Inhalte des Verzeichnisses mit den Feldnamen der Bibliothek.\n\nexport const CONTRACT = 'dataprotection_ui/1'\n\nexport type FieldKind = 'text' | 'flag' | 'count'\nexport type FieldValue = string | boolean | number | null\n\nexport interface RegisterColumn {\n key: string\n title: string\n reference: string\n kind: FieldKind\n required: boolean\n}\n\nexport interface QuestionView {\n key: string\n text: string\n reference: string\n /** `hart` = Muss-Kriterium, `punkt` = Kriterium WP 248, `fria` = Hochrisiko-KI. */\n effect: string\n explanation: string\n}\n\nexport interface BlockView {\n key: string\n title: string\n questions: QuestionView[]\n}\n\nexport interface LevelView {\n value: number\n label: string\n}\n\nexport interface MeasureView {\n key: string\n title: string\n category: string\n reduces_severity: number\n reduces_likelihood: number\n}\n\nexport interface KeyTitle {\n key: string\n title: string\n}\n\nexport interface DossierFieldView extends KeyTitle {\n kind: 'text' | 'date' | 'choice'\n required: boolean\n choices: KeyTitle[]\n}\n\nexport interface DataProtectionProfile {\n contract: string\n profile: { id: string; version: string; fingerprint: string; regime: string; regime_title: string; release_mode: string }\n register: { columns: RegisterColumn[] }\n screening: { blocks: BlockView[]; points_threshold: number }\n risk: {\n scale_min: number\n scale_max: number\n severity_levels: LevelView[]\n likelihood_levels: LevelView[]\n dimensions: KeyTitle[]\n measures: MeasureView[]\n bands: string[]\n method: string\n }\n decisions: KeyTitle[]\n dossier_fields: DossierFieldView[]\n}\n\n/** Hinweis der Vollständigkeitsprüfung; `subject` = `<Tätigkeits-ID>:<Feld>` oder `deckblatt:<Teil>`. */\nexport interface Issue {\n code: string\n message: string\n blocking: boolean\n subject: string\n}\n\nexport type Activity = Record<string, FieldValue> & { id?: string }\n\nexport interface Person {\n name?: string\n [field: string]: string | undefined\n}\n\nexport interface RegisterContent {\n deckblatt: { verantwortlicher?: Person; dsb?: Person; [part: string]: Person | undefined }\n referate: string[]\n taetigkeiten: Activity[]\n}\n\nexport type RegisterStatus = 'entwurf' | 'freigegeben' | 'abgeloest'\n\nexport interface VersionSummary {\n version: number\n status: RegisterStatus\n created_by: string\n created_at: string\n released_by: string | null\n released_at: string | null\n activities: number\n}\n\nexport interface VersionView extends VersionSummary {\n revision: number\n locked: boolean\n content: RegisterContent\n content_hash: string\n editors: string[]\n predecessor_version: number | null\n issues: Issue[]\n}\n\nexport interface RegisterState {\n contract: string\n draft: VersionView | null\n released: VersionView | null\n versions: VersionSummary[]\n}\n\nexport interface OverviewRow {\n id: string\n position: number\n name: string\n referat: string\n zweck: string\n vvt_version: number\n vvt_status: RegisterStatus\n dsfa: null | {\n id: string\n version: number\n status: AssessmentStatus\n entscheidung: string | null\n freigegeben_am: string | null\n pruefung_erforderlich: boolean\n }\n}\n\nexport type AnswerValue = 'ja' | 'nein' | 'unbekannt'\nexport type AssessmentStatus = 'entwurf' | 'dsb_beteiligung' | 'freigegeben' | 'abgeloest'\n\nexport interface AnswerInput {\n value: AnswerValue\n justification: string\n}\n\nexport interface ScenarioInput {\n dimension: string\n description: string\n severity: number\n likelihood: number\n measures: string[]\n residual_severity: number | null\n residual_likelihood: number | null\n residual_justification: string\n}\n\nexport interface ScenarioResult {\n index: number\n dimension_title: string\n description: string\n gross: number\n gross_band: string\n net: number\n net_band: string\n net_severity: number\n net_likelihood: number\n measure_titles: string[]\n explicit_residual: string[]\n}\n\nexport interface Proposal {\n profile: { id: string; version: string; fingerprint: string }\n recommendation: string\n recommendation_text: string\n reasoning: string\n consultation_required: boolean\n consultation_notice?: { status: string; text: string; final: boolean }\n issues: Issue[]\n screening: {\n outcome: 'pflicht' | 'keine_pflicht' | 'unvollstaendig'\n points: number\n points_threshold: number\n hard_triggers: string[]\n point_criteria: string[]\n fria_required: boolean | null\n unanswered: string[]\n unknown: string[]\n complete: boolean\n reasoning: string\n }\n risk: null | {\n gross_maximum: number\n net_maximum: number\n net_band: string\n gross_band?: string\n scenarios: ScenarioResult[]\n }\n}\n\nexport interface AssessmentSummary {\n id: string\n version: number\n status: AssessmentStatus\n decision: string | null\n created_at: string\n released_by: string | null\n released_at: string | null\n}\n\nexport interface AssessmentView extends AssessmentSummary {\n contract: string\n activity_id: string\n activity_name: string\n revision: number\n locked: boolean\n register_version: number\n profile: { id: string; version: string }\n answers: Record<string, AnswerInput>\n scenarios: ScenarioInput[]\n necessity: string\n proportionality: string\n dossier: Record<string, string>\n proposal: Proposal\n created_by: string\n updated_at: string\n editors: string[]\n deviation: boolean\n deviation_justification: string | null\n conditions: string[]\n decided_by: string | null\n decided_at: string | null\n dpo_requested_from: string | null\n dpo_requested_on: string | null\n release_open_points: string[]\n open_points: string[]\n release_blockers: string[]\n versions: AssessmentSummary[]\n}\n\n/** Erhebung einer Folgenabschätzung, wie sie `POST /assessments/{id}` erwartet. */\nexport interface SurveyInput {\n answers: Record<string, AnswerInput>\n scenarios: ScenarioInput[]\n necessity: string\n proportionality: string\n /** Nur Profile nach Schema 2 (EDSA-Vorlage); sonst weglassen. */\n dossier?: Record<string, string>\n}\n\nexport interface DecisionInput {\n decision: string\n justification: string\n conditions: string[]\n}\n\nexport type RegisterExportFormat = 'html' | 'markdown' | 'csv'\nexport type AssessmentExportFormat = 'html' | 'markdown'\n\nexport interface ExportedFile {\n blob: Blob\n filename: string\n mediaType: string\n}\n\n/**\n * Datenzugang der Komponenten. Die mitgelieferte Umsetzung ist\n * `createDataProtectionRestPort`; Anwendungen können eigene Ports übergeben.\n */\nexport interface DataProtectionPort {\n profile: () => Promise<DataProtectionProfile>\n register: () => Promise<RegisterState>\n checkRegister: (content: RegisterContent) => Promise<{ issues: Issue[] }>\n saveDraft: (content: RegisterContent, expectedRevision: number | null) => Promise<VersionView>\n releaseRegister: (expectedRevision: number) => Promise<VersionView>\n exportRegister: (format: RegisterExportFormat, source: 'draft' | 'released') => Promise<ExportedFile>\n overview: () => Promise<{ items: OverviewRow[] }>\n startAssessment: (activityId: string) => Promise<AssessmentView>\n assessment: (id: string) => Promise<AssessmentView>\n calculate: (answers: Record<string, AnswerInput>, scenarios: ScenarioInput[]) => Promise<Proposal>\n updateAssessment: (id: string, expectedRevision: number, survey: SurveyInput) => Promise<AssessmentView>\n decide: (id: string, expectedRevision: number, decision: DecisionInput) => Promise<AssessmentView>\n requestDpo: (id: string, expectedRevision: number, requestedFrom: string, requestedOn: string) => Promise<AssessmentView>\n releaseAssessment: (id: string, expectedRevision: number) => Promise<AssessmentView>\n reassess: (id: string) => Promise<AssessmentView>\n exportAssessment: (id: string, format: AssessmentExportFormat) => Promise<ExportedFile>\n}\n","import { RestError } from '@auditcore/common'\nimport { dataprotectionMessages, type DataProtectionKey, type DataProtectionTranslate } from './messages'\n\n/** Fehler einer Portanfrage: Code und Meldung des Servers bzw. `network_error` mit Status 0. */\nexport interface DataProtectionError {\n code: string\n message: string\n status: number\n}\n\nexport interface RequestHooks {\n onError?: (error: DataProtectionError) => void\n /** Meldung für Fehler ohne Serverantwort (Netz, Programmfehler). */\n networkMessage?: (message: string) => string\n}\n\nexport function asError(error: unknown, hooks: RequestHooks): DataProtectionError {\n if (error instanceof RestError) return { code: error.code, message: error.message, status: error.status }\n const raw = error instanceof Error ? error.message : String(error)\n return { code: 'network_error', message: hooks.networkMessage?.(raw) ?? raw, status: 0 }\n}\n\n/** Übersetzter Status (`entwurf`, `freigegeben`, …); unbekannte Werte bleiben stehen. */\nexport function statusLabel(t: DataProtectionTranslate, status: string): string {\n const key = `status_${status}`\n return key in dataprotectionMessages.de ? t(key as DataProtectionKey) : status\n}\n\nexport function prefixedLabel(t: DataProtectionTranslate, prefix: string, value: string, fallback = value): string {\n const key = `${prefix}_${value}`\n return key in dataprotectionMessages.de ? t(key as DataProtectionKey) : fallback\n}\n","// View-Logik des Verzeichnisses von Verarbeitungstätigkeiten, ohne Vue und ohne DOM.\n// Die Vollständigkeitsprüfung selbst rechnet die Bibliothek (Hinweise `Issue`);\n// hier werden die Hinweise nur Tätigkeiten und Feldern zugeordnet.\n\nimport type { BadgeTone } from '../base/types'\nimport type { Activity, RegisterColumn, FieldValue, Issue, Person, RegisterContent, RegisterState, VersionView } from './types'\n\nexport const NO_DEPARTMENT = ''\n\nexport interface ActivityGroup {\n department: string\n items: { index: number; activity: Activity }[]\n}\n\nexport interface Completeness {\n blocking: number\n hints: number\n}\n\n/** Tätigkeit ohne Kennung (die vergibt der Server beim Speichern). */\nexport function emptyActivity(columns: readonly RegisterColumn[], department: string): Activity {\n const activity: Activity = {}\n for (const column of columns) activity[column.key] = column.kind === 'text' ? '' : null\n activity.referat = department\n return activity\n}\n\nexport function emptyContent(): RegisterContent {\n return { deckblatt: { verantwortlicher: { name: '' }, dsb: { name: '' } }, referate: [], taetigkeiten: [] }\n}\n\n/** Tiefe Kopie (JSON-Daten), damit Eingaben den gelesenen Stand nie verändern. */\nexport function cloneContent(content: RegisterContent): RegisterContent {\n return JSON.parse(JSON.stringify(content)) as RegisterContent\n}\n\n/** Referate wie in der Quelle: konfigurierte zuerst, dann unbekannte; leere entfallen. */\nexport function groupByDepartment(content: RegisterContent, query = ''): ActivityGroup[] {\n const needle = query.trim().toLocaleLowerCase('de')\n const rows = content.taetigkeiten\n .map((activity, index) => ({ index, activity }))\n .filter(({ activity }) => !needle || activityText(activity).includes(needle))\n const named = (activity: Activity): string => (typeof activity.referat === 'string' ? activity.referat.trim() : '')\n const known = content.referate.filter((department) => rows.some(({ activity }) => named(activity) === department))\n const unknown = [...new Set(rows.map(({ activity }) => named(activity)))]\n .filter((department) => !known.includes(department))\n .sort((a, b) => a.localeCompare(b, 'de'))\n return [...known, ...unknown].map((department) => ({\n department,\n items: rows.filter(({ activity }) => named(activity) === department),\n }))\n}\n\nfunction activityText(activity: Activity): string {\n return Object.values(activity)\n .filter((value): value is string => typeof value === 'string')\n .join(' ')\n .toLocaleLowerCase('de')\n}\n\nfunction split(subject: string): [string, string] {\n const at = subject.lastIndexOf(':')\n return at < 0 ? [subject, ''] : [subject.slice(0, at), subject.slice(at + 1)]\n}\n\n/** Schlüssel einer Tätigkeit für die Zuordnung der Hinweise (Kennung, sonst Name wie in der Bibliothek). */\nexport function activityKey(activity: Activity): string {\n return String(activity.id || activity.name || '')\n}\n\nexport function issuesFor(issues: readonly Issue[], activity: Activity): Issue[] {\n const key = activityKey(activity)\n return issues.filter((issue) => split(issue.subject)[0] === key)\n}\n\nexport function fieldIssues(issues: readonly Issue[], activity: Activity, field: string): Issue[] {\n const key = activityKey(activity)\n return issues.filter((issue) => {\n const [subject, name] = split(issue.subject)\n return subject === key && name === field\n })\n}\n\n/** Hinweise zum Deckblatt (Verantwortlicher, DSB). */\nexport function coverIssues(issues: readonly Issue[]): Issue[] {\n return issues.filter((issue) => split(issue.subject)[0] === 'deckblatt')\n}\n\nexport function completeness(issues: readonly Issue[]): Completeness {\n const blocking = issues.filter((issue) => issue.blocking).length\n return { blocking, hints: issues.length - blocking }\n}\n\nexport function completenessTone(value: Completeness): BadgeTone {\n if (value.blocking > 0) return 'danger'\n return value.hints > 0 ? 'warning' : 'success'\n}\n\nexport function statusTone(status: string): BadgeTone {\n if (status === 'freigegeben') return 'success'\n if (status === 'entwurf' || status === 'dsb_beteiligung') return 'warning'\n return 'neutral'\n}\n\n/** Angezeigte Fassung: offener Entwurf vor Freigabe (dort wird gearbeitet). */\nexport function currentVersion(state: RegisterState | null, prefer: 'draft' | 'released' = 'draft'): VersionView | null {\n if (!state) return null\n return prefer === 'released' ? state.released ?? state.draft : state.draft ?? state.released\n}\n\nexport function withField(content: RegisterContent, index: number, key: string, value: FieldValue): RegisterContent {\n const next = cloneContent(content)\n const activity = next.taetigkeiten[index]\n if (activity) activity[key] = value\n return next\n}\n\nexport function withActivity(content: RegisterContent, activity: Activity): RegisterContent {\n const next = cloneContent(content)\n next.taetigkeiten.push(activity)\n return next\n}\n\nexport function withoutActivity(content: RegisterContent, index: number): RegisterContent {\n const next = cloneContent(content)\n next.taetigkeiten.splice(index, 1)\n return next\n}\n\nexport function withPerson(content: RegisterContent, part: 'verantwortlicher' | 'dsb', person: Person): RegisterContent {\n const next = cloneContent(content)\n next.deckblatt[part] = { ...next.deckblatt[part], ...person }\n return next\n}\n\nexport function withDepartments(content: RegisterContent, departments: readonly string[]): RegisterContent {\n const next = cloneContent(content)\n next.referate = [...new Set(departments.map((d) => d.trim()).filter(Boolean))]\n return next\n}\n\n/** Anzeigewert eines Feldes; Wahrheitswerte und Leerwerte über die Texte der Komponente. */\nexport function displayValue(value: FieldValue | undefined, texts: { yes: string; no: string; empty: string }): string {\n if (value === true) return texts.yes\n if (value === false) return texts.no\n if (value === null || value === undefined || value === '') return texts.empty\n return String(value)\n}\n\n/** Eingabe eines Zahlfeldes: leer → null, sonst nichtnegative ganze Zahl; ungültig → undefined. */\nexport function parseCount(text: string): number | null | undefined {\n const trimmed = text.trim()\n if (!trimmed) return null\n if (!/^\\d+$/.test(trimmed)) return undefined\n return Number(trimmed)\n}\n\n/** Vier-Augen-Prinzip vorab anzeigen: wer den Entwurf bearbeitet hat, kann ihn nicht freigeben. */\nexport function editedBy(version: VersionView | null, actor: string): boolean {\n return !!actor && !!version && version.editors.includes(actor)\n}\n","// View-Logik der Datenschutz-Folgenabschätzung, ohne Vue und ohne DOM.\n// Schwellwertanalyse, Brutto-/Nettorisiko und Vorschlag rechnet ausschließlich\n// die Bibliothek (Port `calculate` bzw. gespeicherter Vorschlag); hier werden\n// nur Eingaben verwaltet und Ergebnisse für die Anzeige eingeordnet.\n\nimport type { BadgeTone } from '../base/types'\nimport type {\n AnswerInput,\n AnswerValue,\n AssessmentView,\n BlockView,\n LevelView,\n DataProtectionProfile,\n Proposal,\n ScenarioInput,\n SurveyInput,\n} from './types'\n\nexport const ANSWER_VALUES: readonly AnswerValue[] = ['ja', 'nein', 'unbekannt']\n\nexport interface TabItem {\n key: string\n label: string\n}\n\nexport interface BlockProgress {\n answered: number\n total: number\n yes: number\n}\n\nfunction residualFrom(raw: Partial<ScenarioInput>): Pick<ScenarioInput, 'residual_severity' | 'residual_likelihood' | 'residual_justification'> {\n return {\n residual_severity: raw.residual_severity ?? null,\n residual_likelihood: raw.residual_likelihood ?? null,\n residual_justification: raw.residual_justification ?? '',\n }\n}\n\nfunction scenarioFrom(raw: Partial<ScenarioInput>, profile: DataProtectionProfile): ScenarioInput {\n const middle = Math.ceil((profile.risk.scale_min + profile.risk.scale_max) / 2)\n return {\n dimension: raw.dimension ?? profile.risk.dimensions[0]?.key ?? '',\n description: raw.description ?? '',\n severity: raw.severity ?? middle,\n likelihood: raw.likelihood ?? middle,\n measures: [...(raw.measures ?? [])],\n ...residualFrom(raw),\n }\n}\n\nexport function emptyScenario(profile: DataProtectionProfile): ScenarioInput {\n return scenarioFrom({}, profile)\n}\n\n/** Bearbeitbare Kopie der gespeicherten Erhebung. */\nexport function surveyFrom(view: AssessmentView, profile: DataProtectionProfile): SurveyInput {\n const answers: Record<string, AnswerInput> = {}\n for (const [key, answer] of Object.entries(view.answers)) answers[key] = { value: answer.value, justification: answer.justification ?? '' }\n return {\n answers,\n scenarios: view.scenarios.map((scenario) => scenarioFrom(scenario, profile)),\n necessity: view.necessity,\n proportionality: view.proportionality,\n dossier: { ...view.dossier },\n }\n}\n\nexport function sameSurvey(a: SurveyInput | null, b: SurveyInput | null): boolean {\n return JSON.stringify(a) === JSON.stringify(b)\n}\n\nexport function answerOf(survey: SurveyInput, key: string): AnswerValue | null {\n return survey.answers[key]?.value ?? null\n}\n\nexport function withAnswer(survey: SurveyInput, key: string, value: AnswerValue): SurveyInput {\n const previous = survey.answers[key]\n return { ...survey, answers: { ...survey.answers, [key]: { value, justification: previous?.justification ?? '' } } }\n}\n\nexport function withJustification(survey: SurveyInput, key: string, justification: string): SurveyInput {\n const previous = survey.answers[key] ?? { value: 'unbekannt' as AnswerValue, justification: '' }\n return { ...survey, answers: { ...survey.answers, [key]: { ...previous, justification } } }\n}\n\nexport function blockProgress(block: BlockView, survey: SurveyInput): BlockProgress {\n const values = block.questions.map((question) => answerOf(survey, question.key))\n return {\n answered: values.filter((value) => value === 'ja' || value === 'nein').length,\n total: values.length,\n yes: values.filter((value) => value === 'ja').length,\n }\n}\n\nexport function withScenario(survey: SurveyInput, index: number, scenario: ScenarioInput): SurveyInput {\n const scenarios = survey.scenarios.slice()\n scenarios[index] = scenario\n return { ...survey, scenarios }\n}\n\nexport function addScenario(survey: SurveyInput, profile: DataProtectionProfile): SurveyInput {\n return { ...survey, scenarios: [...survey.scenarios, emptyScenario(profile)] }\n}\n\nexport function removeScenario(survey: SurveyInput, index: number): SurveyInput {\n return { ...survey, scenarios: survey.scenarios.filter((_, position) => position !== index) }\n}\n\nexport function toggleMeasure(scenario: ScenarioInput, measure: string): ScenarioInput {\n const measures = scenario.measures.includes(measure)\n ? scenario.measures.filter((key) => key !== measure)\n : [...scenario.measures, measure]\n return { ...scenario, measures }\n}\n\nexport function levelLabel(levels: readonly LevelView[], value: number | null): string {\n if (value === null) return ''\n return levels.find((level) => level.value === value)?.label ?? String(value)\n}\n\n/** Stufe eines Risikos nach Rang im Profil: höchste Stufe rot, zweithöchste gelb. */\nexport function bandTone(band: string | undefined, bands: readonly string[]): BadgeTone {\n const rank = band ? bands.indexOf(band) : -1\n if (rank <= 0) return 'neutral'\n if (rank === bands.length - 1) return 'danger'\n return rank === bands.length - 2 ? 'warning' : 'success'\n}\n\nconst RECOMMENDATION_TONES: Readonly<Record<string, BadgeTone>> = {\n freigabe: 'success',\n freigabe_mit_auflagen: 'warning',\n konsultation_aufsichtsbehoerde: 'danger',\n verworfen: 'danger',\n nur_schwellwert: 'accent',\n}\n\nexport function recommendationTone(recommendation: string | null | undefined): BadgeTone {\n return (recommendation && RECOMMENDATION_TONES[recommendation]) || 'neutral'\n}\n\nexport function screeningTone(outcome: Proposal['screening']['outcome']): BadgeTone {\n if (outcome === 'pflicht') return 'warning'\n return outcome === 'keine_pflicht' ? 'success' : 'neutral'\n}\n\nexport function decisionTitle(profile: DataProtectionProfile, key: string | null | undefined): string {\n if (!key) return ''\n return profile.decisions.find((decision) => decision.key === key)?.title ?? key\n}\n\n/** Abweichung vom Vorschlag verlangt eine Begründung (Bibliothek prüft Mindestlänge). */\nexport function isDeviation(proposal: Proposal, decision: string): boolean {\n return !!decision && proposal.recommendation !== 'unvollstaendig' && decision !== proposal.recommendation\n}\n\n/** Auflagen: eine je Zeile, leere Zeilen entfallen. */\nexport function parseConditions(text: string): string[] {\n return text.split('\\n').map((line) => line.trim()).filter(Boolean)\n}\n\n/** Vier-Augen-Prinzip vorab anzeigen; maßgeblich bleibt die Prüfung des Servers. */\nexport function mayRelease(view: AssessmentView, actor: string): boolean {\n return !view.locked && !(actor && view.editors.includes(actor))\n}\n\n/** Eingabefelder der Entscheidung, vorbelegt aus der Fassung bzw. dem Vorschlag. */\nexport interface DecisionForm {\n decision: string\n justification: string\n conditions: string\n}\n\nexport function decisionForm(view: AssessmentView, proposal: Proposal): DecisionForm {\n return {\n decision: view.decision ?? (proposal.recommendation === 'unvollstaendig' ? '' : proposal.recommendation),\n justification: view.deviation_justification ?? '',\n conditions: view.conditions.join('\\n'),\n }\n}\n\n/** Freigabe möglich: Vier-Augen-Vorprüfung, keine ungespeicherten Eingaben, keine Sperrgründe. */\nexport function canReleaseAssessment(view: AssessmentView, actor: string, dirty: boolean): boolean {\n return mayRelease(view, actor) && !dirty && !view.release_blockers.length\n}\n","/**\n * Exporte des Verzeichnisses aus dem angezeigten Stand, ohne Vue: CSV mit\n * Formelschutz (`toCsv` aus @auditcore/common, Verträge `csv-cell`/`csv-document`),\n * Markdown und eigenständiges HTML als Druckansicht („Als PDF speichern“).\n */\nimport { escapeHtml, toCsv } from '@auditcore/common'\nimport { escapeMarkdown, exportFilename } from '../synopsis/exporters'\nimport { displayValue, groupByDepartment } from './registerView'\nimport type { RegisterColumn, FieldValue, Issue, RegisterContent } from './types'\n\nexport interface ExportTexts {\n yes: string\n no: string\n empty: string\n title: string\n department: string\n withoutDepartment: string\n controller: string\n dpo: string\n version: string\n issues: string\n noIssues: string\n required: string\n hint: string\n field: string\n content: string\n generated: string\n}\n\nexport interface RegisterExportInput {\n content: RegisterContent\n columns: readonly RegisterColumn[]\n issues: readonly Issue[]\n /** Zeile unter dem Titel, z. B. „Fassung 2 – Entwurf“. */\n versionLabel: string\n texts: ExportTexts\n lang?: string\n generatedAt?: string\n}\n\nfunction cell(value: FieldValue | undefined, texts: ExportTexts): string {\n return displayValue(value, texts)\n}\n\nexport function registerCsv(input: RegisterExportInput): string {\n const { content, columns, texts } = input\n const keys = ['referat', ...columns.map((column) => column.key).filter((key) => key !== 'referat')]\n const titles = keys.map((key) => columns.find((column) => column.key === key)?.title ?? texts.department)\n const rows = content.taetigkeiten.map((activity) => keys.map((key) => {\n const value = activity[key]\n return typeof value === 'boolean' ? (value ? texts.yes : texts.no) : value\n }))\n return toCsv([titles, ...rows])\n}\n\nfunction issueLine(issue: Issue, texts: ExportTexts): string {\n return `${issue.blocking ? texts.required : texts.hint}: ${issue.message}`\n}\n\nexport function registerMarkdown(input: RegisterExportInput): string {\n const { content, columns, issues, texts } = input\n const md = (value: string): string => escapeMarkdown(value.replace(/\\s+/g, ' ').trim())\n const lines = [`# ${texts.title}`, '', md(input.versionLabel), '']\n lines.push(`- ${texts.controller}: ${md(content.deckblatt.verantwortlicher?.name || texts.empty)}`)\n lines.push(`- ${texts.dpo}: ${md(content.deckblatt.dsb?.name || texts.empty)}`)\n for (const group of groupByDepartment(content)) {\n lines.push('', `## ${md(group.department || texts.withoutDepartment)}`)\n for (const { activity } of group.items) {\n lines.push('', `### ${md(cell(activity.name, texts))}`, '', `| ${texts.field} | ${texts.content} |`, '|---|---|')\n for (const column of columns) lines.push(`| ${md(column.title)} | ${md(cell(activity[column.key], texts))} |`)\n }\n }\n lines.push('', `## ${texts.issues}`, '')\n lines.push(...(issues.length ? issues.map((issue) => `- ${md(issueLine(issue, texts))}`) : [`- ${texts.noIssues}`]))\n return lines.join('\\n') + '\\n'\n}\n\nconst PRINT_CSS = `body{font:11pt/1.4 system-ui,sans-serif;color:#111;margin:2rem}\nh1{font-size:16pt}h2{font-size:13pt;margin-top:1.5rem}h3{font-size:11pt;margin:1rem 0 .25rem}\ntable{border-collapse:collapse;width:100%;margin-bottom:.75rem}th,td{border:1px solid #999;padding:.25rem .4rem;text-align:left;vertical-align:top}\nth{width:32%;background:#f0f0f0}.issues li.required{color:#8a1c12}footer{margin-top:2rem;font-size:9pt;color:#555}\n@media print{h3{break-after:avoid}table{break-inside:auto}tr{break-inside:avoid}}`\n\nconst escape = (value: string): string => escapeHtml(value)\n\nfunction coverHtml(input: RegisterExportInput): string[] {\n const { content, texts } = input\n return [\n `<h1>${escape(texts.title)}</h1>`, `<p>${escape(input.versionLabel)}</p>`, '<table>',\n `<tr><th scope=\"row\">${escape(texts.controller)}</th><td>${escape(content.deckblatt.verantwortlicher?.name || texts.empty)}</td></tr>`,\n `<tr><th scope=\"row\">${escape(texts.dpo)}</th><td>${escape(content.deckblatt.dsb?.name || texts.empty)}</td></tr></table>`,\n ]\n}\n\nfunction activitiesHtml(input: RegisterExportInput): string[] {\n const { content, columns, texts } = input\n const parts: string[] = []\n for (const group of groupByDepartment(content)) {\n parts.push(`<h2>${escape(group.department || texts.withoutDepartment)}</h2>`)\n for (const { activity } of group.items) {\n parts.push(`<h3>${escape(cell(activity.name, texts))}</h3><table>`)\n for (const column of columns) {\n parts.push(`<tr><th scope=\"row\">${escape(column.title)}</th><td>${escape(cell(activity[column.key], texts))}</td></tr>`)\n }\n parts.push('</table>')\n }\n }\n return parts\n}\n\nfunction issuesHtml({ issues, texts }: RegisterExportInput): string[] {\n const items = issues.length\n ? issues.map((issue) => `<li class=\"${issue.blocking ? 'required' : 'hint'}\">${escape(issueLine(issue, texts))}</li>`)\n : [`<li>${escape(texts.noIssues)}</li>`]\n return [`<h2>${escape(texts.issues)}</h2><ul class=\"issues\">`, ...items, '</ul>']\n}\n\nexport function registerHtml(input: RegisterExportInput): string {\n const { texts } = input\n const parts = [...coverHtml(input), ...activitiesHtml(input), ...issuesHtml(input)]\n if (input.generatedAt) parts.push(`<footer>${escape(texts.generated)} ${escape(input.generatedAt)}</footer>`)\n return `<!DOCTYPE html><html lang=\"${escape(input.lang ?? 'de')}\"><head><meta charset=\"utf-8\"><title>${escape(texts.title)}</title>` +\n `<style>${PRINT_CSS}</style></head><body>${parts.join('')}</body></html>`\n}\n\nexport function registerFilename(version: number | null, extension: string): string {\n return exportFilename(`Verarbeitungsverzeichnis${version ? `_Fassung_${version}` : ''}`, extension)\n}\n","// Zustandsautomat von <flowaudit-vvt> (Vue und React): Laden, Bearbeiten,\n// Vollständigkeitsprüfung, Speichern, Freigeben, Export.\n\nimport { createDelay, createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport { registerCsv, registerFilename, registerHtml, registerMarkdown, type ExportTexts } from './exporters'\nimport type { DataProtectionTranslate } from './messages'\nimport {\n cloneContent,\n currentVersion,\n editedBy,\n emptyActivity,\n emptyContent,\n withActivity,\n withDepartments,\n withField,\n withoutActivity,\n withPerson,\n} from './registerView'\nimport { asError, statusLabel, type DataProtectionError, type RequestHooks } from './requests'\nimport type { DataProtectionPort, DataProtectionProfile, FieldValue, Issue, Person, RegisterContent, RegisterState, VersionView } from './types'\n\nexport type VvtExportFormat = 'print' | 'markdown' | 'csv'\n\nexport interface VvtExport {\n format: VvtExportFormat\n filename: string\n mimeType: string\n content: string\n}\n\nexport interface VvtHooks extends RequestHooks {\n onSaved?: (version: VersionView) => void\n onReleased?: (version: VersionView) => void\n /** Wartezeit der Vollständigkeitsprüfung nach einer Eingabe (ms). */\n checkDelay?: number\n}\n\nexport interface VvtData extends RequestState<DataProtectionError> {\n profile: DataProtectionProfile | null\n register: RegisterState | null\n showing: 'draft' | 'released'\n working: RegisterContent | null\n checked: Issue[] | null\n /** Ausgewählte Tätigkeit (Index in `content.taetigkeiten`). */\n selected: number | null\n history: boolean\n}\n\n/** Abgeleitete Werte eines Stands (reine Funktion, von beiden Oberflächen genutzt). */\nexport interface VvtView {\n version: VersionView | null\n editing: boolean\n content: RegisterContent\n dirty: boolean\n issues: Issue[]\n}\n\nfunction editingOf(state: VvtData): boolean {\n return state.working !== null && state.showing === 'draft'\n}\n\n/** Inhalt als Grundlage des Bearbeitens: offener Entwurf, sonst freigegebene Fassung. */\nfunction editBase(register: RegisterState | null): RegisterContent {\n return register?.draft?.content ?? register?.released?.content ?? emptyContent()\n}\n\nfunction shownContent(state: VvtData, version: VersionView | null, editing: boolean): RegisterContent {\n if (editing && state.working) return state.working\n return version?.content ?? emptyContent()\n}\n\nfunction shownIssues(state: VvtData, version: VersionView | null, editing: boolean): Issue[] {\n if (editing && state.checked) return state.checked\n return version?.issues ?? []\n}\n\nexport function vvtView(state: VvtData): VvtView {\n const version = currentVersion(state.register, state.showing)\n const editing = editingOf(state)\n const dirty = state.working !== null && JSON.stringify(state.working) !== JSON.stringify(editBase(state.register))\n return { version, editing, content: shownContent(state, version, editing), dirty, issues: shownIssues(state, version, editing) }\n}\n\n/** Vier-Augen-Hinweis: die angemeldete Person hat den offenen Entwurf bearbeitet. */\nexport function vvtFourEyes(state: VvtData, actor: string): boolean {\n return editedBy(state.register?.draft ?? null, actor)\n}\n\nexport function vvtVersionLabel(t: DataProtectionTranslate, version: VersionView | null): string {\n return version ? t('versionLabel', { version: version.version, status: statusLabel(t, version.status) }) : t('noVersion')\n}\n\n/** Beschriftungen der Exporte (Druckansicht, Markdown, CSV). */\nexport function vvtExportTexts(t: DataProtectionTranslate): ExportTexts {\n return {\n yes: t('yes'), no: t('no'), empty: t('empty'), title: t('vvtTitle'), department: t('colDepartment'),\n withoutDepartment: t('withoutDepartment'), controller: t('controller'), dpo: t('dpo'), version: t('colVersion'),\n issues: t('issuesExport'), noIssues: t('noIssues'), required: t('blockingLabel'), hint: t('hintLabel'),\n field: t('field'), content: t('content'), generated: t('generated'),\n }\n}\n\nconst MIME: Readonly<Record<VvtExportFormat, [string, string]>> = {\n print: ['text/html;charset=utf-8', 'html'],\n markdown: ['text/markdown;charset=utf-8', 'md'],\n csv: ['text/csv;charset=utf-8', 'csv'],\n}\n\nexport function buildVvtExport(state: VvtData, format: VvtExportFormat, t: DataProtectionTranslate, lang: string): VvtExport {\n const view = vvtView(state)\n const input = {\n content: view.content,\n columns: state.profile?.register.columns ?? [],\n issues: view.issues,\n versionLabel: vvtVersionLabel(t, view.version),\n texts: vvtExportTexts(t),\n lang,\n }\n const [mimeType, extension] = MIME[format]\n const render = { csv: registerCsv, markdown: registerMarkdown, print: registerHtml }[format]\n const text = render({ ...input, generatedAt: new Date().toLocaleString(lang) })\n return { format, filename: registerFilename(view.version?.version ?? null, extension), mimeType, content: text }\n}\n\nconst INITIAL: VvtData = {\n ...IDLE, profile: null, register: null, showing: 'draft', working: null, checked: null, selected: null, history: false,\n}\n\nfunction reset(store: Store<VvtData>, register: RegisterState, editable: boolean): void {\n store.set({\n register,\n checked: null,\n showing: register.draft ? 'draft' : 'released',\n working: editable && register.draft ? cloneContent(register.draft.content) : null,\n })\n}\n\ntype Run = ReturnType<typeof createRunner<DataProtectionPort, DataProtectionError, VvtData>>\n\n/** Eingaben im Entwurf: Inhalt ändern, Prüfung der Bibliothek anstoßen, Ansicht wechseln. */\nfunction editActions(store: Store<VvtData>, run: Run, hooks: VvtHooks) {\n const delay = createDelay(() => hooks.checkDelay ?? 400)\n\n async function check(): Promise<void> {\n const current = store.get().working\n if (!current) return\n const result = await run('check', (active) => active.checkRegister(current))\n if (result && store.get().working === current) store.set({ checked: result.issues })\n }\n\n function update(next: RegisterContent): void {\n store.set({ working: next })\n delay.schedule(() => void check())\n }\n\n function show(which: 'draft' | 'released'): void {\n const draft = store.get().register?.draft\n store.set((state) => ({ showing: which, working: which === 'draft' && draft && !state.working ? cloneContent(draft.content) : state.working }))\n }\n\n function startDraft(): void {\n const register = store.get().register\n if (register?.draft) return show('draft')\n store.set({ working: cloneContent(register?.released?.content ?? emptyContent()), showing: 'draft', checked: null })\n }\n\n function discard(): void {\n const draft = store.get().register?.draft\n store.set({ working: draft ? cloneContent(draft.content) : null, checked: null })\n }\n\n return { check, update, show, startDraft, discard, dispose: delay.cancel }\n}\n\n/** Änderungen am Inhalt über die reinen Funktionen aus `registerView`. */\nfunction contentActions(store: Store<VvtData>, update: (next: RegisterContent) => void) {\n const content = (): RegisterContent => vvtView(store.get()).content\n return {\n select: (index: number | null) => store.set({ selected: index }),\n toggleHistory: () => store.set((state) => ({ history: !state.history })),\n changeField(key: string, value: FieldValue): void {\n const selected = store.get().selected\n if (selected !== null) update(withField(content(), selected, key, value))\n },\n addActivity(department: string): void {\n const columns = store.get().profile?.register.columns ?? []\n update(withActivity(content(), emptyActivity(columns, department)))\n store.set({ selected: content().taetigkeiten.length - 1 })\n },\n removeActivity(): void {\n const selected = store.get().selected\n if (selected === null) return\n update(withoutActivity(content(), selected))\n store.set({ selected: content().taetigkeiten.length ? 0 : null })\n },\n changePerson: (part: 'verantwortlicher' | 'dsb', person: Person) => update(withPerson(content(), part, person)),\n changeDepartments: (departments: readonly string[]) => update(withDepartments(content(), departments)),\n }\n}\n\n/** Speichern und Freigeben über den Port; danach wird der Stand neu gelesen. */\nfunction writeActions(store: Store<VvtData>, run: Run, hooks: VvtHooks, t: () => DataProtectionTranslate) {\n async function reload(): Promise<void> {\n const register = await run('load', (active) => active.register())\n if (register) reset(store, register, true)\n }\n\n async function save(): Promise<VersionView | null> {\n const current = store.get().working\n if (!current) return null\n const expected = store.get().register?.draft?.revision ?? null\n const saved = await run('save', (active) => active.saveDraft(current, expected))\n if (!saved) return null\n await reload()\n store.set({ notice: t()('saved', { version: saved.version, revision: saved.revision }) })\n hooks.onSaved?.(saved)\n return saved\n }\n\n async function release(): Promise<VersionView | null> {\n const draft = store.get().register?.draft\n if (!draft) return null\n const released = await run('release', (active) => active.releaseRegister(draft.revision))\n if (!released) return null\n await reload()\n store.set({ notice: t()('released', { version: released.version }) })\n hooks.onReleased?.(released)\n return released\n }\n\n return { save, release }\n}\n\nexport interface VvtControllerOptions extends VvtHooks {\n port: () => DataProtectionPort | null\n t: () => DataProtectionTranslate\n}\n\nexport function createVvtController(options: VvtControllerOptions) {\n const store = createStore<VvtData>(INITIAL)\n const hooks: VvtHooks = { ...options, networkMessage: options.networkMessage ?? ((message) => options.t()('networkError', { message })) }\n const run = createRunner(store, options.port, (error) => asError(error, hooks), hooks.onError)\n const edit = editActions(store, run, hooks)\n\n async function load(editable: boolean): Promise<void> {\n const loaded = await run('load', async (active) => Promise.all([active.profile(), active.register()]))\n if (!loaded) return\n store.set({ profile: loaded[0] })\n reset(store, loaded[1], editable)\n if (store.get().selected === null && vvtView(store.get()).content.taetigkeiten.length) store.set({ selected: 0 })\n }\n\n function exportAs(format: VvtExportFormat, lang: string): VvtExport {\n const payload = buildVvtExport(store.get(), format, options.t(), lang)\n store.set({ notice: options.t()('exported', { filename: payload.filename }) })\n return payload\n }\n\n return {\n store,\n load,\n exportAs,\n setNotice: (notice: string) => store.set({ notice }),\n ...edit,\n ...contentActions(store, edit.update),\n ...writeActions(store, run, hooks, options.t),\n }\n}\n\nexport type VvtController = ReturnType<typeof createVvtController>\n","// Zustandsautomat von <flowaudit-dsfa> (Vue und React): Übersicht, Erhebung mit\n// Vorschau der Bibliothek, Entscheidung, DSB-Stellungnahme, Freigabe, Neubewertung.\n\nimport { saveFile } from '@auditcore/common/browser'\nimport { createDelay, createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport { sameSurvey, surveyFrom, type TabItem } from './dsfaView'\nimport type { DataProtectionKey, DataProtectionTranslate } from './messages'\nimport { asError, type DataProtectionError, type RequestHooks } from './requests'\nimport type {\n AssessmentExportFormat,\n AssessmentView,\n DataProtectionPort,\n DataProtectionProfile,\n DecisionInput,\n OverviewRow,\n Proposal,\n SurveyInput,\n} from './types'\n\nexport type DsfaStep = 'saved' | 'decided' | 'dpo' | 'released' | 'started'\nexport type DsfaTab = 'screening' | 'risk' | 'result'\n\nexport interface DsfaHooks extends RequestHooks {\n onChanged?: (step: DsfaStep, view: AssessmentView) => void\n /** Wartezeit der Vorschau nach einer Eingabe (ms). */\n previewDelay?: number\n}\n\nexport interface DsfaData extends RequestState<DataProtectionError> {\n profile: DataProtectionProfile | null\n rows: OverviewRow[]\n view: AssessmentView | null\n survey: SurveyInput | null\n preview: Proposal | null\n tab: DsfaTab\n}\n\nexport interface DsfaDerived {\n dirty: boolean\n proposal: Proposal | null\n /** Vorschau anzeigen: ungespeicherte Eingaben und eine berechnete Vorschau liegen vor. */\n showPreview: boolean\n}\n\nexport function dsfaDerived(state: DsfaData): DsfaDerived {\n const saved = state.view && state.profile ? surveyFrom(state.view, state.profile) : null\n const dirty = !!state.survey && !sameSurvey(state.survey, saved)\n const proposal = dirty && state.preview ? state.preview : state.view?.proposal ?? null\n return { dirty, proposal, showPreview: dirty && !!state.preview }\n}\n\n/** Nur lesen: nicht bearbeitbar oder gesperrte (freigegebene) Fassung. */\nexport function dsfaReadonly(state: DsfaData, editable: boolean): boolean {\n return !editable || !!state.view?.locked\n}\n\nexport function dsfaTabs(t: DataProtectionTranslate): TabItem[] {\n return [\n { key: 'screening', label: t('stepScreening') },\n { key: 'risk', label: t('stepRisk') },\n { key: 'result', label: t('stepResult') },\n ]\n}\n\nexport const DSFA_NOTICES: Readonly<Record<DsfaStep, DataProtectionKey>> = {\n saved: 'assessmentSaved', decided: 'decisionSaved', dpo: 'dpoSaved', released: 'assessmentReleased', started: 'assessmentSaved',\n}\n\nconst INITIAL: DsfaData = { ...IDLE, profile: null, rows: [], view: null, survey: null, preview: null, tab: 'screening' }\n\ntype Run = ReturnType<typeof createRunner<DataProtectionPort, DataProtectionError, DsfaData>>\n\nfunction show(store: Store<DsfaData>, next: AssessmentView): void {\n const profile = store.get().profile\n store.set({ view: next, preview: null, survey: profile ? surveyFrom(next, profile) : null })\n}\n\n/** Lesen: Profil und Übersicht, einzelne Abschätzung, Vorschau der Bibliothek. */\nfunction readActions(store: Store<DsfaData>, run: Run, hooks: DsfaHooks) {\n const delay = createDelay(() => hooks.previewDelay ?? 400)\n\n async function load(): Promise<void> {\n const loaded = await run('load', async (active) => Promise.all([active.profile(), active.overview()]))\n if (loaded) store.set({ profile: loaded[0], rows: loaded[1].items })\n }\n\n async function open(assessmentId: string): Promise<void> {\n const found = await run('open', (active) => active.assessment(assessmentId))\n if (found) show(store, found)\n }\n\n async function openActivity(activityId: string): Promise<void> {\n const row = store.get().rows.find((entry) => entry.id === activityId)\n if (row?.dsfa) await open(row.dsfa.id)\n }\n\n async function calculate(): Promise<void> {\n const current = store.get().survey\n if (!current) return\n const result = await run('preview', (active) => active.calculate(current.answers, current.scenarios))\n if (result && store.get().survey === current) store.set({ preview: result })\n }\n\n function edit(next: SurveyInput): void {\n store.set({ survey: next })\n delay.schedule(() => void calculate())\n }\n\n return { load, open, openActivity, calculate, edit, dispose: delay.cancel }\n}\n\ntype Task = (active: DataProtectionPort, current: AssessmentView) => Promise<AssessmentView>\n\n/** Schreiben: jede Aktion ersetzt die angezeigte Fassung und liest die Übersicht neu. */\nfunction writeActions(store: Store<DsfaData>, run: Run, changed: (step: DsfaStep, view: AssessmentView) => void) {\n async function refreshRows(): Promise<void> {\n const overview = await run('overview', (active) => active.overview())\n if (overview) store.set({ rows: overview.items })\n }\n\n async function step(kind: DsfaStep, task: Task): Promise<AssessmentView | null> {\n const current = store.get().view\n if (!current) return null\n const next = await run(kind, (active) => task(active, current))\n if (!next) return null\n show(store, next)\n changed(kind, next)\n await refreshRows()\n return next\n }\n\n async function start(activityId: string): Promise<void> {\n const created = await run('started', (active) => active.startAssessment(activityId))\n if (!created) return\n show(store, created)\n changed('started', created)\n await refreshRows()\n }\n\n function payload(current: AssessmentView): SurveyInput {\n const { survey, profile } = store.get()\n const data = survey ?? surveyFrom(current, profile as DataProtectionProfile)\n return profile?.dossier_fields.length ? data : { ...data, dossier: undefined }\n }\n\n return {\n start,\n save: () => step('saved', (active, current) => active.updateAssessment(current.id, current.revision, payload(current))),\n decide: (decision: DecisionInput) => step('decided', (active, current) => active.decide(current.id, current.revision, decision)),\n requestDpo: (from: string, on: string) => step('dpo', (active, current) => active.requestDpo(current.id, current.revision, from, on)),\n release: () => step('released', (active, current) => active.releaseAssessment(current.id, current.revision)),\n reassess: () => step('started', (active, current) => active.reassess(current.id)),\n }\n}\n\nexport interface DsfaControllerOptions extends DsfaHooks {\n port: () => DataProtectionPort | null\n t: () => DataProtectionTranslate\n}\n\nexport function createDsfaController(options: DsfaControllerOptions) {\n const store = createStore<DsfaData>(INITIAL)\n const hooks: DsfaHooks = { ...options, networkMessage: options.networkMessage ?? ((message) => options.t()('networkError', { message })) }\n const run = createRunner(store, options.port, (error) => asError(error, hooks), hooks.onError)\n const changed = (step: DsfaStep, view: AssessmentView): void => {\n store.set({ notice: options.t()(DSFA_NOTICES[step], { revision: view.revision, version: view.version }) })\n hooks.onChanged?.(step, view)\n }\n\n async function exportReport(format: AssessmentExportFormat): Promise<boolean> {\n const current = store.get().view\n if (!current) return false\n const file = await run('export', (active) => active.exportAssessment(current.id, format))\n if (!file) return false\n if (typeof URL.createObjectURL === 'function') saveFile(file)\n return true\n }\n\n /** Beim Setzen eines Ports: Profil und Übersicht laden, optional eine Tätigkeit öffnen. */\n async function connect(activityId: string): Promise<void> {\n await read.load()\n if (activityId) await read.openActivity(activityId)\n }\n\n const read = readActions(store, run, hooks)\n return {\n store,\n connect,\n exportReport,\n setTab: (tab: string) => store.set({ tab: tab as DsfaTab }),\n setNotice: (notice: string) => store.set({ notice }),\n ...read,\n ...writeActions(store, run, changed),\n }\n}\n\nexport type DsfaController = ReturnType<typeof createDsfaController>\n","import { defineMessages } from '../i18n'\n\n/** Texte der Geo-Karte. */\nexport const geoMessages = defineMessages({\n de: {\n title: 'Karte',\n loading: 'Erdmodelle und Grenzen werden geladen …',\n noPort: 'Kein Port übergeben: Berechnungen sind nicht verfügbar.',\n failed: 'Anfrage abgelehnt: {message}',\n mapLabel: 'Karte mit {points} Punkten und {areas} Flächen. Klick setzt den Bezugspunkt; Pfeiltasten verschieben, Plus und Minus zoomen.',\n noTiles: 'Keine Kachelquelle eingerichtet – die Karte zeigt nur Punkte und Flächen ohne Hintergrund.',\n attribution: 'Kartendaten: {text}',\n fit: 'Alles zeigen',\n reference: 'Bezugspunkt',\n referenceHelp: 'Auf die Karte klicken, Koordinaten eingeben oder einen Punkt übernehmen.',\n lat: 'Breite (°)',\n lon: 'Länge (°)',\n apply: 'Übernehmen',\n fromPoint: 'Punkt übernehmen',\n choose: 'Bitte wählen',\n errorlat: 'Breite muss eine Zahl zwischen −90 und 90 sein (Komma oder Punkt).',\n errorlon: 'Länge muss eine Zahl zwischen −180 und 180 sein (Komma oder Punkt).',\n utm: 'UTM',\n utmValue: 'Zone {zone}{hemisphere}, E {east} m, N {north} m',\n utmEpsg: 'EPSG:{epsg}',\n utmNote: 'Standardzone aus der Länge; keine Datumstransformation.',\n ellipsoid: 'Ellipsoid',\n utmInput: 'UTM-Koordinaten eingeben',\n utmInputHelp: 'Rechts-/Hochwert mit Zone und Halbkugel; umgerechnet mit dem gewählten Ellipsoid, ohne Datumstransformation.',\n utmZone: 'Zone',\n utmHemisphere: 'Halbkugel',\n hemisphereNorth: 'Nord',\n hemisphereSouth: 'Süd',\n utmEast: 'Ostwert (m)',\n utmNorth: 'Nordwert (m)',\n utmerrorzone: 'Zone muss eine ganze Zahl von 1 bis 60 sein.',\n utmerroreast: 'Ostwert muss eine Zahl über 0 und unter 1000000 m sein (Komma oder Punkt, ohne Tausendertrennzeichen).',\n utmerrornorth: 'Nordwert muss eine Zahl von 0 bis 10000000 m sein (Komma oder Punkt, ohne Tausendertrennzeichen).',\n geocode: 'Adresse suchen',\n geocodeHelp: 'Die Adresse wird an den Geocoder des Servers gesendet.',\n geocodeRun: 'Suchen',\n geocodeNone: 'Keine Treffer.',\n radius: 'Umkreissuche',\n radiusMetres: 'Radius (m)',\n earthModel: 'Erdmodell',\n recommended: '{label} (empfohlen)',\n radiusRun: 'Suchen',\n radiusSummary: '{hits} von {checked} Punkten im Umkreis von {radius}',\n colName: 'Punkt',\n colDistance: 'Entfernung',\n locate: 'Punkt in Fläche',\n area: 'Fläche',\n boundaryInside: 'Randpunkte zählen als innen',\n boundaryHelp: 'Empfehlung (D2): Rand zählt als innen, damit ein möglicher Bezug eher gemeldet als übersehen wird.',\n tolerance: 'Randtoleranz (m)',\n locateRun: 'Prüfen',\n positioninnen: 'innen',\n positionaussen: 'außen',\n positionrand: 'auf dem Rand',\n contains: 'Ergebnis: in der Fläche',\n notContains: 'Ergebnis: nicht in der Fläche',\n boundaryCase: 'Randfall: Der Punkt liegt {how} auf dem Rand; nach der gewählten Randregel zählt er als {rule}.',\n boundaryExact: 'exakt',\n boundaryTolerance: 'innerhalb der Toleranz von {tolerance}',\n ruleInside: 'innen',\n ruleOutside: 'außen',\n distance: 'Abstand zum Rand: {distance}',\n notes: 'Hinweise zur Geometrie',\n simplify: 'Vereinfachung (Douglas-Peucker)',\n unit: 'Einheit',\n unitmeter: 'Meter',\n unitgrad: 'Grad',\n simplifyTolerance: 'Toleranz: {value}',\n simplifyVertices: 'Stützpunkte der Fläche: {count}',\n simplifyRun: 'Vereinfachen',\n simplifyResult: '{before} → {after} Stützpunkte',\n simplifyDropped: '{count} Ring(e) entfallen',\n simplifyGone: 'Bei dieser Toleranz bleibt keine Fläche übrig.',\n gpkg: 'GeoPackage laden',\n gpkgFile: 'Datei (.gpkg)',\n gpkgSource: 'Quelle des Servers',\n gpkgLoad: 'Laden',\n gpkgResult: '{count} Flächen aus Tabelle „{table}“ (srs_id {srs})',\n gpkgConverted: 'aus UTM umgerechnet',\n gpkgTruncated: 'Gekürzt: Die Datei enthält mehr Flächen als erlaubt.',\n gpkgErrors: '{count} Geometrie(n) nicht lesbar',\n needReference: 'Zuerst einen Bezugspunkt setzen.',\n needArea: 'Zuerst eine Fläche wählen.',\n needModel: 'Erdmodell wählen.',\n },\n en: {\n title: 'Map',\n reference: 'Reference point',\n utmInput: 'Enter UTM coordinates',\n radius: 'Radius search',\n locate: 'Point in area',\n simplify: 'Simplification (Douglas-Peucker)',\n gpkg: 'Load GeoPackage',\n fit: 'Show all',\n },\n})\n\nexport type GeoMessageKey = keyof typeof geoMessages.de\n","import { intlFormatNumber as formatNumber } from '@auditcore/common'\nimport type { Locale } from '../i18n'\nimport type { GeoMessageKey } from './messages'\nimport type { AreaGeometry, GeoArea, GeoPackageResult, GeoPoint, LatLon } from './types'\n\n/** Stufen des Toleranzreglers der Vereinfachung (Meter bzw. Grad). */\nexport const TOLERANCE_STEPS: Readonly<Record<'meter' | 'grad', readonly number[]>> = {\n meter: [0, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000],\n grad: [0, 0.00001, 0.00005, 0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05, 0.1],\n}\n\n/**\n * Dezimalgrad aus Texteingabe; Komma und Punkt sind als Dezimaltrenner\n * erlaubt, Tausendertrennzeichen nicht. Ungültiges ergibt `null`.\n */\nexport function parseDegrees(text: string): number | null {\n const trimmed = text.trim().replace(',', '.')\n if (!/^[+-]?\\d{1,3}(\\.\\d+)?$/.test(trimmed)) return null\n const value = Number(trimmed)\n return Number.isFinite(value) ? value : null\n}\n\nexport type CoordinateError = 'lat' | 'lon' | null\n\n/** Punkt aus zwei Texteingaben mit Wertebereichsprüfung. */\nexport function parseLatLon(lat: string, lon: string): { point: LatLon | null; error: CoordinateError } {\n const la = parseDegrees(lat)\n if (la === null || la < -90 || la > 90) return { point: null, error: 'lat' }\n const lo = parseDegrees(lon)\n if (lo === null || lo < -180 || lo > 180) return { point: null, error: 'lon' }\n return { point: { lat: la, lon: lo }, error: null }\n}\n\n/** Meter aus Texteingabe (Komma oder Punkt, keine Tausendertrennung); Ungültiges ergibt `null`. */\nexport function parseMetres(text: string): number | null {\n const trimmed = text.trim().replace(',', '.')\n if (!/^[+-]?\\d+(\\.\\d+)?$/.test(trimmed)) return null\n const value = Number(trimmed)\n return Number.isFinite(value) ? value : null\n}\n\nexport type UtmInputError = 'zone' | 'east' | 'north' | null\n\nexport interface UtmInput {\n zone: number\n ost: number\n nord: number\n}\n\n/** UTM-Eingabe mit Wertebereichsprüfung: Zone 1–60, Ostwert 0–1 000 000 m, Nordwert 0–10 000 000 m. */\nexport function parseUtm(zone: string, east: string, north: string): { value: UtmInput | null; error: UtmInputError } {\n const number = /^\\s*\\d{1,2}\\s*$/.test(zone) ? Number(zone) : NaN\n if (!(number >= 1 && number <= 60)) return { value: null, error: 'zone' }\n const ost = parseMetres(east)\n if (ost === null || ost <= 0 || ost >= 1_000_000) return { value: null, error: 'east' }\n const nord = parseMetres(north)\n if (nord === null || nord < 0 || nord > 10_000_000) return { value: null, error: 'north' }\n return { value: { zone: number, ost, nord }, error: null }\n}\n\n/** Text der Fehlermeldung einer UTM-Eingabe. */\nexport function utmErrorKey(error: Exclude<UtmInputError, null>): GeoMessageKey {\n return `utmerror${error}`\n}\n\n/** Entfernung sprachabhängig: unter 1 km in Metern, sonst in Kilometern mit zwei Stellen. */\nexport function formatDistance(metres: number, locale: Locale): string {\n if (metres < 1000) return `${formatNumber(Math.round(metres), locale)} m`\n return `${formatNumber(metres / 1000, locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} km`\n}\n\n/** Grad mit sechs Nachkommastellen (≈ 0,1 m). */\nexport function formatDegrees(value: number, locale: Locale): string {\n return formatNumber(value, locale, { minimumFractionDigits: 6, maximumFractionDigits: 6 })\n}\n\n/** Rechts-/Hochwert in Metern mit zwei Nachkommastellen, ohne Tausendertrennung. */\nexport function formatMetres(value: number, locale: Locale): string {\n return formatNumber(value, locale, { minimumFractionDigits: 2, maximumFractionDigits: 2, useGrouping: false })\n}\n\n/** Anzahl der Stützpunkte einer Fläche (Schlusspunkte mitgezählt). */\nexport function vertexCount(geometry: AreaGeometry): number {\n const polygons = geometry.type === 'Polygon' ? [geometry.coordinates] : geometry.coordinates\n return polygons.reduce((sum, rings) => sum + rings.reduce((inner, ring) => inner + ring.length, 0), 0)\n}\n\n/** Flächen aus einer GeoPackage-Antwort; Kennungen erhalten die Herkunft als Präfix. */\nexport function areasFromGeoPackage(result: GeoPackageResult, origin: string): GeoArea[] {\n return result.flaechen.map((area) => ({\n id: `${origin}:${area.id}`,\n label: area.bezeichnung,\n geometry: area.geometrie,\n notes: area.hinweise,\n }))\n}\n\n/** Bezeichnung für Listen: Name, sonst Kennung. */\nexport function displayName(entry: GeoPoint | GeoArea): string {\n return entry.label?.trim() ? entry.label : entry.id\n}\n","import { RestError, requestJson, type RestOptions } from '@auditcore/common'\nimport type { GeoPackageResult, GeoPort } from './types'\n\nexport interface GeoRestOptions extends RestOptions {\n /**\n * Adresssuche über `POST /geocode` anbieten. Standard `false`: ohne\n * ausdrückliche Freigabe sendet die Oberfläche keine Adressen, auch wenn\n * der Server einen Geocoder angeschlossen hat.\n */\n geocoding?: boolean\n}\n\nfunction query(table?: string): string {\n return table ? `?tabelle=${encodeURIComponent(table)}` : ''\n}\n\nasync function uploadError(response: Response): Promise<RestError> {\n const data = (await response.json().catch(() => ({}))) as { error?: { code?: string; message?: string } }\n return new RestError(data.error?.message ?? `HTTP ${response.status}`, response.status, data.error?.code ?? 'http_error')\n}\n\n/** `POST /gpkg`: die Datei ist der Anfragekörper (kein JSON, kein Multipart). */\nasync function upload(options: RestOptions, file: Blob, table?: string): Promise<GeoPackageResult> {\n const fetchImpl = options.fetch ?? ((input, init) => globalThis.fetch(input, init))\n const response = await fetchImpl(`${options.baseUrl.replace(/\\/$/, '')}/gpkg${query(table)}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/geopackage+sqlite3', Accept: 'application/json', ...options.headers },\n body: file,\n })\n if (!response.ok) throw await uploadError(response)\n return (await response.json()) as GeoPackageResult\n}\n\n/** Port auf den REST-Vertrag von `auditcore_geo.web` (Starlette oder FastAPI). */\nexport function createGeoRestPort(options: GeoRestOptions): GeoPort {\n const port: GeoPort = {\n catalogue: () => requestJson(options, '/profile'),\n radius: (request) => requestJson(options, '/umkreis', request),\n locate: (request) => requestJson(options, '/lage', request),\n utm: (request) => requestJson(options, '/utm', request),\n fromUtm: (request) => requestJson(options, '/utm/geographisch', request),\n simplify: (request) => requestJson(options, '/vereinfachung', request),\n loadGeoPackage: (file, table) => upload(options, file, table),\n loadSource: (name, table) => requestJson(options, `/gpkg/quellen/${encodeURIComponent(name)}${query(table)}`),\n }\n if (options.geocoding) port.geocode = (text) => requestJson(options, '/geocode', { anfrage: text })\n return port\n}\n","/**\n * Kartenansicht auf Leaflet (BSD-2-Clause). Leaflet wird erst beim Anlegen\n * einer Karte geladen (dynamischer Import), damit Anwendungen ohne Karte es\n * nicht laden. Farben kommen über CSS-Klassen aus den `--fa-*`-Token.\n */\nimport type { AreaGeometry, GeoArea, GeoPoint, LatLon, TileSource } from './types'\n\nexport interface MapLayers {\n points: readonly GeoPoint[]\n areas: readonly GeoArea[]\n reference: LatLon | null\n radiusMetres: number | null\n hits: ReadonlySet<string>\n selectedArea: string | null\n simplified: AreaGeometry | null\n}\n\nexport interface MapViewOptions {\n center: LatLon\n zoom: number\n tiles: TileSource | null\n /** Klick auf die Karte: neuer Bezugspunkt. */\n onPick: (point: LatLon) => void\n /** Beschriftung eines Punktes bzw. einer Fläche für Tooltips. */\n label: (entry: GeoPoint | GeoArea) => string\n}\n\nexport interface MapView {\n update(layers: MapLayers): void\n setTiles(tiles: TileSource | null): void\n /** Ausschnitt auf alle Punkte, Flächen und den Umkreis setzen. */\n fit(): void\n destroy(): void\n}\n\ntype Leaflet = typeof import('leaflet')\n\n/** Leaflet setzt Tooltips und Namensnennung als HTML; Daten gehen deshalb nur als Text hinein. */\nexport function escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (char) => `&#${char.charCodeAt(0)};`)\n}\n\nfunction textElement(text: string): HTMLElement {\n const span = document.createElement('span')\n span.textContent = text\n return span\n}\n\nfunction tileLayer(L: Leaflet, tiles: TileSource | null): import('leaflet').TileLayer | null {\n if (!tiles?.url) return null\n return L.tileLayer(tiles.url, {\n attribution: escapeHtml(tiles.attribution),\n maxZoom: tiles.maxZoom ?? 19,\n subdomains: tiles.subdomains ?? 'abc',\n })\n}\n\nfunction drawAreas(L: Leaflet, group: import('leaflet').LayerGroup, layers: MapLayers, options: MapViewOptions): void {\n for (const area of layers.areas) {\n const selected = area.id === layers.selectedArea\n L.geoJSON(area.geometry, { style: () => ({ className: `fa-geo__area${selected ? ' fa-geo__area--selected' : ''}` }) })\n .bindTooltip(textElement(options.label(area)))\n .addTo(group)\n }\n if (layers.simplified) {\n L.geoJSON(layers.simplified, { style: () => ({ className: 'fa-geo__simplified' }), interactive: false }).addTo(group)\n }\n}\n\nfunction drawPoints(L: Leaflet, group: import('leaflet').LayerGroup, layers: MapLayers, options: MapViewOptions): void {\n for (const point of layers.points) {\n const hit = layers.hits.has(point.id)\n L.circleMarker([point.lat, point.lon], { radius: hit ? 7 : 5, className: `fa-geo__point${hit ? ' fa-geo__point--hit' : ''}` })\n .bindTooltip(textElement(options.label(point)))\n .addTo(group)\n }\n const reference = layers.reference\n if (!reference) return\n if (layers.radiusMetres) {\n L.circle([reference.lat, reference.lon], { radius: layers.radiusMetres, className: 'fa-geo__radius', interactive: false }).addTo(group)\n }\n L.circleMarker([reference.lat, reference.lon], { radius: 8, className: 'fa-geo__reference', interactive: false }).addTo(group)\n}\n\n/** Legt die Leaflet-Karte im Element an. */\nexport async function createLeafletView(element: HTMLElement, options: MapViewOptions): Promise<MapView> {\n const L = await import('leaflet')\n const map = L.map(element, { center: [options.center.lat, options.center.lon], zoom: options.zoom, keyboard: true, zoomControl: true })\n map.attributionControl.setPrefix('<a href=\"https://leafletjs.com\">Leaflet</a>')\n let tiles = tileLayer(L, options.tiles)\n tiles?.addTo(map)\n const group = L.featureGroup().addTo(map)\n map.on('click', (event: import('leaflet').LeafletMouseEvent) => options.onPick({ lat: event.latlng.lat, lon: L.Util.wrapNum(event.latlng.lng, [-180, 180], true) }))\n return {\n update(layers) {\n group.clearLayers()\n drawAreas(L, group, layers, options)\n drawPoints(L, group, layers, options)\n },\n setTiles(next) {\n tiles?.remove()\n tiles = tileLayer(L, next)\n tiles?.addTo(map)\n },\n fit() {\n const bounds = group.getBounds()\n if (bounds.isValid()) map.fitBounds(bounds, { padding: [24, 24], maxZoom: 15 })\n },\n destroy() {\n map.remove()\n },\n }\n}\n","// Zustandsautomat der Geo-Karte (Vue und React): Katalog, Bezugspunkt mit UTM\n// und Adresssuche, Umkreis, Punkt in Fläche, Vereinfachung, GeoPackage.\n// Jede Berechnung läuft über den Port (auditcore_geo.web).\n\nimport { createRunner, createStore, type Store } from '../store'\nimport { areasFromGeoPackage, parseLatLon, parseUtm, TOLERANCE_STEPS, type CoordinateError, type UtmInputError } from './model'\nimport type { MapLayers } from './mapView'\nimport type {\n GeoArea,\n GeoCatalogue,\n GeocodeResult,\n GeoPackageResult,\n GeoPoint,\n GeoPort,\n LatLon,\n LocateResult,\n RadiusResult,\n SimplifyResult,\n SimplifyUnit,\n UtmResult,\n} from './types'\n\nexport type GeoBusy = 'load' | 'radius' | 'locate' | 'utm' | 'simplify' | 'gpkg' | 'geocode'\nexport type GeoHint = 'needReference' | 'needArea' | 'needModel' | null\n\nexport interface GeoMapCallbacks {\n radius?: (result: RadiusResult) => void\n located?: (result: LocateResult) => void\n areasLoaded?: (areas: readonly GeoArea[], result: GeoPackageResult) => void\n reference?: (point: LatLon | null) => void\n failed?: (message: string) => void\n}\n\nexport interface GeoData {\n busy: GeoBusy | null\n failure: string\n error: string | null\n notice: string\n hint: GeoHint\n catalogue: GeoCatalogue | null\n earthModel: string | null\n radiusMetres: number\n radiusResult: RadiusResult | null\n boundaryInside: boolean\n toleranceMetres: number\n locateResult: LocateResult | null\n loadedAreas: readonly GeoArea[]\n areaId: string | null\n simplifyUnit: SimplifyUnit\n simplifyStep: number\n simplifyResult: SimplifyResult | null\n gpkgResult: GeoPackageResult | null\n ellipsoid: string\n reference: LatLon | null\n latText: string\n lonText: string\n coordinateError: CoordinateError\n utm: UtmResult | null\n /** Eingabefelder der UTM-Rückrechnung (`POST /utm/geographisch`). */\n zoneText: string\n eastText: string\n northText: string\n northern: boolean\n utmError: UtmInputError\n geocodeResult: GeocodeResult | null\n}\n\n/** Eingaben der Komponente (Props). */\nexport interface GeoInputs {\n port: GeoPort | null\n points: readonly GeoPoint[]\n areas: readonly GeoArea[]\n}\n\nexport interface GeoSelection {\n areas: readonly GeoArea[]\n area: GeoArea | null\n simplifyTolerance: number\n hitIds: ReadonlySet<string>\n canGeocode: boolean\n /** Port bietet die Rückrechnung aus UTM an. */\n canFromUtm: boolean\n layers: MapLayers\n}\n\nfunction layersOf(state: GeoData, inputs: GeoInputs, areas: readonly GeoArea[], hits: ReadonlySet<string>): MapLayers {\n return {\n points: inputs.points,\n areas,\n reference: state.reference,\n radiusMetres: state.radiusResult ? state.radiusResult.radius_m : null,\n hits,\n selectedArea: state.areaId,\n simplified: state.simplifyResult?.geometrie ?? null,\n }\n}\n\nfunction geocodingAvailable(state: GeoData, inputs: GeoInputs): boolean {\n return Boolean(inputs.port?.geocode) && state.catalogue?.geocoder.aktiv === true\n}\n\nexport function selectGeo(state: GeoData, inputs: GeoInputs): GeoSelection {\n const areas = [...inputs.areas, ...state.loadedAreas]\n const hitIds = new Set(state.radiusResult?.treffer.map((hit) => hit.id) ?? [])\n return {\n areas,\n area: areas.find((entry) => entry.id === state.areaId) ?? null,\n simplifyTolerance: TOLERANCE_STEPS[state.simplifyUnit][state.simplifyStep] ?? 0,\n hitIds,\n canGeocode: geocodingAvailable(state, inputs),\n canFromUtm: Boolean(inputs.port?.fromUtm),\n layers: layersOf(state, inputs, areas, hitIds),\n }\n}\n\n/** Einfache Eingabefelder, die die Oberfläche direkt setzen darf. */\nexport type GeoField =\n | 'radiusMetres' | 'earthModel' | 'boundaryInside' | 'toleranceMetres' | 'simplifyStep' | 'ellipsoid' | 'latText' | 'lonText'\n | 'zoneText' | 'eastText' | 'northText' | 'northern'\n\nconst INITIAL: GeoData = {\n busy: null, failure: '', error: null, notice: '', hint: null, catalogue: null, earthModel: null, radiusMetres: 5000,\n radiusResult: null, boundaryInside: true, toleranceMetres: 0, locateResult: null, loadedAreas: [], areaId: null,\n simplifyUnit: 'meter', simplifyStep: 4, simplifyResult: null, gpkgResult: null, ellipsoid: 'GRS80', reference: null,\n latText: '', lonText: '', coordinateError: null, utm: null, zoneText: '', eastText: '', northText: '', northern: true, utmError: null,\n geocodeResult: null,\n}\n\nfunction rounded(value: number, digits = 6): string {\n const factor = 10 ** digits\n return String(Math.round(value * factor) / factor)\n}\n\n/** Eingabefelder der UTM-Rückrechnung aus dem berechneten Rechts-/Hochwert. */\nfunction utmTexts(result: UtmResult): Partial<GeoData> {\n return { zoneText: String(result.zone), eastText: rounded(result.ost, 2), northText: rounded(result.nord, 2), northern: result.nordhalbkugel, utmError: null }\n}\n\nfunction missing(what: string): Promise<never> {\n return Promise.reject(new Error(`${what} nicht angeboten.`))\n}\n\ntype Run = <T>(kind: GeoBusy, task: (port: GeoPort) => Promise<T>) => Promise<T | null>\n\n/** Voraussetzungen einer Berechnung; fehlt etwas, steht der Hinweis im Zustand. */\nfunction prepare(store: Store<GeoData>, area: GeoArea | null, needsArea: boolean): { point: LatLon; model: string } | null {\n const { reference: point, earthModel: model } = store.get()\n const hint: GeoHint = !point ? 'needReference' : !model ? 'needModel' : needsArea && !area ? 'needArea' : null\n store.set({ hint })\n return point && model && !hint ? { point, model } : null\n}\n\nfunction referenceActions(store: Store<GeoData>, run: Run, inputs: () => GeoInputs, callbacks: GeoMapCallbacks) {\n async function refreshUtm(): Promise<void> {\n const { reference: point, ellipsoid } = store.get()\n if (!point) return\n const result = await run('utm', (active) => active.utm({ punkt: point, ellipsoid }))\n if (result) store.set({ utm: result, ...utmTexts(result) })\n }\n\n async function setReference(point: LatLon | null): Promise<void> {\n store.set({\n reference: point, coordinateError: null, latText: point ? rounded(point.lat) : '', lonText: point ? rounded(point.lon) : '',\n utm: null, radiusResult: null, locateResult: null, hint: null,\n })\n callbacks.reference?.(point)\n await refreshUtm()\n }\n\n async function applyTexts(): Promise<void> {\n const parsed = parseLatLon(store.get().latText, store.get().lonText)\n store.set({ coordinateError: parsed.error })\n if (parsed.point) await setReference(parsed.point)\n }\n\n async function geocode(query: string): Promise<void> {\n const text = query.trim()\n if (!selectGeo(store.get(), inputs()).canGeocode || !text) return\n const result = await run('geocode', (active) => active.geocode?.(text) ?? missing('Adresssuche'))\n if (result) store.set({ geocodeResult: result })\n }\n\n return { refreshUtm, setReference, applyTexts, geocode }\n}\n\nfunction utmActions(store: Store<GeoData>, run: Run, setReference: (point: LatLon | null) => Promise<void>) {\n /** Bezugspunkt aus Zone, Halbkugel, Ost- und Nordwert (Rückrechnung über den Port). */\n async function applyUtm(): Promise<void> {\n const { zoneText, eastText, northText, northern, ellipsoid } = store.get()\n const parsed = parseUtm(zoneText, eastText, northText)\n store.set({ utmError: parsed.error })\n const input = parsed.value\n if (!input) return\n const request = { ...input, nordhalbkugel: northern, ellipsoid }\n const result = await run('utm', (active) => active.fromUtm?.(request) ?? missing('UTM-Rückrechnung'))\n if (result) await setReference(result.punkt)\n }\n\n return { applyUtm }\n}\n\nfunction areaActions(store: Store<GeoData>, run: Run, inputs: () => GeoInputs, callbacks: GeoMapCallbacks) {\n const area = (): GeoArea | null => selectGeo(store.get(), inputs()).area\n\n async function simplifyArea(): Promise<void> {\n const target = area()\n store.set({ hint: target ? null : 'needArea' })\n if (!target) return\n const { simplifyUnit: einheit } = store.get()\n const toleranz = selectGeo(store.get(), inputs()).simplifyTolerance\n const result = await run('simplify', (active) => active.simplify({ flaeche: target.geometry, toleranz, einheit }))\n if (result) store.set({ simplifyResult: result })\n }\n\n function accept(result: GeoPackageResult, origin: string): void {\n const added = areasFromGeoPackage(result, origin)\n store.set((state) => ({\n gpkgResult: result,\n loadedAreas: [...state.loadedAreas.filter((entry) => !entry.id.startsWith(`${origin}:`)), ...added],\n }))\n if (!store.get().areaId && added[0]) selectArea(added[0].id)\n callbacks.areasLoaded?.(added, result)\n }\n\n function selectArea(id: string | null): void {\n if (id === store.get().areaId) return\n store.set({ areaId: id, simplifyResult: null, locateResult: null })\n }\n\n function setSimplifyUnit(unit: SimplifyUnit): void {\n store.set((state) => ({ simplifyUnit: unit, simplifyStep: Math.min(state.simplifyStep, TOLERANCE_STEPS[unit].length - 1), simplifyResult: null }))\n }\n\n async function loadFile(file: Blob): Promise<void> {\n const result = await run('gpkg', (active) => active.loadGeoPackage?.(file) ?? missing('GeoPackage-Upload'))\n if (result) accept(result, 'datei')\n }\n\n async function loadSource(name: string): Promise<void> {\n const result = await run('gpkg', (active) => active.loadSource?.(name) ?? missing('Serverquelle'))\n if (result) accept(result, name)\n }\n\n return { simplifyArea, selectArea, setSimplifyUnit, loadFile, loadSource }\n}\n\nfunction calculations(store: Store<GeoData>, run: Run, inputs: () => GeoInputs, callbacks: GeoMapCallbacks) {\n async function searchRadius(): Promise<void> {\n const given = prepare(store, null, false)\n if (!given) return\n const punkte = inputs().points.map(({ id, lat, lon }) => ({ id, lat, lon }))\n const request = { zentrum: given.point, punkte, radius_m: store.get().radiusMetres, erdmodell: given.model }\n const result = await run('radius', (active) => active.radius(request))\n store.set({ radiusResult: result })\n if (result) callbacks.radius?.(result)\n }\n\n async function checkLocation(): Promise<void> {\n const target = selectGeo(store.get(), inputs()).area\n const given = prepare(store, target, true)\n if (!given || !target) return\n const { boundaryInside, toleranceMetres } = store.get()\n const request = { punkt: given.point, flaeche: target.geometry, erdmodell: given.model, rand_gilt_als_innen: boundaryInside, rand_toleranz_m: toleranceMetres }\n const result = await run('locate', (active) => active.locate(request))\n store.set({ locateResult: result })\n if (result) callbacks.located?.(result)\n }\n\n async function load(): Promise<void> {\n const result = await run('load', (active) => active.catalogue())\n if (!result) return\n const ellipsoid = result.ellipsoide.includes('GRS80') ? 'GRS80' : (result.ellipsoide[0] ?? 'GRS80')\n store.set({ catalogue: result, earthModel: result.empfohlenes_erdmodell, boundaryInside: result.rand_gilt_als_innen_empfohlen, ellipsoid })\n }\n\n return { load, searchRadius, checkLocation }\n}\n\nexport interface GeoControllerOptions extends GeoMapCallbacks {\n inputs: () => GeoInputs\n}\n\nexport function createGeoController(options: GeoControllerOptions) {\n const store = createStore<GeoData>(INITIAL)\n const toError = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n const runner = createRunner<GeoPort, string, GeoData>(store, () => options.inputs().port, toError, options.failed)\n const run: Run = async (kind, task) => {\n store.set({ failure: '' })\n const result = await runner(kind, task)\n const error = store.get().error\n if (error) store.set({ failure: error, error: null })\n return result\n }\n const references = referenceActions(store, run, options.inputs, options)\n return {\n store,\n /** Einfaches Eingabefeld setzen (Radius, Erdmodell, Rand, Toleranz, Stufe, Ellipsoid, Texte). */\n setField: <K extends GeoField>(key: K, value: GeoData[K]) => store.set({ [key]: value } as Partial<GeoData>),\n ...calculations(store, run, options.inputs, options),\n ...references,\n ...utmActions(store, run, references.setReference),\n ...areaActions(store, run, options.inputs, options),\n }\n}\n\nexport type GeoController = ReturnType<typeof createGeoController>\n","import { defineMessages } from '../i18n'\n\n/** Sichtbare Texte der Risiko-Komponenten (Deutsch vollständig, Englisch vorbereitet). */\nexport const riskMessages = defineMessages({\n de: {\n title: 'Risiko-Merkmale',\n profile: 'Profil',\n version: 'Version',\n fingerprint: 'Fingerabdruck',\n status: 'Status',\n statusApproved: 'freigegeben',\n statusLegacy: 'charakterisiertes Altverhalten',\n statusCandidate: 'Kandidat – fachliche Entscheidung erforderlich',\n statusHintLegacy: 'Profil reproduziert eine Quellanwendung; Schwellen sind nicht fachlich freigegeben.',\n statusHintCandidate: 'Profil ist nicht freigegeben; Ergebnisse nur zur Prüfung der Entscheidung verwenden.',\n stateHit: 'Treffer',\n stateUndetermined: 'unbestimmt',\n stateClear: 'kein Merkmal',\n stateSkipped: 'übersprungen',\n stateAbsent: 'nicht ausgewertet',\n stateCell: '{code}: {state}',\n summaryTitle: 'Verteilung je Merkmal',\n summaryCaption: 'Verteilung der Merkmale über {count} Datensätze',\n colCode: 'Code',\n colLabel: 'Merkmal',\n colHits: 'Treffer',\n colShare: 'Anteil',\n colUndetermined: 'unbestimmt',\n colVolume: 'Volumen',\n colRecord: 'Datensatz',\n colFlags: 'Merkmale',\n totalsRecords: '{count} Datensätze',\n totalsHits: '{count} mit Treffer',\n totalsUndetermined: '{count} mit unbestimmtem Merkmal',\n totalsSkipped: '{count} Regeln übersprungen',\n skippedTitle: 'Übersprungene Regeln',\n skippedHint: 'Diese Regeln liefen nicht; ihre Merkmale sind für keinen Datensatz entschieden.',\n missingColumns: 'Fehlende Spalten: {columns}',\n datasetTitle: 'Befunde über alle Datensätze',\n reasonCount: '{reason} ({count})',\n filterTitle: 'Filter',\n filterCode: 'Merkmal',\n filterCodeAll: 'alle Merkmale',\n filterState: 'Zustand',\n filterAffected: 'Treffer oder unbestimmt',\n filterAll: 'alle Datensätze',\n filterQuery: 'Suche (Datensatz, Code, Begründung)',\n filterResult: '{shown} von {total} Datensätzen',\n tableCaption: 'Merkmale je Datensatz',\n noRecords: 'Keine Datensätze für diesen Filter.',\n detailTitle: 'Datensatz {record}',\n detailEmpty: 'Datensatz wählen, um Begründung, Eingabewerte und Schwellen zu sehen.',\n detailNone: 'Keine Treffer und keine unbestimmten Merkmale.',\n reason: 'Begründung',\n inputs: 'Verwendete Eingabefelder',\n field: 'Feld',\n value: 'Wert',\n emptyValue: 'leer',\n parameters: 'Schwellen und Parameter',\n evidence: 'Belegwerte',\n origin: 'Fundstelle in der Quelle',\n note: 'Hinweis',\n severity: 'Schwere',\n assessment: 'Bewertung laut Profil',\n profileInfo: 'Profil und Eingabefelder',\n rulesTitle: 'Regeln',\n fieldsTitle: 'Eingabefelder',\n colMeaning: 'Bedeutung',\n colRequirement: 'Pflicht/optional',\n colMissing: 'Folge bei fehlender Spalte / leerem Wert',\n colWhenMissing: 'Spalte fehlt',\n required: 'Pflicht',\n valueRequired: 'Pflicht, auch der Wert',\n optional: 'optional',\n missingError: 'Abbruch',\n missingSkip: 'übersprungen',\n missingAllFalse: 'kein Merkmal',\n missingUndetermined: 'unbestimmt',\n undocumented: 'Bedeutung laut Quelle nicht dokumentiert',\n openDecisions: 'Offene Entscheidungen',\n source: 'Quelle',\n close: 'Schließen',\n },\n en: {\n title: 'Risk flags',\n stateHit: 'hit',\n stateUndetermined: 'undetermined',\n stateClear: 'no flag',\n stateSkipped: 'skipped',\n summaryTitle: 'Distribution per flag',\n filterTitle: 'Filter',\n reason: 'Reason',\n inputs: 'Input fields used',\n parameters: 'Thresholds and parameters',\n emptyValue: 'empty',\n },\n})\n\nexport type RiskMessageKey = keyof typeof riskMessages.de\n","/**\n * Framework-freie View-Logik der Risiko-Merkmale: Zustand je Datensatz und\n * Regel, Verteilung je Code, Filter und Einträge für die Detailkarten.\n */\nimport type { DatasetFinding, Evaluation, FlagHit, JsonObject, JsonValue, RecordView, RuleView } from './types'\n\n/** Zustand einer Regel für einen Datensatz. */\nexport type FlagState = 'hit' | 'clear' | 'undetermined' | 'skipped' | 'absent'\nexport const FLAG_STATES: readonly FlagState[] = ['hit', 'undetermined', 'clear', 'skipped', 'absent']\n\nexport function flagState(record: RecordView, code: string, skipped: Readonly<Record<string, string>>): FlagState {\n if (code in skipped) return 'skipped'\n const flag = record.flags[code]\n if (flag === true) return 'hit'\n if (flag === false) return 'clear'\n if (flag === null) return 'undetermined'\n return 'absent'\n}\n\n/** Regeln der Auswertung; ohne `rules` aus den Codes der Datensätze abgeleitet. */\nexport function evaluationRules(evaluation: Evaluation): RuleView[] {\n if (evaluation.rules && evaluation.rules.length > 0) return evaluation.rules\n const codes = new Set<string>()\n for (const record of evaluation.records) for (const code of Object.keys(record.flags)) codes.add(code)\n for (const code of Object.keys(evaluation.skipped)) codes.add(code)\n return [...codes].map((code) => ({\n code, label: code, kind: '', scope: 'record', severity: null, interpretation: 'indicator', note: null,\n requires: [], when_missing_columns: 'error', inputs: [], parameters: {}, origin: {},\n }))\n}\n\nexport function recordRules(evaluation: Evaluation): RuleView[] {\n return evaluationRules(evaluation).filter((rule) => rule.scope !== 'dataset')\n}\n\nexport interface RiskDistributionRow {\n code: string\n label: string\n hit: number\n clear: number\n undetermined: number\n total: number\n /** Anteil der Treffer an allen Datensätzen (0–1). */\n share: number\n skipped: string | null\n /** Begründung → Anzahl der unbestimmten Datensätze. */\n reasons: Record<string, number>\n /** Volumen laut Zusammenfassung des Profils, falls vorhanden. */\n volume: number | null\n}\n\nfunction summaryVolume(summary: readonly JsonObject[], code: string): number | null {\n const entry = summary.find((item) => item.code === code)\n const volume = entry?.volumen\n return typeof volume === 'number' ? volume : null\n}\n\nfunction countStates(evaluation: Evaluation, code: string): Pick<RiskDistributionRow, 'hit' | 'clear' | 'undetermined' | 'reasons'> {\n const counts = { hit: 0, clear: 0, undetermined: 0, reasons: {} as Record<string, number> }\n for (const record of evaluation.records) {\n const state = flagState(record, code, evaluation.skipped)\n if (state === 'hit') counts.hit += 1\n else if (state === 'clear') counts.clear += 1\n else if (state === 'undetermined') {\n counts.undetermined += 1\n const reason = record.undetermined[code] ?? ''\n counts.reasons[reason] = (counts.reasons[reason] ?? 0) + 1\n }\n }\n return counts\n}\n\n/** Verteilung je Regel in Profilreihenfolge (nur Datensatzregeln). */\nexport function distribution(evaluation: Evaluation): RiskDistributionRow[] {\n const total = evaluation.records.length\n return recordRules(evaluation).map((rule) => {\n const counts = countStates(evaluation, rule.code)\n return {\n code: rule.code,\n label: rule.label,\n ...counts,\n total,\n share: total > 0 ? counts.hit / total : 0,\n skipped: evaluation.skipped[rule.code] ?? null,\n volume: summaryVolume(evaluation.summary, rule.code),\n }\n })\n}\n\nexport interface Totals {\n records: number\n withHits: number\n withUndetermined: number\n skippedRules: number\n}\n\nexport function totals(evaluation: Evaluation): Totals {\n return {\n records: evaluation.records.length,\n withHits: evaluation.records.filter((record) => record.codes.length > 0).length,\n withUndetermined: evaluation.records.filter((record) => Object.keys(record.undetermined).length > 0).length,\n skippedRules: Object.keys(evaluation.skipped).length,\n }\n}\n\nexport function triggeredDataset(evaluation: Evaluation): DatasetFinding[] {\n return evaluation.dataset.filter((finding) => finding.triggered)\n}\n\n/** Filter: `affected` = Treffer oder unbestimmt; `all` = jeder Datensatz. */\nexport type StateFilter = 'affected' | 'hit' | 'undetermined' | 'clear' | 'all'\n\nexport interface RiskFilter {\n code: string | null\n state: StateFilter\n query: string\n}\n\nexport const DEFAULT_FILTER: RiskFilter = { code: null, state: 'affected', query: '' }\n\nfunction matchesState(states: readonly FlagState[], wanted: StateFilter): boolean {\n if (wanted === 'all') return true\n if (wanted === 'affected') return states.some((state) => state === 'hit' || state === 'undetermined')\n if (wanted === 'clear') return states.every((state) => state !== 'hit' && state !== 'undetermined')\n return states.includes(wanted)\n}\n\nexport function recordLabel(record: RecordView): string {\n const key = record.key\n return key === null || key === undefined || key === '' ? `#${record.index + 1}` : String(key)\n}\n\nfunction matchesQuery(record: RecordView, query: string): boolean {\n const needle = query.trim().toLocaleLowerCase('de')\n if (!needle) return true\n const haystack = [recordLabel(record), ...record.codes, ...record.hits.map((hit) => hit.reason)]\n return haystack.some((text) => text.toLocaleLowerCase('de').includes(needle))\n}\n\nexport function filterRecords(evaluation: Evaluation, filter: RiskFilter): RecordView[] {\n const codes = filter.code ? [filter.code] : recordRules(evaluation).map((rule) => rule.code)\n return evaluation.records.filter((record) => {\n const states = codes.map((code) => flagState(record, code, evaluation.skipped))\n return matchesState(states, filter.state) && matchesQuery(record, filter.query)\n })\n}\n\n/** Ein Eintrag der Detailansicht: Treffer oder unbestimmtes Merkmal eines Datensatzes. */\nexport interface FlagEntry {\n code: string\n label: string\n state: 'hit' | 'undetermined'\n reason: string\n severity: string | null\n note: string | null\n inputs: JsonObject\n parameters: JsonObject\n evidence: JsonObject\n origin: JsonObject\n messages: Record<string, string> | null\n}\n\nfunction hitEntry(hit: FlagHit, rule: RuleView | undefined, inputs: JsonObject): FlagEntry {\n return {\n code: hit.code, label: hit.label, state: 'hit', reason: hit.reason, severity: hit.severity, note: hit.note,\n inputs: hit.inputs ?? inputs, parameters: rule?.parameters ?? {}, evidence: hit.evidence, origin: hit.origin,\n messages: hit.messages,\n }\n}\n\n/** Angaben der Regel für einen Eintrag; ohne Regel (unbekannter Code) neutrale Werte. */\nfunction ruleFacts(code: string, rule: RuleView | undefined): Pick<FlagEntry, 'label' | 'severity' | 'note' | 'parameters' | 'origin'> {\n if (!rule) return { label: code, severity: null, note: null, parameters: {}, origin: {} }\n return { label: rule.label ?? code, severity: rule.severity ?? null, note: rule.note ?? null, parameters: rule.parameters ?? {}, origin: rule.origin ?? {} }\n}\n\nfunction undeterminedEntry(code: string, reason: string, rule: RuleView | undefined, inputs: JsonObject): FlagEntry {\n return { code, state: 'undetermined', reason, inputs, evidence: {}, messages: null, ...ruleFacts(code, rule) }\n}\n\n/** Treffer und unbestimmte Merkmale eines Datensatzes in Profilreihenfolge. */\nexport function recordEntries(record: RecordView, rules: readonly RuleView[]): FlagEntry[] {\n const byCode = new Map(rules.map((rule) => [rule.code, rule]))\n const order = new Map(rules.map((rule, index) => [rule.code, index]))\n const entries = [\n ...record.hits.map((hit) => hitEntry(hit, byCode.get(hit.code), record.inputs?.[hit.code] ?? {})),\n ...Object.entries(record.undetermined).map(([code, reason]) =>\n undeterminedEntry(code, reason, byCode.get(code), record.inputs?.[code] ?? {})),\n ]\n return entries.sort((a, b) => (order.get(a.code) ?? 0) - (order.get(b.code) ?? 0))\n}\n\n/** Objekt als Liste `[Schlüssel, Wert]` in Einfügereihenfolge (für deklarative Tabellen). */\nexport function pairs(value: JsonObject | null | undefined): Array<[string, JsonValue]> {\n return value ? Object.entries(value) : []\n}\n","/** Anzeigeformate und Beschriftungen der Risiko-Merkmale (framework-frei). */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent } from '@auditcore/common'\nimport type { Locale } from '../i18n'\nimport type { JsonValue } from './types'\nimport type { FlagState } from './state'\n\n/** Farbton wie `FaBadge` (`tone`). */\nexport type Tone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger'\n\n/** Wert eines Eingabefelds: leer ausdrücklich, Zahlen im Sprachformat. */\nconst BOOLEAN_TEXT: Readonly<Record<Locale, readonly [string, string]>> = { de: ['ja', 'nein'], en: ['yes', 'no'] }\n\nfunction formatBoolean(value: boolean, locale: Locale): string {\n const [yes, no] = BOOLEAN_TEXT[locale]\n return value ? yes : no\n}\n\nexport function formatValue(value: JsonValue | undefined, locale: Locale, empty: string): string {\n if (value === null || value === undefined || value === '') return empty\n if (typeof value === 'number') return formatNumber(value, locale, { maximumFractionDigits: 4 })\n if (typeof value === 'boolean') return formatBoolean(value, locale)\n if (Array.isArray(value)) return value.map((item) => formatValue(item, locale, empty)).join('; ')\n if (typeof value === 'object') return JSON.stringify(value)\n return value\n}\n\nexport function formatShare(share: number, locale: Locale): string {\n return formatPercent(share, locale, 1)\n}\n\nexport function formatAmount(value: number | null, locale: Locale): string {\n return value === null ? '' : formatNumber(value, locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })\n}\n\nconst SEVERITY_TONES: Readonly<Record<string, Tone>> = {\n CRITICAL: 'danger',\n HIGH: 'danger',\n MEDIUM: 'warning',\n LOW: 'accent',\n INFO: 'neutral',\n}\n\nexport function severityTone(severity: string | null): Tone {\n return severity ? (SEVERITY_TONES[severity] ?? 'neutral') : 'neutral'\n}\n\n/** Symbol je Zustand: Farbe ist nie der einzige Träger der Bedeutung. */\nexport const STATE_ICONS: Readonly<Record<FlagState, string>> = {\n hit: '!',\n undetermined: '?',\n clear: '–',\n skipped: '⤼',\n absent: '·',\n}\n\nexport function stateTone(state: FlagState): Tone {\n if (state === 'hit') return 'danger'\n if (state === 'undetermined') return 'warning'\n return 'neutral'\n}\n\n/** Bekannte Parameter der Regelarten; unbekannte behalten ihren Schlüssel. */\nconst PARAMETER_LABELS: Readonly<Record<string, { de: string; en: string }>> = {\n multiple: { de: 'glattes Vielfaches von', en: 'round multiple of' },\n amount_gt: { de: 'Betrag größer als', en: 'amount greater than' },\n 'thresholds.static': { de: 'Wertgrenzen', en: 'value limits' },\n 'lower.proximity': { de: 'Nähe unter der Schwelle (Anteil)', en: 'proximity below threshold (share)' },\n threshold: { de: 'Schwelle', en: 'threshold' },\n value: { de: 'Vergleichswert', en: 'comparison value' },\n ratio_gt: { de: 'Quote größer als', en: 'ratio greater than' },\n rate_gt: { de: 'Quote größer als (%)', en: 'rate greater than (%)' },\n total_min: { de: 'Mindestanzahl', en: 'minimum count' },\n min_length: { de: 'Mindestlänge', en: 'minimum length' },\n 'group.cases_gt': { de: 'Gruppe: Vorhaben mehr als', en: 'group: cases more than' },\n 'group.sum_gt': { de: 'Gruppe: Summe größer als', en: 'group: sum greater than' },\n 'pair.count_gt': { de: 'Paar: Belege mehr als', en: 'pair: records more than' },\n 'pair.sum_gt': { de: 'Paar: Summe größer als', en: 'pair: sum greater than' },\n share_gte: { de: 'Anteil mindestens', en: 'share at least' },\n}\n\nexport function parameterLabel(key: string, locale: Locale): string {\n const label = PARAMETER_LABELS[key]\n return label ? label[locale] : key\n}\n","/** Zuordnung fachlicher Zustände zu Textschlüsseln (framework-frei). */\nimport type { RiskMessageKey } from './messages'\nimport type { FlagState, StateFilter } from './state'\n\nexport const STATE_KEYS: Readonly<Record<FlagState, RiskMessageKey>> = {\n hit: 'stateHit',\n undetermined: 'stateUndetermined',\n clear: 'stateClear',\n skipped: 'stateSkipped',\n absent: 'stateAbsent',\n}\n\nexport const STATE_FILTER_KEYS: Readonly<Record<StateFilter, RiskMessageKey>> = {\n affected: 'filterAffected',\n hit: 'stateHit',\n undetermined: 'stateUndetermined',\n clear: 'stateClear',\n all: 'filterAll',\n}\n\nconst STATUS_KEYS: Readonly<Record<string, RiskMessageKey>> = {\n APPROVED: 'statusApproved',\n LEGACY_CHARACTERIZED: 'statusLegacy',\n CANDIDATE_HUMAN_DECISION_REQUIRED: 'statusCandidate',\n}\n\nconst STATUS_HINTS: Readonly<Record<string, RiskMessageKey>> = {\n LEGACY_CHARACTERIZED: 'statusHintLegacy',\n CANDIDATE_HUMAN_DECISION_REQUIRED: 'statusHintCandidate',\n}\n\nexport function statusKey(status: string): RiskMessageKey | null {\n return STATUS_KEYS[status] ?? null\n}\n\n/** Hinweis für nicht freigegebene Profile, sonst `null`. */\nexport function statusHintKey(status: string): RiskMessageKey | null {\n return STATUS_HINTS[status] ?? null\n}\n\nconst REQUIREMENT_KEYS: Readonly<Record<string, RiskMessageKey>> = {\n required: 'required',\n value_required: 'valueRequired',\n optional: 'optional',\n}\n\nexport function requirementKey(requirement: string): RiskMessageKey {\n return REQUIREMENT_KEYS[requirement] ?? 'optional'\n}\n\nconst WHEN_MISSING_KEYS: Readonly<Record<string, RiskMessageKey>> = {\n error: 'missingError',\n skip: 'missingSkip',\n all_false: 'missingAllFalse',\n undetermined: 'missingUndetermined',\n}\n\nexport function whenMissingKey(mode: string): RiskMessageKey {\n return WHEN_MISSING_KEYS[mode] ?? 'missingError'\n}\n","/**\n * Port der Risiko-Komponenten zu `auditcore_risk.web` (docs/ui/risk-rest.md).\n * Komponenten erhalten den Port als Prop und rufen nie selbst `fetch` auf;\n * `createRiskRestPort` ist die mitgelieferte REST-Umsetzung.\n */\nimport { requestJson, type RestOptions } from '@auditcore/common'\nimport type { Evaluation, JsonObject, ProfileDetail, ProfileReference } from './types'\n\nexport interface EvaluateRequest {\n profile: { id: string; version: string }\n records: readonly JsonObject[]\n columns?: readonly string[]\n reference_date?: string\n record_key?: string\n flatten?: boolean\n points?: Readonly<Record<string, number>>\n}\n\nexport interface ProfileSummary extends ProfileReference {\n kind: string\n legal_status: string\n rule_count: number\n field_count: number\n open_decision_count: number\n}\n\nexport interface ColumnCheck {\n profile: ProfileReference\n columns: string[]\n complete: boolean\n aborts: boolean\n rules: Array<{ code: string; label: string; missing: string[]; when_missing_columns: string }>\n}\n\nexport interface RiskPort {\n profiles(): Promise<ProfileSummary[]>\n profile(id: string, version: string): Promise<ProfileDetail>\n checkColumns(id: string, version: string, columns: readonly string[]): Promise<ColumnCheck>\n evaluate(request: EvaluateRequest): Promise<Evaluation>\n}\n\nfunction profilePath(id: string, version: string): string {\n return `/profiles/${encodeURIComponent(id)}/${encodeURIComponent(version)}`\n}\n\n/** REST-Umsetzung des Ports, z. B. `createRiskRestPort({ baseUrl: '/api/risk' })`. */\nexport function createRiskRestPort(options: RestOptions): RiskPort {\n return {\n profiles: async () => (await requestJson<{ profiles: ProfileSummary[] }>(options, '/profiles')).profiles,\n profile: (id, version) => requestJson<ProfileDetail>(options, profilePath(id, version)),\n checkColumns: (id, version, columns) =>\n requestJson<ColumnCheck>(options, `${profilePath(id, version)}/check-columns`, { columns }),\n evaluate: (request) => requestJson<Evaluation>(options, '/evaluate', request),\n }\n}\n","// Zustandsautomat von <flowaudit-risk-flags> (Vue und React): Filter,\n// Datensatzauswahl und nachgeladene Profilbeschreibung; alles Übrige sind\n// reine Selektoren über der Auswertung.\n\nimport type { TableColumn, TableRow } from '@auditcore/common'\nimport type { Translate } from '../i18n'\nimport { createStore } from '../store'\nimport type { RiskMessageKey } from './messages'\nimport type { RiskPort } from './port'\nimport { statusHintKey, statusKey } from './labels'\nimport {\n DEFAULT_FILTER,\n distribution,\n filterRecords,\n flagState,\n recordEntries,\n recordLabel,\n recordRules,\n totals,\n triggeredDataset,\n type FlagEntry,\n type RiskDistributionRow,\n type RiskFilter,\n type Totals,\n} from './state'\nimport type { DatasetFinding, Evaluation, ProfileDetail, ProfileReference, RecordView, RuleView } from './types'\n\nexport type RiskTranslate = Translate<RiskMessageKey>\n\n/** Eingaben der Gesamtansicht (Props). */\nexport interface RiskInputs {\n evaluation?: Evaluation | null\n profile?: ProfileDetail | null\n port?: RiskPort | null\n}\n\nexport interface RiskData {\n filter: RiskFilter\n selectedIndex: number | null\n /** Übergebene oder über den Port nachgeladene Profilbeschreibung. */\n profile: ProfileDetail | null\n profileError: string\n}\n\n/** Alles, was die Gesamtansicht aus Stand und Auswertung anzeigt (reine Funktion). */\nexport interface RiskSelection {\n rules: RuleView[]\n codes: string[]\n rows: RiskDistributionRow[]\n totals: Totals\n dataset: DatasetFinding[]\n records: RecordView[]\n tableColumns: TableColumn[]\n tableRows: TableRow[]\n selected: RecordView | null\n entries: FlagEntry[]\n}\n\nexport const EMPTY_EVALUATION: Evaluation = {\n library: '', profile: { id: '', version: '', fingerprint: '', status: '' }, records: [], dataset: [], skipped: {}, summary: [],\n}\n\nexport function riskTableColumns(rules: readonly RuleView[], recordText: string): TableColumn[] {\n return [\n { key: 'record', label: recordText, sortable: true },\n ...rules.map((rule) => ({ key: rule.code, label: rule.code, sortable: true, align: 'center' as const })),\n ]\n}\n\nexport function riskTableRows(evaluation: Evaluation, records: readonly RecordView[], rules: readonly RuleView[]): TableRow[] {\n return records.map((record) => {\n const row: Record<string, unknown> = { id: record.index, record: recordLabel(record) }\n for (const rule of rules) row[rule.code] = flagState(record, rule.code, evaluation.skipped)\n return row\n })\n}\n\nexport function selectRisk(state: Pick<RiskData, 'filter' | 'selectedIndex'>, given: Evaluation | null | undefined, recordText: string): RiskSelection {\n const evaluation = given ?? EMPTY_EVALUATION\n const rules = recordRules(evaluation)\n const records = filterRecords(evaluation, state.filter)\n const selected = evaluation.records.find((record) => record.index === state.selectedIndex) ?? null\n return {\n rules,\n codes: rules.map((rule) => rule.code),\n rows: distribution(evaluation),\n totals: totals(evaluation),\n dataset: triggeredDataset(evaluation),\n records,\n tableColumns: riskTableColumns(rules, recordText),\n tableRows: riskTableRows(evaluation, records, rules),\n selected,\n entries: selected ? recordEntries(selected, rules) : [],\n }\n}\n\n/** Sichtbarer Profilstatus („freigegeben“ …) oder der Rohwert. */\nexport function profileStatusText(profile: ProfileReference | null | undefined, t: RiskTranslate): string {\n const key = profile ? statusKey(profile.status) : null\n return key ? t(key) : (profile?.status ?? '')\n}\n\n/** Warnhinweis für nicht freigegebene Profile, sonst leer. */\nexport function profileHintText(profile: ProfileReference | null | undefined, t: RiskTranslate): string {\n const key = profile ? statusHintKey(profile.status) : null\n return key ? t(key) : ''\n}\n\nfunction errorText(failure: unknown): string {\n return failure instanceof Error ? failure.message : String(failure)\n}\n\nexport function createRiskController() {\n const store = createStore<RiskData>({ filter: { ...DEFAULT_FILTER }, selectedIndex: null, profile: null, profileError: '' })\n\n /**\n * Profilbeschreibung: die übergebene, sonst über den Port nachgeladen\n * (Profil und Version der Auswertung, nie ein Standardprofil). Ein Ergebnis\n * zählt nur, wenn die aktuelle Auswertung noch denselben Fingerabdruck hat.\n */\n async function loadProfile(inputs: RiskInputs, latest: () => RiskInputs): Promise<void> {\n const reference = inputs.evaluation?.profile\n store.set({ profileError: '', profile: inputs.profile ?? null })\n if (inputs.profile || !inputs.port || !reference?.id) return\n try {\n const loaded = await inputs.port.profile(reference.id, reference.version)\n if (latest().evaluation?.profile.fingerprint === reference.fingerprint) store.set({ profile: loaded })\n } catch (failure) {\n store.set({ profileError: errorText(failure) })\n }\n }\n\n return {\n store,\n loadProfile,\n setFilter: (filter: RiskFilter) => store.set({ filter }),\n /** Klick auf einen Code der Verteilung: nach diesem Merkmal filtern (Treffer oder unbestimmt). */\n selectCode: (code: string) => store.set((state) => ({ filter: { ...state.filter, code, state: 'affected' } })),\n /** Datensatz wählen; erneuter Klick hebt die Auswahl auf. Liefert die neue Auswahl. */\n toggleRecord(index: number): number | null {\n const next = store.get().selectedIndex === index ? null : index\n store.set({ selectedIndex: next })\n return next\n },\n select: (index: number | null) => store.set({ selectedIndex: index }),\n /** Neue Auswertung: Auswahl aufheben. */\n resetSelection: () => store.set({ selectedIndex: null }),\n }\n}\n\nexport type RiskController = ReturnType<typeof createRiskController>\n","import { defineMessages, type Translate } from '../i18n'\n\n/** Texte der Screening-Trefferprüfung (Sanktionslisten, PEP). */\nexport const screeningMessages = defineMessages({\n de: {\n title: 'Screening-Trefferprüfung',\n notice: 'Ein Treffer ist ein Prüfhinweis, keine Feststellung.',\n noPort: 'Kein Port übergeben: Eigenschaft „port“ setzen (z. B. createScreeningRestPort).',\n networkError: 'Verbindung fehlgeschlagen: {message}',\n selectRun: 'Prüflauf auswählen oder neu anlegen.',\n sources: 'Quellenstand',\n sourcesOfRun: 'Quellenstand zum Zeitpunkt des Prüflaufs',\n newRun: 'Neuer Prüflauf',\n runs: 'Prüfläufe',\n run: 'Prüflauf',\n runDated: 'Prüflauf {date}',\n hits: 'Treffer',\n comparison: 'Vergleich',\n breakdown: 'Score-Aufschlüsselung',\n decision: 'Entscheidung',\n secondReview: 'Zweitprüfung (Vier-Augen-Prinzip)',\n log: 'Protokoll',\n filters: 'Filter',\n reason: 'Begründung (Pflicht)',\n fourEyes: 'Zweitprüfung durch eine andere Person anfordern',\n fourEyesPolicy: 'Für diese Entscheidung ist die Zweitprüfung vorgeschrieben.',\n approve: 'Zustimmen',\n reject: 'Ablehnen',\n approved: 'zugestimmt',\n rejected: 'abgelehnt',\n input: 'Eingabe',\n listEntry: 'Listeneintrag',\n attribute: 'Merkmal',\n matchColumn: 'Abgleich',\n inconsistent: 'Die Aufschlüsselung lässt sich nicht vollständig nachrechnen. Maßgeblich ist der Ergebniswert der Bibliothek.',\n noSelection: 'Treffer auswählen, um ihn zu vergleichen und zu entscheiden.',\n final: 'Die Entscheidung ist abgeschlossen.',\n saveDecision: 'Entscheidung speichern',\n secondReviewHint: 'Die Zweitprüfung nimmt eine andere Person vor als die entscheidende.',\n lastDecision: 'Zuletzt: {outcome} durch {actor} am {date}',\n fourEyesMarker: '(Vier-Augen-Prinzip)',\n fourEyesMarkerPolicy: '(Vier-Augen-Prinzip, vorgeschrieben)',\n secondReviewDone: 'Zweitprüfung: {result} durch {actor} am {date}',\n nextOpen: 'Nächster offener Treffer',\n hints: 'Hinweise: {hints}',\n all: 'alle',\n filterStatus: 'Prüfstatus',\n filterList: 'Liste',\n filterSubject: 'Geprüfter Name',\n filterConfidence: 'Ähnlichkeitsstufe',\n filterMinScore: 'Mindestscore',\n filterText: 'Suche im Eintrag',\n born: 'geb. {date}',\n countryOf: 'Land {country}',\n normalized: 'Vergleichsform „{query}“',\n queriedLists: 'Abgefragte Listen',\n findingSearched: '{list}: {count} Treffer, Stand {date}',\n findingNotSearched: '{list}: nicht abgefragt',\n noHitsFiltered: 'Keine Treffer im aktuellen Filter.',\n noHits: 'Keine Treffer.',\n viaAlias: 'über Alias „{name}“',\n dobConflict: 'Geburtsjahr weicht ab',\n countryConflict: 'Land weicht ab',\n truncated: 'Es gibt weitere Treffer ({total} insgesamt); Mindestwert erhöhen oder Limit anpassen.',\n limitations: 'Grenzen des Abgleichs',\n logEmpty: 'Keine Einträge.',\n logSecondReview: '{result} (Vorschlag: {outcome})',\n logFourEyes: ', Zweitprüfung angefordert',\n logSubjects: '{count} Namen geprüft',\n profileLine: 'Profil {id} {version}',\n namesHits: '{names} Namen, {hits} Treffer',\n incompleteRun: 'Für {count} Namen wurden nicht alle Listen abgefragt. Ein Ergebnis ohne Treffer belegt dort keine Unbedenklichkeit.',\n kind: 'Prüfart',\n profile: 'Profil',\n recommended: '(empfohlen)',\n lists: 'Listen',\n noStock: 'kein Bestand',\n noStockRun: 'kein Bestand – wird als „nicht abgefragt“ geführt',\n noStockHint: 'Ohne Bestand wird die Liste nicht abgefragt.',\n subjects: 'Namen (je Zeile: Name; Geburtsdatum; Land; Bezug)',\n subjectsPlaceholder: 'Erika Beispiel; 1970-01-31; de; Auftragnehmer Los 1',\n minScore: 'Mindestwert ({min}–{max})',\n caseReference: 'Vorgangsbezug (optional)',\n startRun: 'Prüflauf starten',\n noRuns: 'Noch keine Prüfläufe.',\n runSummary: '{kind} · {names} Namen · {hits} Treffer · {date} · {actor}',\n complete: 'abgeschlossen',\n openCount: '{count} offen',\n incompleteCount: '{count} unvollständig',\n method: 'Verfahren {method}, Skala {min}–{max}',\n level: 'Stufe: {label}',\n minScoreBadge: 'Mindestwert {value}',\n classFrom: '{label} ab {value}',\n checkedAt: 'geprüft {date}',\n noSources: 'Keine Listen eingerichtet.',\n asOf: 'Stand {date}',\n unknown: 'unbekannt',\n entries: '{count} Einträge',\n columnList: 'Liste',\n columnEntries: 'Einträge',\n columnAsOf: 'Stand',\n via: '{kind} · {issuer} · über {provider}',\n dataLicence: 'Datenlizenz: {status}',\n ageUnknown: 'Alter unbekannt',\n ageToday: 'jünger als ein Tag',\n ageOne: 'vor 1 Tag',\n ageDays: 'vor {days} Tagen',\n asOfUnknown: 'Stand unbekannt',\n rowName: 'Name',\n rowMatched: 'Getroffene Schreibweise',\n rowAliases: 'Aliasse',\n rowBirth: 'Geburtsdatum',\n rowCountry: 'Staatsangehörigkeit / Land',\n rowAddress: 'Adresse',\n rowIdentifiers: 'Kennungen',\n rowProgram: 'Programm / Rechtsakt / Funktion',\n rowList: 'Liste',\n rowAsOf: 'Stand der Liste',\n stateMatch: 'stimmt überein',\n stateConflict: 'widerspricht',\n stateNotCompared: 'nicht verglichen',\n errorOutcome: 'Bitte eine Entscheidung wählen.',\n errorReason: 'Eine Begründung ist Pflicht.',\n errorReasonLength: 'Die Begründung ist länger als 4000 Zeichen.',\n errorLine: 'Zeile {line}: Name mit mindestens 3 Zeichen angeben.',\n errorNoSubject: 'Mindestens einen Namen angeben.',\n errorProfile: 'Bitte ein Profil wählen.',\n errorLists: 'Mindestens eine Liste auswählen.',\n status_open: 'offen',\n status_pending_second_review: 'wartet auf Zweitprüfung',\n status_confirmed: 'bestätigt',\n status_dismissed: 'verworfen',\n status_deferred: 'zurückgestellt',\n action_confirmed: 'Treffer bestätigen',\n action_dismissed: 'Treffer verwerfen',\n action_deferred: 'Zurückstellen',\n hint_confirmed: 'Identität mit dem Listeneintrag ist belegt.',\n hint_dismissed: 'Keine Identität mit dem Listeneintrag (Falschtreffer).',\n hint_deferred: 'Klärung offen, später erneut entscheiden.',\n subject_HITS: 'Treffer zur Prüfung',\n subject_NO_HITS: 'keine Treffer in den abgefragten Listen',\n subject_INCOMPLETE: 'keine Treffer, aber nicht alle Listen abgefragt',\n subject_NOT_SEARCHED: 'nicht abgefragt – kein Listenbestand',\n fresh_current: 'aktuell',\n fresh_stale: 'veraltet',\n fresh_unknown: 'Stand unbekannt',\n fresh_not_judged: 'nicht bewertet',\n class_exact: 'exakt',\n class_high: 'hoch',\n class_medium: 'mittel',\n class_low: 'niedrig',\n class_fuzzy: 'unscharf',\n kind_sanctions: 'Sanktionslisten',\n kind_pep: 'Politisch exponierte Personen (PEP)',\n indicator_token_subset: 'Namensteile nur teilweise enthalten',\n indicator_alias_match: 'Treffer über Alias',\n indicator_date_of_birth_not_compared: 'Geburtsdatum nicht verglichen',\n indicator_country_not_compared: 'Land nicht verglichen',\n indicator_below_min_score_after_adjustment: 'nach Abgleich unter dem Mindestwert',\n },\n en: {\n title: 'Screening hit review',\n notice: 'A hit is an indication to review, not a finding.',\n noPort: 'No port given: set the property “port” (e.g. createScreeningRestPort).',\n networkError: 'Connection failed: {message}',\n selectRun: 'Select or create a screening run.',\n sources: 'Source status',\n sourcesOfRun: 'Source status at the time of the run',\n newRun: 'New screening run',\n runs: 'Screening runs',\n run: 'Screening run',\n runDated: 'Screening run {date}',\n hits: 'Hits',\n comparison: 'Comparison',\n breakdown: 'Score breakdown',\n decision: 'Decision',\n secondReview: 'Second review (four-eyes principle)',\n log: 'Log',\n filters: 'Filters',\n reason: 'Reason (required)',\n fourEyes: 'Request a second review by another person',\n fourEyesPolicy: 'A second review is mandatory for this decision.',\n approve: 'Approve',\n reject: 'Reject',\n approved: 'approved',\n rejected: 'rejected',\n input: 'Input',\n listEntry: 'List entry',\n attribute: 'Attribute',\n matchColumn: 'Match',\n noSelection: 'Select a hit to compare and decide.',\n final: 'The decision is final.',\n saveDecision: 'Save decision',\n nextOpen: 'Next open hit',\n all: 'all',\n noHits: 'No hits.',\n logEmpty: 'No entries.',\n startRun: 'Start run',\n noRuns: 'No runs yet.',\n status_open: 'open',\n status_pending_second_review: 'awaiting second review',\n status_confirmed: 'confirmed',\n status_dismissed: 'dismissed',\n status_deferred: 'deferred',\n action_confirmed: 'Confirm hit',\n action_dismissed: 'Dismiss hit',\n action_deferred: 'Defer',\n kind_sanctions: 'Sanctions lists',\n kind_pep: 'Politically exposed persons (PEP)',\n errorOutcome: 'Please choose a decision.',\n errorReason: 'A reason is required.',\n },\n})\n\nexport type ScreeningKey = keyof typeof screeningMessages.de\nexport type ScreeningTranslate = Translate<ScreeningKey>\n\n/** Beschriftung eines Codes aus dem Vertrag (Status, Stufe, Hinweis); unbekannte Codes bleiben stehen. */\nexport function codeLabel(t: ScreeningTranslate, prefix: string, code: string): string {\n const key = `${prefix}_${code}`\n return key in screeningMessages.de ? t(key as ScreeningKey) : code\n}\n","import { requestJson, type RestOptions } from '@auditcore/common'\nimport type { RunQuery, ScreeningPort } from './types'\n\nconst segment = encodeURIComponent\n\nfunction withQuery(path: string, query: RunQuery = {}): string {\n const params = new URLSearchParams(Object.entries(query).filter(([, value]) => value !== undefined && value !== ''))\n const text = params.toString()\n return text ? `${path}?${text}` : path\n}\n\n/** Port auf den REST-Vertrag `screening_review/1` von `auditcore_registry_sources.web`. */\nexport function createScreeningRestPort(options: RestOptions): ScreeningPort {\n const hit = (runId: string, hitId: string): string => `/runs/${segment(runId)}/hits/${segment(hitId)}`\n return {\n settings: () => requestJson(options, '/settings'),\n sources: () => requestJson(options, '/sources'),\n runs: () => requestJson(options, '/runs'),\n createRun: (request) => requestJson(options, '/runs', request),\n run: (runId, query) => requestJson(options, withQuery(`/runs/${segment(runId)}`, query)),\n log: (runId) => requestJson(options, `/runs/${segment(runId)}/log`),\n decide: (runId, hitId, decision) => requestJson(options, `${hit(runId, hitId)}/decision`, decision),\n secondReview: (runId, hitId, review) => requestJson(options, `${hit(runId, hitId)}/second-review`, review),\n }\n}\n","// Typen des REST-Vertrags auditcore_registry_sources.screening_review/1\n// (Server: auditcore_registry_sources/web/_types.py, Doku: docs/ui/screening-rest.md).\n\nexport const CONTRACT = 'auditcore_registry_sources.screening_review/1'\n\nexport type ScreeningKind = 'sanctions' | 'pep'\nexport type Outcome = 'confirmed' | 'dismissed' | 'deferred'\nexport type ReviewStatus = 'open' | 'pending_second_review' | Outcome\nexport type SubjectStatus = 'HITS' | 'NO_HITS' | 'INCOMPLETE' | 'NOT_SEARCHED'\nexport type FreshnessStatus = 'current' | 'stale' | 'unknown' | 'not_judged'\n\nexport interface ActorView {\n id: string\n display_name: string\n}\n\nexport interface SubjectInput {\n subject_id: string\n name: string\n birth_date: string | null\n country: string | null\n schema: string | null\n reference: string | null\n}\n\nexport interface EntryView {\n entry_id: string\n schema: string\n name: string\n aliases: string[]\n aliases_total: number\n birth_date: string\n countries: string\n addresses: string\n identifiers: string\n sanctions: string\n program_ids: string\n first_seen: string\n last_seen: string\n dataset: string\n}\n\nexport interface BreakdownStep {\n step: 'normalization' | 'base' | 'adjustment' | 'clamp' | 'result'\n label: string\n value?: string\n detail?: string\n points?: number\n kind?: string\n}\n\nexport interface ScoreClass {\n class: string\n label: string\n from: number\n}\n\nexport interface Breakdown {\n method: string\n scale: { min: number; max: number }\n steps: BreakdownStep[]\n min_score: number\n classes: ScoreClass[]\n class: string\n class_label: string\n consistent: boolean\n}\n\nexport interface DecisionView {\n outcome: Outcome\n reason: string\n four_eyes: boolean\n four_eyes_source: 'policy' | 'requested' | null\n actor: ActorView\n at: string\n sequence: number\n}\n\nexport interface SecondReviewView {\n approve: boolean\n reason: string\n actor: ActorView\n at: string\n sequence: number\n}\n\nexport interface ReviewView {\n status: ReviewStatus\n status_label: string\n sequence: number\n decision: DecisionView | null\n second_review: SecondReviewView | null\n events: number\n}\n\nexport interface HitView {\n hit_id: string\n subject_id: string\n list_key: string\n list_name: string\n source_key: string | null\n entry: EntryView\n matched_name: string\n matched_field: 'name' | 'alias'\n raw_score: number\n score: number\n confidence: string\n dob_conflict: boolean\n country_conflict: boolean\n below_min_score: boolean\n indicators: string[]\n breakdown: Breakdown\n review: ReviewView\n}\n\nexport interface FindingView {\n list_key: string\n list_name: string\n source_key: string | null\n searched: boolean\n entry_count: number\n as_of: string | null\n retrieved_at: string | null\n hit_count: number\n note: string | null\n}\n\nexport interface SubjectView {\n subject_id: string\n input: SubjectInput\n status: SubjectStatus\n normalized_query: string\n min_score: number\n findings: FindingView[]\n hits: HitView[]\n hits_before_filter: number\n total_hits: number\n truncated: boolean\n notice: string\n limitations: string[]\n}\n\nexport interface FreshnessView {\n status: FreshnessStatus\n label: string\n age_days: number | null\n stale_after_days: number | null\n}\n\nexport interface ListInfo {\n key: string\n source_key: string | null\n name: string\n issuer: string\n url: string\n format: string\n provider: string\n licence_claimed_in_source: string | null\n data_licence: { status?: string; note?: string }\n}\n\nexport interface SourceView {\n list: ListInfo\n kind: ScreeningKind\n entry_count: number\n as_of: string | null\n retrieved_at: string | null\n content_sha256: string | null\n note: string | null\n searchable: boolean\n freshness: FreshnessView\n}\n\nexport interface ProfileView {\n id: string\n version: string\n fingerprint: string\n status: string\n kind: ScreeningKind\n legal_status: string\n default_min_score: number\n scale: { min: number; max: number }\n recommended: boolean\n}\n\nexport interface SettingsView {\n contract: string\n profiles: ProfileView[]\n four_eyes_outcomes: Outcome[]\n stale_after_days: number | null\n}\n\nexport interface SourcesView {\n contract: string\n checked_at: string\n sources: SourceView[]\n}\n\nexport interface RunSummary {\n run_id: string\n created_at: string\n created_by: ActorView\n kind: ScreeningKind\n case_reference: string | null\n profile: { id: string; version: string; fingerprint: string; status: string }\n subject_count: number\n subjects_with_hits: number\n subjects_incomplete: number\n hit_count: number\n review_counts: Record<ReviewStatus, number>\n review_complete: boolean\n last_sequence: number\n}\n\nexport interface RunRequestRecord {\n kind: ScreeningKind\n profile: RunSummary['profile']\n lists: string[]\n min_score: number | null\n limit: number\n case_reference: string | null\n subjects: SubjectInput[]\n}\n\nexport interface RunView extends RunSummary {\n contract: string\n request: RunRequestRecord\n sources: SourceView[]\n subjects: SubjectView[]\n}\n\nexport interface LogEntry {\n run_id: string\n sequence: number\n type: 'run_created' | 'decision_recorded' | 'second_review_recorded'\n type_label: string\n at: string\n actor: ActorView\n hit_id: string | null\n hit?: { subject_name: string; entry_name: string; list_name: string } | null\n data: Record<string, unknown>\n outcome_label?: string\n}\n\nexport interface LogView {\n contract: string\n run_id: string\n events: LogEntry[]\n}\n\nexport interface SubjectRequest {\n name: string\n birth_date?: string\n country?: string\n schema?: string\n reference?: string\n}\n\nexport interface RunRequest {\n kind: ScreeningKind\n profile: { id: string; version: string }\n subjects: SubjectRequest[]\n lists?: string[]\n min_score?: number\n limit?: number\n case_reference?: string\n}\n\nexport interface DecisionRequest {\n outcome: Outcome\n reason: string\n four_eyes: boolean\n expected_sequence?: number\n}\n\nexport interface SecondReviewRequest {\n approve: boolean\n reason: string\n expected_sequence?: number\n}\n\nexport interface ApiErrorBody {\n error: { code: string; message: string; details: Record<string, unknown> }\n}\n\nexport type RunQuery = Partial<Record<'status' | 'list' | 'subject' | 'confidence' | 'min_score', string>>\n\n/**\n * Port der Screening-Trefferprüfung. Die Komponente ruft nie selbst `fetch`\n * auf; `createScreeningRestPort` ist die mitgelieferte REST-Umsetzung.\n */\nexport interface ScreeningPort {\n settings: () => Promise<SettingsView>\n sources: () => Promise<SourcesView>\n runs: () => Promise<{ contract: string; runs: RunSummary[] }>\n createRun: (request: RunRequest) => Promise<RunView>\n run: (runId: string, query?: RunQuery) => Promise<RunView>\n log: (runId: string) => Promise<LogView>\n decide: (runId: string, hitId: string, decision: DecisionRequest) => Promise<HitView>\n secondReview: (runId: string, hitId: string, review: SecondReviewRequest) => Promise<HitView>\n}\n","// Framework-freie View-Logik der Screening-Trefferprüfung: Filter, Formatierung,\n// Vergleichszeilen, Aufschlüsselung, Entscheidungsregeln. Keine Vue-Abhängigkeit.\n\nimport { intlFormatNumber as formatNumber } from '@auditcore/common'\nimport type { Locale, MessageParams } from '../i18n'\nimport { codeLabel, type ScreeningKey, type ScreeningTranslate } from './messages'\nimport type {\n Breakdown,\n FindingView,\n FreshnessStatus,\n HitView,\n Outcome,\n ReviewStatus,\n ReviewView,\n RunView,\n SettingsView,\n SubjectRequest,\n SubjectView,\n} from './types'\n\nexport interface HitFilter {\n statuses: ReviewStatus[]\n lists: string[]\n subjects: string[]\n confidences: string[]\n minScore: number | null\n text: string\n}\n\nexport function emptyFilter(): HitFilter {\n return { statuses: [], lists: [], subjects: [], confidences: [], minScore: null, text: '' }\n}\n\nfunction matchesText(hit: HitView, text: string): boolean {\n if (!text) return true\n const needle = text.toLocaleLowerCase('de')\n const haystack = [hit.entry.name, hit.matched_name, ...hit.entry.aliases, hit.list_name]\n return haystack.some((value) => value.toLocaleLowerCase('de').includes(needle))\n}\n\nexport function acceptsHit(hit: HitView, filter: HitFilter): boolean {\n const checks: [string[], string][] = [\n [filter.statuses, hit.review.status],\n [filter.lists, hit.list_key],\n [filter.subjects, hit.subject_id],\n [filter.confidences, hit.confidence],\n ]\n if (checks.some(([allowed, value]) => allowed.length > 0 && !allowed.includes(value))) return false\n if (filter.minScore !== null && hit.score < filter.minScore) return false\n return matchesText(hit, filter.text.trim())\n}\n\n/** Subjects with only the hits passing the filter; subjects themselves stay visible. */\nexport function filterSubjects(subjects: SubjectView[], filter: HitFilter): SubjectView[] {\n return subjects.map((subject) => ({\n ...subject,\n hits: subject.hits.filter((hit) => acceptsHit(hit, filter)),\n }))\n}\n\nexport interface FilterOptions {\n lists: { key: string; name: string }[]\n subjects: { id: string; name: string }[]\n confidences: string[]\n}\n\nexport function filterOptions(run: RunView): FilterOptions {\n const lists = new Map<string, string>()\n const confidences = new Set<string>()\n for (const subject of run.subjects) {\n for (const finding of subject.findings) lists.set(finding.list_key, finding.list_name)\n for (const hit of subject.hits) confidences.add(hit.confidence)\n }\n return {\n lists: [...lists].map(([key, name]) => ({ key, name })),\n subjects: run.subjects.map((s) => ({ id: s.subject_id, name: s.input.name })),\n confidences: [...confidences],\n }\n}\n\nconst decimals = (scale: { max: number }): number => (scale.max <= 1 ? 2 : 1)\n\nexport function formatScore(value: number, scale: { max: number }, locale: Locale = 'de'): string {\n const digits = decimals(scale)\n return formatNumber(value, locale, { minimumFractionDigits: digits, maximumFractionDigits: digits })\n}\n\nexport function formatPoints(value: number, scale: { max: number }, locale: Locale = 'de'): string {\n const text = formatScore(Math.abs(value), scale, locale)\n if (value > 0) return `+${text}`\n return value < 0 ? `−${text}` : text\n}\n\nexport function scorePercent(value: number, scale: { min: number; max: number }): number {\n const span = scale.max - scale.min\n if (span <= 0) return 0\n return Math.max(0, Math.min(100, ((value - scale.min) / span) * 100))\n}\n\nexport type Tone = 'plus' | 'minus' | 'neutral' | 'result'\n\nexport interface BreakdownRow {\n label: string\n value: string\n points: string\n tone: Tone\n}\n\nfunction stepTone(step: Breakdown['steps'][number]): Tone {\n if (step.step === 'result') return 'result'\n if (step.points === undefined || step.step === 'base') return 'neutral'\n if (step.points > 0) return 'plus'\n return step.points < 0 ? 'minus' : 'neutral'\n}\n\nexport function breakdownRows(breakdown: Breakdown, locale: Locale = 'de'): BreakdownRow[] {\n return breakdown.steps.map((step) => {\n const isDelta = step.step === 'adjustment' || step.step === 'clamp'\n const points =\n step.points === undefined\n ? ''\n : isDelta\n ? formatPoints(step.points, breakdown.scale, locale)\n : formatScore(step.points, breakdown.scale, locale)\n const value = step.value !== undefined ? `„${step.value}“` : ''\n return { label: step.label, value: [value, step.detail ?? ''].filter(Boolean).join(' · '), points, tone: stepTone(step) }\n })\n}\n\nconst DATE = /^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2}))?/\n\nexport function formatDate(value: string | null | undefined): string {\n if (!value) return '–'\n const match = DATE.exec(value)\n if (!match) return value\n const [, year, month, day, hour, minute] = match\n const date = `${day}.${month}.${year}`\n return hour !== undefined && minute !== undefined ? `${date}, ${hour}:${minute}` : date\n}\n\nexport function freshnessTone(status: FreshnessStatus): 'ok' | 'warn' | 'muted' {\n if (status === 'current') return 'ok'\n return status === 'not_judged' ? 'muted' : 'warn'\n}\n\nexport function formatAge(days: number | null, t: ScreeningTranslate): string {\n if (days === null) return t('ageUnknown')\n if (days < 1) return t('ageToday')\n const rounded = Math.round(days)\n return rounded === 1 ? t('ageOne') : t('ageDays', { days: rounded })\n}\n\nexport type MatchState = 'match' | 'conflict' | 'not_compared' | 'info'\n\nexport interface ComparisonRow {\n label: string\n input: string\n entry: string\n state: MatchState\n}\n\nfunction compareState(hit: HitView, conflict: boolean, notCompared: string): MatchState {\n if (hit.indicators.includes(notCompared)) return 'not_compared'\n return conflict ? 'conflict' : 'match'\n}\n\nconst orDash = (value: string | null | undefined): string => (value && value.trim() ? value : '–')\n\nexport function comparisonRows(subject: SubjectView, hit: HitView, t: ScreeningTranslate): ComparisonRow[] {\n const entry = hit.entry\n const finding = subject.findings.find((f) => f.list_key === hit.list_key)\n const aliases = entry.aliases.length ? entry.aliases.join('; ') : '–'\n const more = entry.aliases_total > entry.aliases.length ? ` (+${entry.aliases_total - entry.aliases.length})` : ''\n return [\n { label: t('rowName'), input: subject.input.name, entry: entry.name, state: 'info' },\n { label: t('rowMatched'), input: subject.normalized_query, entry: hit.matched_name, state: 'info' },\n { label: t('rowAliases'), input: '–', entry: aliases + more, state: 'info' },\n {\n label: t('rowBirth'),\n input: orDash(subject.input.birth_date),\n entry: orDash(entry.birth_date),\n state: compareState(hit, hit.dob_conflict, 'date_of_birth_not_compared'),\n },\n {\n label: t('rowCountry'),\n input: orDash(subject.input.country),\n entry: orDash(entry.countries),\n state: compareState(hit, hit.country_conflict, 'country_not_compared'),\n },\n { label: t('rowAddress'), input: '–', entry: orDash(entry.addresses), state: 'info' },\n { label: t('rowIdentifiers'), input: '–', entry: orDash(entry.identifiers), state: 'info' },\n { label: t('rowProgram'), input: '–', entry: orDash(entry.sanctions), state: 'info' },\n { label: t('rowList'), input: '–', entry: `${hit.list_name} (${entry.entry_id})`, state: 'info' },\n { label: t('rowAsOf'), input: '–', entry: findingState(finding, t), state: 'info' },\n ]\n}\n\nfunction findingState(finding: FindingView | undefined, t: ScreeningTranslate): string {\n if (!finding) return '–'\n return finding.as_of ? formatDate(finding.as_of) : t('asOfUnknown')\n}\n\nexport function indicatorLabels(hit: HitView, t: ScreeningTranslate): string[] {\n return hit.indicators.map((code) => codeLabel(t, 'indicator', code))\n}\n\nexport function requiresFourEyes(outcome: Outcome, settings: SettingsView | null): boolean {\n return settings !== null && settings.four_eyes_outcomes.includes(outcome)\n}\n\nexport const canDecide = (review: ReviewView): boolean => review.status === 'open' || review.status === 'deferred'\nexport const awaitsSecondReview = (review: ReviewView): boolean => review.status === 'pending_second_review'\n\nexport interface DecisionForm {\n outcome: Outcome | null\n reason: string\n fourEyes: boolean\n}\n\n/** Meldung als Katalogschlüssel mit Platzhaltern; die Komponente übersetzt sie. */\nexport interface ViewMessage {\n key: ScreeningKey\n params?: MessageParams\n}\n\nexport function validateDecision(form: DecisionForm): ViewMessage[] {\n const errors: ViewMessage[] = []\n if (form.outcome === null) errors.push({ key: 'errorOutcome' })\n if (!form.reason.trim()) errors.push({ key: 'errorReason' })\n if (form.reason.length > 4000) errors.push({ key: 'errorReasonLength' })\n return errors\n}\n\n/** The next hit still needing work after ``currentId`` (open, deferred or pending). */\nexport function nextOpenHit(subjects: SubjectView[], currentId: string | null): string | null {\n const hits = subjects.flatMap((s) => s.hits)\n const start = currentId === null ? 0 : hits.findIndex((h) => h.hit_id === currentId) + 1\n const ordered = [...hits.slice(start), ...hits.slice(0, start)]\n const next = ordered.find((h) => h.hit_id !== currentId && h.review.status !== 'confirmed' && h.review.status !== 'dismissed')\n return next ? next.hit_id : null\n}\n\nexport function findHit(run: RunView | null, hitId: string | null): { subject: SubjectView; hit: HitView } | null {\n if (!run || !hitId) return null\n for (const subject of run.subjects) {\n const hit = subject.hits.find((h) => h.hit_id === hitId)\n if (hit) return { subject, hit }\n }\n return null\n}\n\n/** One subject per line: ``Name; Geburtsdatum; Land; Bezug`` (only the name is required). */\nexport function parseSubjects(text: string): { subjects: SubjectRequest[]; errors: ViewMessage[] } {\n const subjects: SubjectRequest[] = []\n const errors: ViewMessage[] = []\n text.split(/\\r?\\n/).forEach((line, index) => {\n if (!line.trim()) return\n const [name = '', birthDate = '', country = '', reference = ''] = line.split(';').map((p) => p.trim())\n if (name.length < 3) {\n errors.push({ key: 'errorLine', params: { line: index + 1 } })\n return\n }\n const subject: SubjectRequest = { name }\n if (birthDate) subject.birth_date = birthDate\n if (country) subject.country = country\n if (reference) subject.reference = reference\n subjects.push(subject)\n })\n if (!subjects.length && !errors.length) errors.push({ key: 'errorNoSubject' })\n return { subjects, errors }\n}\n\n/** Replace one hit (after a decision) without reloading the whole run. */\nexport function replaceHit(run: RunView, updated: HitView): RunView {\n return {\n ...run,\n subjects: run.subjects.map((subject) => ({\n ...subject,\n hits: subject.hits.map((hit) => (hit.hit_id === updated.hit_id ? updated : hit)),\n })),\n }\n}\n","// Zustandsautomat der Screening-Trefferprüfung (<flowaudit-screening-review>,\n// Vue und React): Laden über den ScreeningPort, Prüfläufe, Filter, Auswahl,\n// Entscheidung und Zweitprüfung. Reine Selektoren liefern die Anzeige.\n\nimport { RestError } from '@auditcore/common'\nimport { createStore, type Store } from '../store'\nimport type {\n HitView,\n LogView,\n Outcome,\n RunRequest,\n RunSummary,\n RunView,\n ScreeningPort,\n SettingsView,\n SourcesView,\n SubjectView,\n} from './types'\nimport { emptyFilter, filterSubjects, findHit, nextOpenHit, replaceHit, type HitFilter } from './view'\n\n/** Fehler einer Portanfrage: Meldung des Servers bzw. `network_error` mit Status 0. */\nexport interface ScreeningError {\n code: string\n message: string\n status: number\n}\n\nexport interface ReviewEvents {\n onRunCreated?: (run: RunView) => void\n onDecided?: (payload: { runId: string; hitId: string; status: string }) => void\n onError?: (error: ScreeningError) => void\n /** Meldung für Fehler ohne Serverantwort (Netz, Programmfehler). */\n networkMessage?: (message: string) => string\n}\n\nexport interface ScreeningData {\n settings: SettingsView | null\n sources: SourcesView | null\n runs: RunSummary[]\n run: RunView | null\n log: LogView | null\n selectedHitId: string | null\n filter: HitFilter\n busy: boolean\n error: ScreeningError | null\n}\n\nexport interface ScreeningSelection {\n visibleSubjects: SubjectView[]\n selected: { subject: SubjectView; hit: HitView } | null\n}\n\nexport function selectScreening(state: ScreeningData): ScreeningSelection {\n return {\n visibleSubjects: state.run ? filterSubjects(state.run.subjects, state.filter) : [],\n selected: findHit(state.run, state.selectedHitId),\n }\n}\n\nexport function asScreeningError(error: unknown, events: ReviewEvents): ScreeningError {\n if (error instanceof RestError) return { code: error.code, message: error.message, status: error.status }\n const raw = error instanceof Error ? error.message : String(error)\n return { code: 'network_error', message: events.networkMessage?.(raw) ?? raw, status: 0 }\n}\n\n/** Leitet jede Anfrage an den aktuell gesetzten Port weiter (Web Components setzen ihn erst nach dem Einhängen). */\nfunction delegate(port: () => ScreeningPort | null | undefined): ScreeningPort {\n const active = (): ScreeningPort => {\n const current = port()\n if (!current) throw new Error('no_port')\n return current\n }\n return {\n settings: () => active().settings(),\n sources: () => active().sources(),\n runs: () => active().runs(),\n createRun: (request) => active().createRun(request),\n run: (runId, query) => active().run(runId, query),\n log: (runId) => active().log(runId),\n decide: (runId, hitId, decision) => active().decide(runId, hitId, decision),\n secondReview: (runId, hitId, review) => active().secondReview(runId, hitId, review),\n }\n}\n\ntype Guard = <T>(action: () => Promise<T>) => Promise<T | null>\n\ninterface Context {\n client: ScreeningPort\n events: () => ReviewEvents\n store: Store<ScreeningData>\n guard: Guard\n}\n\nfunction loadActions({ client, events, store, guard }: Context) {\n async function load(): Promise<void> {\n await guard(async () => {\n const [settings, sources, list] = await Promise.all([client.settings(), client.sources(), client.runs()])\n store.set({ settings, sources, runs: list.runs })\n })\n }\n\n async function openRun(runId: string): Promise<void> {\n await guard(async () => {\n const [run, log] = await Promise.all([client.run(runId), client.log(runId)])\n store.set({ run, log, selectedHitId: nextOpenHit(run.subjects, null) })\n })\n }\n\n async function createRun(request: RunRequest): Promise<boolean> {\n const created = await guard(() => client.createRun(request))\n if (!created) return false\n store.set({ run: created, selectedHitId: nextOpenHit(created.subjects, null) })\n store.set({ log: await client.log(created.run_id).catch(() => null) })\n store.set({ runs: (await client.runs().catch(() => ({ runs: store.get().runs }))).runs })\n events().onRunCreated?.(created)\n return true\n }\n\n return { load, openRun, createRun }\n}\n\nfunction decisionActions({ client, events, store, guard }: Context) {\n async function refresh(runId: string, hitId: string, status: string): Promise<void> {\n const [run, log, list] = await Promise.all([client.run(runId), client.log(runId), client.runs()])\n store.set({ run, log, runs: list.runs })\n events().onDecided?.({ runId, hitId, status })\n }\n\n /** Sendet eine Aktion zum ausgewählten Treffer mit der gelesenen Sequenz und aktualisiert danach Lauf und Protokoll. */\n async function submit(send: (run: RunView, hit: HitView) => Promise<HitView>): Promise<boolean> {\n const current = selectScreening(store.get()).selected\n const view = store.get().run\n if (!current || !view) return false\n const hit = await guard(() => send(view, current.hit))\n if (!hit) return false\n store.set({ run: replaceHit(view, hit) })\n await guard(() => refresh(view.run_id, hit.hit_id, hit.review.status))\n return true\n }\n\n const decide = (outcome: Outcome, reason: string, fourEyes: boolean): Promise<boolean> =>\n submit((run, hit) =>\n client.decide(run.run_id, hit.hit_id, { outcome, reason, four_eyes: fourEyes, expected_sequence: hit.review.sequence }),\n )\n\n const secondReview = (approve: boolean, reason: string): Promise<boolean> =>\n submit((run, hit) => client.secondReview(run.run_id, hit.hit_id, { approve, reason, expected_sequence: hit.review.sequence }))\n\n return { decide, secondReview }\n}\n\nconst INITIAL: ScreeningData = {\n settings: null,\n sources: null,\n runs: [],\n run: null,\n log: null,\n selectedHitId: null,\n filter: emptyFilter(),\n busy: false,\n error: null,\n}\n\nexport function createScreeningController(port: () => ScreeningPort | null | undefined, events: () => ReviewEvents = () => ({})) {\n const store = createStore<ScreeningData>({ ...INITIAL, filter: emptyFilter() })\n\n const guard: Guard = async (action) => {\n store.set({ busy: true, error: null })\n try {\n return await action()\n } catch (caught) {\n const failure = asScreeningError(caught, events())\n store.set({ error: failure })\n events().onError?.(failure)\n return null\n } finally {\n store.set({ busy: false })\n }\n }\n\n const context: Context = { client: delegate(port), events, store, guard }\n return {\n store,\n ...loadActions(context),\n ...decisionActions(context),\n select: (hitId: string | null) => store.set({ selectedHitId: hitId }),\n setFilter: (filter: HitFilter) => store.set({ filter: { ...filter } }),\n selectNext(): void {\n const { run, selectedHitId } = store.get()\n if (run) store.set({ selectedHitId: nextOpenHit(run.subjects, selectedHitId) })\n },\n }\n}\n\nexport type ScreeningController = ReturnType<typeof createScreeningController>\n","// Formularlogik „Neuer Prüflauf“ (Vue und React): Vorbelegung je Prüfart und\n// Aufbau der Anfrage mit Prüfung der Eingaben.\n\nimport type { ProfileView, RunRequest, ScreeningKind, SettingsView, SourceView } from './types'\nimport { parseSubjects, type ViewMessage } from './view'\n\nexport const SCREENING_KINDS: readonly ScreeningKind[] = ['sanctions', 'pep']\n\nexport interface RunForm {\n kind: ScreeningKind\n profileKey: string\n lists: string[]\n subjectsText: string\n minScore: number | null\n caseReference: string\n}\n\nexport const profileKeyOf = (profile: Pick<ProfileView, 'id' | 'version'>): string => `${profile.id}@${profile.version}`\n\nexport function kindProfiles(settings: SettingsView, kind: ScreeningKind): ProfileView[] {\n return settings.profiles.filter((profile) => profile.kind === kind)\n}\n\nexport function kindSources(sources: readonly SourceView[], kind: ScreeningKind): SourceView[] {\n return sources.filter((source) => source.kind === kind)\n}\n\nexport function selectedProfile(settings: SettingsView, form: Pick<RunForm, 'kind' | 'profileKey'>): ProfileView | undefined {\n return kindProfiles(settings, form.kind).find((profile) => profileKeyOf(profile) === form.profileKey)\n}\n\n/** Vorbelegung bei Wechsel der Prüfart oder neuen Einstellungen: empfohlenes Profil, alle Listen, Standard-Mindestwert. */\nexport function runFormDefaults(settings: SettingsView, sources: readonly SourceView[], kind: ScreeningKind): Pick<RunForm, 'profileKey' | 'lists' | 'minScore'> {\n const profiles = kindProfiles(settings, kind)\n const preferred = profiles.find((profile) => profile.recommended) ?? profiles[0]\n return {\n profileKey: preferred ? profileKeyOf(preferred) : '',\n lists: kindSources(sources, kind).map((source) => source.list.key),\n minScore: preferred ? preferred.default_min_score : null,\n }\n}\n\n/** Anfrage aus dem Formular; bei Fehlern `request: null` und die Meldungen als Katalogschlüssel. */\nexport function buildRunRequest(settings: SettingsView, form: RunForm): { request: RunRequest | null; errors: ViewMessage[] } {\n const parsed = parseSubjects(form.subjectsText)\n const profile = selectedProfile(settings, form)\n const errors = [...parsed.errors]\n if (!profile) errors.push({ key: 'errorProfile' })\n if (!form.lists.length) errors.push({ key: 'errorLists' })\n if (errors.length || !profile) return { request: null, errors }\n const request: RunRequest = { kind: form.kind, profile: { id: profile.id, version: profile.version }, subjects: parsed.subjects, lists: form.lists }\n if (form.minScore !== null) request.min_score = form.minScore\n if (form.caseReference.trim()) request.case_reference = form.caseReference.trim()\n return { request, errors }\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte des Datei-Imports (Stichprobe, Benford). */\nexport const tabularMessages = defineMessages({\n de: {\n file: 'Datei (CSV, TSV oder Text)',\n header: 'Erste Zeile enthält Spaltennamen',\n valueColumn: 'Wertspalte',\n idColumn: 'Kennungsspalte',\n stratumColumn: 'Schichtspalte',\n none: '– keine –',\n decimal: 'Dezimaltrennzeichen',\n decimalComma: 'Komma (1.234,56)',\n decimalDot: 'Punkt (1,234.56)',\n column: 'Spalte',\n apply: 'Übernehmen',\n summary: '{file}: {rows} Zeilen, Trennzeichen „{delimiter}“',\n rejected: '{count} Zeilen nicht lesbar (Zeilen {lines}) – nicht übernommen.',\n tab: 'Tabulator',\n },\n en: {\n file: 'File (CSV, TSV or text)',\n header: 'First row contains column names',\n valueColumn: 'Value column',\n apply: 'Apply',\n },\n})\n\nexport type TabularMessageKey = keyof typeof tabularMessages.de\n","// Zustandsautomat des Datei-Imports (Stichprobe, Benford) für Vue und React:\n// Datei lesen, Spalten zuordnen, Vorschau der übernommenen Werte.\n\nimport {\n columnCells,\n detectDecimal,\n guessNumberColumn,\n numberColumn,\n parseTable,\n type DecimalSeparator,\n type ParsedTable,\n} from '@auditcore/common'\nimport { createStore } from '../store'\n\n/** Übernommene Spalten einer Datei. */\nexport interface ImportedColumns {\n filename: string\n values: (number | null)[]\n /** Kennungen und Schichten der übernommenen Zeilen (gleiche Länge wie `values`). */\n ids: string[] | null\n strata: string[] | null\n rejected: number[]\n}\n\nexport interface TableImportData {\n filename: string\n text: string\n table: ParsedTable | null\n hasHeader: boolean\n valueColumn: number\n idColumn: number | null\n stratumColumn: number | null\n decimal: DecimalSeparator\n}\n\nconst INITIAL: TableImportData = {\n filename: '', text: '', table: null, hasHeader: true, valueColumn: 0, idColumn: null, stratumColumn: null, decimal: ',',\n}\n\n/** Vorschau der übernommenen Werte (reine Funktion). */\nexport function importPreview(state: TableImportData): ImportedColumns | null {\n const current = state.table\n if (!current) return null\n const parsed = numberColumn(current, state.valueColumn, state.decimal)\n const rejected = new Set(parsed.rejected)\n const kept = current.rows.filter((_, index) => !rejected.has(index + 1))\n const pick = (column: number | null): string[] | null => (column === null ? null : kept.map((row) => row[column] ?? ''))\n return { filename: state.filename, values: parsed.values, ids: pick(state.idColumn), strata: pick(state.stratumColumn), rejected: parsed.rejected }\n}\n\n/** Anzeige des Trennzeichens („Tabulator“ für `\\t`). */\nexport function importDelimiterText(table: ParsedTable | null, tab: string): string {\n return table?.delimiter === '\\t' ? tab : (table?.delimiter ?? '')\n}\n\n/** Die ersten zehn unlesbaren Zeilen als Liste. */\nexport function importRejectedLines(preview: ImportedColumns | null): string {\n return (preview?.rejected ?? []).slice(0, 10).join(', ')\n}\n\n/** Optionale Spalte aus einem Auswahlwert (`''` = keine). */\nexport function importOptionalColumn(value: string): number | null {\n return value === '' ? null : Number(value)\n}\n\nexport function createTableImportController() {\n const store = createStore<TableImportData>({ ...INITIAL })\n\n /** Nach Umschalten von `hasHeader` neu einlesen. */\n function reparse(): void {\n const state = store.get()\n const table = parseTable(state.text, state.hasHeader)\n const valueColumn = guessNumberColumn(table)\n store.set({ table, valueColumn, decimal: detectDecimal(columnCells(table, valueColumn), table.delimiter) })\n }\n\n function load(filename: string, text: string): void {\n store.set({ filename, text, idColumn: null, stratumColumn: null })\n reparse()\n }\n\n return {\n store,\n load,\n reparse,\n read: async (file: File) => load(file.name, await file.text()),\n setHasHeader: (hasHeader: boolean) => store.set({ hasHeader }),\n setValueColumn: (valueColumn: number) => store.set({ valueColumn }),\n setIdColumn: (idColumn: number | null) => store.set({ idColumn }),\n setStratumColumn: (stratumColumn: number | null) => store.set({ stratumColumn }),\n setDecimal: (decimal: DecimalSeparator) => store.set({ decimal }),\n }\n}\n\nexport type TableImportController = ReturnType<typeof createTableImportController>\n","import { defineMessages } from '../i18n'\n\n/** Texte des Stichprobenrechners. */\nexport const samplingMessages = defineMessages({\n de: {\n title: 'Stichprobe',\n loading: 'Methodenprofile werden geladen …',\n method: 'Methode',\n methodHint: 'Nur benannte Methodenprofile der Bibliothek auswahlbereit.',\n statusRECOMMENDED: 'Empfohlen',\n statusSUPERSEDED: 'Abgelöst',\n statusLEGACY_CHARACTERIZED: 'Charakterisiert',\n formula: 'Formel',\n source: 'Quelle',\n parameters: 'Parameter',\n confidence: 'Konfidenzniveau',\n confidenceOption: '{level} (Faktor {factor})',\n choose: 'Bitte wählen',\n fromPopulation: 'Aus Grundgesamtheit übernehmen',\n calculate: 'Stichprobenumfang berechnen',\n errorRequired: 'Pflichtangabe',\n errorInvalid: 'Keine gültige Zahl',\n errorRange: 'Zulässig: {range}',\n rangeBetween: '{min} bis {max}',\n rangeFrom: 'ab {min}',\n rangeTo: 'bis {max}',\n result: 'Stichprobenumfang',\n resultSummary: 'n = {size}',\n interval: 'Stichprobenintervall J = {interval}',\n derivation: 'Herleitung',\n step: 'Schritt',\n stepFormula: 'Formel',\n stepValue: 'Wert',\n population: 'Grundgesamtheit',\n populationCount: '{count} Elemente, Summe {sum}',\n populationEmpty: 'Keine Grundgesamtheit übergeben. Datei laden oder Elemente als Eigenschaft „items“ setzen.',\n strataCount: '{count} Schichten',\n selection: 'Auswahl',\n sampleSize: 'Stichprobenumfang für die Auswahl',\n variant: 'Auswahlvariante',\n allocation: 'Aufteilung auf Schichten',\n seed: 'Seed',\n seedHint: 'Leer lassen: Der Server erzeugt einen Seed und zeigt ihn an.',\n draw: 'Stichprobe ziehen',\n redraw: 'Neu ziehen mit neuem Seed',\n seedUsed: 'Seed {seed}',\n seedGenerated: 'vom Server erzeugt',\n seedGiven: 'vorgegeben',\n reproducible: 'Mit diesem Seed und derselben Grundgesamtheit (SHA-256 {hash}) ergibt sich dieselbe Auswahl.',\n selectedSummary: '{selected} von {population} Elementen ausgewählt',\n allocationTable: 'Allokation je Schicht',\n stratum: 'Schicht',\n stratumPopulation: 'Umfang N_h',\n stratumSample: 'Stichprobe n_h',\n stratumInterval: 'Intervall',\n stratumStart: 'Start',\n noStratum: 'ohne Schicht',\n excludedNegative: 'Negative Werte (nicht in der Auswahlbasis): {ids}',\n excludedZero: 'Null- oder fehlende Werte (nicht in der Auswahlbasis): {ids}',\n colOrder: 'Nr.',\n colPosition: 'Position',\n colId: 'Kennung',\n colValue: 'Wert',\n colStratum: 'Schicht',\n colHits: 'Treffer',\n exportCsv: 'Auswahl als CSV',\n exportJson: 'Auswahl als JSON',\n selectionErrornoItems: 'Keine Grundgesamtheit vorhanden.',\n selectionErrorsampleSize: 'Stichprobenumfang als ganze Zahl ≥ 0 angeben.',\n selectionErrorseed: 'Seed als ganze Zahl ≥ 0 angeben (höchstens 2^53 − 1).',\n selectionErrorvariant: 'Auswahlvariante wählen.',\n selectionErrorallocation: 'Aufteilung auf Schichten wählen.',\n selectionErrorpartialStrata: 'Nur ein Teil der Elemente hat eine Schicht; entweder alle oder keine schichten.',\n failed: 'Anfrage abgelehnt: {message}',\n },\n en: {\n title: 'Sample',\n method: 'Method',\n parameters: 'Parameters',\n confidence: 'Confidence level',\n calculate: 'Calculate sample size',\n result: 'Sample size',\n derivation: 'Derivation',\n population: 'Population',\n selection: 'Selection',\n draw: 'Draw sample',\n exportCsv: 'Selection as CSV',\n exportJson: 'Selection as JSON',\n },\n})\n\nexport type SamplingMessageKey = keyof typeof samplingMessages.de\n","/**\n * Framework-freie Ansichtslogik des Stichprobenrechners: Eingaben prüfen,\n * Anfragen bilden, Vorschläge aus der Grundgesamtheit, Schichten zählen.\n * Kein Vue, kein DOM – direkt testbar.\n */\nimport { detectDecimal, parseNumber } from '@auditcore/common'\nimport type {\n AllocationMethod,\n MethodProfile,\n ParameterSpec,\n PopulationItem,\n SelectionRequest,\n SelectionVariant,\n SizeRequest,\n} from './types'\n\nexport type FieldErrorCode = 'required' | 'invalid' | 'range'\n\nexport interface FieldError {\n code: FieldErrorCode\n min?: number\n max?: number\n}\n\nexport type SizeValidation =\n | { ok: true; request: SizeRequest }\n | { ok: false; errors: Readonly<Record<string, FieldError>> }\n\n/** Anteile werden in Prozent eingegeben und angezeigt. */\nexport function isPercent(spec: ParameterSpec): boolean {\n return spec.unit === 'Anteil' && spec.type !== 'choice'\n}\n\n/** Eingabetext (deutsch oder englisch notiert) → Zahl; leer → null, unlesbar → undefined. */\nexport function parseInput(text: string): number | null | undefined {\n return parseNumber(text, detectDecimal([text.trim()], ';'))\n}\n\nfunction lowerBound(spec: ParameterSpec): number | undefined {\n return spec.minimum ?? spec.exclusive_minimum\n}\n\nfunction upperBound(spec: ParameterSpec): number | undefined {\n return spec.maximum ?? spec.exclusive_maximum\n}\n\nfunction inRange(spec: ParameterSpec, value: number): boolean {\n if (spec.minimum !== undefined && value < spec.minimum) return false\n if (spec.exclusive_minimum !== undefined && value <= spec.exclusive_minimum) return false\n if (spec.maximum !== undefined && value > spec.maximum) return false\n return !(spec.exclusive_maximum !== undefined && value >= spec.exclusive_maximum)\n}\n\n/** Prüft ein Eingabefeld und liefert den Vertragswert (Prozent → Anteil). */\nexport function fieldValue(spec: ParameterSpec, text: string): { value: number } | { error: FieldError } {\n const parsed = parseInput(text)\n if (parsed === null) return { error: { code: 'required' } }\n if (parsed === undefined) return { error: { code: 'invalid' } }\n const value = isPercent(spec) ? parsed / 100 : parsed\n if (spec.type === 'integer' && !Number.isInteger(value)) return { error: { code: 'invalid' } }\n if (!inRange(spec, value)) {\n const scale = isPercent(spec) ? 100 : 1\n const min = lowerBound(spec)\n const max = upperBound(spec)\n return {\n error: {\n code: 'range',\n ...(min === undefined ? {} : { min: min * scale }),\n ...(max === undefined ? {} : { max: max * scale }),\n },\n }\n }\n return { value }\n}\n\n/** Anfrage für `POST /size`; jedes Feld ist Pflicht, nichts wird still ergänzt. */\nexport function buildSizeRequest(\n profile: MethodProfile,\n texts: Readonly<Record<string, string>>,\n confidence: number | null,\n): SizeValidation {\n const errors: Record<string, FieldError> = {}\n const request: Record<string, number | string> = { method: profile.id }\n for (const spec of profile.parameters) {\n if (spec.type === 'choice') continue\n const result = fieldValue(spec, texts[spec.key] ?? '')\n if ('error' in result) errors[spec.key] = result.error\n else request[spec.key] = result.value\n }\n if (confidence === null) errors.confidence_level = { code: 'required' }\n else request.confidence_level = confidence\n if (Object.keys(errors).length > 0) return { ok: false, errors }\n return { ok: true, request: request as SizeRequest }\n}\n\n/** Vorschlagswerte aus der Grundgesamtheit (Summe positiver Werte bzw. Anzahl). */\nexport function populationSuggestions(items: readonly PopulationItem[]): Readonly<Record<string, number>> {\n const positive = items.reduce((sum, item) => (item.value !== null && item.value > 0 ? sum + item.value : sum), 0)\n return { population_value: Math.round(positive * 100) / 100, population_size: items.length }\n}\n\n/** Startwerte der Textfelder: vorgeschlagene Werte der Profile, sonst leer. */\nexport function initialTexts(profile: MethodProfile, formatter: (value: number) => string): Record<string, string> {\n const texts: Record<string, string> = {}\n for (const spec of profile.parameters) {\n if (spec.suggested === undefined) continue\n texts[spec.key] = formatter(isPercent(spec) ? spec.suggested * 100 : spec.suggested)\n }\n return texts\n}\n\nexport interface StratumCount {\n stratum: string\n population: number\n}\n\n/** Schichten in Reihenfolge ihres ersten Auftretens; leer, wenn kein Element geschichtet ist. */\nexport function strataOf(items: readonly PopulationItem[]): StratumCount[] {\n const counts = new Map<string, number>()\n for (const item of items) {\n if (item.stratum === undefined || item.stratum === '') continue\n counts.set(item.stratum, (counts.get(item.stratum) ?? 0) + 1)\n }\n return [...counts].map(([stratum, population]) => ({ stratum, population }))\n}\n\n/** Teilweise geschichtete Grundgesamtheit (der Server lehnt sie ab). */\nexport function hasPartialStrata(items: readonly PopulationItem[]): boolean {\n const stratified = items.filter((item) => item.stratum !== undefined && item.stratum !== '').length\n return stratified > 0 && stratified < items.length\n}\n\nexport interface SelectionInput {\n profile: MethodProfile\n items: readonly PopulationItem[]\n sampleSize: string\n seed: string\n variant: SelectionVariant | null\n allocation: AllocationMethod | null\n}\n\nexport type SelectionValidation =\n | { ok: true; request: SelectionRequest }\n | { ok: false; error: 'noItems' | 'sampleSize' | 'seed' | 'variant' | 'allocation' | 'partialStrata' }\n\nfunction optionalSeed(text: string): number | null | undefined {\n const trimmed = text.trim()\n if (trimmed === '') return null\n if (!/^\\d{1,19}$/.test(trimmed)) return undefined\n const seed = Number(trimmed)\n return Number.isSafeInteger(seed) ? seed : undefined\n}\n\ntype SelectionFailure = Extract<SelectionValidation, { ok: false }>['error']\n\nfunction sampleSizeOf(text: string): number | null {\n const size = parseInput(text)\n return typeof size === 'number' && Number.isInteger(size) && size >= 0 ? size : null\n}\n\nfunction selectionProblem(input: SelectionInput): SelectionFailure | null {\n if (input.items.length === 0) return 'noItems'\n if (sampleSizeOf(input.sampleSize) === null) return 'sampleSize'\n if (optionalSeed(input.seed) === undefined) return 'seed'\n if (input.profile.kind === 'mus' && input.variant === null) return 'variant'\n if (hasPartialStrata(input.items)) return 'partialStrata'\n if (strataOf(input.items).length > 0 && input.allocation === null) return 'allocation'\n return null\n}\n\n/** Anfrage für `POST /selection`; ein leerer Seed überlässt dem Server die Erzeugung. */\nexport function buildSelectionRequest(input: SelectionInput): SelectionValidation {\n const problem = selectionProblem(input)\n if (problem !== null) return { ok: false, error: problem }\n const seed = optionalSeed(input.seed)\n const mus = input.profile.kind === 'mus'\n const stratified = strataOf(input.items).length > 0\n const request: SelectionRequest = {\n method: input.profile.kind,\n items: input.items,\n sample_size: sampleSizeOf(input.sampleSize) ?? 0,\n ...(mus && input.variant ? { variant: input.variant } : {}),\n ...(typeof seed === 'number' ? { seed } : {}),\n ...(stratified && input.allocation ? { allocation: input.allocation } : {}),\n }\n return { ok: true, request }\n}\n\n/** Übernommene Dateispalten → Elemente der Grundgesamtheit (Kennung sonst laufende Nummer). */\nexport function itemsFromImport(columns: {\n values: readonly (number | null)[]\n ids: readonly string[] | null\n strata: readonly string[] | null\n}): PopulationItem[] {\n return columns.values.map((value, index) => {\n const item: PopulationItem = { id: columns.ids?.[index] || String(index + 1), value }\n const stratum = columns.strata?.[index]\n return stratum ? { ...item, stratum } : item\n })\n}\n\n/** Summe der positiven Werte (Auswahlbasis der Variante „portal“). */\nexport function positiveSum(items: readonly PopulationItem[]): number {\n return items.reduce((sum, item) => (item.value !== null && item.value > 0 ? sum + item.value : sum), 0)\n}\n","import { requestFile, requestJson, type RestOptions } from '@auditcore/common'\nimport type { SamplingPort } from './types'\n\n/** Port auf den REST-Vertrag von `auditcore_sampling.web` (Starlette oder FastAPI). */\nexport function createSamplingRestPort(options: RestOptions): SamplingPort {\n return {\n profiles: () => requestJson(options, '/profiles'),\n size: (request) => requestJson(options, '/size', request),\n allocation: (request) => requestJson(options, '/allocation', request),\n selection: (request) => requestJson(options, '/selection', request),\n exportSelection: (request, format) =>\n requestFile(options, '/selection/export', { ...request, format }, `stichprobe-seed-${request.seed}.${format}`),\n }\n}\n","// Zustandsautomat von <flowaudit-sampling> (Vue und React): Methodenwahl,\n// Parameter, Stichprobenumfang, Grundgesamtheit, Auswahl mit Seed, Export.\n// Die Fachlogik liegt im Port; hier werden nur Eingaben geprüft, Anfragen\n// gebildet und Ergebnisse gehalten.\n\nimport type { DownloadFile } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState } from '../store'\nimport {\n buildSelectionRequest,\n buildSizeRequest,\n initialTexts,\n populationSuggestions,\n strataOf,\n type FieldError,\n type SelectionValidation,\n} from './model'\nimport type {\n AllocationMethod,\n ExportFormat,\n MethodProfile,\n PopulationItem,\n SamplingCatalogue,\n SamplingPort,\n SelectionRequest,\n SelectionResult,\n SelectionVariant,\n SizeResult,\n} from './types'\n\nexport type SamplingBusy = 'load' | 'size' | 'selection' | 'export'\nexport type SelectionError = Extract<SelectionValidation, { ok: false }>['error']\n\nexport interface SamplingCallbacks {\n sizeCalculated?: (result: SizeResult) => void\n selectionDrawn?: (result: SelectionResult) => void\n failed?: (message: string) => void\n}\n\n/** Stand des Stichprobenrechners; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface SamplingData extends RequestState<string> {\n catalogue: SamplingCatalogue | null\n methodId: string\n texts: Record<string, string>\n confidence: number | null\n fieldErrors: Readonly<Record<string, FieldError>>\n size: SizeResult | null\n /** Importierte Grundgesamtheit; `null` = Eigenschaft `items`. */\n imported: readonly PopulationItem[] | null\n sampleSize: string\n seed: string\n variant: SelectionVariant | null\n allocation: AllocationMethod | null\n selection: SelectionResult | null\n lastRequest: (SelectionRequest & { seed: number }) | null\n selectionError: SelectionError | null\n}\n\nexport interface SamplingSource {\n port: () => SamplingPort | null | undefined\n items: () => readonly PopulationItem[]\n /** Zahl → Text im Sprachformat (Startwerte und Vorschläge der Felder). */\n format: (value: number) => string\n callbacks?: () => SamplingCallbacks\n}\n\nexport const INITIAL_SAMPLING: SamplingData = {\n ...IDLE, catalogue: null, methodId: '', texts: {}, confidence: null, fieldErrors: {}, size: null, imported: null,\n sampleSize: '', seed: '', variant: null, allocation: null, selection: null, lastRequest: null, selectionError: null,\n}\n\nexport function samplingProfile(state: SamplingData): MethodProfile | null {\n return state.catalogue?.methods.find((method) => method.id === state.methodId) ?? null\n}\n\nexport function samplingPopulation(state: SamplingData, items: readonly PopulationItem[]): readonly PopulationItem[] {\n return state.imported ?? items\n}\n\nexport function isStratifiedPopulation(population: readonly PopulationItem[]): boolean {\n return strataOf(population).length > 0\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nfunction createActions(source: SamplingSource, store: ReturnType<typeof createStore<SamplingData>>) {\n const run = createRunner<SamplingPort, string, SamplingData>(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n\n async function calculate(): Promise<void> {\n const state = store.get()\n const profile = samplingProfile(state)\n if (!profile) return\n const checked = buildSizeRequest(profile, state.texts, state.confidence)\n store.set({ fieldErrors: checked.ok ? {} : checked.errors })\n if (!checked.ok) return\n const result = await run('size', (port) => port.size(checked.request))\n if (!result) return\n store.set({ size: result, sampleSize: String(result.sample_size) })\n source.callbacks?.().sizeCalculated?.(result)\n }\n\n async function draw(freshSeed = false): Promise<void> {\n const profile = samplingProfile(store.get())\n if (!profile) return\n if (freshSeed) store.set({ seed: '' })\n const state = store.get()\n const checked = buildSelectionRequest({\n profile, items: samplingPopulation(state, source.items()), sampleSize: state.sampleSize, seed: state.seed,\n variant: state.variant, allocation: state.allocation,\n })\n store.set({ selectionError: checked.ok ? null : checked.error })\n if (!checked.ok) return\n const result = await run('selection', (port) => port.selection(checked.request))\n if (!result) return\n store.set({ selection: result, lastRequest: { ...checked.request, seed: result.seed }, seed: String(result.seed) })\n source.callbacks?.().selectionDrawn?.(result)\n }\n\n return { run, calculate, draw }\n}\n\nexport function createSamplingController(source: SamplingSource) {\n const store = createStore<SamplingData>({ ...INITIAL_SAMPLING })\n const { run, calculate, draw } = createActions(source, store)\n\n function selectMethod(id: string): void {\n const profile = samplingProfile({ ...store.get(), methodId: id })\n store.set({\n methodId: id, texts: profile ? initialTexts(profile, source.format) : {}, confidence: null, fieldErrors: {},\n size: null, variant: profile?.default_variant ?? null, selection: null,\n })\n }\n\n async function load(): Promise<void> {\n const result = await run('load', (active) => active.profiles())\n if (!result) return\n store.set({ catalogue: result })\n selectMethod(result.recommended.mus)\n }\n\n function applySuggestions(): void {\n const state = store.get()\n const suggestions = populationSuggestions(samplingPopulation(state, source.items()))\n const texts = { ...state.texts }\n for (const spec of samplingProfile(state)?.parameters ?? []) {\n const value = suggestions[spec.key]\n if (value !== undefined) texts[spec.key] = source.format(value)\n }\n store.set({ texts })\n }\n\n async function exportSelection(format: ExportFormat): Promise<DownloadFile | null> {\n const request = store.get().lastRequest\n return request ? run('export', (port) => port.exportSelection(request, format)) : null\n }\n\n return {\n store,\n load,\n selectMethod,\n applySuggestions,\n calculate,\n draw,\n exportSelection,\n /** Importierte Grundgesamtheit übernehmen; `null` kehrt zur Eigenschaft `items` zurück. */\n usePopulation: (imported: readonly PopulationItem[] | null) => store.set({ imported, selection: null }),\n setTexts: (texts: Record<string, string>) => store.set({ texts }),\n setConfidence: (confidence: number | null) => store.set({ confidence }),\n setSampleSize: (sampleSize: string) => store.set({ sampleSize }),\n setSeed: (seed: string) => store.set({ seed }),\n setVariant: (variant: SelectionVariant | null) => store.set({ variant }),\n setAllocation: (allocation: AllocationMethod | null) => store.set({ allocation }),\n }\n}\n\nexport type SamplingController = ReturnType<typeof createSamplingController>\n","/**\n * Anzeige des Stichprobenrechners für Vue und React (reine Funktionen):\n * Einheiten, Fehlermeldungen der Felder, Methodengruppen, Tabellenspalten,\n * Zusammenfassungen. Texte kommen ausschließlich aus `samplingMessages`.\n */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent, type TableColumn, type TableRow } from '@auditcore/common'\nimport type { BadgeTone } from '../base/types'\nimport type { Locale, Translate } from '../i18n'\nimport type { SamplingMessageKey } from './messages'\nimport { isPercent, positiveSum, strataOf, type FieldError } from './model'\nimport type { ConfidenceLevel, MethodProfile, ParameterSpec, PopulationItem, SamplingCatalogue, SelectionResult, SizeResult } from './types'\nimport type { SelectionError } from './controller'\n\nexport type SamplingTranslate = Translate<SamplingMessageKey>\n\n/** Einheit hinter dem Eingabefeld (Prozent, Euro oder keine). */\nexport function parameterUnit(spec: ParameterSpec): string {\n if (isPercent(spec)) return '%'\n return spec.unit === 'EUR' ? '€' : ''\n}\n\nfunction rangeText(error: FieldError, t: SamplingTranslate, locale: Locale): string {\n const fmt = (value: number): string => formatNumber(value, locale, { maximumFractionDigits: 4 })\n if (error.min !== undefined && error.max !== undefined) return t('rangeBetween', { min: fmt(error.min), max: fmt(error.max) })\n if (error.min !== undefined) return t('rangeFrom', { min: fmt(error.min) })\n return t('rangeTo', { max: fmt(error.max ?? 0) })\n}\n\n/** Fehlermeldung eines Eingabefelds, leer ohne Fehler. */\nexport function samplingFieldError(error: FieldError | undefined, t: SamplingTranslate, locale: Locale): string {\n if (!error) return ''\n if (error.code === 'range') return t('errorRange', { range: rangeText(error, t, locale) })\n return error.code === 'required' ? t('errorRequired') : t('errorInvalid')\n}\n\nexport function selectionErrorKey(error: SelectionError): SamplingMessageKey {\n return `selectionError${error}`\n}\n\nexport function confidenceText(level: ConfidenceLevel, t: SamplingTranslate, locale: Locale): string {\n return t('confidenceOption', { level: formatPercent(level.level, locale, 0), factor: formatNumber(level.factor, locale, { maximumFractionDigits: 3 }) })\n}\n\nexport interface MethodGroup {\n kind: 'mus' | 'srs'\n label: string\n methods: MethodProfile[]\n}\n\nexport function methodGroups(catalogue: SamplingCatalogue): MethodGroup[] {\n return [\n { kind: 'mus', label: 'MUS', methods: catalogue.methods.filter((method) => method.kind === 'mus') },\n { kind: 'srs', label: 'SRS', methods: catalogue.methods.filter((method) => method.kind === 'srs') },\n ]\n}\n\nexport function methodTone(profile: MethodProfile | null): BadgeTone {\n const status = profile?.status\n return status === 'RECOMMENDED' ? 'success' : status === 'SUPERSEDED' ? 'warning' : 'neutral'\n}\n\nexport function methodStatusKey(profile: MethodProfile): SamplingMessageKey {\n return `status${profile.status}`\n}\n\n/** Zusammenfassung der Grundgesamtheit; leer, wenn keine Elemente vorliegen. */\nexport function populationText(items: readonly PopulationItem[], t: SamplingTranslate, locale: Locale): string {\n if (items.length === 0) return ''\n const summary = t('populationCount', { count: formatNumber(items.length, locale), sum: formatNumber(positiveSum(items), locale, { maximumFractionDigits: 2 }) })\n const strata = strataOf(items).length\n return strata ? `${summary} · ${t('strataCount', { count: strata })}` : summary\n}\n\nconst numberFormat = (locale: Locale) => (value: unknown): string =>\n typeof value === 'number' ? formatNumber(value, locale, { maximumFractionDigits: 4 }) : ''\nconst amountFormat = (locale: Locale) => (value: unknown): string =>\n typeof value === 'number' ? formatNumber(value, locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : ''\nconst plain = (value: unknown): string => (value === null || value === undefined ? '' : String(value))\n\nexport function derivationColumns(t: SamplingTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'label', label: t('step') },\n { key: 'formula', label: t('stepFormula') },\n { key: 'value', label: t('stepValue'), align: 'end', format: numberFormat(locale) },\n ]\n}\n\nexport function derivationRows(result: SizeResult): TableRow[] {\n return result.derivation.map((step, index) => ({ id: index, ...step }))\n}\n\nexport function sizeTexts(result: SizeResult, t: SamplingTranslate, locale: Locale): { size: string; interval: string } {\n return {\n size: t('resultSummary', { size: formatNumber(result.sample_size, locale) }),\n interval: result.kind === 'mus' ? t('interval', { interval: formatNumber(result.interval, locale, { maximumFractionDigits: 2 }) }) : '',\n }\n}\n\nexport function selectionColumns(result: SelectionResult, t: SamplingTranslate, locale: Locale): TableColumn[] {\n const stratified = result.strata.some((stratum) => stratum.stratum !== null)\n return [\n { key: 'order', label: t('colOrder'), align: 'end', sortable: true },\n { key: 'position', label: t('colPosition'), align: 'end', sortable: true },\n { key: 'id', label: t('colId'), sortable: true },\n { key: 'value', label: t('colValue'), align: 'end', sortable: true, format: amountFormat(locale) },\n ...(stratified ? [{ key: 'stratum', label: t('colStratum'), sortable: true, format: plain }] : []),\n ...(result.method === 'mus' ? [{ key: 'hits', label: t('colHits'), align: 'end' as const }] : []),\n ]\n}\n\nexport function strataColumns(result: SelectionResult, t: SamplingTranslate, locale: Locale): TableColumn[] {\n const amount = amountFormat(locale)\n return [\n { key: 'stratum', label: t('stratum'), format: (value) => (value === null ? t('noStratum') : String(value)) },\n { key: 'population', label: t('stratumPopulation'), align: 'end' },\n { key: 'sample_size', label: t('stratumSample'), align: 'end' },\n ...(result.method === 'mus'\n ? [\n { key: 'interval', label: t('stratumInterval'), align: 'end' as const, format: amount },\n { key: 'start', label: t('stratumStart'), align: 'end' as const, format: amount },\n ]\n : []),\n ]\n}\n\nexport function strataRows(result: SelectionResult): TableRow[] {\n return result.strata.map((stratum, index) => ({ id: index, ...stratum }))\n}\n\nexport function selectionRows(result: SelectionResult): TableRow[] {\n return result.rows.map((row) => ({ ...row }))\n}\n\n/** Hinweise auf Elemente außerhalb der Auswahlbasis. */\nexport function excludedLines(result: SelectionResult, t: SamplingTranslate): string[] {\n return result.strata.flatMap((stratum) => [\n ...(stratum.excluded_negative?.length ? [t('excludedNegative', { ids: stratum.excluded_negative.join(', ') })] : []),\n ...(stratum.excluded_zero_or_missing?.length ? [t('excludedZero', { ids: stratum.excluded_zero_or_missing.join(', ') })] : []),\n ])\n}\n\nexport interface SelectionTexts {\n seed: string\n origin: string\n summary: string\n reproducible: string\n}\n\nexport function selectionTexts(result: SelectionResult, t: SamplingTranslate, locale: Locale): SelectionTexts {\n return {\n seed: t('seedUsed', { seed: result.seed }),\n origin: result.seed_generated ? t('seedGenerated') : t('seedGiven'),\n summary: t('selectedSummary', { selected: formatNumber(result.selected, locale), population: formatNumber(result.population, locale) }),\n reproducible: t('reproducible', { hash: result.items_sha256.slice(0, 12) }),\n }\n}\n\n/** Zahlformat der Eingabefelder (ohne Tausendertrennung, bis 6 Nachkommastellen). */\nexport function samplingInputNumber(locale: Locale): (value: number) => string {\n return (value) => formatNumber(value, locale, { maximumFractionDigits: 6, useGrouping: false })\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte der Benford-Analyse. */\nexport const benfordMessages = defineMessages({\n de: {\n title: 'Benford-Analyse',\n loading: 'Tests und Bewertungsprofile werden geladen …',\n data: 'Werte',\n valuesCount: '{count} Werte übernommen',\n valuesEmpty: 'Keine Werte übergeben. Datei laden oder Werte als Eigenschaft „values“ setzen.',\n test: 'Test',\n profile: 'Bewertungsprofil',\n shortValues: 'Werte mit nur einer signifikanten Ziffer',\n choose: 'Bitte wählen',\n analyse: 'Analysieren',\n errornoValues: 'Keine Werte vorhanden.',\n errortooMany: 'Zu viele Werte für eine Anfrage.',\n errortest: 'Test wählen.',\n errorprofile: 'Bewertungsprofil wählen.',\n errorshortValues: 'Regel für Werte mit nur einer signifikanten Ziffer wählen.',\n failed: 'Anfrage abgelehnt: {message}',\n notice: 'Die Bewertungsstufen beschreiben die Nähe der Verteilung zum Benford-Gesetz. Sie sind keine Feststellungen zu einzelnen Belegen.',\n analysed: 'Ausgewertet',\n excluded: 'Ausgeschlossen',\n excludedDetail: '{zero} null, {missing} fehlend, {short} kurz; {negative} negativ (Betrag)',\n mad: 'MAD',\n madBounds: 'Grenzen {bounds}',\n chi2: 'Chi²',\n chi2Detail: '{dof} FG, p {p}',\n chi2Exceeds: 'p < α = {alpha}',\n chi2Within: 'p ≥ α = {alpha}',\n zDigits: 'Ziffern mit |z| > {critical}',\n zNone: 'keine',\n chart: 'Verteilung',\n chartLabel: '{test}: beobachtete und erwartete Anteile, {count} Ziffern über dem kritischen z-Wert',\n legendObserved: 'Beobachtet',\n legendExpected: 'Erwartet (Benford)',\n legendExceeds: 'Beobachtet, |z| über kritischem Wert',\n barTitle: 'Ziffer {digit}: beobachtet {observed}, erwartet {expected}, z = {z}',\n axisDigit: 'Ziffer',\n axisShare: 'Anteil',\n table: 'Ziffern',\n colDigit: 'Ziffer',\n colCount: 'Anzahl',\n colObserved: 'Beobachtet',\n colExpected: 'Erwartet',\n colDeviation: 'Abweichung',\n colZ: 'z',\n colExceeds: '|z| > krit.',\n yes: 'ja',\n profileSource: 'Quelle des Profils',\n metricsLegend: 'Zusätzliche Kennzahlen',\n metricchi_square: 'Chi²-Test mit kritischen Werten',\n metricdigit_z: 'Auffällige Ziffern (z je Ziffer)',\n significance: 'Zusätzliche Kennzahlen',\n chiTest: 'Chi²-Test',\n chiTestDetail: '{dof} FG, p {p}',\n criticalValues: 'Kritische Werte: {values}',\n criticalValue: 'α = {alpha}: {value}',\n chiRejects: 'Bei α = {alpha} verworfen (p < α)',\n chiKeeps: 'Bei α = {alpha} nicht verworfen (p ≥ α)',\n chiNoLevel: 'Ohne Signifikanzniveau keine Entscheidung',\n digitZ: 'Auffällige Ziffern',\n digitZDetail: '|z| > {critical}, {correction}',\n withCorrection: 'mit Stetigkeitskorrektur',\n withoutCorrection: 'ohne Stetigkeitskorrektur',\n digitZNoLimit: 'Ohne kritischen z-Wert keine Markierung',\n digitZValues: 'Größtes |z|: Ziffer {digit} ({z})',\n },\n en: {\n title: 'Benford analysis',\n test: 'Test',\n profile: 'Assessment profile',\n analyse: 'Analyse',\n chart: 'Distribution',\n legendObserved: 'Observed',\n legendExpected: 'Expected (Benford)',\n metricsLegend: 'Additional measures',\n chiTest: 'Chi-square test',\n digitZ: 'Conspicuous digits',\n },\n})\n\nexport type BenfordMessageKey = keyof typeof benfordMessages.de\n","/**\n * Geometrie des Benford-Diagramms als reine Funktion (kein DOM, keine\n * Diagrammbibliothek): beobachtete Anteile als Balken, erwartete Anteile als\n * Linie mit Punkten, Überschreitungen des kritischen z-Werts markiert.\n */\nimport type { ConformityRow } from './types'\n\nexport interface ChartBox {\n width: number\n height: number\n top: number\n right: number\n bottom: number\n left: number\n}\n\nexport interface ChartBar {\n digit: number\n x: number\n y: number\n width: number\n height: number\n exceeds: boolean\n}\n\nexport interface ChartGeometry {\n box: ChartBox\n plot: { x: number; y: number; width: number; height: number }\n bars: ChartBar[]\n expected: { x: number; y: number }[]\n expectedPath: string\n yTicks: { y: number; value: number }[]\n /** Nachkommastellen der Prozentbeschriftung (0 für ganze Prozent, sonst 1). */\n tickDigits: number\n xLabels: { x: number; digit: number }[]\n}\n\nexport const DEFAULT_BOX: ChartBox = { width: 720, height: 300, top: 16, right: 16, bottom: 36, left: 52 }\n\n/** Obergrenze der y-Achse: nächstes Vielfaches des Tickabstands über dem Maximum. */\nexport function axisMaximum(maximum: number): { top: number; step: number } {\n const steps = [0.005, 0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5]\n const step = steps.find((candidate) => maximum / candidate <= 5) ?? 1\n const top = Math.max(step, Math.ceil((maximum * 1.05) / step) * step)\n return { top, step }\n}\n\nfunction labelEvery(count: number): number {\n return count > 20 ? 10 : 1\n}\n\nexport function chartGeometry(rows: readonly ConformityRow[], box: ChartBox = DEFAULT_BOX): ChartGeometry {\n const plot = {\n x: box.left,\n y: box.top,\n width: box.width - box.left - box.right,\n height: box.height - box.top - box.bottom,\n }\n const maximum = Math.max(0, ...rows.flatMap((row) => [row.observed_share, row.expected_share]))\n const axis = axisMaximum(maximum)\n const slot = rows.length > 0 ? plot.width / rows.length : 0\n const gap = Math.min(slot * 0.25, 8)\n const scaleY = (share: number): number => plot.y + plot.height - (share / axis.top) * plot.height\n const centre = (index: number): number => plot.x + slot * index + slot / 2\n const bars = rows.map((row, index) => {\n const y = scaleY(row.observed_share)\n return { digit: row.digit, x: plot.x + slot * index + gap / 2, y, width: slot - gap, height: plot.y + plot.height - y, exceeds: row.exceeds }\n })\n const expected = rows.map((row, index) => ({ x: centre(index), y: scaleY(row.expected_share) }))\n const expectedPath = expected.map((point, index) => `${index === 0 ? 'M' : 'L'}${point.x.toFixed(2)},${point.y.toFixed(2)}`).join(' ')\n const tickCount = Math.round(axis.top / axis.step)\n const yTicks = Array.from({ length: tickCount + 1 }, (_, index) => ({ value: index * axis.step, y: scaleY(index * axis.step) }))\n const every = labelEvery(rows.length)\n const xLabels = rows.flatMap((row, index) => (row.digit % every === 0 || every === 1 ? [{ x: centre(index), digit: row.digit }] : []))\n const tickDigits = Number.isInteger(Math.round(axis.step * 1000) / 10) ? 0 : 1\n return { box, plot, bars, expected, expectedPath, yTicks, xLabels, tickDigits }\n}\n","/** Framework-freie Ansichtslogik der Benford-Analyse. */\nimport type { AnalyseRequest, BenfordCatalogue, BenfordMetricId, BenfordMetricsRequest, BenfordTest, ShortValues } from './types'\n\nexport interface AnalyseInput {\n catalogue: BenfordCatalogue\n test: BenfordTest | null\n profile: string | null\n shortValues: ShortValues | null\n values: readonly (number | null)[]\n /** Angeforderte Kennzahlen (bereits ohne abgewählte). */\n metrics?: BenfordMetricsRequest | null\n}\n\nexport const BENFORD_METRIC_IDS: readonly BenfordMetricId[] = ['chi_square', 'digit_z']\n\n/** Vorgegebene Kennzahlen ohne die abgewählten; `null`, wenn keine übrig bleibt. */\nexport function activeMetrics(given: BenfordMetricsRequest | null | undefined, disabled: readonly BenfordMetricId[]): BenfordMetricsRequest | null {\n if (!given) return null\n const active: BenfordMetricsRequest = {}\n if (given.chi_square && !disabled.includes('chi_square')) active.chi_square = given.chi_square\n if (given.digit_z && !disabled.includes('digit_z')) active.digit_z = given.digit_z\n return active.chi_square || active.digit_z ? active : null\n}\n\n/** Kennungen der vorgegebenen Kennzahlen in fester Reihenfolge (für die Auswahl im Formular). */\nexport function offeredMetrics(given: BenfordMetricsRequest | null | undefined): BenfordMetricId[] {\n return BENFORD_METRIC_IDS.filter((id) => Boolean(given?.[id]))\n}\n\nexport type AnalyseError = 'noValues' | 'tooMany' | 'test' | 'profile' | 'shortValues'\n\nexport type AnalyseValidation = { ok: true; request: AnalyseRequest } | { ok: false; error: AnalyseError }\n\n/** Zweistellige Tests (erste zwei Ziffern, zweite Ziffer) verlangen eine Regel für kurze Werte. */\nexport function needsShortValues(catalogue: BenfordCatalogue, test: BenfordTest | null): boolean {\n return catalogue.tests.find((entry) => entry.id === test)?.digits === 2\n}\n\n/** Anfrage für `POST /analyze`; Test, Profil und ggf. Regel für kurze Werte sind Pflicht. */\nexport function buildAnalyseRequest(input: AnalyseInput): AnalyseValidation {\n if (input.values.length === 0) return { ok: false, error: 'noValues' }\n if (input.values.length > input.catalogue.limits.max_values) return { ok: false, error: 'tooMany' }\n if (input.test === null) return { ok: false, error: 'test' }\n if (input.profile === null) return { ok: false, error: 'profile' }\n const twoDigits = needsShortValues(input.catalogue, input.test)\n if (twoDigits && input.shortValues === null) return { ok: false, error: 'shortValues' }\n return {\n ok: true,\n request: {\n test: input.test,\n profile: input.profile,\n values: input.values,\n ...(twoDigits && input.shortValues ? { short_values: input.shortValues } : {}),\n ...(input.metrics ? { metrics: input.metrics } : {}),\n },\n }\n}\n\nexport type LevelTone = 'neutral' | 'success' | 'accent' | 'warning' | 'danger'\n\nconst TONES: readonly LevelTone[] = ['success', 'accent', 'warning', 'danger']\n\n/** Farbton der MAD-Stufe 0–3 (enge … keine Übereinstimmung). */\nexport function levelTone(level: number): LevelTone {\n return TONES[Math.min(Math.max(level, 0), TONES.length - 1)] ?? 'neutral'\n}\n\n/** Anzeige einer Ziffer: zweite Ziffer 0–9, sonst Zahl. */\nexport function digitLabel(digit: number): string {\n return String(digit)\n}\n","import { requestJson, type RestOptions } from '@auditcore/common'\nimport type { BenfordPort } from './types'\n\n/** Port auf den REST-Vertrag von `auditcore_statistics.web` (Starlette oder FastAPI). */\nexport function createBenfordRestPort(options: RestOptions): BenfordPort {\n return {\n profiles: () => requestJson(options, '/profiles'),\n analyse: (request) => requestJson(options, '/analyze', request),\n }\n}\n","// Zustandsautomat von <flowaudit-benford> (Vue und React): Tests und Profile\n// laden, Werte übernehmen, Analyse anstoßen. Berechnet wird ausschließlich\n// über den Port.\n\nimport { createRunner, createStore, IDLE, type RequestState } from '../store'\nimport { activeMetrics, buildAnalyseRequest, type AnalyseError } from './model'\nimport type { BenfordAnalysis, BenfordCatalogue, BenfordMetricId, BenfordMetricsRequest, BenfordPort, BenfordTest, ConformityProfile, ShortValues } from './types'\n\nexport type BenfordBusy = 'load' | 'analyse'\n\nexport interface BenfordCallbacks {\n analysed?: (result: BenfordAnalysis) => void\n failed?: (message: string) => void\n}\n\n/** Stand der Benford-Analyse; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface BenfordData extends RequestState<string> {\n catalogue: BenfordCatalogue | null\n /** Importierte Werte; `null` = Eigenschaft `values`. */\n imported: readonly (number | null)[] | null\n test: BenfordTest | null\n profileId: string | null\n shortValues: ShortValues | null\n result: BenfordAnalysis | null\n validation: AnalyseError | null\n /** Im Formular abgewählte Kennzahlen (Vorgabe: alle vorgegebenen aktiv). */\n disabledMetrics: readonly BenfordMetricId[]\n}\n\nexport interface BenfordSource {\n port: () => BenfordPort | null | undefined\n values: () => readonly (number | null)[]\n callbacks?: () => BenfordCallbacks\n /** Vorgegebene zusätzliche Kennzahlen (Eigenschaft `metrics`). */\n metrics?: () => BenfordMetricsRequest | null | undefined\n /** Nach dem Laden und bei neuen Werten sofort analysieren (Eigenschaft `autoAnalyse`). */\n autoAnalyse?: () => boolean | undefined\n}\n\nexport const INITIAL_BENFORD: BenfordData = {\n ...IDLE, catalogue: null, imported: null, test: 'first', profileId: null, shortValues: null, result: null, validation: null,\n disabledMetrics: [],\n}\n\nexport function benfordValues(state: BenfordData, given: readonly (number | null)[]): readonly (number | null)[] {\n return state.imported ?? given\n}\n\nexport function benfordProfile(state: BenfordData): ConformityProfile | null {\n return state.catalogue?.profiles.find((entry) => entry.id === state.profileId) ?? null\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nexport function createBenfordController(source: BenfordSource) {\n const store = createStore<BenfordData>({ ...INITIAL_BENFORD })\n const run = createRunner<BenfordPort, string, BenfordData>(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n\n const automatic = (): boolean => source.autoAnalyse?.() === true && benfordValues(store.get(), source.values()).length > 0\n\n async function load(): Promise<void> {\n const loaded = await run('load', (active) => active.profiles())\n if (!loaded) return\n store.set({ catalogue: loaded, profileId: loaded.profiles[0]?.id ?? null })\n if (automatic()) await analyse()\n }\n\n async function analyse(): Promise<void> {\n const state = store.get()\n if (!state.catalogue) return\n const checked = buildAnalyseRequest({\n catalogue: state.catalogue, test: state.test, profile: state.profileId, shortValues: state.shortValues,\n values: benfordValues(state, source.values()),\n metrics: activeMetrics(source.metrics?.(), state.disabledMetrics),\n })\n store.set({ validation: checked.ok ? null : checked.error })\n if (!checked.ok) return\n const analysed = await run('analyse', (active) => active.analyse(checked.request))\n if (!analysed) return\n store.set({ result: analysed })\n source.callbacks?.().analysed?.(analysed)\n }\n\n return {\n store,\n load,\n analyse,\n /** Importierte Werte übernehmen; `null` kehrt zur Eigenschaft `values` zurück. */\n useValues: (imported: readonly (number | null)[] | null) => store.set({ imported, result: null }),\n /** Neue Eigenschaft `values`: Import verwerfen, bei `autoAnalyse` erneut analysieren. */\n async valuesChanged(): Promise<void> {\n store.set({ imported: null, result: null })\n if (store.get().catalogue && automatic()) await analyse()\n },\n /** Vorgegebene Kennzahl für die nächste Analyse an- oder abwählen. */\n setMetric: (id: BenfordMetricId, on: boolean) =>\n store.set((state) => ({ disabledMetrics: on ? state.disabledMetrics.filter((entry) => entry !== id) : [...new Set([...state.disabledMetrics, id])] })),\n setTest: (test: BenfordTest | null) => store.set({ test }),\n setProfile: (profileId: string | null) => store.set({ profileId }),\n setShortValues: (shortValues: ShortValues | null) => store.set({ shortValues }),\n }\n}\n\nexport type BenfordController = ReturnType<typeof createBenfordController>\n","/**\n * Anzeige der Benford-Analyse für Vue und React (reine Funktionen): Kennzahlen,\n * Diagrammbeschriftungen und Spalten der Zifferntabelle. Texte ausschließlich\n * aus `benfordMessages`.\n */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent, type TableColumn, type TableRow } from '@auditcore/common'\nimport type { Locale, Translate } from '../i18n'\nimport type { BenfordMessageKey } from './messages'\nimport type { AnalyseError } from './model'\nimport type { BenfordAnalysis, BenfordMetricId, ChiSquareMetric, Conformity, ConformityProfile, DigitZMetric } from './types'\n\nexport type BenfordTranslate = Translate<BenfordMessageKey>\n\nexport function analyseErrorKey(error: AnalyseError): BenfordMessageKey {\n return `error${error}`\n}\n\nexport function benfordValuesText(count: number, t: BenfordTranslate, locale: Locale): string {\n return count ? t('valuesCount', { count: formatNumber(count, locale) }) : t('valuesEmpty')\n}\n\n/** Titel eines Balkens (Tooltip und Vorlesetext). */\nexport function benfordBarTitle(conformity: Conformity, index: number, t: BenfordTranslate, locale: Locale): string {\n const row = conformity.rows[index]\n if (!row) return ''\n return t('barTitle', {\n digit: row.digit,\n observed: formatPercent(row.observed_share, locale, 2),\n expected: formatPercent(row.expected_share, locale, 2),\n z: formatNumber(row.z, locale, { maximumFractionDigits: 2 }),\n })\n}\n\nexport function benfordChartTitle(conformity: Conformity, testLabel: string, t: BenfordTranslate): string {\n return t('chartLabel', { test: testLabel, count: conformity.exceeding_digits.length })\n}\n\nexport function benfordTickText(value: number, digits: number, locale: Locale): string {\n return formatPercent(value, locale, digits)\n}\n\nexport interface BenfordMetricTexts {\n analysed: string\n excluded: string\n excludedDetail: string\n mad: string\n madBounds: string\n chi2: string\n chi2Detail: string\n chi2Verdict: string\n zDigits: string\n exceeding: string\n}\n\nexport function benfordMetricTexts(analysis: BenfordAnalysis, profile: ConformityProfile | null, t: BenfordTranslate, locale: Locale): BenfordMetricTexts {\n const number = (value: number, digits = 4): string => formatNumber(value, locale, { maximumFractionDigits: digits })\n const { conformity, distribution } = analysis\n const excluded = distribution.excluded\n const bounds = (profile?.mad_bounds[conformity.test] ?? []).map((bound) => number(bound)).join(' / ')\n const p = conformity.p_value < 0.0001 ? `< ${number(0.0001)}` : `= ${number(conformity.p_value, 4)}`\n return {\n analysed: formatNumber(conformity.analysed, locale),\n excluded: formatNumber(excluded.zero + excluded.missing + excluded.short, locale),\n excludedDetail: t('excludedDetail', { zero: excluded.zero, missing: excluded.missing, short: excluded.short, negative: distribution.negative_absolute }),\n mad: number(conformity.mad, 5),\n madBounds: t('madBounds', { bounds }),\n chi2: number(conformity.chi2_statistic, 2),\n chi2Detail: t('chi2Detail', { dof: conformity.degrees_of_freedom, p }),\n chi2Verdict: t(conformity.chi2_exceeds ? 'chi2Exceeds' : 'chi2Within', { alpha: number(conformity.significance_level, 3) }),\n zDigits: t('zDigits', { critical: number(conformity.z_critical, 2) }),\n exceeding: conformity.exceeding_digits.length ? conformity.exceeding_digits.join(', ') : t('zNone'),\n }\n}\n\nexport function benfordDigitColumns(t: BenfordTranslate, locale: Locale): TableColumn[] {\n const share = (value: unknown): string => (typeof value === 'number' ? formatPercent(value, locale, 2) : '')\n const signedShare = (value: unknown): string => (typeof value === 'number' ? `${value > 0 ? '+' : ''}${formatPercent(value, locale, 2)}` : '')\n const decimal = (value: unknown): string =>\n typeof value === 'number' ? formatNumber(value, locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : ''\n return [\n { key: 'digit', label: t('colDigit'), align: 'end', sortable: true },\n { key: 'observed_count', label: t('colCount'), align: 'end', sortable: true },\n { key: 'observed_share', label: t('colObserved'), align: 'end', sortable: true, format: share },\n { key: 'expected_share', label: t('colExpected'), align: 'end', format: share },\n { key: 'deviation', label: t('colDeviation'), align: 'end', sortable: true, format: signedShare },\n { key: 'z', label: t('colZ'), align: 'end', sortable: true, format: decimal },\n { key: 'exceeds', label: t('colExceeds'), align: 'center', format: (value) => (value === true ? t('yes') : '') },\n ]\n}\n\nexport function benfordDigitRows(conformity: Conformity): TableRow[] {\n return conformity.rows.map((row) => ({ id: row.digit, ...row }))\n}\n\nexport function benfordMetricLabel(id: BenfordMetricId, t: BenfordTranslate): string {\n return t(`metric${id}`)\n}\n\nexport interface BenfordChiTexts {\n statistic: string\n detail: string\n critical: string\n verdict: string\n /** Farbton des Urteils: `warning` (verworfen), `success`, `neutral` (ohne Niveau). */\n tone: 'warning' | 'success' | 'neutral'\n}\n\nexport interface BenfordDigitZTexts {\n digits: string\n detail: string\n largest: string\n}\n\nfunction pText(p: number, number: (value: number, digits?: number) => string): string {\n return p < 0.0001 ? `< ${number(0.0001)}` : `= ${number(p, 4)}`\n}\n\n/** Texte der Kennzahl `chi_square` (kritische Werte je Niveau, Urteil nur mit Niveau). */\nexport function benfordChiTexts(metric: ChiSquareMetric, t: BenfordTranslate, locale: Locale): BenfordChiTexts {\n const number = (value: number, digits = 4): string => formatNumber(value, locale, { maximumFractionDigits: digits })\n const values = metric.critical_values.map((entry) => t('criticalValue', { alpha: number(entry.level, 3), value: number(entry.value, 3) })).join(' · ')\n const alpha = metric.significance_level === null ? '' : number(metric.significance_level, 3)\n const verdict = metric.rejects === null ? t('chiNoLevel') : t(metric.rejects ? 'chiRejects' : 'chiKeeps', { alpha })\n return {\n statistic: number(metric.chi2_statistic, 2),\n detail: t('chiTestDetail', { dof: metric.degrees_of_freedom, p: pText(metric.p_value, number) }),\n critical: t('criticalValues', { values }),\n verdict,\n tone: metric.rejects === null ? 'neutral' : metric.rejects ? 'warning' : 'success',\n }\n}\n\n/** Texte der Kennzahl `digit_z` („auffällige Ziffern“ nur mit kritischem z-Wert). */\nexport function benfordDigitZTexts(metric: DigitZMetric, t: BenfordTranslate, locale: Locale): BenfordDigitZTexts {\n const number = (value: number, digits: number): string => formatNumber(value, locale, { maximumFractionDigits: digits })\n const correction = t(metric.continuity_correction ? 'withCorrection' : 'withoutCorrection')\n const exceeding = metric.exceeding_digits\n const largest = metric.rows.reduce<DigitZMetric['rows'][number] | null>((top, row) => (top === null || row.z > top.z ? row : top), null)\n return {\n digits: exceeding === null ? t('digitZNoLimit') : exceeding.length ? exceeding.join(', ') : t('zNone'),\n detail: metric.z_critical === null ? correction : t('digitZDetail', { critical: number(metric.z_critical, 3), correction }),\n largest: largest ? t('digitZValues', { digit: largest.digit, z: number(largest.z, 2) }) : '',\n }\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte der Hochrechnung (TER) und der Restfehlerquote (RER). */\nexport const extrapolationMessages = defineMessages({\n de: {\n title: 'Hochrechnung und Fehlerquoten',\n loading: 'Methoden und Profile werden geladen …',\n failed: 'Anfrage abgelehnt: {message}',\n settings: 'Verfahren',\n method: 'Hochrechnungsmethode',\n choose: 'Bitte wählen',\n statistical: 'Statistische Verfahren',\n nonStatistical: 'Nicht-statistische Verfahren',\n methodSource: 'Quelle und Formel',\n confidence: 'Konfidenzniveau',\n factorProfile: 'Faktorprofil (z-Werte, Zuverlässigkeitsfaktoren)',\n sampleSize: 'Geplanter Stichprobenumfang n',\n sampleSizeHint: 'Nur für den konservativen Ansatz: Stichprobenintervall SI = BV / n.',\n materiality: 'Wesentlichkeitsschwelle',\n materialityHint: 'Höchstens 2 % der geltend gemachten Ausgaben.',\n strata: 'Schichten der Grundgesamtheit',\n strataHint: 'Ohne Schichtung eine Zeile. Buchwert und Anzahl einschließlich der vollständig geprüften Einheiten.',\n stratumName: 'Schicht',\n bookValue: 'Buchwert',\n populationSize: 'Anzahl Einheiten (N)',\n systemicDelimited: 'Abgegrenzte systemische Fehler',\n addStratum: 'Schicht hinzufügen',\n remove: 'Entfernen',\n removeRow: '{what} {row} entfernen',\n units: 'Geprüfte Einheiten der Stichprobe',\n unitsHint: 'Fehler = Buchwert − korrigierter Buchwert. Vollerhebung: Einheit der 100-%-Schicht (Hochwertschicht).',\n unitId: 'Kennung',\n stratum: 'Schicht',\n randomError: 'Zufälliger Fehler',\n systemicError: 'Systemischer Fehler',\n anomalousError: 'Anomaler Fehler',\n anomalousReason: 'Begründung (anomal)',\n anomalousCorrected: 'Anomal korrigiert',\n exhaustive: 'Vollerhebung',\n addUnit: 'Einheit hinzufügen',\n noUnits: 'Noch keine Einheiten erfasst.',\n cellLabel: '{field}, Zeile {row}',\n evaluate: 'Hochrechnen',\n issueRequired: 'Pflichtfeld.',\n issueInvalid: 'Keine gültige Zahl.',\n issueRange: 'Wert außerhalb des zulässigen Bereichs.',\n issueReason: 'Anomale Fehler nur mit Begründung.',\n issueStratum: 'Unbekannte Schicht.',\n issueDuplicate: 'Doppelt vergeben.',\n formIncomplete: 'Bitte die markierten Felder prüfen.',\n errormethod: 'Hochrechnungsmethode wählen.',\n errorconfidence: 'Konfidenzniveau wählen.',\n errorprofile: 'Faktorprofil wählen.',\n errorstrata: 'Mindestens eine Schicht erfassen.',\n errorunits: 'Mindestens eine geprüfte Einheit erfassen.',\n resultTitle: 'Gesamtfehlerquote (TER)',\n resultNotice: 'Die Bewertung gibt die Entscheidungsregeln des KOM-Leitfadens wieder; sie ersetzt nicht das fachliche Urteil der Prüfbehörde.',\n projected: 'Hochgerechneter zufälliger Fehler (EE)',\n systemic: 'Abgegrenzte systemische Fehler',\n anomalousUncorrected: 'Nicht korrigierte anomale Fehler',\n anomalousExcluded: 'Korrigierte anomale Fehler (nicht in der TER)',\n totalError: 'Gesamtfehler',\n ter: 'Gesamtfehlerquote (TER)',\n tolerable: 'Tolerierbarer Fehler (TE)',\n precision: 'Präzision (SE)',\n upperLimit: 'Fehlerobergrenze (ULE)',\n notDeterminable: 'nicht bestimmbar',\n correctedBookValue: 'Korrigierter Buchwert (CBV)',\n lowerLimit: 'Untergrenze (CBV − SE)',\n explanation: 'Erläuterung',\n warnings: 'Hinweise',\n derivation: 'Herleitung',\n colStep: 'Schritt',\n colFormula: 'Formel',\n colValue: 'Wert',\n colSource: 'Quelle',\n exportCsv: 'Als CSV exportieren',\n exportJson: 'Als JSON exportieren',\n fingerprint: 'Fingerabdruck der Eingabe',\n residualTitle: 'Restfehlerquote (RER) nach Finanzkorrekturen',\n residualNotice: 'Getrennt von der Gesamtfehlerquote: Die RER berücksichtigt die Finanzkorrekturen (Vorlage CPRE_23-0013-01 Annex 3).',\n auditPopulation: 'Prüfpopulation (A)',\n terRate: 'Gesamtfehlerquote (D)',\n ongoing: 'Beträge in laufender Bewertung (E1)',\n otherNegative: 'Sonstige negative Beträge (E2)',\n corrections: 'Finanzkorrekturen (H)',\n computeResidual: 'Restfehlerquote berechnen',\n rer: 'Restfehlerquote (RER)',\n rerExceeds: 'über der Wesentlichkeitsschwelle',\n rerWithin: 'höchstens Wesentlichkeitsschwelle',\n extrapolatedCorrection: 'Hochgerechnete Finanzkorrektur (L)',\n rateAfter: 'RER nach hochgerechneter Korrektur (M)',\n colRow: 'Zeile',\n colLabel: 'Bezeichnung',\n colAmount: 'Wert',\n notApplicable: 'entfällt',\n design: 'Aufbau der Stichprobe',\n designsingle: 'Ein Zeitraum',\n designperiods: 'Mehrere Zeiträume des Geschäftsjahres',\n designgroups: 'Gruppe von Programmen',\n designHint: 'Mehrere Zeiträume: Leitfaden 6.1.3, 6.2.3, 6.3.3, 6.3.4, 6.4.9 und 7.3; Gruppe von Programmen: 7.8.',\n systemAssessment: 'Bewertung des Verwaltungs- und Kontrollsystems',\n systemAssessmentHint: 'Für die Neuberechnung des Konfidenzniveaus bei nicht schlüssigem Ergebnis (Leitfaden 7.7; Tabelle 1 in 3.2.1).',\n systemNone: 'keine Angabe',\n populationUnits: 'Verschiedene Einheiten aller Zeiträume',\n populationUnitsHint: 'Nur nicht-statistisch, für die Abdeckungsprüfung (Leitfaden 6.4.9).',\n period: 'Zeitraum',\n group: 'Programm',\n groupOptional: 'Programm (optional)',\n errorperiods: 'Für diese Methode beschreibt der Leitfaden keine Stichprobe über mehrere Zeiträume.',\n subsample: 'Teilstichprobe',\n subsampleCreate: 'Teilstichprobe anlegen, Zeile {row}',\n subsampleOpen: 'Teilstichprobe bearbeiten, Zeile {row}',\n subsampleDrop: 'Teilstichprobe entfernen, Zeile {row}',\n fromSubsample: 'aus Teilstichprobe',\n subsampleTitle: 'Teilstichprobe der Einheit {unit}',\n subsampleHint: 'Fehler der Einheit aus einer Zufallsauswahl ihrer Belege, Zahlungsanträge oder Projektpartner (Leitfaden 7.6; ETC 6.5.3). Vollständig geprüfte Teileinheiten (z. B. Lead-Partner) als Vollerhebung markieren; Buchwert der Stichprobenschicht = Buchwert der Einheit − Vollerhebung.',\n estimator: 'Schätzer',\n estimatorratio: 'Verhältnisschätzung',\n estimatormean_per_unit: 'Mittelwertschätzung',\n estimatorpps: 'Wertproportional (MUS-Formel)',\n subPopulation: 'Anzahl Teileinheiten der Stichprobenschicht (N)',\n subItems: 'Geprüfte Teileinheiten',\n subItemId: 'Teileinheit',\n subStratum: 'Teilschicht',\n subStrata: 'Teilschichten (optional)',\n subStrataHint: 'Ohne Teilschichten: eine Stichprobenschicht und die Vollerhebung. Mit Teilschichten: Buchwert (und bei der Mittelwertschätzung die Anzahl) je Teilschicht; die Summe der Buchwerte ist der Buchwert der Einheit.',\n addSubStratum: 'Teilschicht hinzufügen',\n subsampleNestedTitle: 'Teilstichprobe der Teileinheit {item} (Einheit {unit}, dritte Stufe)',\n nestedCreate: 'Teilstichprobe der Teileinheit anlegen, Zeile {row}',\n nestedOpen: 'Teilstichprobe der Teileinheit bearbeiten, Zeile {row}',\n nestedDrop: 'Teilstichprobe der Teileinheit entfernen, Zeile {row}',\n backToUnit: 'Zurück zur Teilstichprobe der Einheit',\n addSubItem: 'Teileinheit hinzufügen',\n close: 'Schließen',\n detailsPeriods: 'Zeiträume',\n detailsGroups: 'Programme der Gruppe',\n detailsSubsamples: 'Teilstichproben',\n recalcTitle: 'Neuberechnung des Konfidenzniveaus (Leitfaden 7.7)',\n recalcLevel: 'Konfidenzniveau für ein schlüssiges Ergebnis',\n recalcCoefficient: 'Neuer z-Wert (z*)',\n recalcRequired: 'Nach Systembewertung verlangt',\n recalcSupports: 'Mit der Systembewertung vereinbar: kein wesentlicher Fehler ohne weitere Prüfungshandlungen.',\n recalcNotSupported: 'Nicht mit der Systembewertung vereinbar: weitere Prüfungshandlungen nach Abschn. 4.12.',\n recalcNoRequirement: 'Ohne Bewertung des Verwaltungs- und Kontrollsystems keine Aussage zur Vereinbarkeit.',\n colName: 'Bezeichnung',\n colBookValue: 'Buchwert',\n colProjected: 'Hochgerechneter Fehler',\n colPrecision: 'Präzision',\n colSampleSize: 'Stichprobe',\n colObservations: 'Beobachtungen',\n colTer: 'Gesamtfehlerquote',\n colUpper: 'Obergrenze',\n colConclusion: 'Ergebnis',\n colRate: 'Fehlerquote',\n colCoverage: 'Deckung',\n colItems: 'Teileinheiten',\n },\n en: {\n title: 'Projection and error rates',\n method: 'Projection method',\n confidence: 'Confidence level',\n evaluate: 'Project',\n resultTitle: 'Total error rate (TER)',\n residualTitle: 'Residual error rate (RER) after financial corrections',\n computeResidual: 'Compute residual error rate',\n design: 'Sample design',\n period: 'Period',\n subsample: 'Sub-sample',\n },\n})\n\nexport type ExtrapolationMessageKey = keyof typeof extrapolationMessages.de\n","/**\n * Formularteile für den Aufbau der Stichprobe (Leitfaden Kap. 6/7): mehrere\n * Zeiträume (7.3), Gruppen von Programmen (7.8), Teilstichproben je Einheit\n * (7.6, 6.5.3) und die Systembewertung für die Neuberechnung des\n * Konfidenzniveaus (7.7). Teilstichproben: `model-subsample.ts`.\n */\nimport type { ExtrapolationDesign, StratumInput } from './types'\n\nexport type DesignIssue = 'required' | 'invalid' | 'range' | 'reason' | 'stratum' | 'duplicate'\n\nexport interface DesignRule {\n required?: boolean\n positive?: boolean\n integer?: boolean\n max?: number\n}\n\n/** Sammelt Feldbefunde (von `model.ts` bereitgestellt). */\nexport interface IssueSink {\n take(key: string, text: string, rule?: DesignRule): number\n flag(key: string, issue: DesignIssue): void\n}\n\n/** Aufbau aus vorbelegten Schichten: Zeitraum oder Gruppe gesetzt? */\nexport function designOf(strata: readonly StratumInput[]): ExtrapolationDesign {\n if (strata.some((stratum) => stratum.period)) return 'periods'\n return strata.some((stratum) => stratum.group) ? 'groups' : 'single'\n}\n\nexport function stratumPart(stratum: StratumInput): string {\n return stratum.period ?? stratum.group ?? ''\n}\n\n\n/** Zeiträume in der Reihenfolge ihres ersten Auftretens. */\nexport function periodNames(parts: readonly string[]): string[] {\n return [...new Set(parts.map((part) => part.trim()).filter(Boolean))]\n}\n\n/** Ergänzungen der Anfrage je Aufbau (Zeitraumliste, Zahl der Einheiten, Systembewertung). */\nexport function designRequest(design: ExtrapolationDesign, parts: readonly string[], populationUnits: string, systemAssessment: string, out: IssueSink) {\n const units = design === 'periods' && populationUnits.trim() ? out.take('populationUnits', populationUnits, { positive: true, integer: true }) : undefined\n return {\n ...(design === 'periods' ? { periods: periodNames(parts).map((name) => ({ name })) } : {}),\n ...(units === undefined ? {} : { population_units: units }),\n ...(systemAssessment ? { system_assessment: Number(systemAssessment) } : {}),\n }\n}\n\n/** Schlüssel einer Schicht für die Zuordnung der Einheiten (je Zeitraum eindeutig). */\nexport function stratumKey(design: ExtrapolationDesign, part: string, name: string): string {\n return design === 'periods' ? `${part.trim()}\\u0000${name.trim()}` : name.trim()\n}\n","/**\n * Teilstichproben im Formular (Leitfaden 7.6, 6.4.10, 6.5.3): Fehler einer\n * Einheit aus einer Zufallsauswahl ihrer Belege, Zahlungsanträge oder\n * Projektpartner.\n *\n * Ohne eigene Teilschichten gilt die einfache Form: eine Stichprobenschicht\n * und vollständig geprüfte Teileinheiten (z. B. der Lead-Partner); der\n * Buchwert der Stichprobenschicht ist der Buchwert der Einheit abzüglich der\n * Vollerhebung. Mit Teilschichten werden Buchwert und Anzahl je Teilschicht\n * erfasst und jede Teileinheit einer Teilschicht zugeordnet. Eine Teileinheit\n * darf selbst eine Teilstichprobe haben (dreistufig, 6.5.3.2.2), tiefer nicht.\n */\nimport type { IssueSink } from './model-design'\nimport type { StratumInput, SubsampleEstimator, SubsampleInput, UnitInput } from './types'\n\nexport const SAMPLED_PART = 'Stichprobe'\nexport const EXHAUSTIVE_PART = 'Vollerhebung'\n/** Einheit (Stufe 1) → Teileinheit (Stufe 2) → Teileinheit (Stufe 3). */\nexport const MAX_SUBSAMPLE_DEPTH = 2\n\nexport interface SubStratumRow {\n key: string\n name: string\n bookValue: string\n populationSize: string\n}\n\nexport interface SubItemRow {\n key: string\n id: string\n /** Teilschicht (nur mit eigenen Teilschichten). */\n stratum: string\n bookValue: string\n random: string\n exhaustive: boolean\n /** Teilstichprobe der Teileinheit (dreistufig). */\n subsample: SubsampleRows | null\n}\n\nexport interface SubsampleRows {\n estimator: SubsampleEstimator\n /** Anzahl Teileinheiten der Stichprobenschicht (einfache Form, Mittelwertschätzung). */\n populationSize: string\n /** Eigene Teilschichten; leer = einfache Form. */\n strata: readonly SubStratumRow[]\n items: readonly SubItemRow[]\n}\n\nexport function emptySubItem(key: string, stratum = ''): SubItemRow {\n return { key, id: '', stratum, bookValue: '', random: '', exhaustive: false, subsample: null }\n}\n\nexport function emptySubStratum(key: string): SubStratumRow {\n return { key, name: '', bookValue: '', populationSize: '' }\n}\n\nexport function emptySubsample(): SubsampleRows {\n return { estimator: 'ratio', populationSize: '', strata: [], items: [] }\n}\n\ntype Format = (value: number) => string\n\nfunction isSimple(sub: SubsampleInput): boolean {\n return sub.strata.every((stratum) => stratum.name === SAMPLED_PART || stratum.name === EXHAUSTIVE_PART)\n}\n\n/** Formularzeilen einer vorbelegten Teilstichprobe (einfache Form oder mit Teilschichten). */\nexport function subsampleRows(sub: SubsampleInput | undefined, format: Format, prefix = 'i'): SubsampleRows | null {\n if (!sub) return null\n const simple = isSimple(sub)\n const sampled = sub.strata.find((stratum) => stratum.name === SAMPLED_PART)\n return {\n estimator: sub.estimator,\n populationSize: simple && sampled?.population_size !== undefined ? String(sampled.population_size) : '',\n strata: simple ? [] : sub.strata.map((stratum, index) => ({\n key: `${prefix}s${index + 1}`,\n name: stratum.name,\n bookValue: format(stratum.book_value),\n populationSize: stratum.population_size === undefined ? '' : String(stratum.population_size),\n })),\n items: sub.units.map((unit, index) => ({\n key: `${prefix}${index + 1}`,\n id: unit.id,\n stratum: simple ? '' : unit.stratum,\n bookValue: format(unit.book_value),\n random: unit.random_error ? format(unit.random_error) : '',\n exhaustive: unit.exhaustive ?? false,\n subsample: subsampleRows(unit.subsample, format, `${prefix}${index + 1}.`),\n })),\n }\n}\n\nfunction readItem(item: SubItemRow, at: string, simple: boolean, depth: number, out: IssueSink): UnitInput {\n const book = out.take(`${at}.bookValue`, item.bookValue, { required: true, positive: true })\n const stratum = simple ? (item.exhaustive ? EXHAUSTIVE_PART : SAMPLED_PART) : item.stratum.trim()\n const nested = item.subsample && depth < MAX_SUBSAMPLE_DEPTH ? item.subsample : null\n const unit: UnitInput = {\n id: item.id.trim(),\n stratum,\n book_value: book,\n ...(nested ? { subsample: readSubsample(nested, book, `${at}.subsample`, out, depth + 1) } : { random_error: out.take(`${at}.random`, item.random) }),\n }\n return item.exhaustive ? { ...unit, exhaustive: true } : unit\n}\n\nfunction readItems(rows: SubsampleRows, key: string, depth: number, out: IssueSink): UnitInput[] {\n const seen = new Set<string>()\n const names = new Set(rows.strata.map((stratum) => stratum.name.trim()))\n const simple = rows.strata.length === 0\n return rows.items.map((item, index) => {\n const at = `${key}.items.${index}`\n const id = item.id.trim()\n if (!id) out.flag(`${at}.id`, 'required')\n else if (seen.has(id)) out.flag(`${at}.id`, 'duplicate')\n seen.add(id)\n if (!simple && !names.has(item.stratum.trim())) out.flag(`${at}.stratum`, 'stratum')\n return readItem(item, at, simple, depth, out)\n })\n}\n\nfunction simpleStrata(rows: SubsampleRows, units: readonly UnitInput[], unitBook: number, key: string, out: IssueSink): StratumInput[] {\n const exhaustive = units.filter((unit) => unit.exhaustive).reduce((sum, unit) => sum + unit.book_value, 0)\n const sampled = unitBook - exhaustive\n if (sampled <= 0) out.flag(`${key}.items`, 'range')\n const size = rows.estimator === 'mean_per_unit' ? out.take(`${key}.populationSize`, rows.populationSize, { required: true, positive: true, integer: true }) : undefined\n const strata: StratumInput[] = [{ name: SAMPLED_PART, book_value: sampled, ...(size === undefined ? {} : { population_size: size }) }]\n if (exhaustive > 0) strata.unshift({ name: EXHAUSTIVE_PART, book_value: exhaustive })\n return strata\n}\n\nfunction ownStrata(rows: SubsampleRows, unitBook: number, key: string, out: IssueSink): StratumInput[] {\n const seen = new Set<string>()\n const strata = rows.strata.map((row, index) => {\n const at = `${key}.strata.${index}`\n const name = row.name.trim()\n if (!name) out.flag(`${at}.name`, 'required')\n else if (seen.has(name)) out.flag(`${at}.name`, 'duplicate')\n seen.add(name)\n const book = out.take(`${at}.bookValue`, row.bookValue, { required: true, positive: true })\n const needsSize = rows.estimator === 'mean_per_unit' || row.populationSize.trim() !== ''\n const size = needsSize ? out.take(`${at}.populationSize`, row.populationSize, { required: true, positive: true, integer: true }) : undefined\n return { name, book_value: book, ...(size === undefined ? {} : { population_size: size }) }\n })\n const total = strata.reduce((sum, stratum) => sum + stratum.book_value, 0)\n if (Math.abs(total - unitBook) > 0.005) out.flag(`${key}.strata`, 'range')\n return strata\n}\n\n/** Teilstichprobe für die Anfrage (`depth` 1 = Teilstichprobe der Einheit). */\nexport function readSubsample(rows: SubsampleRows, unitBook: number, key: string, out: IssueSink, depth = 1): SubsampleInput {\n const units = readItems(rows, key, depth, out)\n if (!units.some((unit) => !unit.exhaustive)) out.flag(`${key}.items`, 'required')\n const strata = rows.strata.length ? ownStrata(rows, unitBook, key, out) : simpleStrata(rows, units, unitBook, key, out)\n return { estimator: rows.estimator, strata, units }\n}\n","/**\n * Framework-freie Formularlogik der Hochrechnung: Zeilen als Text (so wie\n * eingegeben), Prüfung je Feld und Aufbau der Anfragen. Nichts wird still\n * ergänzt; leere Fehlerfelder zählen als 0.\n */\nimport { parseInput } from '../sampling/model'\nimport { designRequest, stratumKey, stratumPart } from './model-design'\nimport { readSubsample, subsampleRows, type SubsampleRows } from './model-subsample'\nimport type { EvaluationRequest, EvaluationResult, ExtrapolationCatalogue, ExtrapolationDesign, ExtrapolationMethod, ResidualRequest, StratumInput, UnitInput } from './types'\n\nexport interface StratumRow {\n key: string\n name: string\n bookValue: string\n populationSize: string\n systemic: string\n /** Zeitraum bzw. Programm (Aufbau `periods` bzw. `groups`). */\n part: string\n /** Programm bei mehreren Zeiträumen (optional, Leitfaden 6.3.4 und 7.8). */\n group: string\n}\n\nexport interface UnitRow {\n key: string\n id: string\n stratum: string\n bookValue: string\n random: string\n systemic: string\n anomalous: string\n reason: string\n corrected: boolean\n exhaustive: boolean\n period: string\n subsample: SubsampleRows | null\n}\n\nexport interface ExtrapolationForm {\n methodId: string\n confidence: number | null\n profileId: string | null\n sampleSize: string\n /** Wesentlichkeitsschwelle in Prozent. */\n materiality: string\n strata: readonly StratumRow[]\n units: readonly UnitRow[]\n design: ExtrapolationDesign\n /** Kategorie 1–4 der Systembewertung (Tabelle 1, Leitfaden 3.2.1) oder leer. */\n systemAssessment: string\n /** Verschiedene Einheiten aller Zeiträume (nicht-statistisch, 6.4.9). */\n populationUnits: string\n}\n\nexport type ExtrapolationIssue = 'required' | 'invalid' | 'range' | 'reason' | 'stratum' | 'duplicate'\nexport type ExtrapolationFormError = 'method' | 'confidence' | 'profile' | 'strata' | 'units' | 'periods'\nexport type ExtrapolationIssues = Readonly<Record<string, ExtrapolationIssue>>\n\nexport type EvaluationValidation =\n | { ok: true; request: EvaluationRequest }\n | { ok: false; error: ExtrapolationFormError | null; issues: ExtrapolationIssues }\n\nexport interface ResidualForm {\n auditPopulation: string\n /** Gesamtfehlerquote in Prozent. */\n terRate: string\n ongoing: string\n otherNegative: string\n corrections: string\n}\n\nexport type ResidualValidation = { ok: true; request: ResidualRequest } | { ok: false; issues: ExtrapolationIssues }\n\nexport const EMPTY_RESIDUAL: ResidualForm = { auditPopulation: '', terRate: '', ongoing: '', otherNegative: '', corrections: '' }\n\nexport function emptyStratum(key: string): StratumRow {\n return { key, name: '', bookValue: '', populationSize: '', systemic: '', part: '', group: '' }\n}\n\nexport function emptyUnit(key: string, stratum = '', period = ''): UnitRow {\n return { key, id: '', stratum, bookValue: '', random: '', systemic: '', anomalous: '', reason: '', corrected: false, exhaustive: false, period, subsample: null }\n}\n\ntype Format = (value: number) => string\n\nconst optional = (value: number | undefined, format: Format): string => (value === undefined || value === 0 ? '' : format(value))\n\nexport function stratumRows(strata: readonly StratumInput[], format: Format): StratumRow[] {\n return strata.map((stratum, index) => ({\n key: `s${index + 1}`,\n name: stratum.name,\n bookValue: format(stratum.book_value),\n populationSize: stratum.population_size === undefined ? '' : String(stratum.population_size),\n systemic: optional(stratum.systemic_error, format),\n part: stratumPart(stratum),\n group: stratum.period ? stratum.group ?? '' : '',\n }))\n}\n\nexport function unitRows(units: readonly UnitInput[], format: Format): UnitRow[] {\n return units.map((unit, index) => ({\n key: `u${index + 1}`,\n id: unit.id,\n stratum: unit.stratum,\n bookValue: format(unit.book_value),\n random: optional(unit.random_error, format),\n systemic: optional(unit.systemic_error, format),\n anomalous: optional(unit.anomalous_error, format),\n reason: unit.anomalous_reason ?? '',\n corrected: unit.anomalous_corrected ?? false,\n exhaustive: unit.exhaustive ?? false,\n period: unit.period ?? '',\n subsample: subsampleRows(unit.subsample, format),\n }))\n}\n\ninterface Rule {\n required?: boolean\n positive?: boolean\n integer?: boolean\n max?: number\n}\n\nfunction violates(value: number, rule: Rule): boolean {\n if (rule.integer && !Number.isInteger(value)) return true\n const low = rule.positive ? value <= 0 : value < 0\n return low || (rule.max !== undefined && value > rule.max)\n}\n\n/** Zahl eines Textfelds oder der Befund; leere, nicht verlangte Felder ergeben 0. */\nexport function readExtrapolationAmount(text: string, rule: Rule = {}): number | ExtrapolationIssue {\n const parsed = parseInput(text)\n if (parsed === null) return rule.required ? 'required' : 0\n if (parsed === undefined) return 'invalid'\n if (rule.integer && !Number.isInteger(parsed)) return 'invalid'\n return violates(parsed, rule) ? 'range' : parsed\n}\n\nclass Collector {\n readonly issues: Record<string, ExtrapolationIssue> = {}\n\n take(key: string, text: string, rule: Rule = {}): number {\n const value = readExtrapolationAmount(text, rule)\n if (typeof value === 'number') return value\n this.issues[key] = value\n return 0\n }\n\n flag(key: string, issue: ExtrapolationIssue): void {\n this.issues[key] = issue\n }\n}\n\nfunction withPart(design: ExtrapolationDesign, row: StratumRow, index: number, out: Collector): Partial<StratumInput> {\n if (design === 'single') return {}\n const part = row.part.trim()\n if (!part) out.flag(`strata.${index}.part`, 'required')\n if (design === 'groups') return { group: part }\n const group = row.group.trim()\n return group ? { period: part, group } : { period: part }\n}\n\nfunction readStrata(rows: readonly StratumRow[], method: ExtrapolationMethod, design: ExtrapolationDesign, out: Collector): StratumInput[] {\n const seen = new Set<string>()\n return rows.map((row, index) => {\n const name = row.name.trim()\n const key = stratumKey(design, row.part, name)\n if (!name) out.flag(`strata.${index}.name`, 'required')\n else if (seen.has(key)) out.flag(`strata.${index}.name`, 'duplicate')\n seen.add(key)\n const stratum: StratumInput = { name, book_value: out.take(`strata.${index}.bookValue`, row.bookValue, { required: true, positive: true }) }\n const systemic = out.take(`strata.${index}.systemic`, row.systemic)\n const size = row.populationSize.trim() || method.needs_population_size\n ? out.take(`strata.${index}.populationSize`, row.populationSize, { required: true, positive: true, integer: true })\n : undefined\n return { ...stratum, ...(size === undefined ? {} : { population_size: size }), ...(systemic ? { systemic_error: systemic } : {}), ...withPart(design, row, index, out) }\n })\n}\n\nfunction readUnit(row: UnitRow, index: number, names: ReadonlySet<string>, design: ExtrapolationDesign, out: Collector): UnitInput {\n const key = `units.${index}`\n if (!row.id.trim()) out.flag(`${key}.id`, 'required')\n if (!names.has(stratumKey(design, row.period, row.stratum))) out.flag(`${key}.stratum`, 'stratum')\n const anomalous = out.take(`${key}.anomalous`, row.anomalous)\n if (anomalous > 0 && !row.reason.trim()) out.flag(`${key}.reason`, 'reason')\n const book = out.take(`${key}.bookValue`, row.bookValue, { required: true, positive: true })\n const unit: UnitInput = {\n id: row.id.trim(),\n stratum: row.stratum.trim(),\n book_value: book,\n ...(row.subsample ? { subsample: readSubsample(row.subsample, book, `${key}.subsample`, out) } : { random_error: out.take(`${key}.random`, row.random) }),\n systemic_error: out.take(`${key}.systemic`, row.systemic),\n anomalous_error: anomalous,\n }\n const period = design === 'periods' ? { period: row.period.trim() } : {}\n return { ...unit, ...period, ...(anomalous > 0 ? { anomalous_reason: row.reason.trim(), anomalous_corrected: row.corrected } : {}), ...(row.exhaustive ? { exhaustive: true } : {}) }\n}\n\nfunction formError(catalogue: ExtrapolationCatalogue, form: ExtrapolationForm): ExtrapolationFormError | null {\n const method = catalogue.methods.find((entry) => entry.id === form.methodId)\n if (!method) return 'method'\n if (method.statistical && form.confidence === null) return 'confidence'\n if (method.statistical && form.profileId === null) return 'profile'\n if (form.design === 'periods' && method.periods === false) return 'periods'\n if (form.strata.length === 0) return 'strata'\n return form.units.length === 0 ? 'units' : null\n}\n\nfunction settings(method: ExtrapolationMethod, form: ExtrapolationForm, out: Collector): Partial<EvaluationRequest> {\n const materiality = out.take('materiality', form.materiality, { required: true, positive: true, max: 2 })\n const size = method.needs_sample_size ? out.take('sampleSize', form.sampleSize, { required: true, positive: true, integer: true }) : undefined\n return {\n materiality_rate: materiality / 100,\n ...(method.statistical && form.confidence !== null ? { confidence_level: form.confidence } : {}),\n ...(method.statistical && form.profileId !== null ? { factor_profile: form.profileId } : {}),\n ...(size === undefined ? {} : { sample_size: size }),\n }\n}\n\n/** Programme über mehrere Zeiträume: alle Schichten oder keine (Leitfaden 7.8). */\nfunction checkPeriodGroups(rows: readonly StratumRow[], out: Collector): void {\n if (!rows.some((row) => row.group.trim())) return\n rows.forEach((row, index) => {\n if (!row.group.trim()) out.flag(`strata.${index}.group`, 'required')\n })\n}\n\n/** Anfrage für `POST /evaluate`; bei Befunden die Feldschlüssel mit ihrem Fehler. */\nexport function buildEvaluationRequest(catalogue: ExtrapolationCatalogue, form: ExtrapolationForm): EvaluationValidation {\n const error = formError(catalogue, form)\n const method = catalogue.methods.find((entry) => entry.id === form.methodId)\n if (error || !method) return { ok: false, error, issues: {} }\n const out = new Collector()\n const strata = readStrata(form.strata, method, form.design, out)\n const names = new Set(form.strata.filter((row) => row.name.trim()).map((row) => stratumKey(form.design, row.part, row.name)))\n const units = form.units.map((row, index) => readUnit(row, index, names, form.design, out))\n const extra = designRequest(form.design, form.strata.map((row) => row.part), form.populationUnits, form.systemAssessment, out)\n if (form.design === 'periods') checkPeriodGroups(form.strata, out)\n const request = { method: method.id, ...settings(method, form, out), ...extra, strata, units } as EvaluationRequest\n return Object.keys(out.issues).length ? { ok: false, error: null, issues: out.issues } : { ok: true, request }\n}\n\n/** RER-Formular aus einer Auswertung: A = Buchwert, D = Gesamtfehlerquote (in Prozent). */\nexport function residualFormFrom(result: EvaluationResult, current: ResidualForm, format: (value: number) => string): ResidualForm {\n const ter = result.total_error_rate\n return { ...current, auditPopulation: format(ter.book_value), terRate: format(ter.rate * 100) }\n}\n\n/** Anfrage für `POST /residual`; die Gesamtfehlerquote wird in Prozent eingegeben. */\nexport function buildResidualRequest(form: ResidualForm, materialityRate: number): ResidualValidation {\n const out = new Collector()\n const request: ResidualRequest = {\n audit_population: out.take('auditPopulation', form.auditPopulation, { required: true, positive: true }),\n total_error_rate: out.take('terRate', form.terRate, { required: true, max: 100 }) / 100,\n ongoing_assessment: out.take('ongoing', form.ongoing),\n other_negative_amounts: out.take('otherNegative', form.otherNegative),\n financial_corrections: out.take('corrections', form.corrections),\n materiality_rate: materialityRate,\n }\n return Object.keys(out.issues).length ? { ok: false, issues: out.issues } : { ok: true, request }\n}\n\nexport function extrapolationMethodById(catalogue: ExtrapolationCatalogue | null, id: string): ExtrapolationMethod | null {\n return catalogue?.methods.find((method) => method.id === id) ?? null\n}\n\n/** Konfidenzniveaus, die die gewählte Methode mit Tabellenwerten erlaubt. */\nexport function confidenceChoices(catalogue: ExtrapolationCatalogue, method: ExtrapolationMethod | null): readonly number[] {\n return method?.id === 'mus.conservative' ? catalogue.confidence_levels['mus.conservative'] : catalogue.confidence_levels.z\n}\n","import { requestFile, requestJson, type RestOptions } from '@auditcore/common'\nimport type { ExtrapolationPort } from './types'\n\n/** Port auf den REST-Vertrag von `auditcore_extrapolation.web` (Starlette oder FastAPI). */\nexport function createExtrapolationRestPort(options: RestOptions): ExtrapolationPort {\n return {\n profiles: () => requestJson(options, '/profiles'),\n evaluate: (request) => requestJson(options, '/evaluate', request),\n residual: (request) => requestJson(options, '/residual', request),\n exportEvaluation: (request, format) =>\n requestFile(options, '/evaluate/export', { ...request, format }, `hochrechnung-${request.method}.${format}`),\n }\n}\n","// Bearbeitung der Teilstichprobe einer Einheit (Leitfaden 7.6, 6.5.3) im\n// Zustandsautomaten der Hochrechnung: anlegen, öffnen, Teilschichten und\n// Teileinheiten pflegen, Teilstichprobe einer Teileinheit (dreistufig).\nimport type { Store } from '../store'\nimport type { ExtrapolationData } from './controller'\nimport type { UnitRow } from './model'\nimport { emptySubItem, emptySubsample, emptySubStratum, type SubItemRow, type SubsampleRows, type SubStratumRow } from './model-subsample'\n\nfunction patchUnit(store: Store<ExtrapolationData>, index: number, patch: Partial<UnitRow>): void {\n store.set((state) => ({ form: { ...state.form, units: state.form.units.map((row, position) => (position === index ? { ...row, ...patch } : row)) } }))\n}\n\nfunction replaceAt<T>(rows: readonly T[], index: number, change: Partial<T>): T[] {\n return rows.map((row, position) => (position === index ? { ...row, ...change } : row))\n}\n\n/** Gerade bearbeitete Teilstichprobe: die der Einheit oder die einer ihrer Teileinheiten. */\nexport function openSubsample(state: ExtrapolationData): SubsampleRows | null {\n const unit = state.subsampleUnit === null ? null : state.form.units[state.subsampleUnit]?.subsample ?? null\n if (!unit || state.subsampleItem === null) return unit\n return unit.items[state.subsampleItem]?.subsample ?? null\n}\n\nexport function createSubsampleActions(store: Store<ExtrapolationData>, key: (prefix: string) => string) {\n const patch = (change: (rows: SubsampleRows) => Partial<SubsampleRows>): void => {\n const state = store.get()\n const index = state.subsampleUnit\n const unit = index === null ? null : state.form.units[index]?.subsample\n if (index === null || !unit) return\n if (state.subsampleItem === null) {\n patchUnit(store, index, { subsample: { ...unit, ...change(unit) } })\n return\n }\n const nested = unit.items[state.subsampleItem]?.subsample\n if (!nested) return\n patchUnit(store, index, { subsample: { ...unit, items: replaceAt(unit.items, state.subsampleItem, { subsample: { ...nested, ...change(nested) } }) } })\n }\n const fresh = (): SubsampleRows => ({ ...emptySubsample(), items: [emptySubItem(key('i'))] })\n return {\n /** Teilstichprobe anlegen und öffnen bzw. entfernen (der Fehler kommt dann wieder aus dem Feld). */\n toggleSubsample(index: number): void {\n const unit = store.get().form.units[index]\n if (!unit) return\n if (unit.subsample) {\n patchUnit(store, index, { subsample: null })\n store.set((state) => (state.subsampleUnit === index ? { subsampleUnit: null, subsampleItem: null } : {}))\n return\n }\n patchUnit(store, index, { subsample: fresh(), random: '' })\n store.set({ subsampleUnit: index, subsampleItem: null })\n },\n editSubsample: (index: number | null) => store.set({ subsampleUnit: index, subsampleItem: null }),\n /** Teilstichprobe einer Teileinheit anlegen bzw. entfernen (nur in der Teilstichprobe der Einheit). */\n toggleNestedSubsample(item: number): void {\n if (store.get().subsampleItem !== null) return\n const current = store.get()\n const unit = current.subsampleUnit === null ? null : current.form.units[current.subsampleUnit]?.subsample\n const row = unit?.items[item]\n if (!row) return\n patch((rows) => ({ items: replaceAt(rows.items, item, row.subsample ? { subsample: null } : { subsample: fresh(), random: '' }) }))\n if (!row.subsample) store.set({ subsampleItem: item })\n },\n editNestedSubsample: (item: number | null) => store.set({ subsampleItem: item }),\n updateSubsample: (change: Partial<Pick<SubsampleRows, 'estimator' | 'populationSize'>>) => patch(() => change),\n addSubStratum: () => patch((rows) => ({ strata: [...rows.strata, emptySubStratum(key('t'))] })),\n updateSubStratum: (index: number, change: Partial<SubStratumRow>) => patch((rows) => ({ strata: replaceAt(rows.strata, index, change) })),\n removeSubStratum: (index: number) => patch((rows) => ({ strata: rows.strata.filter((_, position) => position !== index) })),\n addSubItem: () => patch((rows) => ({ items: [...rows.items, emptySubItem(key('i'), rows.strata[0]?.name ?? '')] })),\n updateSubItem: (item: number, change: Partial<SubItemRow>) => patch((rows) => ({ items: replaceAt(rows.items, item, change) })),\n removeSubItem: (item: number) => patch((rows) => ({ items: rows.items.filter((_, position) => position !== item) })),\n }\n}\n","// Zustandsautomat von <flowaudit-extrapolation> (Vue und React): Methode,\n// Konfidenzniveau, Schichten und geprüfte Einheiten erfassen, hochrechnen\n// (TER), getrennt davon die Restfehlerquote (RER) berechnen und exportieren.\n// Gerechnet wird ausschließlich über den Port.\n\nimport type { DownloadFile } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport {\n buildEvaluationRequest,\n buildResidualRequest,\n confidenceChoices,\n EMPTY_RESIDUAL,\n emptyStratum,\n emptyUnit,\n extrapolationMethodById,\n residualFormFrom,\n stratumRows,\n unitRows,\n type ExtrapolationForm,\n type ExtrapolationFormError,\n type ExtrapolationIssues,\n type ResidualForm,\n type StratumRow,\n type UnitRow,\n} from './model'\nimport { createSubsampleActions } from './controller-subsample'\nimport { designOf } from './model-design'\nimport type {\n EvaluationRequest,\n EvaluationResult,\n ExtrapolationCatalogue,\n ExtrapolationExportFormat,\n ExtrapolationMethod,\n ExtrapolationPort,\n ResidualResult,\n StratumInput,\n UnitInput,\n} from './types'\n\nexport type ExtrapolationBusy = 'load' | 'evaluate' | 'residual' | 'export'\n\nexport interface ExtrapolationCallbacks {\n evaluated?: (result: EvaluationResult) => void\n residualComputed?: (result: ResidualResult) => void\n failed?: (message: string) => void\n}\n\n/** Stand der Hochrechnung; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface ExtrapolationData extends RequestState<string> {\n catalogue: ExtrapolationCatalogue | null\n form: ExtrapolationForm\n formError: ExtrapolationFormError | null\n issues: ExtrapolationIssues\n result: EvaluationResult | null\n lastRequest: EvaluationRequest | null\n residualForm: ResidualForm\n residualIssues: ExtrapolationIssues\n residual: ResidualResult | null\n /** Einheit, deren Teilstichprobe gerade bearbeitet wird. */\n subsampleUnit: number | null\n /** Teileinheit dieser Teilstichprobe, deren eigene Teilstichprobe bearbeitet wird (dreistufig). */\n subsampleItem: number | null\n}\n\nexport interface ExtrapolationSource {\n port: () => ExtrapolationPort | null | undefined\n strata: () => readonly StratumInput[]\n units: () => readonly UnitInput[]\n /** Zahl → Eingabetext im Sprachformat. */\n format: (value: number) => string\n callbacks?: () => ExtrapolationCallbacks\n}\n\nconst EMPTY_FORM: ExtrapolationForm = {\n methodId: '', confidence: null, profileId: null, sampleSize: '', materiality: '', strata: [], units: [], design: 'single', systemAssessment: '', populationUnits: '',\n}\n\nexport const INITIAL_EXTRAPOLATION: ExtrapolationData = {\n ...IDLE, catalogue: null, form: EMPTY_FORM, formError: null, issues: {}, result: null, lastRequest: null,\n residualForm: EMPTY_RESIDUAL, residualIssues: {}, residual: null, subsampleUnit: null, subsampleItem: null,\n}\n\nexport function extrapolationMethod(state: ExtrapolationData): ExtrapolationMethod | null {\n return extrapolationMethodById(state.catalogue, state.form.methodId)\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nfunction replaceAt<T>(rows: readonly T[], index: number, patch: Partial<T>): T[] {\n return rows.map((row, position) => (position === index ? { ...row, ...patch } : row))\n}\n\nfunction createRows(store: Store<ExtrapolationData>) {\n let counter = 0\n const key = (prefix: string): string => `${prefix}n${(counter += 1)}`\n const patchForm = (patch: Partial<ExtrapolationForm>): void => store.set((state) => ({ form: { ...state.form, ...patch } }))\n return {\n patchForm,\n addStratum: () => patchForm({ strata: [...store.get().form.strata, emptyStratum(key('s'))] }),\n updateStratum: (index: number, patch: Partial<StratumRow>) => patchForm({ strata: replaceAt(store.get().form.strata, index, patch) }),\n removeStratum: (index: number) => patchForm({ strata: store.get().form.strata.filter((_, position) => position !== index) }),\n addUnit: () => {\n const form = store.get().form\n patchForm({ units: [...form.units, emptyUnit(key('u'), form.strata[0]?.name ?? '', form.design === 'periods' ? form.strata[0]?.part ?? '' : '')] })\n },\n updateUnit: (index: number, patch: Partial<UnitRow>) => patchForm({ units: replaceAt(store.get().form.units, index, patch) }),\n removeUnit: (index: number) => {\n patchForm({ units: store.get().form.units.filter((_, position) => position !== index) })\n store.set({ subsampleUnit: null, subsampleItem: null })\n },\n ...createSubsampleActions(store, key),\n }\n}\n\ntype Run = ReturnType<typeof createRunner<ExtrapolationPort, string, ExtrapolationData>>\n\nfunction createRequests(source: ExtrapolationSource, store: Store<ExtrapolationData>, run: Run) {\n async function evaluate(): Promise<void> {\n const state = store.get()\n if (!state.catalogue) return\n const checked = buildEvaluationRequest(state.catalogue, state.form)\n store.set({ formError: checked.ok ? null : checked.error, issues: checked.ok ? {} : checked.issues })\n if (!checked.ok) return\n const result = await run('evaluate', (port) => port.evaluate(checked.request))\n if (!result) return\n store.set({ result, lastRequest: checked.request, residual: null, residualIssues: {}, residualForm: residualFormFrom(result, store.get().residualForm, source.format) })\n source.callbacks?.().evaluated?.(result)\n }\n\n async function computeResidual(): Promise<void> {\n const state = store.get()\n const checked = buildResidualRequest(state.residualForm, state.lastRequest?.materiality_rate ?? 0.02)\n store.set({ residualIssues: checked.ok ? {} : checked.issues })\n if (!checked.ok) return\n const result = await run('residual', (port) => port.residual(checked.request))\n if (!result) return\n store.set({ residual: result })\n source.callbacks?.().residualComputed?.(result)\n }\n\n async function exportEvaluation(format: ExtrapolationExportFormat): Promise<DownloadFile | null> {\n const request = store.get().lastRequest\n return request ? run('export', (port) => port.exportEvaluation(request, format)) : null\n }\n\n return { evaluate, computeResidual, exportEvaluation }\n}\n\nexport function createExtrapolationController(source: ExtrapolationSource) {\n const store = createStore<ExtrapolationData>({ ...INITIAL_EXTRAPOLATION })\n const run: Run = createRunner<ExtrapolationPort, string, ExtrapolationData>(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n const rows = createRows(store)\n\n /** Eigenschaften `strata`/`units` als bearbeitbare Zeilen übernehmen (verwirft das Ergebnis). */\n function applyInputs(): void {\n const strata = stratumRows(source.strata(), source.format)\n rows.patchForm({ strata: strata.length ? strata : [emptyStratum('s1')], units: unitRows(source.units(), source.format), design: designOf(source.strata()) })\n store.set({ result: null, residual: null, issues: {}, formError: null, subsampleUnit: null, subsampleItem: null })\n }\n\n async function load(): Promise<void> {\n const catalogue = await run('load', (port) => port.profiles())\n if (!catalogue) return\n store.set({ catalogue })\n rows.patchForm({ profileId: catalogue.recommended_profile, materiality: source.format(catalogue.materiality.default * 100) })\n applyInputs()\n }\n\n function selectMethod(methodId: string): void {\n const state = store.get()\n const method = extrapolationMethodById(state.catalogue, methodId)\n const keep = state.catalogue && state.form.confidence !== null && confidenceChoices(state.catalogue, method).includes(state.form.confidence)\n rows.patchForm({ methodId, confidence: keep ? state.form.confidence : null })\n store.set({ formError: null })\n }\n\n return {\n store,\n load,\n applyInputs,\n selectMethod,\n ...createRequests(source, store, run),\n ...rows,\n setConfidence: (confidence: number | null) => rows.patchForm({ confidence }),\n setProfile: (profileId: string | null) => rows.patchForm({ profileId }),\n setSampleSize: (sampleSize: string) => rows.patchForm({ sampleSize }),\n setMateriality: (materiality: string) => rows.patchForm({ materiality }),\n setDesign: (design: ExtrapolationForm['design']) => {\n rows.patchForm({ design })\n store.set({ formError: null })\n },\n setSystemAssessment: (systemAssessment: string) => rows.patchForm({ systemAssessment }),\n setPopulationUnits: (populationUnits: string) => rows.patchForm({ populationUnits }),\n setResidual: (patch: Partial<ResidualForm>) => store.set((state) => ({ residualForm: { ...state.residualForm, ...patch } })),\n }\n}\n\nexport type ExtrapolationController = ReturnType<typeof createExtrapolationController>\n","/**\n * Anzeige der Hochrechnung für Vue und React (reine Funktionen): Kennzahlen\n * der TER, Ergebnis-Ton, Herleitungstabelle und Zeilen der RER-Vorlage.\n * Texte ausschließlich aus `extrapolationMessages`.\n */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent, type TableColumn, type TableRow } from '@auditcore/common'\nimport type { BadgeTone } from '../base/types'\nimport type { Locale, Translate } from '../i18n'\nimport type { ExtrapolationMessageKey } from './messages'\nimport type { ExtrapolationFormError, ExtrapolationIssue } from './model'\nimport type { Conclusion, EvaluationResult, ExtrapolationCatalogue, ExtrapolationMethod, ResidualErrorRate } from './types'\n\nexport type ExtrapolationTranslate = Translate<ExtrapolationMessageKey>\n\nconst TONES: Readonly<Record<Conclusion, BadgeTone>> = { material: 'danger', not_material: 'success', inconclusive: 'warning' }\n\nexport function conclusionTone(conclusion: Conclusion): BadgeTone {\n return TONES[conclusion]\n}\n\nexport function conclusionLabel(catalogue: ExtrapolationCatalogue | null, conclusion: Conclusion): string {\n return catalogue?.conclusions.find((entry) => entry.id === conclusion)?.label ?? conclusion\n}\n\nexport function extrapolationAmount(value: number, locale: Locale): string {\n return `${formatNumber(value, locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} €`\n}\n\nexport function extrapolationRate(value: number, locale: Locale): string {\n return formatPercent(value, locale, 2)\n}\n\n/** Zahl als Eingabetext (ohne Tausendertrenner). */\nexport function extrapolationInputNumber(locale: Locale): (value: number) => string {\n return (value) => formatNumber(value, locale, { maximumFractionDigits: 6, useGrouping: false })\n}\n\nexport function extrapolationIssueKey(issue: ExtrapolationIssue): ExtrapolationMessageKey {\n const keys: Readonly<Record<ExtrapolationIssue, ExtrapolationMessageKey>> = {\n required: 'issueRequired', invalid: 'issueInvalid', range: 'issueRange', reason: 'issueReason', stratum: 'issueStratum', duplicate: 'issueDuplicate',\n }\n return keys[issue]\n}\n\nexport function extrapolationFormErrorKey(error: ExtrapolationFormError): ExtrapolationMessageKey {\n return `error${error}`\n}\n\nexport interface ExtrapolationMethodGroup {\n statistical: boolean\n label: string\n methods: readonly ExtrapolationMethod[]\n}\n\nexport function extrapolationMethodGroups(catalogue: ExtrapolationCatalogue, t: ExtrapolationTranslate): ExtrapolationMethodGroup[] {\n return [true, false].map((statistical) => ({\n statistical,\n label: t(statistical ? 'statistical' : 'nonStatistical'),\n methods: catalogue.methods.filter((method) => method.statistical === statistical),\n }))\n}\n\nexport function extrapolationConfidenceLabel(level: number, locale: Locale): string {\n return formatPercent(level, locale, 0)\n}\n\nexport interface ExtrapolationMetric {\n id: string\n label: string\n value: string\n detail?: string\n}\n\nfunction limitMetrics(result: EvaluationResult, t: ExtrapolationTranslate, locale: Locale): ExtrapolationMetric[] {\n const ter = result.total_error_rate\n if (ter.precision === null || ter.upper_limit === null) {\n return [{ id: 'precision', label: t('precision'), value: t('notDeterminable') }, { id: 'upper', label: t('upperLimit'), value: t('notDeterminable') }]\n }\n const metrics: ExtrapolationMetric[] = [\n { id: 'precision', label: t('precision'), value: extrapolationAmount(ter.precision, locale) },\n { id: 'upper', label: t('upperLimit'), value: extrapolationAmount(ter.upper_limit, locale), detail: extrapolationRate(ter.upper_limit_rate ?? 0, locale) },\n ]\n if (ter.difference) {\n metrics.push({ id: 'cbv', label: t('correctedBookValue'), value: extrapolationAmount(ter.difference.corrected_book_value, locale) })\n metrics.push({ id: 'lower', label: t('lowerLimit'), value: extrapolationAmount(ter.difference.lower_limit, locale) })\n }\n return metrics\n}\n\n/** Kennzahlen der Gesamtfehlerquote in fester Reihenfolge. */\nexport function terMetrics(result: EvaluationResult, t: ExtrapolationTranslate, locale: Locale): ExtrapolationMetric[] {\n const ter = result.total_error_rate\n const metrics: ExtrapolationMetric[] = [\n { id: 'projected', label: t('projected'), value: extrapolationAmount(ter.projected_random_error, locale) },\n { id: 'systemic', label: t('systemic'), value: extrapolationAmount(ter.systemic_errors, locale) },\n { id: 'anomalous', label: t('anomalousUncorrected'), value: extrapolationAmount(ter.anomalous_uncorrected, locale) },\n ]\n if (ter.anomalous_corrected_excluded > 0) {\n metrics.push({ id: 'excluded', label: t('anomalousExcluded'), value: extrapolationAmount(ter.anomalous_corrected_excluded, locale) })\n }\n metrics.push(\n { id: 'total', label: t('totalError'), value: extrapolationAmount(ter.total_error, locale) },\n { id: 'ter', label: t('ter'), value: extrapolationRate(ter.rate, locale) },\n { id: 'tolerable', label: t('tolerable'), value: extrapolationAmount(ter.tolerable_error, locale), detail: extrapolationRate(ter.materiality_rate, locale) },\n )\n return [...metrics, ...limitMetrics(result, t, locale)]\n}\n\nfunction stepValue(value: unknown, locale: Locale): string {\n if (typeof value !== 'number') return ''\n const digits = Math.abs(value) < 10 ? 6 : 2\n return formatNumber(value, locale, { maximumFractionDigits: digits })\n}\n\nexport function extrapolationStepColumns(t: ExtrapolationTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'label', label: t('colStep') },\n { key: 'formula', label: t('colFormula') },\n { key: 'value', label: t('colValue'), align: 'end', format: (value) => stepValue(value, locale) },\n { key: 'source', label: t('colSource') },\n ]\n}\n\nexport function extrapolationStepRows(result: EvaluationResult): TableRow[] {\n const steps = [...result.projection.steps, ...result.total_error_rate.steps]\n return steps.map((step, index) => ({ id: index + 1, ...step }))\n}\n\nexport function residualColumns(t: ExtrapolationTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'row', label: t('colRow') },\n { key: 'label', label: t('colLabel') },\n { key: 'value', label: t('colAmount'), align: 'end', format: (value) => (value === null ? t('notApplicable') : stepValue(value, locale)) },\n ]\n}\n\nexport function residualRows(residual: ResidualErrorRate): TableRow[] {\n return residual.rows.map((row) => ({ id: row.row, row: row.row, label: row.label, value: row.value }))\n}\n\n/** Kennzahlen der Restfehlerquote (K, L, M). */\nexport function residualMetrics(residual: ResidualErrorRate, t: ExtrapolationTranslate, locale: Locale): ExtrapolationMetric[] {\n const verdict = t(residual.exceeds_materiality ? 'rerExceeds' : 'rerWithin')\n const rate = residual.rate === null ? t('notApplicable') : extrapolationRate(residual.rate, locale)\n return [\n { id: 'rer', label: t('rer'), value: rate, detail: verdict },\n { id: 'correction', label: t('extrapolatedCorrection'), value: residual.extrapolated_correction === null ? t('notApplicable') : extrapolationAmount(residual.extrapolated_correction, locale) },\n { id: 'after', label: t('rateAfter'), value: residual.rate_after_correction === null ? t('notApplicable') : extrapolationRate(residual.rate_after_correction, locale) },\n ]\n}\n\nexport interface ExtrapolationField<K extends string> {\n key: K\n label: ExtrapolationMessageKey\n numeric: boolean\n}\n\nexport const STRATUM_FIELDS: readonly ExtrapolationField<'name' | 'bookValue' | 'populationSize' | 'systemic'>[] = [\n { key: 'name', label: 'stratumName', numeric: false },\n { key: 'bookValue', label: 'bookValue', numeric: true },\n { key: 'populationSize', label: 'populationSize', numeric: true },\n { key: 'systemic', label: 'systemicDelimited', numeric: true },\n]\n\nexport const UNIT_FIELDS: readonly ExtrapolationField<'id' | 'bookValue' | 'random' | 'systemic' | 'anomalous' | 'reason'>[] = [\n { key: 'id', label: 'unitId', numeric: false },\n { key: 'bookValue', label: 'bookValue', numeric: true },\n { key: 'random', label: 'randomError', numeric: true },\n { key: 'systemic', label: 'systemicError', numeric: true },\n { key: 'anomalous', label: 'anomalousError', numeric: true },\n { key: 'reason', label: 'anomalousReason', numeric: false },\n]\n\nexport const UNIT_FLAGS: readonly ExtrapolationField<'corrected' | 'exhaustive'>[] = [\n { key: 'corrected', label: 'anomalousCorrected', numeric: false },\n { key: 'exhaustive', label: 'exhaustive', numeric: false },\n]\n\nexport const RESIDUAL_FIELDS: readonly ExtrapolationField<'auditPopulation' | 'terRate' | 'ongoing' | 'otherNegative' | 'corrections'>[] = [\n { key: 'auditPopulation', label: 'auditPopulation', numeric: true },\n { key: 'terRate', label: 'terRate', numeric: true },\n { key: 'ongoing', label: 'ongoing', numeric: true },\n { key: 'otherNegative', label: 'otherNegative', numeric: true },\n { key: 'corrections', label: 'corrections', numeric: true },\n]\n\n/** Meldung eines Feldes (leer ohne Befund). */\nexport function extrapolationIssueText(issues: Readonly<Record<string, ExtrapolationIssue>>, key: string, t: ExtrapolationTranslate): string {\n const issue = issues[key]\n return issue ? t(extrapolationIssueKey(issue)) : ''\n}\n\n/** Sammelmeldung unter dem Formular: fehlende Auswahl oder markierte Felder. */\nexport function extrapolationFormMessage(formError: ExtrapolationFormError | null, issues: Readonly<Record<string, ExtrapolationIssue>>, t: ExtrapolationTranslate): string {\n if (formError) return t(extrapolationFormErrorKey(formError))\n return Object.keys(issues).length ? t('formIncomplete') : ''\n}\n\nexport function extrapolationCellLabel(t: ExtrapolationTranslate, field: ExtrapolationMessageKey, row: number): string {\n return t('cellLabel', { field: t(field), row })\n}\n","/**\n * Anzeige der Ergänzungen nach Leitfaden Kap. 6/7 (reine Funktionen für Vue und\n * React): Zeiträume, Programme einer Gruppe, Teilstichproben, Neuberechnung des\n * Konfidenzniveaus sowie Auswahllisten für Aufbau, Systembewertung und Schätzer.\n */\nimport type { TableColumn, TableRow } from '@auditcore/common'\nimport type { Locale } from '../i18n'\nimport { openSubsample } from './controller-subsample'\nimport type { ExtrapolationData } from './controller'\nimport { MAX_SUBSAMPLE_DEPTH, type SubItemRow, type SubStratumRow } from './model-subsample'\nimport { conclusionLabel, extrapolationAmount, extrapolationConfidenceLabel, extrapolationRate, type ExtrapolationField, type ExtrapolationMetric, type ExtrapolationTranslate } from './view'\nimport type { EvaluationResult, ExtrapolationCatalogue, ExtrapolationDesign, SubsampleEstimator } from './types'\n\nexport interface ExtrapolationChoice<T extends string> {\n id: T\n label: string\n}\n\nconst DESIGNS: readonly ExtrapolationDesign[] = ['single', 'periods', 'groups']\nconst ESTIMATORS: readonly SubsampleEstimator[] = ['ratio', 'mean_per_unit', 'pps']\n\nexport function extrapolationDesignChoices(catalogue: ExtrapolationCatalogue | null, t: ExtrapolationTranslate): ExtrapolationChoice<ExtrapolationDesign>[] {\n return DESIGNS.map((id) => ({ id, label: catalogue?.designs?.find((entry) => entry.id === id)?.label ?? t(`design${id}`) }))\n}\n\nexport function subsampleEstimatorChoices(t: ExtrapolationTranslate): ExtrapolationChoice<SubsampleEstimator>[] {\n return ESTIMATORS.map((id) => ({ id, label: t(`estimator${id}`) }))\n}\n\n/** Kategorien 1–4 der Systembewertung mit Konfidenzniveau (Tabelle 1, Leitfaden 3.2.1). */\nexport function systemAssessmentChoices(catalogue: ExtrapolationCatalogue | null, locale: Locale): ExtrapolationChoice<string>[] {\n return (catalogue?.system_assessment ?? []).map((entry) => ({\n id: String(entry.category),\n label: `${entry.category} – ${entry.label} (${extrapolationConfidenceLabel(entry.confidence_level, locale)})`,\n }))\n}\n\nexport const SUB_ITEM_FIELDS: readonly ExtrapolationField<'id' | 'bookValue' | 'random'>[] = [\n { key: 'id', label: 'subItemId', numeric: false },\n { key: 'bookValue', label: 'bookValue', numeric: true },\n { key: 'random', label: 'randomError', numeric: true },\n]\n\nexport const SUB_STRATUM_FIELDS: readonly ExtrapolationField<'name' | 'bookValue' | 'populationSize'>[] = [\n { key: 'name', label: 'subStratum', numeric: false },\n { key: 'bookValue', label: 'bookValue', numeric: true },\n { key: 'populationSize', label: 'populationSize', numeric: true },\n]\n\nexport type SubStratumFieldKey = keyof Pick<SubStratumRow, 'name' | 'bookValue' | 'populationSize'>\n\n/** Ansicht der gerade bearbeiteten Teilstichprobe: Zeilen, Überschrift, Feldpräfix, Stufe. */\nexport interface SubsampleEditorView {\n rows: NonNullable<ReturnType<typeof openSubsample>>\n title: string\n /** Präfix der Feldbefunde, z. B. `units.2.subsample`. */\n prefix: string\n nested: boolean\n /** Teileinheiten dürfen eine eigene Teilstichprobe haben (nur Stufe 2). */\n allowNested: boolean\n}\n\nexport function subsampleEditorView(state: ExtrapolationData, t: ExtrapolationTranslate): SubsampleEditorView | null {\n const rows = openSubsample(state)\n const index = state.subsampleUnit\n const unit = index === null ? null : state.form.units[index]\n if (!rows || index === null || !unit) return null\n const unitLabel = unit.id || String(index + 1)\n if (state.subsampleItem === null) {\n return { rows, title: t('subsampleTitle', { unit: unitLabel }), prefix: `units.${index}.subsample`, nested: false, allowNested: MAX_SUBSAMPLE_DEPTH > 1 }\n }\n const item = unit.subsample?.items[state.subsampleItem]\n const itemLabel = item?.id || String(state.subsampleItem + 1)\n return { rows, title: t('subsampleNestedTitle', { unit: unitLabel, item: itemLabel }), prefix: `units.${index}.subsample.items.${state.subsampleItem}.subsample`, nested: true, allowNested: false }\n}\n\nexport type SubItemFieldKey = keyof Pick<SubItemRow, 'id' | 'bookValue' | 'random'>\n\nconst amount = (locale: Locale) => (value: unknown): string => (typeof value === 'number' ? extrapolationAmount(value, locale) : '')\nconst rate = (locale: Locale) => (value: unknown): string => (typeof value === 'number' ? extrapolationRate(value, locale) : '')\n\nexport function periodColumns(t: ExtrapolationTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'name', label: t('period') },\n { key: 'book_value', label: t('colBookValue'), align: 'end', format: amount(locale) },\n { key: 'projected', label: t('colProjected'), align: 'end', format: amount(locale) },\n { key: 'precision', label: t('colPrecision'), align: 'end', format: (value) => (typeof value === 'number' ? extrapolationAmount(value, locale) : t('notDeterminable')) },\n { key: 'sample_size', label: t('colSampleSize'), align: 'end' },\n ]\n}\n\nexport function periodRows(result: EvaluationResult): TableRow[] {\n const periods = (result.projection.extra.periods ?? []) as readonly { name: string; book_value: number; projected_random_error: number; precision: number | null; sample_size: number }[]\n return periods.map((entry) => ({ id: entry.name, name: entry.name, book_value: entry.book_value, projected: entry.projected_random_error, precision: entry.precision, sample_size: entry.sample_size }))\n}\n\nexport function groupColumns(t: ExtrapolationTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'name', label: t('group') },\n { key: 'observations', label: t('colObservations'), align: 'end' },\n { key: 'projected', label: t('colProjected'), align: 'end', format: amount(locale) },\n { key: 'ter', label: t('colTer'), align: 'end', format: rate(locale) },\n { key: 'upper', label: t('colUpper'), align: 'end', format: (value) => (typeof value === 'number' ? extrapolationRate(value, locale) : t('notDeterminable')) },\n { key: 'conclusion', label: t('colConclusion') },\n ]\n}\n\nexport function groupRows(result: EvaluationResult, catalogue: ExtrapolationCatalogue | null): TableRow[] {\n return (result.groups ?? []).map((group) => ({\n id: group.name,\n name: group.name,\n observations: group.observations,\n projected: group.total_error_rate.projected_random_error,\n ter: group.total_error_rate.rate,\n upper: group.total_error_rate.upper_limit_rate,\n conclusion: conclusionLabel(catalogue, group.total_error_rate.conclusion),\n }))\n}\n\nexport function subsampleColumns(t: ExtrapolationTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'unit', label: t('unitId') },\n { key: 'estimator', label: t('estimator') },\n { key: 'book_value', label: t('colBookValue'), align: 'end', format: amount(locale) },\n { key: 'projected', label: t('colProjected'), align: 'end', format: amount(locale) },\n { key: 'rate', label: t('colRate'), align: 'end', format: rate(locale) },\n { key: 'coverage', label: t('colCoverage'), align: 'end', format: rate(locale) },\n { key: 'items', label: t('colItems'), align: 'end' },\n ]\n}\n\nexport function subsampleResultRows(result: EvaluationResult, t: ExtrapolationTranslate): TableRow[] {\n return (result.subsamples ?? []).map((entry, index) => ({\n id: `${entry.unit_id}-${index}`,\n unit: entry.unit_id,\n estimator: t(`estimator${entry.estimator}`),\n book_value: entry.book_value,\n projected: entry.projected_error,\n rate: entry.error_rate,\n coverage: entry.coverage,\n items: entry.sampled_items + entry.exhaustive_items,\n }))\n}\n\n/** Hinweise aus Gruppen und Teilstichproben (die der Hochrechnung stehen im Ergebnis). */\nexport function detailWarnings(result: EvaluationResult): string[] {\n return [...(result.groups ?? []).flatMap((group) => group.warnings), ...(result.subsamples ?? []).flatMap((entry) => entry.warnings)]\n}\n\nexport interface RecalculationView {\n metrics: ExtrapolationMetric[]\n verdict: string\n}\n\n/** Neuberechnung des Konfidenzniveaus; `null`, wenn nicht anwendbar (Ergebnis schlüssig usw.). */\nexport function recalculationView(result: EvaluationResult, t: ExtrapolationTranslate, locale: Locale): RecalculationView | null {\n const recalculation = result.confidence_recalculation\n if (!recalculation?.applicable || recalculation.confidence_level === null) return null\n const metrics: ExtrapolationMetric[] = [\n { id: 'recalc-level', label: t('recalcLevel'), value: extrapolationRate(recalculation.confidence_level, locale) },\n { id: 'recalc-z', label: t('recalcCoefficient'), value: (recalculation.recalculated_coefficient ?? 0).toLocaleString(locale, { maximumFractionDigits: 3 }) },\n ]\n if (recalculation.required_level !== null) {\n metrics.push({ id: 'recalc-required', label: t('recalcRequired'), value: extrapolationConfidenceLabel(recalculation.required_level, locale) })\n }\n const verdict = recalculation.supports_not_material === null ? t('recalcNoRequirement') : t(recalculation.supports_not_material ? 'recalcSupports' : 'recalcNotSupported')\n return { metrics, verdict }\n}\n\n/** Gibt es Ergänzungen anzuzeigen? */\nexport function hasExtrapolationDetails(result: EvaluationResult): boolean {\n return periodRows(result).length > 0 || (result.groups?.length ?? 0) > 0 || (result.subsamples?.length ?? 0) > 0 || result.confidence_recalculation?.applicable === true\n}\n","import { defineMessages, type Translate } from '../i18n'\n\n/**\n * Texte der Vergleichsverwaltung (`<flowaudit-comparisons>`): Hochladen,\n * gespeicherte Vergleiche, Import und Löschen. Begriffe wie in der Synopse.\n */\nexport const comparisonsMessages = defineMessages({\n de: {\n title: 'Dokumentvergleiche',\n workAid: 'Ein Vergleich ist eine Arbeitshilfe: Er stellt Unterschiede fest und trifft keine Prüfungsentscheidung.',\n formHeading: 'Neuer Vergleich',\n oldFile: 'Bisherige Fassung',\n newFile: 'Neue Fassung',\n oldFileArticleLaw: 'Stammgesetz (geltende Fassung)',\n newFileArticleLaw: 'Artikelgesetz mit Änderungsbefehlen',\n fileHint: 'DOCX, DOCM oder PDF, höchstens {size}',\n fileChosen: 'Ausgewählt: {name} ({size})',\n titleLabel: 'Titel (optional)',\n titlePlaceholder: 'Vergleich von ALT mit NEU',\n typeLabel: 'Vergleichsart',\n kind_standard: 'Standardvergleich',\n kind_article_law: 'Gesetzessynopse',\n modeLabel: 'Dokumentart',\n mode_auto: 'Automatisch erkennen',\n mode_checklist: 'Checkliste',\n mode_text: 'Fließtext',\n pdfHint: 'PDF-Dateien werden immer als Fließtext verglichen.',\n thresholdLabel: 'Ähnlichkeitsschwelle in Prozent (70–100)',\n optionsLegend: 'Einbeziehen',\n includeAnswers: 'Antworten',\n includeNotes: 'Bemerkungen und Hinweise',\n includeEditorial: 'Redaktionelle Änderungen',\n highlightWords: 'Wortweise hervorheben',\n sectionsLegend: 'Ausgabe enthält',\n section_changed: 'Geändert',\n section_removed: 'Entfallen',\n section_added: 'Neu',\n section_moved: 'Verschoben',\n section_unchanged: 'Unverändert',\n profileLabel: 'Vergleichsprofil',\n profileDefault: '{id} {version} (Vorgabe)',\n profileOption: '{id} {version}',\n submit: 'Vergleichen',\n reset: 'Zurücksetzen',\n problemsHeading: 'Bitte prüfen',\n problem_oldMissing: 'Die bisherige Fassung fehlt.',\n problem_newMissing: 'Die neue Fassung fehlt.',\n problem_type: '{name}: Bitte eine DOCX-, DOCM- oder PDF-Datei auswählen.',\n problem_size: '{name} ist größer als {size}.',\n problem_threshold: 'Die Ähnlichkeitsschwelle muss zwischen 70 und 100 liegen.',\n problem_sections: 'Mindestens einen Abschnitt für die Ausgabe wählen.',\n problem_title: 'Der Titel darf höchstens 255 Zeichen lang sein.',\n listHeading: 'Gespeicherte Vergleiche',\n searchLabel: 'Vergleiche durchsuchen',\n listCount: '{count} von {total} Vergleichen',\n empty: 'Noch keine Vergleiche gespeichert.',\n noMatches: 'Kein Vergleich passt zur Suche.',\n counts: '{changed} geändert · {removed} entfallen · {added} neu · {moved} verschoben',\n files: '{old} → {new}',\n open: 'Öffnen',\n openLabel: '„{title}“ öffnen',\n remove: 'Löschen',\n removeLabel: '„{title}“ löschen',\n confirmTitle: 'Vergleich löschen?',\n confirmText: '„{title}“ wird endgültig gelöscht. Bereits heruntergeladene Ausgaben bleiben erhalten.',\n cancel: 'Abbrechen',\n importLabel: 'Ergebnis importieren (JSON)',\n importInvalid: 'Die Datei enthält kein Vergleichsergebnis.',\n importUnreadable: 'Die Datei ist kein gültiges JSON.',\n importUnsupported: 'Der Port unterstützt keinen Import.',\n created: '„{title}“ wurde angelegt.',\n imported: '„{title}“ wurde importiert.',\n removed: '„{title}“ wurde gelöscht.',\n back: 'Zurück zur Übersicht',\n noPort: 'Kein Port übergeben – Vergleiche können nicht geladen werden.',\n networkError: 'Keine Verbindung zum Server ({message}).',\n busy_load: 'Vergleiche werden geladen …',\n busy_create: 'Vergleich läuft …',\n busy_import: 'Ergebnis wird importiert …',\n busy_remove: 'Vergleich wird gelöscht …',\n },\n en: {\n title: 'Document comparisons',\n workAid: 'A comparison is a work aid: it identifies differences and makes no audit decision.',\n formHeading: 'New comparison',\n oldFile: 'Previous version',\n newFile: 'New version',\n oldFileArticleLaw: 'Principal act (version in force)',\n newFileArticleLaw: 'Amending act with amendment instructions',\n fileHint: 'DOCX, DOCM or PDF, at most {size}',\n fileChosen: 'Selected: {name} ({size})',\n titleLabel: 'Title (optional)',\n titlePlaceholder: 'Comparison of OLD with NEW',\n typeLabel: 'Comparison type',\n kind_standard: 'Standard comparison',\n kind_article_law: 'Legislative synopsis',\n modeLabel: 'Document type',\n mode_auto: 'Detect automatically',\n mode_checklist: 'Checklist',\n mode_text: 'Running text',\n pdfHint: 'PDF files are always compared as running text.',\n thresholdLabel: 'Similarity threshold in percent (70–100)',\n optionsLegend: 'Include',\n includeAnswers: 'Answers',\n includeNotes: 'Comments and notes',\n includeEditorial: 'Editorial changes',\n highlightWords: 'Highlight words',\n sectionsLegend: 'Output contains',\n section_changed: 'Changed',\n section_removed: 'Removed',\n section_added: 'Added',\n section_moved: 'Moved',\n section_unchanged: 'Unchanged',\n profileLabel: 'Comparison profile',\n profileDefault: '{id} {version} (default)',\n submit: 'Compare',\n reset: 'Reset',\n problemsHeading: 'Please check',\n listHeading: 'Saved comparisons',\n searchLabel: 'Search comparisons',\n listCount: '{count} of {total} comparisons',\n empty: 'No comparisons saved yet.',\n noMatches: 'No comparison matches the search.',\n counts: '{changed} changed · {removed} removed · {added} added · {moved} moved',\n open: 'Open',\n openLabel: 'Open “{title}”',\n remove: 'Delete',\n removeLabel: 'Delete “{title}”',\n confirmTitle: 'Delete comparison?',\n cancel: 'Cancel',\n importLabel: 'Import result (JSON)',\n back: 'Back to overview',\n noPort: 'No port given – comparisons cannot be loaded.',\n },\n})\n\nexport type ComparisonsMessageKey = keyof typeof comparisonsMessages.de\nexport type ComparisonsTranslate = Translate<ComparisonsMessageKey>\n","/**\n * Formular „Neuer Vergleich“ als reine Daten: Vorgaben wie im REST-Vertrag\n * (`POST /comparisons`, docs/ui/synopsis-rest.md), Prüfung vor dem Hochladen\n * und Umsetzung in die Formularfelder des Servers. Der Server prüft erneut.\n */\nimport type { CompareFields } from '../synopsis/port'\nimport { ROW_STATUSES, type ComparisonProfile, type RowStatus } from '../synopsis/types'\nimport type { ComparisonsMessageKey } from './messages'\n\nexport type ComparisonKind = 'standard' | 'article_law'\nexport type ComparisonMode = 'auto' | 'checklist' | 'text'\nexport const COMPARISON_KINDS: readonly ComparisonKind[] = ['standard', 'article_law']\nexport const COMPARISON_MODES: readonly ComparisonMode[] = ['auto', 'checklist', 'text']\nexport const ACCEPTED_EXTENSIONS: readonly string[] = ['.docx', '.docm', '.pdf']\n/** Vorgabe des Servers (`ServiceSettings.max_upload_bytes`). */\nexport const DEFAULT_MAX_UPLOAD_BYTES = 20 * 1024 * 1024\nexport const MIN_THRESHOLD = 70\nexport const MAX_THRESHOLD = 100\nexport const MAX_TITLE = 255\n\n/** Datei aus einem Eingabefeld (im Browser `File`). */\nexport interface UploadFile extends Blob {\n readonly name: string\n}\n\nexport interface CompareForm {\n oldFile: UploadFile | null\n newFile: UploadFile | null\n title: string\n kind: ComparisonKind\n mode: ComparisonMode\n threshold: number\n includeAnswers: boolean\n includeNotes: boolean\n includeEditorial: boolean\n highlightWords: boolean\n sections: readonly RowStatus[]\n /** Leer: Standardprofil des Servers. */\n profile: string\n}\n\nexport const DEFAULT_FORM: CompareForm = {\n oldFile: null,\n newFile: null,\n title: '',\n kind: 'standard',\n mode: 'auto',\n threshold: 85,\n includeAnswers: true,\n includeNotes: true,\n includeEditorial: false,\n highlightWords: true,\n sections: ['changed', 'removed', 'added', 'moved'],\n profile: '',\n}\n\n/** Ein Befund der Formularprüfung: Textschlüssel und Platzhalter. */\nexport interface FormProblem {\n key: Extract<ComparisonsMessageKey, `problem_${string}`>\n field: 'oldFile' | 'newFile' | 'threshold' | 'sections' | 'title'\n params?: Readonly<Record<string, string>>\n}\n\n/** Größenangabe wie „20 MiB“ oder „512 KiB“. */\nexport function formatBytes(bytes: number, lang = 'de'): string {\n const format = (value: number): string => new Intl.NumberFormat(lang, { maximumFractionDigits: 1 }).format(value)\n if (bytes >= 1024 * 1024) return `${format(bytes / (1024 * 1024))} MiB`\n if (bytes >= 1024) return `${format(bytes / 1024)} KiB`\n return `${format(bytes)} B`\n}\n\nexport function hasAcceptedExtension(name: string): boolean {\n const lower = name.toLowerCase()\n return ACCEPTED_EXTENSIONS.some((extension) => lower.endsWith(extension))\n}\n\nfunction fileProblems(file: UploadFile | null, field: 'oldFile' | 'newFile', maxBytes: number, lang: string): FormProblem[] {\n if (!file) return [{ key: field === 'oldFile' ? 'problem_oldMissing' : 'problem_newMissing', field }]\n if (!hasAcceptedExtension(file.name)) return [{ key: 'problem_type', field, params: { name: file.name } }]\n if (file.size > maxBytes) return [{ key: 'problem_size', field, params: { name: file.name, size: formatBytes(maxBytes, lang) } }]\n return []\n}\n\nfunction optionProblems(form: CompareForm): FormProblem[] {\n const problems: FormProblem[] = []\n const threshold = form.threshold\n if (!Number.isInteger(threshold) || threshold < MIN_THRESHOLD || threshold > MAX_THRESHOLD) {\n problems.push({ key: 'problem_threshold', field: 'threshold' })\n }\n if (form.sections.length === 0) problems.push({ key: 'problem_sections', field: 'sections' })\n if (form.title.trim().length > MAX_TITLE) problems.push({ key: 'problem_title', field: 'title' })\n return problems\n}\n\n/** Alle Befunde in Formularreihenfolge; leer heißt: absendbar. */\nexport function formProblems(form: CompareForm, maxBytes = DEFAULT_MAX_UPLOAD_BYTES, lang = 'de'): FormProblem[] {\n return [\n ...fileProblems(form.oldFile, 'oldFile', maxBytes, lang),\n ...fileProblems(form.newFile, 'newFile', maxBytes, lang),\n ...optionProblems(form),\n ]\n}\n\n/** PDF-Dateien vergleicht der Server immer als Fließtext. */\nexport function involvesPdf(form: CompareForm): boolean {\n return [form.oldFile, form.newFile].some((file) => file?.name.toLowerCase().endsWith('.pdf'))\n}\n\n/** Formularfelder für `POST /comparisons`; Gesetzessynopse ohne die Optionen des Standardvergleichs. */\nexport function toCompareFields(form: CompareForm): CompareFields {\n const sections = ROW_STATUSES.filter((status) => form.sections.includes(status))\n const common: CompareFields = {\n comparison_type: form.kind,\n highlight_words: form.highlightWords,\n output_sections: sections,\n ...(form.title.trim() ? { title: form.title.trim() } : {}),\n ...(form.profile ? { profile: form.profile } : {}),\n }\n if (form.kind === 'article_law') return common\n return {\n ...common,\n mode: form.mode,\n threshold: form.threshold,\n include_answers: form.includeAnswers,\n include_notes: form.includeNotes,\n include_editorial: form.includeEditorial,\n }\n}\n\n/** Abschnitt ein- oder ausschalten; Reihenfolge wie `ROW_STATUSES`. */\nexport function toggleSection(sections: readonly RowStatus[], status: RowStatus, enabled: boolean): RowStatus[] {\n const next = new Set(sections)\n if (enabled) next.add(status)\n else next.delete(status)\n return ROW_STATUSES.filter((entry) => next.has(entry))\n}\n\n/** Standardprofil des Servers (`default: true`), sonst das erste. */\nexport function defaultProfile(profiles: readonly ComparisonProfile[]): ComparisonProfile | null {\n return profiles.find((profile) => profile.default) ?? profiles[0] ?? null\n}\n","/**\n * Import eines fertigen Vergleichsergebnisses (`POST /comparisons/import`):\n * akzeptiert die JSON-Ausgabe (`export?format=json`, ein `ComparisonResult`),\n * einen gespeicherten Vergleich (`{id, title, result}`) oder die\n * Anfrageform `{title?, result}`. Die fachliche Prüfung macht der Server.\n */\nimport type { ImportRequest } from '../synopsis/port'\nimport type { ComparisonResult } from '../synopsis/types'\n\nexport type ImportParse =\n | { ok: true; request: ImportRequest }\n | { ok: false; key: 'importUnreadable' | 'importInvalid' }\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** Kennzeichen eines `ComparisonResult.to_dict()`; Einzelheiten prüft `ComparisonResult.from_dict`. */\nexport function looksLikeResult(value: unknown): value is ComparisonResult {\n return (\n isRecord(value) &&\n Array.isArray(value.rows) &&\n typeof value.old_filename === 'string' &&\n typeof value.new_filename === 'string'\n )\n}\n\nfunction withTitle(result: ComparisonResult, title: unknown): ImportRequest {\n return typeof title === 'string' && title.trim() ? { title: title.trim(), result } : { result }\n}\n\nexport function parseImport(text: string): ImportParse {\n let data: unknown\n try {\n data = JSON.parse(text)\n } catch {\n return { ok: false, key: 'importUnreadable' }\n }\n if (looksLikeResult(data)) return { ok: true, request: { result: data } }\n if (isRecord(data) && looksLikeResult(data.result)) return { ok: true, request: withTitle(data.result, data.title) }\n return { ok: false, key: 'importInvalid' }\n}\n","/** Liste der gespeicherten Vergleiche (`GET /comparisons`) als reine View-Funktionen. */\nimport type { Comparison, ComparisonSummary } from '../synopsis/types'\nimport type { ComparisonsMessageKey, ComparisonsTranslate } from './messages'\n\nexport interface SummaryView {\n id: string\n title: string\n kind: string\n kindLabel: string\n files: string\n counts: string\n /** Summe der Änderungen (für Badges). */\n changes: number\n created: string\n createdIso: string\n}\n\nfunction kindLabel(kind: string, t: ComparisonsTranslate): string {\n const key = `kind_${kind}` as ComparisonsMessageKey\n return kind === 'standard' || kind === 'article_law' ? t(key) : kind\n}\n\n/** Datum und Uhrzeit in der Sprache der Oberfläche; ungültige Angaben bleiben stehen. */\nexport function formatDateTime(iso: string, lang: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso\n return new Intl.DateTimeFormat(lang, { dateStyle: 'medium', timeStyle: 'short' }).format(date)\n}\n\nexport function summaryView(summary: ComparisonSummary, t: ComparisonsTranslate, lang: string): SummaryView {\n const counts = summary.counts\n return {\n id: summary.id,\n title: summary.title,\n kind: summary.comparison_type,\n kindLabel: kindLabel(summary.comparison_type, t),\n files: t('files', { old: summary.old_filename, new: summary.new_filename }),\n counts: t('counts', { changed: counts.changed, removed: counts.removed, added: counts.added, moved: counts.moved }),\n changes: counts.changed + counts.removed + counts.added + counts.moved,\n created: formatDateTime(summary.created_at, lang),\n createdIso: summary.created_at,\n }\n}\n\n/** Suche in Titel und Dateinamen, ohne Groß-/Kleinschreibung; neueste zuerst wie der Server. */\nexport function filterSummaries(items: readonly ComparisonSummary[], query: string): ComparisonSummary[] {\n const needle = query.trim().toLowerCase()\n const sorted = [...items].sort((a, b) => b.created_at.localeCompare(a.created_at))\n if (!needle) return sorted\n return sorted.filter((item) => [item.title, item.old_filename, item.new_filename].some((text) => text.toLowerCase().includes(needle)))\n}\n\n/** Eintrag der Liste aus einem gespeicherten Vergleich (nach Anlegen oder Import). */\nexport function summaryOf(comparison: Comparison): ComparisonSummary {\n const result = comparison.result\n return {\n id: comparison.id,\n title: comparison.title,\n created_at: comparison.created_at,\n old_filename: result.old_filename,\n new_filename: result.new_filename,\n comparison_type: result.metadata?.comparison_type ?? 'standard',\n counts: { changed: result.changed_count, removed: result.removed_count, added: result.added_count, moved: result.moved_count ?? 0 },\n }\n}\n","// Zustandsautomat von <flowaudit-comparisons> (Vue und React): gespeicherte\n// Vergleiche laden, neuen Vergleich hochladen, Ergebnis importieren, löschen.\n\nimport { RestError } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport type { ImportRequest, SynopsisPort, SynopsisRestClient } from '../synopsis/port'\nimport type { Comparison, ComparisonProfile, ComparisonSummary, RowStatus } from '../synopsis/types'\nimport { DEFAULT_FORM, DEFAULT_MAX_UPLOAD_BYTES, formProblems, toCompareFields, toggleSection, type CompareForm } from './form'\nimport { parseImport } from './importing'\nimport { summaryOf } from './list'\nimport type { ComparisonsTranslate } from './messages'\n\n/**\n * Port zur Anwendung: {@link createSynopsisRestClient} erfüllt ihn vollständig.\n * `load`/`updateRows`/`exportUrl` braucht nur die eingebettete Synopse,\n * `importResult` nur der Import.\n */\nexport type ComparisonsPort = Pick<SynopsisRestClient, 'profiles' | 'list' | 'create' | 'remove'> &\n Partial<Pick<SynopsisRestClient, 'importResult' | 'load' | 'updateRows' | 'exportUrl'>>\n\n/** Der Port als Datenzugang der eingebetteten Synopse, wenn er Vergleiche laden kann. */\nexport function synopsisPortOf(port: ComparisonsPort | null | undefined): SynopsisPort | null {\n return port?.load ? (port as SynopsisPort) : null\n}\n\n/** Fehler einer Portanfrage: Meldung des Servers bzw. `network_error` mit Status 0. */\nexport interface ComparisonsError {\n code: string\n message: string\n status: number\n}\n\nexport type ComparisonsBusy = 'load' | 'create' | 'import' | 'remove'\n\nexport interface ComparisonsData extends RequestState<ComparisonsError> {\n profiles: ComparisonProfile[]\n items: ComparisonSummary[]\n loaded: boolean\n query: string\n form: CompareForm\n /** Nach dem ersten Absenden werden Befunde der Formularprüfung angezeigt. */\n submitted: boolean\n /** Geöffneter Vergleich (Synopse). */\n openId: string | null\n /** Vergleich, dessen Löschen bestätigt werden soll. */\n pendingRemove: string | null\n}\n\nexport interface ComparisonsHooks {\n onCreated?: (comparison: Comparison) => void\n onImported?: (comparison: Comparison) => void\n onRemoved?: (id: string) => void\n onError?: (error: ComparisonsError) => void\n}\n\nexport interface ComparisonsControllerOptions extends ComparisonsHooks {\n port: () => ComparisonsPort | null\n t: () => ComparisonsTranslate\n maxBytes?: () => number\n lang?: () => string\n}\n\nexport const INITIAL_COMPARISONS: ComparisonsData = {\n ...IDLE, profiles: [], items: [], loaded: false, query: '', form: DEFAULT_FORM, submitted: false, openId: null, pendingRemove: null,\n}\n\nexport function asComparisonsError(error: unknown, t: ComparisonsTranslate): ComparisonsError {\n if (error instanceof RestError) return { code: error.code, message: error.message, status: error.status }\n const raw = error instanceof Error ? error.message : String(error)\n return { code: 'network_error', message: t('networkError', { message: raw }), status: 0 }\n}\n\ntype Run = ReturnType<typeof createRunner<ComparisonsPort, ComparisonsError, ComparisonsData>>\n\nfunction titleOf(state: ComparisonsData, id: string): string {\n return state.items.find((item) => item.id === id)?.title ?? id\n}\n\n/** Neuer oder importierter Vergleich: oben in die Liste, Meldung für `aria-live`. */\nfunction added(store: Store<ComparisonsData>, comparison: Comparison, notice: string): void {\n store.set((state) => ({\n items: [summaryOf(comparison), ...state.items.filter((item) => item.id !== comparison.id)],\n notice,\n }))\n}\n\nfunction formActions(store: Store<ComparisonsData>) {\n const update = (patch: Partial<CompareForm>): void => store.set((state) => ({ form: { ...state.form, ...patch } }))\n return {\n updateForm: update,\n toggleSection: (status: RowStatus, enabled: boolean) => update({ sections: toggleSection(store.get().form.sections, status, enabled) }),\n resetForm: () => store.set({ form: DEFAULT_FORM, submitted: false }),\n }\n}\n\nfunction writeActions(store: Store<ComparisonsData>, run: Run, options: ComparisonsControllerOptions) {\n const maxBytes = (): number => options.maxBytes?.() ?? DEFAULT_MAX_UPLOAD_BYTES\n const lang = (): string => options.lang?.() ?? 'de'\n\n async function submit(): Promise<Comparison | null> {\n const form = store.get().form\n store.set({ submitted: true })\n const { oldFile, newFile } = form\n if (formProblems(form, maxBytes(), lang()).length > 0 || !oldFile || !newFile) return null\n const created = await run('create', (port) => port.create(oldFile, oldFile.name, newFile, newFile.name, toCompareFields(form)))\n if (!created) return null\n added(store, created, options.t()('created', { title: created.title }))\n store.set({ form: DEFAULT_FORM, submitted: false })\n options.onCreated?.(created)\n return created\n }\n\n async function importText(text: string): Promise<Comparison | null> {\n const parsed = parseImport(text)\n if (!parsed.ok) return fail(parsed.key)\n if (!options.port()?.importResult) return fail('importUnsupported')\n const request: ImportRequest = parsed.request\n const imported = await run('import', (port) => port.importResult?.(request) ?? Promise.reject(new Error('importResult')))\n if (!imported) return null\n added(store, imported, options.t()('imported', { title: imported.title }))\n options.onImported?.(imported)\n return imported\n }\n\n function fail(key: 'importUnreadable' | 'importInvalid' | 'importUnsupported'): null {\n const error: ComparisonsError = { code: 'invalid_import', message: options.t()(key), status: 0 }\n store.set({ error })\n options.onError?.(error)\n return null\n }\n\n async function confirmRemove(): Promise<boolean> {\n const id = store.get().pendingRemove\n if (!id) return false\n const title = titleOf(store.get(), id)\n const done = await run('remove', async (port) => {\n await port.remove(id)\n return true\n })\n store.set({ pendingRemove: null })\n if (!done) return false\n store.set((state) => ({\n items: state.items.filter((item) => item.id !== id),\n openId: state.openId === id ? null : state.openId,\n notice: options.t()('removed', { title }),\n }))\n options.onRemoved?.(id)\n return true\n }\n\n return { submit, importText, confirmRemove }\n}\n\nexport function createComparisonsController(options: ComparisonsControllerOptions) {\n const store = createStore<ComparisonsData>(INITIAL_COMPARISONS)\n const run = createRunner(store, options.port, (error) => asComparisonsError(error, options.t()), options.onError)\n\n async function load(): Promise<void> {\n const loaded = await run('load', async (port) => Promise.all([port.profiles(), port.list()]))\n if (loaded) store.set({ profiles: loaded[0], items: loaded[1], loaded: true })\n }\n\n return {\n store,\n load,\n ...formActions(store),\n ...writeActions(store, run, options),\n setQuery: (query: string) => store.set({ query }),\n open: (id: string | null) => store.set({ openId: id }),\n askRemove: (id: string) => store.set({ pendingRemove: id }),\n cancelRemove: () => store.set({ pendingRemove: null }),\n dismissError: () => store.set({ error: null }),\n }\n}\n\nexport type ComparisonsController = ReturnType<typeof createComparisonsController>\n","/** Abgeleitete Anzeige der Vergleichsverwaltung (reine Funktion, von Vue und React genutzt). */\nimport type { ComparisonsData } from './controller'\nimport { DEFAULT_MAX_UPLOAD_BYTES, defaultProfile, formatBytes, formProblems, involvesPdf, type FormProblem, type UploadFile } from './form'\nimport { filterSummaries, summaryView, type SummaryView } from './list'\nimport type { ComparisonsMessageKey, ComparisonsTranslate } from './messages'\n\nexport interface ProblemView {\n field: FormProblem['field']\n text: string\n}\n\nexport interface ProfileOption {\n /** Leer: Vorgabe des Servers. */\n value: string\n label: string\n}\n\nexport interface ComparisonsView {\n rows: SummaryView[]\n total: number\n countText: string\n /** Hinweis bei leerer Liste, sonst `null`. */\n emptyText: string | null\n problems: ProblemView[]\n profileOptions: ProfileOption[]\n sizeHint: string\n oldFileText: string\n newFileText: string\n oldFileLabel: string\n newFileLabel: string\n pdfHint: boolean\n busyText: string\n pendingTitle: string | null\n openTitle: string | null\n}\n\nexport interface ComparisonsViewOptions {\n lang: string\n maxBytes?: number\n}\n\nfunction fileText(file: UploadFile | null, t: ComparisonsTranslate, lang: string): string {\n return file ? t('fileChosen', { name: file.name, size: formatBytes(file.size, lang) }) : ''\n}\n\nfunction profileOptions(state: ComparisonsData, t: ComparisonsTranslate): ProfileOption[] {\n const fallback = defaultProfile(state.profiles)\n return state.profiles.map((profile) => ({\n value: profile.id === fallback?.id ? '' : profile.id,\n label: t(profile.id === fallback?.id ? 'profileDefault' : 'profileOption', { id: profile.id, version: profile.version }),\n }))\n}\n\nfunction emptyText(state: ComparisonsData, shown: number, t: ComparisonsTranslate): string | null {\n if (!state.loaded || shown > 0) return null\n return state.items.length === 0 ? t('empty') : t('noMatches')\n}\n\nfunction titleOf(state: ComparisonsData, id: string | null): string | null {\n if (id === null) return null\n return state.items.find((item) => item.id === id)?.title ?? id\n}\n\nfunction problems(state: ComparisonsData, t: ComparisonsTranslate, maxBytes: number, lang: string): ProblemView[] {\n if (!state.submitted) return []\n return formProblems(state.form, maxBytes, lang).map((problem) => ({ field: problem.field, text: t(problem.key, problem.params) }))\n}\n\nexport function comparisonsView(state: ComparisonsData, t: ComparisonsTranslate, options: ComparisonsViewOptions): ComparisonsView {\n const { lang } = options\n const maxBytes = options.maxBytes ?? DEFAULT_MAX_UPLOAD_BYTES\n const rows = filterSummaries(state.items, state.query).map((item) => summaryView(item, t, lang))\n const articleLaw = state.form.kind === 'article_law'\n return {\n rows,\n total: state.items.length,\n countText: t('listCount', { count: rows.length, total: state.items.length }),\n emptyText: emptyText(state, rows.length, t),\n problems: problems(state, t, maxBytes, lang),\n profileOptions: profileOptions(state, t),\n sizeHint: t('fileHint', { size: formatBytes(maxBytes, lang) }),\n oldFileText: fileText(state.form.oldFile, t, lang),\n newFileText: fileText(state.form.newFile, t, lang),\n oldFileLabel: t(articleLaw ? 'oldFileArticleLaw' : 'oldFile'),\n newFileLabel: t(articleLaw ? 'newFileArticleLaw' : 'newFile'),\n pdfHint: !articleLaw && involvesPdf(state.form),\n busyText: state.busy ? t(`busy_${state.busy}` as ComparisonsMessageKey) : '',\n pendingTitle: titleOf(state, state.pendingRemove),\n openTitle: titleOf(state, state.openId),\n }\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte des Tabellenexports (Berichtsexport nach Excel). */\nexport const reportingMessages = defineMessages({\n de: {\n title: 'Tabellenexport (Excel)',\n loading: 'Formatprofile werden geladen …',\n noPort: 'Kein Port übergeben: Vorschau und Export sind nicht verfügbar.',\n failed: 'Anfrage abgelehnt: {message}',\n data: 'Daten',\n tablesSummary: '{tables} Tabelle(n), {rows} Zeilen',\n noTables: 'Keine Tabellen übergeben. Die Anwendung setzt sie als Eigenschaft „tables“.',\n profile: 'Formatprofil',\n choose: 'Bitte wählen',\n profileSource: 'Herkunft des Profils',\n profileVersion: 'Version {version}, Status {status}',\n filename: 'Dateiname',\n preview: 'Vorschau',\n export: 'Als Excel exportieren',\n errornoTables: 'Keine Tabellen vorhanden.',\n errorprofile: 'Formatprofil wählen.',\n excelMissing: 'XLSX-Export auf dem Server nicht verfügbar (Extra „excel“ fehlt). Die Vorschau zeigt nur die Formate.',\n previewStale: 'Eingaben geändert – Vorschau neu anfordern.',\n workbook: 'Probelauf: {filename}, {size}',\n sheetHeading: 'Blatt „{name}“ – {rows} Zeilen',\n columns: 'Spaltenformate',\n colName: 'Spalte',\n colType: 'Typ',\n colFormat: 'Excel-Format',\n colSource: 'Herkunft',\n sourceprofile: 'Profil',\n sourceoverride: 'ausdrücklich',\n sample: 'Erste Zeilen',\n sampleMore: 'Vorschau zeigt {shown} von {rows} Zeilen.',\n exported: 'Exportiert: {filename}',\n notice: 'Texte werden als Text gespeichert, auch wenn sie mit „=“ beginnen; es entstehen keine Formeln, Makros oder Verknüpfungen.',\n },\n en: {\n title: 'Table export (Excel)',\n profile: 'Format profile',\n preview: 'Preview',\n export: 'Export as Excel',\n filename: 'File name',\n },\n})\n\nexport type ReportingMessageKey = keyof typeof reportingMessages.de\n","import { requestFile, requestJson, type RestOptions } from '@auditcore/common'\nimport type { ReportingPort } from './types'\n\n/** Port auf den REST-Vertrag `reporting_ui/1` von `auditcore_reporting.web` (Starlette oder FastAPI). */\nexport function createReportingRestPort(options: RestOptions): ReportingPort {\n return {\n profiles: () => requestJson(options, '/profiles'),\n preview: (request) => requestJson(options, '/preview', request),\n exportWorkbook: (request) => requestFile(options, '/export', request, request.filename ?? 'bericht.xlsx'),\n }\n}\n","// Zustandsautomat des Tabellenexports (Vue und React): Formatprofile laden,\n// Profil wählen, Vorschau und Export über den Port (reporting_ui/1).\n\nimport type { DownloadFile } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState } from '../store'\nimport type { FormatProfile, ReportingCatalogue, ReportingPort, ReportTableInput, WorkbookPreview, WorkbookRequest } from './types'\n\nexport type ReportingBusy = 'load' | 'preview' | 'export'\nexport type ReportingError = 'noTables' | 'profile'\n\nexport interface ReportingCallbacks {\n previewed?: (result: WorkbookPreview) => void\n exported?: (file: DownloadFile) => void\n failed?: (message: string) => void\n}\n\nexport interface ReportingData extends RequestState<string> {\n catalogue: ReportingCatalogue | null\n profileId: string | null\n filename: string\n preview: WorkbookPreview | null\n /** Vorschau passt nicht mehr zu Profil, Dateiname oder Tabellen. */\n stale: boolean\n validation: ReportingError | null\n exportedName: string | null\n}\n\nexport interface ReportingSource {\n port: () => ReportingPort | null | undefined\n tables: () => readonly ReportTableInput[]\n callbacks?: () => ReportingCallbacks\n}\n\nexport const INITIAL_REPORTING: ReportingData = {\n ...IDLE, catalogue: null, profileId: null, filename: '', preview: null, stale: false, validation: null, exportedName: null,\n}\n\nexport function reportingProfile(state: ReportingData): FormatProfile | null {\n return state.catalogue?.profiles.find((entry) => entry.id === state.profileId) ?? null\n}\n\n/** Anfrage aus Zustand und Tabellen oder der erste fehlende Punkt. */\nexport function buildWorkbookRequest(state: ReportingData, tables: readonly ReportTableInput[]): { ok: true; request: WorkbookRequest } | { ok: false; error: ReportingError } {\n if (!tables.length) return { ok: false, error: 'noTables' }\n if (!state.profileId) return { ok: false, error: 'profile' }\n const filename = state.filename.trim()\n return { ok: true, request: { profile: state.profileId, tables, ...(filename ? { filename } : {}) } }\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nexport function createReportingController(source: ReportingSource) {\n const store = createStore<ReportingData>({ ...INITIAL_REPORTING })\n const run = createRunner<ReportingPort, string, ReportingData>(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n\n function checked(): WorkbookRequest | null {\n const built = buildWorkbookRequest(store.get(), source.tables())\n store.set({ validation: built.ok ? null : built.error })\n return built.ok ? built.request : null\n }\n\n async function load(): Promise<void> {\n const loaded = await run('load', (active) => active.profiles())\n if (!loaded) return\n store.set({ catalogue: loaded, profileId: loaded.profiles[0]?.id ?? null })\n }\n\n async function preview(): Promise<void> {\n const request = checked()\n if (!request) return\n const result = await run('preview', (active) => active.preview(request))\n if (!result) return\n store.set({ preview: result, stale: false })\n source.callbacks?.().previewed?.(result)\n }\n\n async function exportWorkbook(): Promise<DownloadFile | null> {\n const request = checked()\n if (!request) return null\n const file = await run('export', (active) => active.exportWorkbook(request))\n if (!file) return null\n store.set({ exportedName: file.filename })\n source.callbacks?.().exported?.(file)\n return file\n }\n\n const changed = (patch: Partial<ReportingData>): void => store.set((state) => ({ ...patch, stale: state.preview !== null, exportedName: null }))\n\n return {\n store,\n load,\n preview,\n exportWorkbook,\n setProfile: (profileId: string | null) => changed({ profileId }),\n setFilename: (filename: string) => changed({ filename }),\n /** Tabellen der Anwendung haben sich geändert. */\n tablesChanged: () => changed({}),\n }\n}\n\nexport type ReportingController = ReturnType<typeof createReportingController>\n","// Anzeige des Tabellenexports (Vue und React): Texte, Zellen, Zusammenfassungen.\n\nimport { EMPTY_VALUE, formatBytes, intlFormatNumber } from '@auditcore/common'\nimport type { Locale, Translate } from '../i18n'\nimport type { ReportingMessageKey } from './messages'\nimport type { ReportCell, ReportTableInput, TablePreview, WorkbookPreview } from './types'\n\nexport type ReportingTranslate = Translate<ReportingMessageKey>\n\n/** Zelle der Vorschau: Werte wie gesendet (Zahlen sprachabhängig), leer als „—“. */\nexport function reportCellText(value: ReportCell, locale: Locale): string {\n if (value === null || value === '') return EMPTY_VALUE\n if (typeof value === 'number') return intlFormatNumber(value, locale, { maximumFractionDigits: 10 })\n return String(value)\n}\n\nexport function reportingTablesText(tables: readonly ReportTableInput[], t: ReportingTranslate, locale: Locale): string {\n if (!tables.length) return t('noTables')\n const rows = tables.reduce((sum, table) => sum + table.rows.length, 0)\n return t('tablesSummary', { tables: tables.length, rows: intlFormatNumber(rows, locale) })\n}\n\nexport function reportingWorkbookText(preview: WorkbookPreview, t: ReportingTranslate, locale: Locale): string {\n if (!preview.workbook) return t('excelMissing')\n return t('workbook', { filename: preview.workbook.filename, size: formatBytes(preview.workbook.bytes, { locale }) })\n}\n\nexport function reportingSheetHeading(table: TablePreview, t: ReportingTranslate, locale: Locale): string {\n return t('sheetHeading', { name: table.name, rows: intlFormatNumber(table.rows, locale) })\n}\n\n/** Hinweis, wenn die Vorschau nur einen Teil der Zeilen zeigt; sonst leer. */\nexport function reportingSampleNote(table: TablePreview, t: ReportingTranslate, locale: Locale): string {\n if (table.sample.length >= table.rows) return ''\n return t('sampleMore', { shown: table.sample.length, rows: intlFormatNumber(table.rows, locale) })\n}\n\nexport function reportingErrorKey(error: 'noTables' | 'profile'): ReportingMessageKey {\n return error === 'noTables' ? 'errornoTables' : 'errorprofile'\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte von „Kennung prüfen“. */\nexport const identifierMessages = defineMessages({\n de: {\n title: 'Kennung prüfen',\n loading: 'Kennungsarten und Prüfprofile werden geladen …',\n noPort: 'Kein Port übergeben: Prüfungen sind nicht verfügbar.',\n failed: 'Anfrage abgelehnt: {message}',\n single: 'Einzelprüfung',\n kind: 'Kennungsart',\n profile: 'Prüfprofil',\n recommended: '{label} (empfohlen)',\n legacy: '{label} (Altverhalten)',\n profileSource: 'Herkunft und Zweck des Profils',\n value: 'Wert',\n country: 'Land (optional)',\n countryHelp: 'Nur nötig, wenn die USt-IdNr. ohne Länderpräfix vorliegt, z. B. DE.',\n choose: 'Bitte wählen',\n check: 'Prüfen',\n result: 'Ergebnis',\n statusVALID: 'gültig',\n statusINVALID: 'ungültig',\n statusMISSING: 'fehlt',\n validText: 'Die Kennung erfüllt alle Prüfungen des Profils „{profile}“.',\n normalized: 'Normalform',\n reason: 'Grund',\n message: 'Begründung',\n countryFound: 'Land',\n details: 'Einzelheiten der Prüfung',\n yes: 'ja',\n no: 'nein',\n batch: 'Stapelprüfung aus Tabelle',\n batchHelp: 'CSV-, TSV- oder Textdatei laden und Spalten zuordnen; jede Zeile wird mit dem gewählten Profil geprüft.',\n file: 'Datei (CSV, TSV oder Text)',\n header: 'Erste Zeile enthält Spaltennamen',\n tableSummary: '{file}: {rows} Zeilen',\n valueColumn: 'Wertspalte',\n kindSource: 'Kennungsart',\n fromColumn: 'aus Spalte …',\n kindColumn: 'Spalte mit Kennungsart',\n refColumn: 'Bezugsspalte (z. B. Belegnummer)',\n countryColumn: 'Landspalte',\n none: '– keine –',\n batchRun: 'Alle prüfen',\n summary: '{total} Zeilen geprüft: {valid} gültig, {invalid} ungültig, {missing} ohne Wert, {notChecked} nicht prüfbar',\n colRef: 'Bezug',\n colKind: 'Art',\n colValue: 'Wert',\n colStatus: 'Ergebnis',\n colReason: 'Begründung',\n colNormalized: 'Normalform',\n notChecked: 'nicht prüfbar',\n onlyInvalid: 'Nur Auffälligkeiten zeigen',\n export: 'Ergebnis als CSV',\n lineRef: 'Zeile {line}',\n errorkind: 'Kennungsart wählen.',\n errorprofile: 'Prüfprofil wählen.',\n errornoTable: 'Zuerst eine Datei laden.',\n errornoRows: 'Die Tabelle enthält keine Zeilen.',\n errortooMany: 'Zu viele Zeilen für eine Anfrage.',\n errorkindColumn: 'Kennungsart für alle Zeilen oder eine Spalte mit Kennungsart wählen.',\n },\n en: {\n title: 'Check identifier',\n kind: 'Identifier type',\n profile: 'Check profile',\n value: 'Value',\n check: 'Check',\n result: 'Result',\n batch: 'Batch check from table',\n batchRun: 'Check all',\n },\n})\n\nexport type IdentifierMessageKey = keyof typeof identifierMessages.de\n","/** Framework-freie Anfrage- und Anzeigelogik von „Kennung prüfen“ (Vue und React). */\nimport { recordsToCsv, type ParsedTable } from '@auditcore/common'\nimport type { Translate } from '../i18n'\nimport type { IdentifierMessageKey } from './messages'\nimport type {\n IdentifierBatchAnswer,\n IdentifierBatchItem,\n IdentifierBatchRequest,\n IdentifierBatchRow,\n IdentifierCheckRequest,\n IdentifierDetailValue,\n IdentifierCatalogue,\n IdentifierKindInfo,\n IdentifierProfileInfo,\n IdentifierResult,\n IdentifierStatus,\n} from './types'\n\nexport type IdentifierTranslate = Translate<IdentifierMessageKey>\nexport type IdentifierError = 'kind' | 'profile' | 'noTable' | 'noRows' | 'tooMany' | 'kindColumn'\nexport type IdentifierValidation<R> = { ok: true; request: R } | { ok: false; error: IdentifierError }\n\nexport function findIdentifierProfile(catalogue: IdentifierCatalogue | null, id: string | null): IdentifierProfileInfo | null {\n return catalogue?.profiles.find((entry) => entry.id === id) ?? null\n}\n\n/** Kennungsarten, die das gewählte Profil prüft (ohne Profil: keine). */\nexport function identifierProfileKinds(catalogue: IdentifierCatalogue | null, profileId: string | null): IdentifierKindInfo[] {\n const profile = findIdentifierProfile(catalogue, profileId)\n return profile && catalogue ? catalogue.kinds.filter((kind) => profile.kinds.includes(kind.id)) : []\n}\n\n/** Anzeige eines Profils in der Auswahl: Empfehlung und Altverhalten sichtbar. */\nexport function identifierProfileLabel(catalogue: IdentifierCatalogue, profile: IdentifierProfileInfo, t: IdentifierTranslate): string {\n if (profile.id === catalogue.recommended_profile) return t('recommended', { label: profile.title })\n return profile.legacy ? t('legacy', { label: profile.title }) : profile.title\n}\n\nexport function kindNeedsCountry(catalogue: IdentifierCatalogue | null, kind: string | null): boolean {\n return catalogue?.kinds.find((entry) => entry.id === kind)?.country === true\n}\n\nfunction country(text: string | null | undefined): string | null {\n const trimmed = (text ?? '').trim().toUpperCase()\n return trimmed === '' ? null : trimmed\n}\n\nexport interface IdentifierCheckInput {\n catalogue: IdentifierCatalogue\n profile: string | null\n kind: string | null\n value: string\n country: string\n}\n\n/** Anfrage für `POST /check`; Profil und Kennungsart sind Pflicht, ein leerer Wert ergibt „fehlt“. */\nexport function buildIdentifierCheck(input: IdentifierCheckInput): IdentifierValidation<IdentifierCheckRequest> {\n if (!findIdentifierProfile(input.catalogue, input.profile)) return { ok: false, error: 'profile' }\n if (!input.kind || !identifierProfileKinds(input.catalogue, input.profile).some((kind) => kind.id === input.kind)) return { ok: false, error: 'kind' }\n const request: IdentifierCheckRequest = { kind: input.kind, value: input.value.trim() === '' ? null : input.value, profile: input.profile as string }\n const land = kindNeedsCountry(input.catalogue, input.kind) ? country(input.country) : null\n return { ok: true, request: land ? { ...request, country: land } : request }\n}\n\n/** Kennungsart aus einer Tabellenzelle: Kennung oder Bezeichnung des Katalogs, sonst unverändert (Server meldet sie). */\nexport function resolveIdentifierKind(catalogue: IdentifierCatalogue, cell: string): string {\n const text = cell.trim().toLowerCase()\n const found = catalogue.kinds.find((kind) => kind.id === text || kind.label.toLowerCase() === text)\n return found ? found.id : cell.trim()\n}\n\nexport interface IdentifierBatchMapping {\n table: ParsedTable | null\n hasHeader: boolean\n valueColumn: number\n refColumn: number | null\n /** Kennungsart für alle Zeilen; `null` = aus `kindColumn`. */\n kind: string | null\n kindColumn: number | null\n countryColumn: number | null\n}\n\nfunction batchItem(catalogue: IdentifierCatalogue, mapping: IdentifierBatchMapping, row: readonly string[], index: number): IdentifierBatchItem {\n const cell = (column: number | null): string => (column === null ? '' : (row[column] ?? ''))\n const value = cell(mapping.valueColumn)\n const line = index + (mapping.hasHeader ? 2 : 1)\n const kind = mapping.kind ?? resolveIdentifierKind(catalogue, cell(mapping.kindColumn))\n const item: IdentifierBatchItem = { ref: mapping.refColumn === null ? String(line) : cell(mapping.refColumn), kind, value: value.trim() === '' ? null : value }\n const land = mapping.countryColumn === null ? null : country(cell(mapping.countryColumn))\n return land ? { ...item, country: land } : item\n}\n\n/** Anfrage für `POST /check/batch` aus der geladenen Tabelle und der Spaltenzuordnung. */\nexport function buildIdentifierBatch(catalogue: IdentifierCatalogue, profile: string | null, mapping: IdentifierBatchMapping): IdentifierValidation<IdentifierBatchRequest> {\n if (!findIdentifierProfile(catalogue, profile)) return { ok: false, error: 'profile' }\n if (!mapping.table) return { ok: false, error: 'noTable' }\n if (mapping.table.rows.length === 0) return { ok: false, error: 'noRows' }\n if (mapping.table.rows.length > catalogue.limits.max_items) return { ok: false, error: 'tooMany' }\n if (mapping.kind === null && mapping.kindColumn === null) return { ok: false, error: 'kindColumn' }\n const items = mapping.table.rows.map((row, index) => batchItem(catalogue, mapping, row, index))\n return { ok: true, request: { profile: profile as string, items } }\n}\n\nexport function identifierErrorKey(error: IdentifierError): IdentifierMessageKey {\n return `error${error}`\n}\n\nexport type IdentifierTone = 'success' | 'danger' | 'warning' | 'neutral'\n\nconst TONES: Readonly<Record<IdentifierStatus, IdentifierTone>> = { VALID: 'success', INVALID: 'danger', MISSING: 'warning' }\n\nexport function identifierStatusTone(status: IdentifierStatus | null): IdentifierTone {\n return status ? TONES[status] : 'neutral'\n}\n\nexport function identifierStatusText(status: IdentifierStatus | null, t: IdentifierTranslate): string {\n return status ? t(`status${status}`) : t('notChecked')\n}\n\n/** Begründung eines Ergebnisses: Meldung der Bibliothek, bei „gültig“ der Satz zum Profil. */\nexport function identifierReasonText(result: IdentifierResult, profileTitle: string, t: IdentifierTranslate): string {\n if (result.message) return result.message\n return result.status === 'VALID' ? t('validText', { profile: profileTitle }) : (result.reason_label ?? '')\n}\n\nfunction detailValue(catalogue: IdentifierCatalogue, value: IdentifierDetailValue, t: IdentifierTranslate): string {\n if (value === null) return '—'\n if (typeof value === 'boolean') return t(value ? 'yes' : 'no')\n return catalogue.value_labels[String(value)] ?? String(value)\n}\n\n/** Einzelheiten (`details`) mit deutschen Bezeichnungen aus dem Katalog. */\nexport function identifierFacts(catalogue: IdentifierCatalogue, result: IdentifierResult, t: IdentifierTranslate): { key: string; label: string; value: string }[] {\n return Object.entries(result.details).map(([key, value]) => ({\n key,\n label: catalogue.detail_labels[key] ?? key,\n value: detailValue(catalogue, value, t),\n }))\n}\n\n/** Status einer Stapelzeile; `null` = nicht prüfbar. */\nexport function identifierRowStatus(row: IdentifierBatchRow): IdentifierStatus | null {\n return row.error === null ? row.status : null\n}\n\n/** Begründung einer Stapelzeile; gültige Zeilen nur mit eigener Meldung der Bibliothek (Tabelle bleibt knapp). */\nexport function identifierRowReason(row: IdentifierBatchRow): string {\n if (row.error !== null) return row.error.message\n return row.message || (row.status === 'VALID' ? '' : (row.reason_label ?? ''))\n}\n\nexport function identifierRowKind(catalogue: IdentifierCatalogue, row: IdentifierBatchRow, request: IdentifierBatchRequest | null): string {\n if (row.error === null) return row.kind_label\n const kind = request?.items[row.index]?.kind ?? ''\n return catalogue.kinds.find((entry) => entry.id === kind)?.label ?? kind\n}\n\nexport function identifierRowValue(row: IdentifierBatchRow, request: IdentifierBatchRequest | null): string {\n return row.error === null ? (row.raw ?? '') : (request?.items[row.index]?.value ?? '')\n}\n\n/** Zeilen der Ergebnistabelle; wahlweise nur ungültige, fehlende und nicht prüfbare. */\nexport function visibleIdentifierRows(answer: IdentifierBatchAnswer, onlyIssues: boolean): readonly IdentifierBatchRow[] {\n return onlyIssues ? answer.results.filter((row) => identifierRowStatus(row) !== 'VALID') : answer.results\n}\n\nexport function identifierBatchSummary(answer: IdentifierBatchAnswer, t: IdentifierTranslate): string {\n const { total, valid, invalid, missing, not_checked: notChecked } = answer.summary\n return t('summary', { total, valid, invalid, missing, notChecked })\n}\n\n/** Anzeigezeile der Stapelprüfung (Tabelle und CSV). */\nexport interface IdentifierBatchLine {\n key: number\n ref: string\n kind: string\n value: string\n status: string\n tone: IdentifierTone\n reason: string\n normalized: string\n}\n\nexport function identifierBatchLines(\n catalogue: IdentifierCatalogue,\n answer: IdentifierBatchAnswer,\n request: IdentifierBatchRequest | null,\n onlyIssues: boolean,\n t: IdentifierTranslate,\n): IdentifierBatchLine[] {\n return visibleIdentifierRows(answer, onlyIssues).map((row) => ({\n key: row.index,\n ref: row.ref,\n kind: identifierRowKind(catalogue, row, request),\n value: identifierRowValue(row, request),\n status: identifierStatusText(identifierRowStatus(row), t),\n tone: identifierStatusTone(identifierRowStatus(row)),\n reason: identifierRowReason(row),\n normalized: row.error === null ? (row.normalized ?? '') : '',\n }))\n}\n\n/** CSV (Excel-DE) der Stapelprüfung mit denselben Spalten wie die Tabelle (alle Zeilen). */\nexport function identifierBatchCsv(catalogue: IdentifierCatalogue, answer: IdentifierBatchAnswer, request: IdentifierBatchRequest | null, t: IdentifierTranslate): string {\n return recordsToCsv(identifierBatchLines(catalogue, answer, request, false, t), [\n { label: t('colRef'), value: 'ref' },\n { label: t('colKind'), value: 'kind' },\n { label: t('colValue'), value: 'value' },\n { label: t('colStatus'), value: 'status' },\n { label: t('colReason'), value: 'reason' },\n { label: t('colNormalized'), value: 'normalized' },\n ])\n}\n\nexport type IdentifierColumn = 'value' | 'kind' | 'ref' | 'country'\n\nexport interface IdentifierColumnField {\n id: IdentifierColumn\n label: IdentifierMessageKey\n value: number | null\n /** Text der leeren Auswahl: „keine“ bei optionalen Spalten, „Bitte wählen“ bei der Spalte mit Kennungsart. */\n placeholder: IdentifierMessageKey | null\n}\n\n/** Spaltenauswahl der Stapelprüfung; die Spalte mit Kennungsart nur ohne feste Art. */\nexport function identifierColumnFields(mapping: IdentifierBatchMapping): IdentifierColumnField[] {\n const field = (id: IdentifierColumn, label: IdentifierMessageKey, value: number | null, placeholder: IdentifierMessageKey | null): IdentifierColumnField => ({\n id, label, value, placeholder,\n })\n return [\n field('value', 'valueColumn', mapping.valueColumn, null),\n ...(mapping.kind === null ? [field('kind', 'kindColumn', mapping.kindColumn, 'choose')] : []),\n field('ref', 'refColumn', mapping.refColumn, 'none'),\n field('country', 'countryColumn', mapping.countryColumn, 'none'),\n ]\n}\n","import { requestJson, type RestOptions } from '@auditcore/common'\nimport type { IdentifiersPort } from './types'\n\n/** Port auf den REST-Vertrag `identifiers_ui/1` von `auditcore_identifiers.web` (Starlette oder FastAPI). */\nexport function createIdentifiersRestPort(options: RestOptions): IdentifiersPort {\n return {\n catalogue: () => requestJson(options, '/catalogue'),\n check: (request) => requestJson(options, '/check', request),\n checkBatch: (request) => requestJson(options, '/check/batch', request),\n }\n}\n","// Zustandsautomat von „Kennung prüfen“ (Vue und React): Katalog laden,\n// Einzelprüfung, Stapelprüfung aus einer Tabelle. Die Datei liest der\n// gemeinsame TableImport-Controller; geprüft wird ausschließlich über den Port.\n\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport { createTableImportController, type TableImportController, type TableImportData } from '../tabular'\nimport { buildIdentifierBatch, buildIdentifierCheck, identifierProfileKinds, type IdentifierBatchMapping, type IdentifierColumn, type IdentifierError } from './model'\nimport type { IdentifierBatchAnswer, IdentifierBatchRequest, IdentifierCatalogue, IdentifierResult, IdentifiersPort } from './types'\n\nexport type IdentifierBusy = 'load' | 'check' | 'batch'\n\nexport interface IdentifierCallbacks {\n checked?: (result: IdentifierResult) => void\n batchChecked?: (answer: IdentifierBatchAnswer) => void\n failed?: (message: string) => void\n}\n\nexport interface IdentifierData extends RequestState<string> {\n catalogue: IdentifierCatalogue | null\n profileId: string | null\n kind: string | null\n value: string\n country: string\n result: IdentifierResult | null\n validation: IdentifierError | null\n /** Kennungsart aller Tabellenzeilen; `null` = aus `kindColumn`. */\n batchKind: string | null\n kindColumn: number | null\n countryColumn: number | null\n batchRequest: IdentifierBatchRequest | null\n batch: IdentifierBatchAnswer | null\n batchValidation: IdentifierError | null\n onlyIssues: boolean\n}\n\nexport const INITIAL_IDENTIFIERS: IdentifierData = {\n ...IDLE, catalogue: null, profileId: null, kind: null, value: '', country: '', result: null, validation: null,\n batchKind: null, kindColumn: null, countryColumn: null, batchRequest: null, batch: null, batchValidation: null, onlyIssues: false,\n}\n\n/** Einfache Eingabefelder, die die Oberfläche direkt setzen darf. */\nexport type IdentifierField = 'value' | 'country' | 'kindColumn' | 'countryColumn' | 'onlyIssues'\n\nexport interface IdentifierSource {\n port: () => IdentifiersPort | null | undefined\n callbacks?: () => IdentifierCallbacks\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\n/** Zuordnung aus beiden Zuständen (Tabelle und Kennungsprüfung). */\nexport function identifierBatchMapping(state: IdentifierData, loaded: TableImportData): IdentifierBatchMapping {\n return {\n table: loaded.table, hasHeader: loaded.hasHeader, valueColumn: loaded.valueColumn, refColumn: loaded.idColumn,\n kind: state.batchKind, kindColumn: state.kindColumn, countryColumn: state.countryColumn,\n }\n}\n\nfunction keepKind(store: Store<IdentifierData>, kind: string | null, profileId: string | null): string | null {\n const offered = identifierProfileKinds(store.get().catalogue, profileId)\n return offered.some((entry) => entry.id === kind) ? kind : (offered[0]?.id ?? null)\n}\n\n/** Datei und Spaltenzuordnung der Stapelprüfung. */\nfunction tableActions(store: Store<IdentifierData>, table: TableImportController) {\n return {\n /** Spalte zuordnen; `null` = keine (nur optionale Spalten). */\n setColumn: (column: IdentifierColumn, index: number | null) => {\n if (column === 'value') table.setValueColumn(index ?? 0)\n else if (column === 'ref') table.setIdColumn(index)\n else store.set(column === 'kind' ? { kindColumn: index } : { countryColumn: index })\n },\n setHasHeader: (hasHeader: boolean) => {\n table.setHasHeader(hasHeader)\n table.reparse()\n },\n readFile: async (file: File) => {\n await table.read(file)\n store.set({ batch: null, batchRequest: null, batchValidation: null, kindColumn: null, countryColumn: null })\n },\n }\n}\n\nexport function createIdentifierController(source: IdentifierSource) {\n const store = createStore<IdentifierData>({ ...INITIAL_IDENTIFIERS })\n const table = createTableImportController()\n const callbacks = (): IdentifierCallbacks => source.callbacks?.() ?? {}\n const run = createRunner<IdentifiersPort, string, IdentifierData>(store, () => source.port() ?? null, errorText, (message) => callbacks().failed?.(message))\n\n async function load(): Promise<void> {\n const loaded = await run('load', (active) => active.catalogue())\n if (!loaded) return\n store.set({ catalogue: loaded, profileId: null })\n setProfile(loaded.recommended_profile)\n store.set((state) => ({ batchKind: state.kind }))\n }\n\n function setProfile(profileId: string | null): void {\n const { kind, batchKind } = store.get()\n store.set({ profileId, kind: keepKind(store, kind, profileId), batchKind: batchKind === null ? null : keepKind(store, batchKind, profileId), result: null, batch: null })\n }\n\n async function check(): Promise<void> {\n const state = store.get()\n if (!state.catalogue) return\n const checked = buildIdentifierCheck({ catalogue: state.catalogue, profile: state.profileId, kind: state.kind, value: state.value, country: state.country })\n store.set({ validation: checked.ok ? null : checked.error })\n if (!checked.ok) return\n const answer = await run('check', (active) => active.check(checked.request))\n if (!answer) return\n store.set({ result: answer.result })\n callbacks().checked?.(answer.result)\n }\n\n async function checkBatch(): Promise<void> {\n const state = store.get()\n if (!state.catalogue) return\n const checked = buildIdentifierBatch(state.catalogue, state.profileId, identifierBatchMapping(state, table.store.get()))\n store.set({ batchValidation: checked.ok ? null : checked.error })\n if (!checked.ok) return\n const answer = await run('batch', (active) => active.checkBatch(checked.request))\n if (!answer) return\n store.set({ batch: answer, batchRequest: checked.request })\n callbacks().batchChecked?.(answer)\n }\n\n return {\n store,\n /** Datei-Import (gemeinsamer TableImport-Controller aus `@auditcore/ui-core`). */\n table,\n load,\n check,\n checkBatch,\n setProfile,\n setKind: (kind: string | null) => store.set({ kind, result: null }),\n setBatchKind: (batchKind: string | null) => store.set({ batchKind }),\n setField: <K extends IdentifierField>(key: K, value: IdentifierData[K]) => store.set({ [key]: value } as Partial<IdentifierData>),\n ...tableActions(store, table),\n }\n}\n\nexport type IdentifierController = ReturnType<typeof createIdentifierController>\n","import { defineMessages } from '../i18n'\n\n/** Texte der Belegerkennung (`<flowaudit-extraction>`). */\nexport const extractionMessages = defineMessages({\n de: {\n title: 'Belegerkennung',\n loading: 'Profile und Engines werden geladen …',\n noPort: 'Kein Port übergeben: Die Belegerkennung ist nicht verfügbar.',\n failed: 'Anfrage abgelehnt: {message}',\n disabled: 'Die Belegerkennung ist nicht eingerichtet: Der Server hat keine OCR-Engine angeschlossen.',\n upload: 'Dokument hochladen',\n file: 'Datei',\n fileHelp: 'PDF oder Bild (PNG, JPEG, TIFF, WebP), höchstens {size}.',\n profile: 'Profil',\n recommended: '{label} (empfohlen)',\n unavailable: '{label} – Engine nicht angeschlossen',\n experimental: 'Erprobendes Profil: Donut-Werte gelten nur nach Plausibilitätsprüfung und Abgleich mit der Texterkennung.',\n retention: 'Das Dokument wird nur für diesen Lauf zwischengespeichert und danach gelöscht; der Server speichert kein Ergebnis.',\n run: 'Erkennen',\n errorneedFile: 'Bitte eine Datei auswählen.',\n errortooLarge: 'Die Datei ist größer als {size}.',\n errorprofile: 'Bitte ein verfügbares Profil wählen.',\n notice: 'Arbeitshilfe: Das Ergebnis ist ein Vorschlag der Texterkennung, keine Prüfungsentscheidung.',\n result: 'Ergebnis',\n statusok: 'Ohne Auffälligkeiten',\n statusreview_needed: 'Prüfung erforderlich',\n statusrejected: 'Abgelehnt',\n statusfailed: 'Fehlgeschlagen',\n statusOther: 'Status {status}',\n runError: 'Fehler {code}: {message}',\n retryable: 'Der Lauf kann wiederholt werden.',\n document: 'Dokument',\n documentValue: '{file} · {type} · {pages}',\n pages: '{count} Seite(n)',\n ocr: 'Texterkennung',\n ocrValue: '{engine}: mittlere Konfidenz {avg} (mindestens {min})',\n qualityok: 'ausreichend',\n qualityreview: 'prüfen',\n qualityrejected: 'unzureichend',\n fields: 'Erkannte Felder',\n colField: 'Feld',\n colValue: 'Wert',\n colConfidence: 'Konfidenz',\n colDecision: 'Übernahme',\n noValue: '–',\n noFields: 'Keine Felder erkannt.',\n confidenceHelp: 'Konfidenz je Feld liefert nur das Donut-Profil; sonst gilt die Konfidenz der Texterkennung.',\n decisionaccepted: 'übernommen',\n decisionrejected: 'verworfen (Plausibilität)',\n decisionunconfirmed: 'nicht bestätigt',\n decisiondisagreement: 'Abweichung zur Texterkennung',\n decisionnot_taken: 'nicht übernommen',\n proposal: 'Vorschlag: {value}',\n findings: 'Validierungsbefunde',\n findingsNone: 'Keine Auffälligkeiten.',\n passed: 'Bestandene Prüfungen ({count})',\n colRule: 'Prüfung',\n colSeverity: 'Gewicht',\n colOutcome: 'Ergebnis',\n colMessage: 'Meldung des Regelwerks',\n severityINFO: 'Hinweis',\n severityWARN: 'Warnung',\n severityCRITICAL: 'kritisch',\n outcomePASS: 'bestanden',\n outcomeFAIL: 'nicht bestanden',\n outcomeREVIEW: 'prüfen',\n flags: 'Kennzeichen',\n pagesText: 'Erkannter Text',\n pageLabel: 'Seite {page}',\n field_invoice_number: 'Rechnungsnummer',\n field_date: 'Rechnungsdatum',\n field_supply_date: 'Leistungsdatum',\n field_due_date: 'Fälligkeit',\n field_supplier_name: 'Lieferant',\n field_net_amount: 'Nettobetrag',\n field_vat_amount: 'Umsatzsteuer',\n field_total: 'Gesamtbetrag',\n field_iban: 'IBAN',\n field_bic: 'BIC',\n field_vat_id: 'USt-IdNr.',\n field_vat_rates: 'Steuersätze',\n rule_VAL_IBAN_CHECKSUM: 'IBAN-Prüfziffer',\n rule_VAL_VAT_ID_FORMAT: 'Aufbau der USt-IdNr.',\n rule_VAL_TOTAL_PLAUSIBILITY: 'Summe netto + Steuer = brutto',\n rule_VAL_OCR_CONFIDENCE: 'Lesequalität der Texterkennung',\n rule_VAL_FRAUD_DETECTION: 'Doppel- und Betrugsprüfung',\n rule_VAL_AMOUNT_FORMAT: 'Eindeutige Betragsformate',\n rule_VAL_DONUT_PLAUSIBILITY: 'Plausibilität der Donut-Werte',\n rule_VAL_DONUT_DISAGREEMENT: 'Abgleich Donut mit Texterkennung',\n },\n en: {\n title: 'Document extraction',\n upload: 'Upload document',\n file: 'File',\n profile: 'Profile',\n run: 'Extract',\n result: 'Result',\n fields: 'Extracted fields',\n findings: 'Validation findings',\n },\n})\n\nexport type ExtractionMessageKey = keyof typeof extractionMessages.de\n","import { RestError, type RestOptions } from '@auditcore/common'\nimport type { ExtractionCatalogue, ExtractionPort, ExtractionRun } from './types'\n\nasync function parse<T>(response: Response): Promise<T> {\n const data = (await response.json().catch(() => ({}))) as { error?: { code?: string; message?: string } }\n if (response.ok) return data as T\n throw new RestError(data.error?.message ?? `HTTP ${response.status}`, response.status, data.error?.code ?? 'http_error')\n}\n\n/** Port auf den REST-Vertrag `documents_extraction/1` von `auditcore_documents.web` (Starlette oder FastAPI). */\nexport function createExtractionRestPort(options: RestOptions): ExtractionPort {\n const base = options.baseUrl.replace(/\\/$/, '')\n const fetchImpl = options.fetch ?? ((input, init) => globalThis.fetch(input, init))\n const headers = { Accept: 'application/json', ...options.headers }\n return {\n catalogue: async () => parse<ExtractionCatalogue>(await fetchImpl(`${base}/profile`, { method: 'GET', headers })),\n async run(file, filename, profile) {\n const form = new FormData()\n form.append('file', file, filename)\n form.append('profile', profile)\n return parse<ExtractionRun>(await fetchImpl(`${base}/runs`, { method: 'POST', headers, body: form }))\n },\n }\n}\n","// Zustandsautomat von <flowaudit-extraction> (Vue und React): Katalog laden,\n// Datei und Profil wählen, Lauf anstoßen. Erkannt wird ausschließlich über den Port.\n\nimport { createRunner, createStore, IDLE, type RequestState } from '../store'\nimport type { ExtractionCatalogue, ExtractionPort, ExtractionRun } from './types'\n\nexport type ExtractionBusy = 'load' | 'run'\nexport type ExtractionValidation = 'needFile' | 'tooLarge' | 'profile' | null\n\nexport interface ExtractionCallbacks {\n completed?: (result: ExtractionRun) => void\n failed?: (message: string) => void\n}\n\nexport interface ExtractionData extends RequestState<string> {\n catalogue: ExtractionCatalogue | null\n profileId: string | null\n file: Blob | null\n filename: string\n result: ExtractionRun | null\n validation: ExtractionValidation\n}\n\nexport interface ExtractionSource {\n port: () => ExtractionPort | null | undefined\n callbacks?: () => ExtractionCallbacks\n}\n\nexport const INITIAL_EXTRACTION: ExtractionData = {\n ...IDLE, catalogue: null, profileId: null, file: null, filename: '', result: null, validation: null,\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\n/** Prüfung vor dem Senden (reine Funktion). */\nexport function extractionValidation(state: ExtractionData): ExtractionValidation {\n if (!state.file) return 'needFile'\n if (state.catalogue && state.file.size > state.catalogue.limits.max_upload_bytes) return 'tooLarge'\n const profile = state.catalogue?.profiles.find((entry) => entry.id === state.profileId)\n return profile?.available ? null : 'profile'\n}\n\nexport function createExtractionController(source: ExtractionSource) {\n const store = createStore<ExtractionData>({ ...INITIAL_EXTRACTION })\n const run = createRunner<ExtractionPort, string, ExtractionData>(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n\n async function load(): Promise<void> {\n const loaded = await run('load', (active) => active.catalogue())\n if (loaded) store.set({ catalogue: loaded, profileId: loaded.default_profile })\n }\n\n async function extract(): Promise<void> {\n const state = store.get()\n const validation = extractionValidation(state)\n store.set({ validation })\n if (validation || !state.file || !state.profileId) return\n const { file, filename, profileId } = state\n const result = await run('run', (active) => active.run(file, filename, profileId))\n if (!result) return\n store.set({ result })\n source.callbacks?.().completed?.(result)\n }\n\n return {\n store,\n load,\n extract,\n /** Datei wählen (`null` = Auswahl aufheben). */\n selectFile: (file: File | null) => store.set({ file, filename: file?.name ?? '', validation: null }),\n setProfile: (profileId: string | null) => store.set({ profileId, validation: null }),\n /** Vorhandenes Ergebnis anzeigen (Eigenschaft `result`). */\n showResult: (result: ExtractionRun | null) => store.set({ result }),\n }\n}\n\nexport type ExtractionController = ReturnType<typeof createExtractionController>\n","/**\n * Anzeige der Belegerkennung für Vue und React (reine Funktionen): Profile,\n * Feld- und Befundzeilen, Konfidenzen, Status. Texte nur aus `extractionMessages`.\n */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent } from '@auditcore/common'\nimport type { Locale, Translate } from '../i18n'\nimport { extractionMessages, type ExtractionMessageKey } from './messages'\nimport type { ExtractedField, ExtractionCatalogue, ExtractionProfile, ExtractionRun, ExtractionJson, ExtractionFinding } from './types'\n\nexport type ExtractionTranslate = Translate<ExtractionMessageKey>\nexport type ExtractionTone = 'success' | 'warning' | 'danger' | 'neutral'\n\nconst KNOWN = new Set<string>(Object.keys(extractionMessages.de))\n\nfunction known(key: string): ExtractionMessageKey | null {\n return KNOWN.has(key) ? (key as ExtractionMessageKey) : null\n}\n\n/** Dateigröße in MiB (bzw. KiB unter 1 MiB). */\nexport function extractionSizeText(bytes: number, locale: Locale): string {\n if (bytes < 1024 * 1024) return `${formatNumber(Math.ceil(bytes / 1024), locale)} KiB`\n return `${formatNumber(bytes / (1024 * 1024), locale, { maximumFractionDigits: 1 })} MiB`\n}\n\nexport function extractionProfileText(profile: ExtractionProfile, t: ExtractionTranslate): string {\n if (!profile.available) return t('unavailable', { label: profile.label })\n return profile.recommended ? t('recommended', { label: profile.label }) : profile.label\n}\n\nexport function extractionFieldLabel(name: string, t: ExtractionTranslate): string {\n const key = known(`field_${name}`)\n return key ? t(key) : name\n}\n\nexport function extractionRuleLabel(finding: ExtractionFinding, t: ExtractionTranslate): string {\n const key = known(`rule_${finding.rule_id}`)\n return key ? t(key) : finding.rule_name || finding.rule_id\n}\n\n/** Wert eines Feldes als Text (Zahlen sprachabhängig, Listen mit Komma). */\nexport function extractionValueText(value: ExtractionJson, locale: Locale): string {\n if (value === null || value === '') return ''\n if (typeof value === 'number') return formatNumber(value, locale, { maximumFractionDigits: 2 })\n if (typeof value === 'string' || typeof value === 'boolean') return String(value)\n return JSON.stringify(value)\n}\n\nexport function extractionConfidenceText(value: number | null, locale: Locale): string {\n return value === null ? '' : formatPercent(value, locale, 0)\n}\n\n/** Ton einer Feldkonfidenz gegen den Schwellwert des Profils. */\nexport function extractionConfidenceTone(value: number | null, threshold: number | null): ExtractionTone {\n if (value === null) return 'neutral'\n return threshold === null || value >= threshold ? 'success' : 'warning'\n}\n\nexport function extractionDecisionText(field: ExtractedField, t: ExtractionTranslate): string {\n if (!field.decision) return ''\n const key = known(`decision${field.decision}`)\n return key ? t(key) : field.decision\n}\n\nexport function extractionDecisionTone(field: ExtractedField): ExtractionTone {\n if (field.decision === 'accepted') return 'success'\n if (field.decision === 'rejected' || field.decision === 'disagreement') return 'danger'\n return field.decision ? 'warning' : 'neutral'\n}\n\nexport function extractionStatusText(result: ExtractionRun, t: ExtractionTranslate): string {\n const key = known(`status${result.run.status}`)\n return key ? t(key) : t('statusOther', { status: result.run.status })\n}\n\nexport function extractionStatusTone(result: ExtractionRun): ExtractionTone {\n const status = result.run.status\n if (status === 'ok') return 'success'\n return status === 'review_needed' ? 'warning' : 'danger'\n}\n\nexport function extractionDocumentText(result: ExtractionRun, t: ExtractionTranslate): string {\n const { filename, mime_type, page_count } = result.document\n const pages = page_count === null ? t('noValue') : t('pages', { count: page_count })\n return t('documentValue', { file: filename || t('noValue'), type: mime_type ?? t('noValue'), pages })\n}\n\nexport function extractionOcrText(result: ExtractionRun, t: ExtractionTranslate, locale: Locale): string {\n const ocr = result.ocr\n if (!ocr) return t('noValue')\n const avg = formatPercent(ocr.avg_confidence, locale, 0)\n return `${t('ocrValue', { engine: ocr.engine, avg, min: formatPercent(ocr.min_confidence, locale, 0) })} – ${t(`quality${ocr.quality}`)}`\n}\n\nconst OUTCOME_ORDER: Readonly<Record<string, number>> = { FAIL: 0, REVIEW: 1, PASS: 2 }\nconst SEVERITY_ORDER: Readonly<Record<string, number>> = { CRITICAL: 0, WARN: 1, INFO: 2 }\n\n/** Auffällige Befunde (nicht bestanden, prüfen) zuerst nach Gewicht; bestandene getrennt. */\nexport function splitExtractionFindings(findings: readonly ExtractionFinding[]): { open: ExtractionFinding[]; passed: ExtractionFinding[] } {\n const rank = (entry: ExtractionFinding): number => (OUTCOME_ORDER[entry.outcome] ?? 3) * 10 + (SEVERITY_ORDER[entry.severity] ?? 3)\n const sorted = [...findings].sort((a, b) => rank(a) - rank(b))\n return { open: sorted.filter((entry) => entry.outcome !== 'PASS'), passed: sorted.filter((entry) => entry.outcome === 'PASS') }\n}\n\nexport function extractionOutcomeTone(finding: ExtractionFinding): ExtractionTone {\n if (finding.outcome === 'PASS') return 'success'\n return finding.outcome === 'FAIL' && finding.severity === 'CRITICAL' ? 'danger' : 'warning'\n}\n\n/** Schwellwert der Feldkonfidenz des gelaufenen Profils (nur Donut). */\nexport function extractionFieldThreshold(catalogue: ExtractionCatalogue | null, result: ExtractionRun): number | null {\n return catalogue?.profiles.find((entry) => entry.id === result.profile.id)?.min_field_confidence ?? null\n}\n\n/** Dateiauswahl der Oberfläche (`accept`) aus den zulässigen Typen. */\nexport function extractionAccept(catalogue: ExtractionCatalogue | null): string {\n const types = catalogue?.accepted_types ?? []\n return [...types, ...(types.includes('application/pdf') ? ['.pdf'] : [])].join(',')\n}\n\n/** Donut-Vorschlag, wenn er nicht übernommen wurde (sonst leer). */\nexport function extractionProposalText(field: ExtractedField, t: ExtractionTranslate, locale: Locale): string {\n if (!field.decision || field.decision === 'accepted' || field.proposal === null) return ''\n const text = extractionValueText(field.proposal, locale)\n return text ? t('proposal', { value: text }) : ''\n}\n\n/** Meldung zur Prüfung vor dem Senden. */\nexport function extractionValidationText(validation: 'needFile' | 'tooLarge' | 'profile', catalogue: ExtractionCatalogue | null, t: ExtractionTranslate, locale: Locale): string {\n if (validation !== 'tooLarge') return t(`error${validation}`)\n return t('errortooLarge', { size: extractionSizeText(catalogue?.limits.max_upload_bytes ?? 0, locale) })\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte der Kanban-Komponenten; Englisch vorbereitet. */\nexport const kanbanMessages = defineMessages({\n de: {\n board: 'Kanban-Board',\n loading: 'Board wird geladen …',\n readOnly: 'Nur Lesezugriff',\n sharedBy: 'Geteilt von {name}',\n renameHint: 'Zum Umbenennen klicken',\n renameLabel: 'Board-Titel',\n progress: '{done} von {total} erledigt',\n search: 'Suchen',\n searchPlaceholder: 'Titel, Beschreibung, Tags …',\n priorityFilter: 'Priorität',\n allPriorities: 'Alle Prioritäten',\n dueFilter: 'Fälligkeit',\n allDue: 'Alle Fristen',\n resetFilter: 'Filter zurücksetzen',\n filteredHint: 'Filter aktiv – Verschieben ist nur ohne Filter möglich',\n fullscreen: 'Vollbild (F)',\n share: 'Board teilen',\n settings: 'Board-Einstellungen',\n addCard: 'Aufgabe hinzufügen',\n addCardIn: 'Aufgabe in {column} hinzufügen',\n newCardTitle: 'Neue Aufgabe',\n emptyColumn: 'Keine Karten',\n wipLimit: 'WIP-Limit {count} von {limit}',\n cardCount: '{count} Karten',\n priority_hoch: 'Hoch',\n priority_mittel: 'Mittel',\n priority_niedrig: 'Niedrig',\n due_none: 'ohne Frist',\n due_overdue: 'überfällig',\n due_due_soon: 'bald fällig',\n due_later: 'später fällig',\n dueOn: 'Fällig am {date}',\n markDone: 'Als erledigt markieren',\n markOpen: 'Wieder öffnen',\n moreTags: '+{count}',\n checklistProgress: 'Checkliste {done}/{total}',\n attachments: '{count} Anhänge',\n links: '{count} Verknüpfungen',\n ageNew: 'neu',\n ageHours: '{count} Std.',\n ageDays: '{count} T.',\n ageWeeks: '{count} Wo.',\n ageMonths: '{count} Mon.',\n cardRole: 'Karte',\n moveInstructions: 'Leertaste nimmt die Karte auf; Pfeiltasten verschieben, Leertaste legt ab, Escape bricht ab. Strg+Pfeiltasten verschieben direkt. Enter öffnet die Details.',\n grabbed: '„{title}“ aufgenommen. Spalte {column}, Position {position} von {count}.',\n movedTo: '„{title}“: Spalte {column}, Position {position} von {count}.',\n dropped: '„{title}“ abgelegt in {column}, Position {position}.',\n cancelled: 'Verschieben von „{title}“ abgebrochen.',\n moveDenied: 'Nicht erlaubt: {reason}',\n wipWarning: 'Hinweis: WIP-Limit der Spalte {column} ist erreicht.',\n saved: 'Gespeichert.',\n errorPrefix: 'Fehler: {message}',\n retry: 'Erneut laden',\n },\n en: {\n board: 'Kanban board',\n loading: 'Loading board …',\n readOnly: 'Read-only access',\n sharedBy: 'Shared by {name}',\n renameHint: 'Click to rename',\n renameLabel: 'Board title',\n progress: '{done} of {total} done',\n search: 'Search',\n searchPlaceholder: 'Title, description, tags …',\n priorityFilter: 'Priority',\n allPriorities: 'All priorities',\n dueFilter: 'Due',\n allDue: 'All deadlines',\n resetFilter: 'Reset filters',\n filteredHint: 'Filter active – moving is only possible without filters',\n fullscreen: 'Full screen (F)',\n share: 'Share board',\n settings: 'Board settings',\n addCard: 'Add task',\n addCardIn: 'Add task to {column}',\n newCardTitle: 'New task',\n emptyColumn: 'No cards',\n wipLimit: 'WIP limit {count} of {limit}',\n cardCount: '{count} cards',\n priority_hoch: 'High',\n priority_mittel: 'Medium',\n priority_niedrig: 'Low',\n due_none: 'no deadline',\n due_overdue: 'overdue',\n due_due_soon: 'due soon',\n due_later: 'due later',\n dueOn: 'Due on {date}',\n markDone: 'Mark as done',\n markOpen: 'Reopen',\n moreTags: '+{count}',\n checklistProgress: 'Checklist {done}/{total}',\n attachments: '{count} attachments',\n links: '{count} links',\n ageNew: 'new',\n ageHours: '{count} h',\n ageDays: '{count} d',\n ageWeeks: '{count} wk',\n ageMonths: '{count} mo',\n cardRole: 'Card',\n moveInstructions: 'Space picks the card up; arrow keys move it, space drops, Escape cancels. Ctrl+arrow keys move directly. Enter opens the details.',\n grabbed: 'Picked up “{title}”. Column {column}, position {position} of {count}.',\n movedTo: '“{title}”: column {column}, position {position} of {count}.',\n dropped: 'Dropped “{title}” in {column}, position {position}.',\n cancelled: 'Moving “{title}” cancelled.',\n moveDenied: 'Not allowed: {reason}',\n wipWarning: 'Note: WIP limit of column {column} reached.',\n saved: 'Saved.',\n errorPrefix: 'Error: {message}',\n retry: 'Reload',\n },\n})\n\n/** Texte von Detailansicht, Einstellungen, Teilen und Boardliste. */\nexport const kanbanDialogMessages = defineMessages({\n de: {\n detailTitle: 'Aufgabe',\n close: 'Schließen',\n title: 'Titel',\n badge: 'Kennung',\n badgePlaceholder: 'VP-01',\n column: 'Spalte',\n priority: 'Priorität',\n due: 'Fälligkeitsdatum',\n clearDue: 'Datum entfernen',\n description: 'Beschreibung',\n descriptionPlaceholder: 'Beschreibung hinzufügen …',\n tags: 'Tags',\n tagPlaceholder: 'Neuer Tag + Enter',\n removeTag: 'Tag {tag} entfernen',\n assignees: 'Zuständig',\n checklist: 'Checkliste',\n checklistSummary: '{done}/{total} erledigt',\n checklistPlaceholder: '+ Neuer Eintrag + Enter',\n removeItem: 'Eintrag „{text}“ entfernen',\n appearance: 'Karten-Design',\n customColor: 'Eigene Farbe',\n clearColor: 'Farbe entfernen',\n image: 'Hintergrundbild',\n uploadImage: 'Bild wählen (höchstens 2 MB)',\n removeImage: 'Hintergrundbild entfernen',\n imageTooLarge: 'Das Bild ist größer als 2 MB.',\n links: 'Verknüpfungen',\n openLink: '{title} öffnen',\n attachments: 'Anhänge',\n noAttachments: 'Keine Anhänge',\n deleteCard: 'Aufgabe löschen',\n confirmDelete: 'Wirklich löschen?',\n created: 'Erstellt: {date}',\n updated: 'Aktualisiert: {date}',\n settingsTitle: 'Board-Einstellungen',\n settingsDescription: 'Spalten, Farben und WIP-Limits',\n columns: 'Spalten ({count}/{max})',\n addColumn: 'Spalte hinzufügen',\n newColumn: 'Neue Spalte',\n columnLabel: 'Name der Spalte',\n columnColor: 'Farbe der Spalte {label}',\n wipLimit: 'WIP-Limit',\n doneColumn: 'Erledigt-Spalte',\n moveUp: 'Nach oben',\n moveDown: 'Nach unten',\n removeColumn: 'Spalte {label} entfernen',\n removedHint: 'Karten entfernter Spalten wandern in die erste Spalte.',\n cancel: 'Abbrechen',\n save: 'Speichern',\n shareTitle: 'Board teilen',\n shareDescription: 'Lesen = nur ansehen. Bearbeiten = Aufgaben anlegen, ändern und verschieben.',\n searchUser: 'Person suchen',\n permission: 'Berechtigung',\n permission_read: 'Lesen',\n permission_edit: 'Bearbeiten',\n addShare: 'Freigeben',\n noShares: 'Noch keine Freigaben',\n revoke: 'Freigabe für {name} entfernen',\n confirmRevoke: 'Freigabe wirklich entfernen?',\n boardsTitle: 'Kanban-Boards',\n myBoards: 'Meine Boards',\n sharedBoards: 'Mit mir geteilt',\n noBoards: 'Noch keine Boards',\n newBoard: 'Neues Board',\n boardTitle: 'Titel des Boards',\n template: 'Vorlage',\n create: 'Anlegen',\n pin: 'Anheften',\n unpin: 'Lösen',\n deleteBoard: 'Board {title} löschen',\n confirmDeleteBoard: 'Board „{title}“ wirklich löschen?',\n tasksDone: '{done}/{total} Aufgaben',\n justNow: 'gerade eben',\n minutesAgo: 'vor {count} Min.',\n hoursAgo: 'vor {count} Std.',\n daysAgo: 'vor {count} Tagen',\n weeksAgo: 'vor {count} Wochen',\n role_owner: 'Eigentümer',\n role_edit: 'Bearbeiten',\n role_read: 'Lesen',\n },\n en: {\n detailTitle: 'Task',\n close: 'Close',\n title: 'Title',\n badge: 'Identifier',\n badgePlaceholder: 'VP-01',\n column: 'Column',\n priority: 'Priority',\n due: 'Due date',\n clearDue: 'Remove date',\n description: 'Description',\n descriptionPlaceholder: 'Add a description …',\n tags: 'Tags',\n tagPlaceholder: 'New tag + Enter',\n removeTag: 'Remove tag {tag}',\n assignees: 'Assignees',\n checklist: 'Checklist',\n checklistSummary: '{done}/{total} done',\n checklistPlaceholder: '+ New item + Enter',\n removeItem: 'Remove item “{text}”',\n appearance: 'Card design',\n customColor: 'Custom colour',\n clearColor: 'Remove colour',\n image: 'Background image',\n uploadImage: 'Choose image (max. 2 MB)',\n removeImage: 'Remove background image',\n imageTooLarge: 'The image is larger than 2 MB.',\n links: 'Links',\n openLink: 'Open {title}',\n attachments: 'Attachments',\n noAttachments: 'No attachments',\n deleteCard: 'Delete task',\n confirmDelete: 'Really delete?',\n created: 'Created: {date}',\n updated: 'Updated: {date}',\n settingsTitle: 'Board settings',\n settingsDescription: 'Columns, colours and WIP limits',\n columns: 'Columns ({count}/{max})',\n addColumn: 'Add column',\n newColumn: 'New column',\n columnLabel: 'Column name',\n columnColor: 'Colour of column {label}',\n wipLimit: 'WIP limit',\n doneColumn: 'Done column',\n moveUp: 'Move up',\n moveDown: 'Move down',\n removeColumn: 'Remove column {label}',\n removedHint: 'Cards of removed columns move to the first column.',\n cancel: 'Cancel',\n save: 'Save',\n shareTitle: 'Share board',\n shareDescription: 'Read = view only. Edit = create, change and move tasks.',\n searchUser: 'Search person',\n permission: 'Permission',\n permission_read: 'Read',\n permission_edit: 'Edit',\n addShare: 'Share',\n noShares: 'No shares yet',\n revoke: 'Remove share for {name}',\n confirmRevoke: 'Really remove the share?',\n boardsTitle: 'Kanban boards',\n myBoards: 'My boards',\n sharedBoards: 'Shared with me',\n noBoards: 'No boards yet',\n newBoard: 'New board',\n boardTitle: 'Board title',\n template: 'Template',\n create: 'Create',\n pin: 'Pin',\n unpin: 'Unpin',\n deleteBoard: 'Delete board {title}',\n confirmDeleteBoard: 'Really delete board “{title}”?',\n tasksDone: '{done}/{total} tasks',\n justNow: 'just now',\n minutesAgo: '{count} min ago',\n hoursAgo: '{count} h ago',\n daysAgo: '{count} days ago',\n weeksAgo: '{count} weeks ago',\n role_owner: 'Owner',\n role_edit: 'Edit',\n role_read: 'Read',\n },\n})\n\nexport type KanbanMessageKey = keyof typeof kanbanMessages.de\nexport type KanbanDialogMessageKey = keyof typeof kanbanDialogMessages.de\n","import { defineMessages, type Translate } from '../i18n'\n\n/** Texte der Datenbankansicht als Kanban (`<flowaudit-db-kanban>`). */\nexport const dbKanbanMessages = defineMessages({\n de: {\n title: 'Kanban-Ansicht',\n groupByLabel: 'Gruppieren nach',\n searchLabel: 'Einträge durchsuchen',\n noGroupable: 'Die Tabelle hat keine Auswahl-Eigenschaft, nach der gruppiert werden kann.',\n noGroupBy: 'Bitte eine Eigenschaft zum Gruppieren wählen.',\n noMatches: 'Kein Eintrag passt zur Suche.',\n withoutValue: 'Ohne Wert',\n columnCount: '{count} Einträge',\n columnCountOne: '1 Eintrag',\n columnEmpty: 'Keine Einträge',\n untitled: 'Ohne Titel',\n yes: 'Ja',\n no: 'Nein',\n addCard: 'Eintrag hinzufügen',\n addCardIn: 'Eintrag in „{label}“ hinzufügen',\n cardLabel: '{title} – {label}',\n moveHint: 'Mit Strg und Pfeil links/rechts in die Nachbarspalte verschieben.',\n moved: '„{title}“ nach „{label}“ verschoben.',\n added: 'Eintrag in „{label}“ angelegt.',\n readOnly: 'Nur Lesezugriff',\n noPort: 'Keine Datenquelle übergeben – bitte einen Port oder eine Tabelle setzen.',\n networkError: 'Keine Verbindung zur Datenquelle ({message}).',\n busy_load: 'Wird geladen …',\n busy_move: 'Änderung wird gespeichert …',\n busy_add: 'Eintrag wird angelegt …',\n },\n en: {\n title: 'Kanban view',\n groupByLabel: 'Group by',\n searchLabel: 'Search entries',\n noGroupable: 'The table has no select property to group by.',\n noGroupBy: 'Please choose a property to group by.',\n noMatches: 'No entry matches the search.',\n withoutValue: 'No value',\n columnCount: '{count} entries',\n columnCountOne: '1 entry',\n columnEmpty: 'No entries',\n untitled: 'Untitled',\n yes: 'Yes',\n no: 'No',\n addCard: 'Add entry',\n addCardIn: 'Add entry to “{label}”',\n moveHint: 'Use Ctrl and arrow left/right to move to the neighbouring column.',\n moved: '“{title}” moved to “{label}”.',\n added: 'Entry added to “{label}”.',\n readOnly: 'Read-only',\n noPort: 'No data source given – please set a port or a table.',\n networkError: 'No connection to the data source ({message}).',\n },\n})\n\nexport type DbKanbanMessageKey = keyof typeof dbKanbanMessages.de\nexport type DbKanbanTranslate = Translate<DbKanbanMessageKey>\n","/** Anzeige der Datenbankansicht: Spalten, Karten und Feldtexte (reine Funktionen). */\nimport { groupableProperties, groupRecords, matchesRecord, type RecordValue, type RecordProperty, type RecordRow, type RecordTable } from '@auditcore/kanban-core'\nimport type { DbKanbanData } from './controller'\nimport type { DbKanbanMessageKey, DbKanbanTranslate } from './messages'\n\nexport interface DbFieldView {\n id: string\n label: string\n text: string\n}\n\nexport interface DbCardView {\n id: string\n title: string\n fields: DbFieldView[]\n /** Spalte der Karte (`\"\"` = ohne Wert). */\n column: string\n}\n\nexport interface DbColumnView {\n value: string\n label: string\n countText: string\n cards: DbCardView[]\n}\n\nexport interface DbGroupOption {\n value: string\n label: string\n}\n\nexport interface DbKanbanView {\n groupOptions: DbGroupOption[]\n columns: DbColumnView[]\n /** Hinweis statt Spalten (keine Gruppierung möglich/gewählt), sonst `null`. */\n notice: string | null\n noMatches: boolean\n busyText: string\n}\n\n/** Anzeigetext eines Zellwerts; leere Werte ergeben `\"\"`. */\nexport function cellText(value: RecordValue | undefined, t: DbKanbanTranslate, lang: string): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'boolean') return value ? t('yes') : t('no')\n if (typeof value === 'number') return new Intl.NumberFormat(lang).format(value)\n if (Array.isArray(value)) return value.join(', ')\n return String(value)\n}\n\n/** Titel-Eigenschaft: die erste Texteigenschaft (wie die erste Spalte der Tabellenansicht). */\nexport function titleProperty(table: RecordTable): RecordProperty | undefined {\n return table.properties.find((property) => property.type === 'text')\n}\n\nexport function columnLabel(value: string, t: DbKanbanTranslate): string {\n return value === '' ? t('withoutValue') : value\n}\n\nfunction cardView(table: RecordTable, row: RecordRow, groupBy: string, column: string, context: { t: DbKanbanTranslate; lang: string }): DbCardView {\n const title = titleProperty(table)\n const fields = table.properties\n .filter((property) => property.id !== groupBy && property.id !== title?.id)\n .map((property) => ({ id: property.id, label: property.name, text: cellText(row.cells[property.id], context.t, context.lang) }))\n .filter((field) => field.text !== '')\n const titleText = title ? cellText(row.cells[title.id], context.t, context.lang) : ''\n return { id: row.id, title: titleText || context.t('untitled'), fields, column }\n}\n\nfunction columns(state: DbKanbanData, t: DbKanbanTranslate, lang: string): DbColumnView[] {\n const table = state.table\n if (!table) return []\n const rows = table.rows.filter((row) => matchesRecord(row, state.query))\n return groupRecords(table, state.groupBy, rows).map((group) => ({\n value: group.value,\n label: columnLabel(group.value, t),\n countText: group.rows.length === 1 ? t('columnCountOne') : t('columnCount', { count: group.rows.length }),\n cards: group.rows.map((row) => cardView(table, row, state.groupBy, group.value, { t, lang })),\n }))\n}\n\nfunction notice(state: DbKanbanData, groupOptions: readonly DbGroupOption[], t: DbKanbanTranslate): string | null {\n if (!state.table) return null\n if (groupOptions.length === 0) return t('noGroupable')\n return groupOptions.some((option) => option.value === state.groupBy) ? null : t('noGroupBy')\n}\n\nexport function dbKanbanView(state: DbKanbanData, t: DbKanbanTranslate, lang = 'de'): DbKanbanView {\n const groupOptions = state.table ? groupableProperties(state.table).map((property) => ({ value: property.id, label: property.name })) : []\n const shown = columns(state, t, lang)\n return {\n groupOptions,\n columns: shown,\n notice: notice(state, groupOptions, t),\n noMatches: shown.length > 0 && state.query.trim() !== '' && shown.every((column) => column.cards.length === 0),\n busyText: state.busy ? t(`busy_${state.busy}` as DbKanbanMessageKey) : '',\n }\n}\n","// Zustandsautomat der Datenbankansicht als Kanban (<flowaudit-db-kanban>, Vue und React):\n// Tabelle über einen RecordPort laden, nach einer Auswahl-Eigenschaft gruppieren,\n// Karten per Ziehen oder Tastatur verschieben (setzt den Zellwert), Einträge anlegen.\n\nimport { RestError } from '@auditcore/common'\nimport {\n dropValue,\n groupableProperties,\n groupOf,\n groupRecords,\n matchesRecord,\n neighbourGroup,\n withCell,\n withRow,\n type RecordPort,\n type RecordRow,\n type RecordTable,\n} from '@auditcore/kanban-core'\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport type { DbKanbanTranslate } from './messages'\nimport { cellText, columnLabel, titleProperty } from './view'\n\nexport interface DbKanbanError {\n code: string\n message: string\n status: number\n}\n\nexport type DbKanbanBusy = 'load' | 'move' | 'add'\n\nexport interface DbKanbanData extends RequestState<DbKanbanError> {\n table: RecordTable | null\n /** Eigenschaft, nach der gruppiert wird (`select`). */\n groupBy: string\n query: string\n /** Gezogene Karte (Maus) bzw. aufgenommene Karte (Tastatur). */\n dragging: string | null\n /** Spalte unter dem Mauszeiger beim Ziehen. */\n dropTarget: string | null\n}\n\n/** Verschiebung einer Karte: der gesetzte Zellwert (`null` = ohne Wert). */\nexport interface RecordMove {\n rowId: string\n propertyId: string\n value: string | null\n}\n\nexport interface DbKanbanHooks {\n onMoved?: (move: RecordMove) => void\n onAdded?: (row: RecordRow) => void\n onGroupBy?: (propertyId: string) => void\n onError?: (error: DbKanbanError) => void\n}\n\nexport interface DbKanbanControllerOptions extends DbKanbanHooks {\n port: () => RecordPort | null\n t: () => DbKanbanTranslate\n editable?: () => boolean\n lang?: () => string\n}\n\nexport const INITIAL_DB_KANBAN: DbKanbanData = { ...IDLE, table: null, groupBy: '', query: '', dragging: null, dropTarget: null }\n\nexport function asDbKanbanError(error: unknown, t: DbKanbanTranslate): DbKanbanError {\n if (error instanceof RestError) return { code: error.code, message: error.message, status: error.status }\n const raw = error instanceof Error ? error.message : String(error)\n return { code: 'network_error', message: t('networkError', { message: raw }), status: 0 }\n}\n\n/** Vorgabe: gewünschte Eigenschaft, falls gruppierbar, sonst die erste Auswahl-Eigenschaft. */\nexport function initialGroupBy(table: RecordTable, preferred: string | undefined): string {\n const options = groupableProperties(table).map((property) => property.id)\n return preferred && options.includes(preferred) ? preferred : (options[0] ?? '')\n}\n\ntype Run = ReturnType<typeof createRunner<RecordPort, DbKanbanError, DbKanbanData>>\n\nfunction titleOf(table: RecordTable, rowId: string, t: DbKanbanTranslate, lang: string): string {\n const title = titleProperty(table)\n const row = table.rows.find((entry) => entry.id === rowId)\n return (title && row ? cellText(row.cells[title.id], t, lang) : '') || t('untitled')\n}\n\nfunction moveActions(store: Store<DbKanbanData>, run: Run, options: DbKanbanControllerOptions) {\n const editable = (): boolean => options.editable?.() ?? true\n const lang = (): string => options.lang?.() ?? 'de'\n\n /** Datensatz, wenn er in `column` verschoben werden darf und dort noch nicht liegt. */\n function movable(rowId: string, column: string): RecordRow | null {\n const { table, groupBy } = store.get()\n const row = table?.rows.find((entry) => entry.id === rowId)\n if (!table || !row || !groupBy || !editable()) return null\n return groupOf(table, row, groupBy) === column ? null : row\n }\n\n function announce(table: RecordTable, rowId: string, column: string): void {\n const t = options.t()\n store.set({ notice: t('moved', { title: titleOf(table, rowId, t, lang()), label: columnLabel(column, t) }) })\n }\n\n /** Karte in eine Spalte legen: sofort anzeigen, bei Fehler zurücknehmen. */\n async function move(rowId: string, column: string): Promise<boolean> {\n const { table, groupBy } = store.get()\n const row = movable(rowId, column)\n store.set({ dragging: null, dropTarget: null })\n if (!table || !row) return false\n const value = dropValue(column)\n const patch = (cell: RecordRow['cells'][string] | null) => (state: DbKanbanData) => ({ table: state.table ? withCell(state.table, rowId, groupBy, cell) : null })\n store.set(patch(value))\n const outcome = await run('move', async (port) => ({ row: (await port.updateCell(rowId, groupBy, value)) ?? null }))\n if (!outcome) {\n store.set(patch(row.cells[groupBy] ?? null))\n return false\n }\n const saved = outcome.row\n if (saved) store.set((state) => ({ table: state.table ? withRow(state.table, saved) : null }))\n announce(table, rowId, column)\n options.onMoved?.({ rowId, propertyId: groupBy, value })\n return true\n }\n\n /** Tastatur: in die Nachbarspalte der sichtbaren Spalten. */\n async function moveBy(rowId: string, direction: 1 | -1): Promise<boolean> {\n const { table, groupBy, query } = store.get()\n const row = table?.rows.find((entry) => entry.id === rowId)\n if (!table || !row) return false\n const groups = groupRecords(table, groupBy, table.rows.filter((entry) => matchesRecord(entry, query)))\n const target = neighbourGroup(groups, groupOf(table, row, groupBy), direction)\n return target === null ? false : move(rowId, target)\n }\n\n async function addCard(column: string): Promise<RecordRow | null> {\n const { table, groupBy } = store.get()\n if (!table || !groupBy || !editable() || !options.port()?.addRow) return null\n const cells = { [groupBy]: dropValue(column) }\n const row = await run('add', (port) => port.addRow?.(cells) ?? Promise.reject(new Error('addRow')))\n if (!row) return null\n store.set((state) => ({ table: state.table ? withRow(state.table, row) : null, notice: options.t()('added', { label: columnLabel(column, options.t()) }) }))\n options.onAdded?.(row)\n return row\n }\n\n return { move, moveBy, addCard }\n}\n\nexport function createDbKanbanController(options: DbKanbanControllerOptions) {\n const store = createStore<DbKanbanData>(INITIAL_DB_KANBAN)\n const run = createRunner(store, options.port, (error) => asDbKanbanError(error, options.t()), options.onError)\n\n async function load(preferredGroupBy?: string): Promise<void> {\n const table = await run('load', (port) => port.load())\n if (table) store.set((state) => ({ table, groupBy: initialGroupBy(table, preferredGroupBy || state.groupBy) }))\n }\n\n function setGroupBy(propertyId: string): void {\n if (propertyId === store.get().groupBy) return\n store.set({ groupBy: propertyId })\n options.onGroupBy?.(propertyId)\n }\n\n return {\n store,\n load,\n setGroupBy,\n ...moveActions(store, run, options),\n setQuery: (query: string) => store.set({ query }),\n startDrag: (rowId: string | null) => store.set({ dragging: rowId, dropTarget: null }),\n setDropTarget: (column: string | null) => store.set({ dropTarget: column }),\n dismissError: () => store.set({ error: null }),\n }\n}\n\nexport type DbKanbanController = ReturnType<typeof createDbKanbanController>\n","import { defineMessages } from '../i18n'\n\n/** Texte der Bestandsprüfung: BatchChecks (Vue) und FlowauditBatchChecks (React); sichtbare Texte nur hier. */\nexport const batchchecksMessages = defineMessages({\n de: {\n title: 'Bestandsprüfung',\n loading: 'Prüfregeln werden geladen …',\n noPort: 'Kein Port übergeben: Die Bestandsprüfung ist nicht verfügbar.',\n failed: 'Anfrage abgelehnt: {message}',\n input: 'Bestand einlesen',\n file: 'Datei (CSV oder JSON)',\n fileHelp: 'Tabelle mit einer Zeile je Beleg (CSV, Semikolon, Tabulator oder Komma) oder JSON mit einer Liste von Belegen bzw. Ergebnissen der Belegerkennung; höchstens {max} Belege.',\n tableSummary: '{file}: {rows} Zeile(n)',\n jsonSummary: '{file}: {count} Beleg(e) aus JSON',\n header: 'Erste Zeile enthält Spaltennamen',\n decimal: 'Dezimaltrennzeichen',\n decimalComma: 'Komma (1.234,56)',\n decimalDot: 'Punkt (1,234.56)',\n columns: 'Spaltenzuordnung',\n none: '– keine –',\n totalVolume: 'Ausgewiesenes Gesamtvolumen in EUR (für C-08)',\n totalVolumeHelp: 'Leer lassen, wenn kein Gesamtvolumen vorliegt; der Summenabgleich entfällt dann.',\n supplementary: 'Ergänzungsprüfungen ERG-01 und ERG-02 (Nummernlücken, USt-IdNr.-Konsistenz)',\n run: 'Bestand prüfen',\n errornoData: 'Bitte zuerst eine Datei einlesen.',\n errornoRows: 'Die Datei enthält keine Belege.',\n errortooMany: 'Höchstens {max} Belege je Prüflauf.',\n errornoColumns: 'Bitte mindestens ein Feld einer Spalte zuordnen.',\n errorjson: 'Die JSON-Datei enthält keine Liste von Belegen.',\n errortotalVolume: 'Das Gesamtvolumen ist keine lesbare Zahl.',\n notice: 'Arbeitshilfe: Die Befunde sind Hinweise zur Nachprüfung, keine Prüfungsentscheidung. Der Server speichert nichts.',\n result: 'Ergebnis',\n summary: '{documents} Beleg(e) geprüft, {findings} Befund(e), {affected} Beleg(e) betroffen.',\n escalation: 'Eskalation (C-10)',\n levelinfo: 'Hinweis',\n levelwarning: 'Warnung',\n levelblocker: 'Blockade',\n blocked: 'Automatische Berichterstellung blockiert – manuelle Freigabe erforderlich: {reason}',\n rules: 'Prüfregeln',\n colCode: 'Regel',\n colTitle: 'Prüfung',\n colChecks: 'Was geprüft wird',\n colStatus: 'Ergebnis',\n statuspassed: 'ohne Befund',\n statusfindings: '{count} Befund(e), {documents} Beleg(e)',\n statusnot_checked: 'nicht geprüft',\n statusresult: 'Ergebnis des Laufs',\n supplement: 'Ergänzung',\n findings: 'Befunde',\n findingsNone: 'Keine Befunde.',\n filterRule: 'Befunde der Regel',\n allRules: 'alle Regeln',\n colId: 'Nr.',\n colLevel: 'Stufe',\n colMessage: 'Begründung',\n colAffected: 'Betroffene Belege',\n colBasis: 'Rechtsgrundlage',\n inventoryWide: 'Gesamtbestand',\n more: '… und {count} weitere',\n metrics: 'Kennzahlen (C-12)',\n metricMandatory: 'Pflichtangaben erfüllt',\n metricFormal: 'Formal korrekte Belege',\n metricErrors: 'Belege mit fehlenden Pflichtangaben',\n metricOcrAvg: 'Mittlere OCR-Konfidenz',\n metricOcrMin: 'Kleinste OCR-Konfidenz',\n noValue: '–',\n exportJson: 'Export JSON (C-11)',\n exportCsv: 'Export CSV',\n },\n en: {\n title: 'Inventory checks',\n loading: 'Loading rules …',\n noPort: 'No port given: inventory checks are not available.',\n failed: 'Request rejected: {message}',\n input: 'Read inventory',\n file: 'File (CSV or JSON)',\n fileHelp: 'Table with one row per document (CSV, semicolon, tab or comma) or JSON with a list of documents or extraction results; at most {max} documents.',\n tableSummary: '{file}: {rows} row(s)',\n jsonSummary: '{file}: {count} document(s) from JSON',\n header: 'First row contains column names',\n decimal: 'Decimal separator',\n decimalComma: 'Comma (1.234,56)',\n decimalDot: 'Dot (1,234.56)',\n columns: 'Column mapping',\n none: '– none –',\n totalVolume: 'Reported total volume in EUR (for C-08)',\n totalVolumeHelp: 'Leave empty if there is no reported total; the sum reconciliation is skipped.',\n supplementary: 'Supplementary checks ERG-01 and ERG-02 (number gaps, VAT ID consistency)',\n run: 'Check inventory',\n errornoData: 'Please read a file first.',\n errornoRows: 'The file contains no documents.',\n errortooMany: 'At most {max} documents per run.',\n errornoColumns: 'Please map at least one field to a column.',\n errorjson: 'The JSON file contains no list of documents.',\n errortotalVolume: 'The total volume is not a readable number.',\n notice: 'Working aid: findings are hints for review, not audit decisions. The server stores nothing.',\n result: 'Result',\n summary: '{documents} document(s) checked, {findings} finding(s), {affected} document(s) affected.',\n escalation: 'Escalation (C-10)',\n levelinfo: 'Info',\n levelwarning: 'Warning',\n levelblocker: 'Blocker',\n blocked: 'Automatic reporting blocked – manual release required: {reason}',\n rules: 'Rules',\n colCode: 'Rule',\n colTitle: 'Check',\n colChecks: 'What is checked',\n colStatus: 'Result',\n statuspassed: 'no finding',\n statusfindings: '{count} finding(s), {documents} document(s)',\n statusnot_checked: 'not checked',\n statusresult: 'run result',\n supplement: 'supplement',\n findings: 'Findings',\n findingsNone: 'No findings.',\n filterRule: 'Findings of rule',\n allRules: 'all rules',\n colId: 'No.',\n colLevel: 'Level',\n colMessage: 'Reason',\n colAffected: 'Affected documents',\n colBasis: 'Legal basis',\n inventoryWide: 'whole inventory',\n more: '… and {count} more',\n metrics: 'Metrics (C-12)',\n metricMandatory: 'Mandatory fields present',\n metricFormal: 'Formally correct documents',\n metricErrors: 'Documents with missing mandatory fields',\n metricOcrAvg: 'Average OCR confidence',\n metricOcrMin: 'Lowest OCR confidence',\n noValue: '–',\n exportJson: 'Export JSON (C-11)',\n exportCsv: 'Export CSV',\n },\n})\n\nexport type BatchchecksMessageKey = keyof typeof batchchecksMessages.de\n","import type { BatchchecksAnswer, BatchchecksCatalogue, BatchchecksPort } from './types'\n\n/**\n * Port mit festen Antworten (Demo ohne Server, Tests): Katalog und Antwort\n * wie vom Dienst; der Export liefert die Antwort als JSON-Datei.\n */\nexport function createBatchchecksMemoryPort(catalogue: BatchchecksCatalogue, answer: BatchchecksAnswer): BatchchecksPort {\n return {\n catalogue: async () => catalogue,\n run: async () => answer,\n exportRun: async (_request, format) => ({\n blob: new Blob([JSON.stringify(answer, null, 2)], { type: 'application/json' }),\n filename: `befunde-bestand.${format}`,\n mediaType: 'application/json',\n }),\n }\n}\n","import { requestFile, requestJson, type RestOptions } from '@auditcore/common'\nimport type { BatchchecksPort } from './types'\n\n/** Port auf den REST-Vertrag `documents_batch_checks/1` von `auditcore_documents.web` (Starlette oder FastAPI). */\nexport function createBatchchecksRestPort(options: RestOptions): BatchchecksPort {\n return {\n catalogue: () => requestJson(options, '/catalogue'),\n run: (request) => requestJson(options, '/runs', request),\n exportRun: (request, format) => requestFile(options, '/export', { ...request, format }, `befunde-bestand.${format}`),\n }\n}\n","/**\n * Eingabe der Bestandsprüfung (Vue und React, reine Funktionen): JSON-Datei\n * oder Tabelle, Spaltenzuordnung und Anfrage für `POST /runs`.\n */\nimport { detectDecimal, parseNumber, type DecimalSeparator, type ParsedTable } from '@auditcore/common'\nimport type { BatchchecksCatalogue, BatchchecksDocument, BatchchecksField, BatchchecksRequest } from './types'\n\nexport type BatchchecksError = 'noData' | 'noRows' | 'tooMany' | 'noColumns' | 'json' | 'totalVolume'\nexport type BatchchecksValidation = { ok: true; request: BatchchecksRequest } | { ok: false; error: BatchchecksError }\n/** Feld → Spalte der Tabelle (`null` = nicht zugeordnet). */\nexport type BatchchecksMapping = Readonly<Record<string, number | null>>\n\nconst normalize = (text: string): string => text.trim().toLowerCase()\n\n/** Spalten automatisch zuordnen: Spaltenname gleich Feldkennung oder einem Spaltennamen des Katalogs; jede Spalte höchstens einmal. */\nexport function batchchecksAutoMapping(fields: readonly BatchchecksField[], header: readonly string[]): Record<string, number | null> {\n const names = header.map(normalize)\n const used = new Set<number>()\n const mapping: Record<string, number | null> = {}\n for (const field of fields) {\n const index = names.findIndex((name, column) => !used.has(column) && (name === field.name || field.aliases.includes(name)))\n mapping[field.name] = index < 0 ? null : index\n if (index >= 0) used.add(index)\n }\n return mapping\n}\n\n/** Dezimaltrennzeichen aus den Zellen aller zugeordneten Zahlenspalten. */\nexport function batchchecksDecimal(table: ParsedTable, fields: readonly BatchchecksField[], mapping: BatchchecksMapping): DecimalSeparator {\n const columns = fields.filter((field) => field.numeric).map((field) => mapping[field.name]).filter((column) => column !== null && column !== undefined)\n const cells = table.rows.flatMap((row) => columns.map((column) => row[column] ?? '')).filter((cell) => /[.,]/.test(cell))\n return detectDecimal(cells, table.delimiter)\n}\n\n/** Dateiinhalt als JSON behandeln (Endung `.json` oder beginnt mit `[`/`{`). */\nexport function batchchecksLooksLikeJson(filename: string, text: string): boolean {\n return /\\.json$/i.test(filename) || /^\\s*[[{]/.test(text.replace(/^\\ufeff/, ''))\n}\n\nconst isRecord = (value: unknown): value is BatchchecksDocument => typeof value === 'object' && value !== null && !Array.isArray(value)\n\nfunction jsonItems(data: unknown): unknown[] | null {\n if (Array.isArray(data)) return data\n if (!isRecord(data)) return null\n if (Array.isArray(data.documents)) return data.documents as unknown[]\n return Array.isArray(data.fields) ? [data] : null\n}\n\n/**\n * Belege aus einer JSON-Datei: Liste, `{\"documents\": [...]}` oder ein\n * einzelner Lauf der Belegerkennung; `null`, wenn die Datei das nicht ist.\n */\nexport function batchchecksJsonDocuments(text: string): BatchchecksDocument[] | null {\n let data: unknown\n try {\n data = JSON.parse(text.replace(/^\\ufeff/, ''))\n } catch {\n return null\n }\n const items = jsonItems(data)\n return items && items.every(isRecord) ? (items as BatchchecksDocument[]) : null\n}\n\n/** Zelle als Wert: leer → `null`, Zahlenfelder als Zahl (Prozentangaben der OCR-Konfidenz als Anteil), Unlesbares unverändert. */\nexport function batchchecksCellValue(cell: string, field: BatchchecksField, decimal: DecimalSeparator): string | number | null {\n const text = cell.trim()\n if (text === '') return null\n if (!field.numeric) return text\n const percent = /%$/.test(text)\n const parsed = parseNumber(text.replace(/%$/, ''), decimal)\n if (parsed === null || parsed === undefined) return text\n return percent && field.name === 'ocr_confidence' ? parsed / 100 : parsed\n}\n\n/** Tabellenzeilen als Belege (nur zugeordnete Felder). */\nexport function batchchecksTableDocuments(table: ParsedTable, mapping: BatchchecksMapping, fields: readonly BatchchecksField[], decimal: DecimalSeparator): BatchchecksDocument[] {\n const mapped = fields.filter((field) => mapping[field.name] !== null && mapping[field.name] !== undefined)\n return table.rows.map((row) => Object.fromEntries(mapped.map((field) => [field.name, batchchecksCellValue(row[mapping[field.name] ?? -1] ?? '', field, decimal)])))\n}\n\nexport interface BatchchecksInput {\n catalogue: BatchchecksCatalogue\n table: ParsedTable | null\n json: readonly BatchchecksDocument[] | null\n mapping: BatchchecksMapping\n decimal: DecimalSeparator\n totalVolume: string\n supplementary: boolean\n}\n\nfunction totalVolume(text: string): number | null | undefined {\n return text.trim() === '' ? null : (parseNumber(text, ',') ?? undefined)\n}\n\nfunction documentsOf(input: BatchchecksInput): readonly BatchchecksDocument[] | BatchchecksError {\n if (input.json) return input.json\n if (!input.table || input.table.header.length === 0) return 'noData'\n const mapped = Object.entries(input.mapping).some(([name, column]) => name !== 'ref' && column !== null)\n return mapped ? batchchecksTableDocuments(input.table, input.mapping, input.catalogue.fields, input.decimal) : 'noColumns'\n}\n\n/** Anfrage für `POST /runs` aus Datei, Zuordnung und Optionen. */\nexport function buildBatchchecksRequest(input: BatchchecksInput): BatchchecksValidation {\n const documents = documentsOf(input)\n if (typeof documents === 'string') return { ok: false, error: documents }\n if (documents.length === 0) return { ok: false, error: 'noRows' }\n if (documents.length > input.catalogue.limits.max_documents) return { ok: false, error: 'tooMany' }\n const total = totalVolume(input.totalVolume)\n if (total === undefined) return { ok: false, error: 'totalVolume' }\n const options = total === null ? { supplementary: input.supplementary } : { supplementary: input.supplementary, total_volume: total }\n return { ok: true, request: { documents, options } }\n}\n","// Zustandsautomat von <flowaudit-batch-checks> (Vue und React): Katalog laden,\n// Bestand als CSV (gemeinsamer TableImport-Controller) oder JSON einlesen,\n// Spalten zuordnen, Prüflauf und Export ausschließlich über den Port.\n\nimport type { DecimalSeparator, DownloadFile } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport { createTableImportController, type TableImportController } from '../tabular'\nimport { batchchecksAutoMapping, batchchecksDecimal, batchchecksJsonDocuments, batchchecksLooksLikeJson, buildBatchchecksRequest, type BatchchecksError, type BatchchecksMapping } from './model'\nimport type { BatchchecksAnswer, BatchchecksCatalogue, BatchchecksDocument, BatchchecksExportFormat, BatchchecksPort, BatchchecksRequest } from './types'\n\nexport type BatchchecksBusy = 'load' | 'run' | 'export'\n\nexport interface BatchchecksCallbacks {\n completed?: (answer: BatchchecksAnswer) => void\n failed?: (message: string) => void\n}\n\n/** Stand; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface BatchchecksData extends RequestState<string> {\n catalogue: BatchchecksCatalogue | null\n /** Belege aus einer JSON-Datei (sonst gilt die Tabelle des TableImport-Controllers). */\n json: readonly BatchchecksDocument[] | null\n jsonName: string\n mapping: BatchchecksMapping\n totalVolume: string\n supplementary: boolean\n validation: BatchchecksError | null\n request: BatchchecksRequest | null\n answer: BatchchecksAnswer | null\n /** Regel, deren Befunde angezeigt werden (`null` = alle). */\n ruleFilter: string | null\n}\n\nexport interface BatchchecksSource {\n port: () => BatchchecksPort | null | undefined\n callbacks?: () => BatchchecksCallbacks\n}\n\nexport const INITIAL_BATCHCHECKS: BatchchecksData = {\n ...IDLE, catalogue: null, json: null, jsonName: '', mapping: {}, totalVolume: '', supplementary: true,\n validation: null, request: null, answer: null, ruleFilter: null,\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\n/** Datei lesen: JSON als Belegliste, sonst Tabelle mit automatischer Spaltenzuordnung. */\nfunction fileActions(store: Store<BatchchecksData>, table: TableImportController) {\n /** Spalten neu zuordnen; das Dezimaltrennzeichen aus allen zugeordneten Zahlenspalten ableiten. */\n const remap = (): void => {\n const loaded = table.store.get().table\n const fields = store.get().catalogue?.fields ?? []\n const mapping = batchchecksAutoMapping(fields, loaded?.header ?? [])\n store.set({ mapping })\n if (loaded) table.setDecimal(batchchecksDecimal(loaded, fields, mapping))\n }\n function loadText(filename: string, text: string): void {\n store.set({ answer: null, request: null, ruleFilter: null, validation: null })\n if (batchchecksLooksLikeJson(filename, text)) {\n const json = batchchecksJsonDocuments(text)\n table.load('', '')\n store.set({ json, jsonName: filename, mapping: {}, validation: json ? null : 'json' })\n return\n }\n store.set({ json: null, jsonName: '' })\n table.load(filename, text)\n remap()\n }\n return {\n /** Dateiinhalt übernehmen (Datei bereits gelesen, z. B. Beispielbestand). */\n loadText,\n readFile: async (file: File) => loadText(file.name, await file.text()),\n setHasHeader: (hasHeader: boolean) => {\n table.setHasHeader(hasHeader)\n table.reparse()\n remap()\n },\n setDecimal: (decimal: DecimalSeparator) => table.setDecimal(decimal),\n /** Feld einer Spalte zuordnen (`null` = keine). */\n setColumn: (field: string, column: number | null) => store.set((state) => ({ mapping: { ...state.mapping, [field]: column } })),\n }\n}\n\nexport function createBatchchecksController(source: BatchchecksSource) {\n const store = createStore<BatchchecksData>({ ...INITIAL_BATCHCHECKS })\n const table = createTableImportController()\n const callbacks = (): BatchchecksCallbacks => source.callbacks?.() ?? {}\n const run = createRunner<BatchchecksPort, string, BatchchecksData>(store, () => source.port() ?? null, errorText, (message) => callbacks().failed?.(message))\n\n async function load(): Promise<void> {\n const catalogue = await run('load', (port) => port.catalogue())\n if (catalogue) store.set({ catalogue, supplementary: catalogue.defaults.supplementary })\n }\n\n async function check(): Promise<void> {\n const state = store.get()\n if (!state.catalogue) return\n const loaded = table.store.get()\n const built = buildBatchchecksRequest({\n catalogue: state.catalogue, table: state.json ? null : loaded.table, json: state.json, mapping: state.mapping,\n decimal: loaded.decimal, totalVolume: state.totalVolume, supplementary: state.supplementary,\n })\n store.set({ validation: built.ok ? null : built.error })\n if (!built.ok) return\n const answer = await run('run', (port) => port.run(built.request))\n if (!answer) return\n store.set({ answer, request: built.request, ruleFilter: null })\n callbacks().completed?.(answer)\n }\n\n /** Export des letzten Laufs; die Datei bietet die Oberfläche zum Speichern an. */\n async function exportRun(format: BatchchecksExportFormat): Promise<DownloadFile | null> {\n const request = store.get().request\n return request ? run('export', (port) => port.exportRun(request, format)) : null\n }\n\n return {\n store,\n /** Tabellenimport (gemeinsamer TableImport-Controller aus `@auditcore/ui-core`). */\n table,\n load,\n check,\n exportRun,\n ...fileActions(store, table),\n setTotalVolume: (totalVolume: string) => store.set({ totalVolume }),\n setSupplementary: (supplementary: boolean) => store.set({ supplementary }),\n setRuleFilter: (ruleFilter: string | null) => store.set({ ruleFilter }),\n /** Vorhandenes Ergebnis anzeigen (Eigenschaft `result`). */\n showAnswer: (answer: BatchchecksAnswer | null) => store.set({ answer, ruleFilter: null }),\n }\n}\n\nexport type BatchchecksController = ReturnType<typeof createBatchchecksController>\n","/**\n * Anzeige der Bestandsprüfung für Vue und React (reine Funktionen): Zuordnung,\n * Regelübersicht, Befunde mit betroffenen Belegen, Kennzahlen. Texte nur aus\n * `batchchecksMessages`.\n */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent } from '@auditcore/common'\nimport type { Locale, Translate } from '../i18n'\nimport type { TableImportData } from '../tabular'\nimport type { BatchchecksData } from './controller'\nimport type { BatchchecksMessageKey } from './messages'\nimport type { BatchchecksAnswer, BatchchecksFinding, BatchchecksLevel, BatchchecksRuleResult } from './types'\n\nexport type BatchchecksTranslate = Translate<BatchchecksMessageKey>\nexport type BatchchecksTone = 'success' | 'warning' | 'danger' | 'neutral'\n\n/** Höchstzahl aufgezählter Belege je Befund. */\nexport const BATCHCHECKS_LISTED_DOCUMENTS = 10\n\nconst LEVEL_TONES: Readonly<Record<BatchchecksLevel, BatchchecksTone>> = { info: 'neutral', warning: 'warning', blocker: 'danger' }\n\nexport function batchchecksLevelText(level: BatchchecksLevel | null, t: BatchchecksTranslate): string {\n return level ? t(`level${level}`) : ''\n}\n\nexport function batchchecksLevelTone(level: BatchchecksLevel | null): BatchchecksTone {\n return level ? LEVEL_TONES[level] : 'success'\n}\n\n/** Eine Tabelle ist geladen (und keine JSON-Datei). */\nexport function batchchecksHasTable(state: BatchchecksData, table: TableImportData): boolean {\n return state.json === null && (table.table?.header.length ?? 0) > 0\n}\n\n/** Kurzbeschreibung der eingelesenen Datei. */\nexport function batchchecksSourceText(state: BatchchecksData, table: TableImportData, t: BatchchecksTranslate): string {\n if (state.json) return t('jsonSummary', { file: state.jsonName, count: state.json.length })\n return table.table ? t('tableSummary', { file: table.filename, rows: table.table.rows.length }) : ''\n}\n\nexport interface BatchchecksColumnField {\n name: string\n label: string\n value: number | null\n}\n\n/** Auswahlfelder der Spaltenzuordnung in der Reihenfolge des Katalogs. */\nexport function batchchecksColumnFields(state: BatchchecksData): BatchchecksColumnField[] {\n return (state.catalogue?.fields ?? []).map((field) => ({ name: field.name, label: field.label, value: state.mapping[field.name] ?? null }))\n}\n\nexport interface BatchchecksRuleRow {\n code: string\n title: string\n checks: string\n basis: string\n supplement: boolean\n status: string\n tone: BatchchecksTone\n note: string\n}\n\nfunction ruleStatus(rule: BatchchecksRuleResult, t: BatchchecksTranslate): string {\n if (rule.status === 'findings') return t('statusfindings', { count: rule.findings, documents: rule.documents })\n return t(`status${rule.status}`)\n}\n\nfunction ruleTone(rule: BatchchecksRuleResult): BatchchecksTone {\n if (rule.status === 'findings') return batchchecksLevelTone(rule.level)\n return rule.status === 'passed' ? 'success' : 'neutral'\n}\n\n/** Regelübersicht: alle Regeln mit Status, auch ohne Befund und nicht geprüfte. */\nexport function batchchecksRuleRows(answer: BatchchecksAnswer, t: BatchchecksTranslate): BatchchecksRuleRow[] {\n return answer.rules.map((rule) => ({\n code: rule.code,\n title: rule.title,\n checks: rule.checks,\n basis: rule.legal_basis,\n supplement: rule.code.startsWith('ERG-'),\n status: ruleStatus(rule, t),\n tone: ruleTone(rule),\n note: rule.note ?? '',\n }))\n}\n\n/** Regeln mit Befunden für die Filterauswahl. */\nexport function batchchecksFilterOptions(answer: BatchchecksAnswer): { code: string; label: string }[] {\n return answer.rules.filter((rule) => rule.findings > 0).map((rule) => ({ code: rule.code, label: `${rule.code} ${rule.title} (${rule.findings})` }))\n}\n\n/** Betroffene Belege als Kennungen (höchstens zehn, dann „… und n weitere“); ohne Belege „Gesamtbestand“. */\nexport function batchchecksAffectedText(finding: BatchchecksFinding, answer: BatchchecksAnswer, t: BatchchecksTranslate): string {\n if (!finding.documents.length) return t('inventoryWide')\n const refs = finding.documents.slice(0, BATCHCHECKS_LISTED_DOCUMENTS).map((index) => answer.documents[index]?.ref ?? String(index + 1))\n const rest = finding.documents.length - refs.length\n return rest > 0 ? `${refs.join(', ')} ${t('more', { count: rest })}` : refs.join(', ')\n}\n\nexport interface BatchchecksFindingRow {\n id: string\n rule: string\n level: string\n tone: BatchchecksTone\n message: string\n affected: string\n basis: string\n}\n\n/** Befunde (wahlweise einer Regel) mit Begründung und betroffenen Belegen. */\nexport function batchchecksFindingRows(answer: BatchchecksAnswer, ruleFilter: string | null, t: BatchchecksTranslate): BatchchecksFindingRow[] {\n return answer.findings\n .filter((finding) => ruleFilter === null || finding.rule === ruleFilter)\n .map((finding) => ({\n id: finding.id,\n rule: finding.rule,\n level: batchchecksLevelText(finding.level, t),\n tone: batchchecksLevelTone(finding.level),\n message: finding.message,\n affected: batchchecksAffectedText(finding, answer, t),\n basis: finding.rule_reference,\n }))\n}\n\nexport function batchchecksSummaryText(answer: BatchchecksAnswer, t: BatchchecksTranslate): string {\n const { documents, findings, documents_with_findings: affected } = answer.summary\n return t('summary', { documents, findings, affected })\n}\n\nconst percent = (value: number | null, locale: Locale, t: BatchchecksTranslate): string => (value === null ? t('noValue') : formatPercent(value, locale, 1))\n\n/** Kennzahlen der Extraktionsqualität (C-12). */\nexport function batchchecksMetricRows(answer: BatchchecksAnswer, t: BatchchecksTranslate, locale: Locale): { label: string; value: string }[] {\n const m = answer.metrics\n return [\n { label: t('metricMandatory'), value: percent(m.mandatory_fields_success_rate, locale, t) },\n { label: t('metricFormal'), value: percent(m.formal_correctness_rate, locale, t) },\n { label: t('metricErrors'), value: `${formatNumber(m.documents_with_errors, locale)} (${percent(m.documents_with_errors_rate, locale, t)})` },\n { label: t('metricOcrAvg'), value: percent(m.avg_ocr_confidence, locale, t) },\n { label: t('metricOcrMin'), value: percent(m.min_ocr_confidence, locale, t) },\n ]\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte von SampleSizePlanner (Vue) und FlowauditSampleSizePlanner (React); sichtbare Texte nur hier. */\nexport const samplesizeMessages = defineMessages({\n de: {\n title: 'Stichprobenumfang nach Leitfaden',\n loading: 'Methoden werden geladen …',\n calculating: 'Umfang wird berechnet …',\n failed: 'Anfrage abgelehnt: {message}',\n method: 'Verfahren',\n choose: 'Bitte wählen',\n optional: 'keine Angabe',\n calculate: 'Umfang berechnen',\n source: 'Formel und Fundstelle',\n factor_profile: 'Faktorprofil',\n confidence_level: 'Konfidenzniveau',\n book_value: 'Buchwert der Grundgesamtheit (BV, €)',\n anticipated_error_rate: 'Erwartete Fehlerquote (%)',\n materiality_rate: 'Wesentlichkeit (%)',\n population_size: 'Anzahl der Einheiten (N)',\n error_sd: 'Standardabweichung der Fehler (σ_e, €)',\n error_rate_sd: 'Standardabweichung der Fehlerquoten (σ_r)',\n finite_population_correction: 'Endlichkeitskorrektur (Fußnote 25)',\n rule: 'Regel',\n assurance_level: 'Bewertung der Systemprüfung',\n strata: 'Schichten',\n stratumName: 'Name',\n stratumPopulation: 'Einheiten (N_h)',\n stratumBookValue: 'Buchwert (BV_h, €)',\n stratumSd: 'Standardabweichung',\n stratumExhaustive: 'Vollerhebung',\n stratumRow: '{column}, Zeile {row}',\n addStratum: 'Schicht hinzufügen',\n removeStratum: 'Schicht {row} entfernen',\n required: 'Pflichtangabe',\n invalid: 'keine gültige Zahl',\n result: 'Ergebnis',\n sampleSize: 'Stichprobenumfang',\n rawSize: 'Wert der Formel (vor dem Aufrunden)',\n interval: 'Stichprobenintervall / Schwellenwert',\n allocation: 'Aufteilung',\n allocationSize: 'Umfang',\n allocationShare: 'Anteil',\n allocationCutOff: 'Schwellenwert',\n derivation: 'Herleitung',\n stepLabel: 'Schritt',\n stepFormula: 'Formel',\n stepValue: 'Wert',\n stepSource: 'Fundstelle',\n warnings: 'Hinweise',\n yes: 'ja',\n no: 'nein',\n },\n en: {\n title: 'Sample size according to the guidance',\n loading: 'Loading methods …',\n calculating: 'Calculating sample size …',\n failed: 'Request rejected: {message}',\n method: 'Method',\n choose: 'Please choose',\n calculate: 'Calculate sample size',\n result: 'Result',\n sampleSize: 'Sample size',\n },\n})\n\nexport type SamplesizeMessageKey = keyof typeof samplesizeMessages.de\n","import { requestJson, type RestOptions } from '@auditcore/common'\nimport type { SampleSizeCatalogue, SampleSizePlan, SamplesizePort } from './types'\n\n/** Port auf den REST-Vertrag `auditcore_sampling.guidance/1` (Starlette oder FastAPI). */\nexport function createSamplesizeRestPort(options: RestOptions): SamplesizePort {\n return {\n profiles: () => requestJson(options, '/guidance/profiles'),\n plan: (request) => requestJson(options, '/guidance/size', request),\n }\n}\n\n/**\n * Port im Arbeitsspeicher (Demo, Tests): feste Antworten je Methode; ohne\n * Antwort wird die Anfrage wie vom Backend abgelehnt.\n */\nexport function createSamplesizeMemoryPort(\n catalogue: SampleSizeCatalogue,\n plans: Readonly<Record<string, SampleSizePlan>> = {},\n): SamplesizePort {\n return {\n profiles: async () => catalogue,\n plan: async (request) => {\n const plan = plans[request.method]\n if (!plan) throw new Error(`Keine Antwort für '${request.method}' hinterlegt.`)\n return plan\n },\n }\n}\n","/**\n * Formular des Planers: Eingaben als Text, Umwandlung in die Anfrage des\n * Vertrags. Anteile werden in Prozent erfasst und als Wert zwischen 0 und 1\n * gesendet; gerechnet wird nur im Backend.\n */\nimport { parseDecimal } from '@auditcore/common'\nimport type { SampleSizeCatalogue, SampleSizeMethod, SampleSizeRequest, SampleSizeStratumRequest } from './types'\n\nexport interface StratumDraft {\n name: string\n populationSize: string\n bookValue: string\n sd: string\n exhaustive: boolean\n}\n\nexport interface SampleSizeForm {\n methodId: string\n values: Readonly<Record<string, string>>\n finiteCorrection: boolean\n strata: readonly StratumDraft[]\n}\n\n/** Feldschlüssel → Fehlerart (`required` oder `invalid`). */\nexport type SampleSizeIssues = Readonly<Record<string, 'required' | 'invalid'>>\n\nexport type StratumColumn = 'name' | 'populationSize' | 'bookValue' | 'sd' | 'exhaustive'\n\nexport const EMPTY_FORM: SampleSizeForm = { methodId: '', values: {}, finiteCorrection: false, strata: [] }\nexport const EMPTY_STRATUM: StratumDraft = { name: '', populationSize: '', bookValue: '', sd: '', exhaustive: false }\n\n/** Felder mit Auswahlliste; alle übrigen skalaren Felder sind Zahlen. */\nexport const CHOICE_FIELDS: readonly string[] = ['factor_profile', 'confidence_level', 'rule', 'assurance_level']\n/** In Prozent erfasste Anteile. */\nexport const PERCENT_FIELDS: readonly string[] = ['anticipated_error_rate', 'materiality_rate']\n/** Felder, die nicht als einzelnes Eingabefeld erscheinen. */\nconst SPECIAL_FIELDS: readonly string[] = ['strata', 'book_values', 'finite_population_correction']\nconst OPTIONAL_FIELDS: readonly string[] = ['assurance_level']\nconst INTEGER_FIELDS: readonly string[] = ['population_size']\n\nexport function methodById(catalogue: SampleSizeCatalogue | null, id: string): SampleSizeMethod | null {\n return catalogue?.methods.find((entry) => entry.id === id) ?? null\n}\n\n/** Einzelne Eingabefelder der Methode in der Reihenfolge des Katalogs. */\nexport function scalarFields(method: SampleSizeMethod | null): string[] {\n return method ? method.fields.filter((field) => !SPECIAL_FIELDS.includes(field)) : []\n}\n\nexport function hasStrata(method: SampleSizeMethod | null): boolean {\n return Boolean(method?.fields.includes('strata'))\n}\n\nexport function hasFiniteCorrection(method: SampleSizeMethod | null): boolean {\n return Boolean(method?.fields.includes('finite_population_correction'))\n}\n\n/** Spalten der Schichttabelle: MUS nach Buchwert, sonst nach Anzahl mit Vollerhebung. */\nexport function strataColumns(method: SampleSizeMethod | null): StratumColumn[] {\n if (method?.id === 'guidance.mus_stratified') return ['name', 'bookValue', 'sd']\n return ['name', 'populationSize', 'sd', 'exhaustive']\n}\n\n/** Anfangswerte bei Methodenwechsel: sichtbar vorbelegt ist nur die Wesentlichkeit von 2 %. */\nexport function formFor(method: SampleSizeMethod | null, catalogue: SampleSizeCatalogue | null): SampleSizeForm {\n if (!method) return EMPTY_FORM\n const values: Record<string, string> = {}\n if (method.fields.includes('materiality_rate') && catalogue) values.materiality_rate = String(catalogue.materiality_rate * 100)\n const strata = hasStrata(method) ? [EMPTY_STRATUM, EMPTY_STRATUM] : []\n return { methodId: method.id, values, finiteCorrection: false, strata }\n}\n\ntype Parsed = { value: number } | { issue: 'required' | 'invalid' } | null\n\nfunction parseField(field: string, text: string | undefined): Parsed {\n if (text === undefined || text.trim() === '') return OPTIONAL_FIELDS.includes(field) ? null : { issue: 'required' }\n const value = parseDecimal(text, { allowNegative: false })\n if (value === null || (INTEGER_FIELDS.includes(field) && !Number.isInteger(value))) return { issue: 'invalid' }\n // Prozent → Anteil ohne Gleitkommarest (1,8 % → 0.018, nicht 0.018000000000000002).\n return { value: PERCENT_FIELDS.includes(field) ? Number((value / 100).toPrecision(15)) : value }\n}\n\nfunction scalarValue(field: string, text: string | undefined): Parsed | { text: string } {\n if (field === 'confidence_level') return text ? { value: Number(text) } : { issue: 'required' }\n if (CHOICE_FIELDS.includes(field)) {\n if (text) return { text }\n return OPTIONAL_FIELDS.includes(field) ? null : { issue: 'required' }\n }\n return parseField(field, text)\n}\n\n/** Zahl als deutsche Eingabe (Komma, keine Gruppierung), wie sie `parseDecimal` wieder liest. */\nfunction germanText(value: number): string {\n return String(value).replace('.', ',')\n}\n\nfunction optionalNumber(text: string): number | undefined {\n const value = parseDecimal(text, { allowNegative: false })\n return value === null ? undefined : value\n}\n\nfunction stratumRequest(draft: StratumDraft): SampleSizeStratumRequest {\n const size = optionalNumber(draft.populationSize)\n const book = optionalNumber(draft.bookValue)\n const sd = optionalNumber(draft.sd)\n return {\n name: draft.name.trim(),\n exhaustive: draft.exhaustive,\n ...(size === undefined ? {} : { population_size: size }),\n ...(book === undefined ? {} : { book_value: book }),\n ...(sd === undefined ? {} : { sd }),\n }\n}\n\n/** Anfrage aus dem Formular oder die Felder mit fehlenden bzw. ungültigen Angaben. */\nexport function buildRequest(form: SampleSizeForm, method: SampleSizeMethod): { request: SampleSizeRequest } | { issues: SampleSizeIssues } {\n const request: SampleSizeRequest = { method: method.id }\n const issues: Record<string, 'required' | 'invalid'> = {}\n for (const field of scalarFields(method)) {\n const parsed = scalarValue(field, form.values[field])\n if (parsed === null) continue\n if ('issue' in parsed) issues[field] = parsed.issue\n else request[field] = 'text' in parsed ? parsed.text : parsed.value\n }\n if (hasFiniteCorrection(method)) request.finite_population_correction = form.finiteCorrection\n if (hasStrata(method)) request.strata = form.strata.filter((row) => row.name.trim() !== '').map(stratumRequest)\n return Object.keys(issues).length ? { issues } : { request }\n}\n\n/** Formular aus einer Anfrage (Vorbelegung über die Eigenschaft `request`). */\nexport function formFromRequest(request: SampleSizeRequest, catalogue: SampleSizeCatalogue | null): SampleSizeForm {\n const method = methodById(catalogue, request.method)\n const base = formFor(method, catalogue)\n const values: Record<string, string> = { ...base.values }\n for (const field of scalarFields(method)) {\n const raw = request[field]\n if (field === 'confidence_level' && typeof raw === 'number') values[field] = String(raw)\n else if (typeof raw === 'number') values[field] = germanText(PERCENT_FIELDS.includes(field) ? Math.round(raw * 1e10) / 1e8 : raw)\n else if (typeof raw === 'string') values[field] = raw\n }\n const strata = Array.isArray(request.strata)\n ? (request.strata as readonly SampleSizeStratumRequest[]).map((row) => ({\n name: row.name,\n populationSize: row.population_size === undefined ? '' : germanText(row.population_size),\n bookValue: row.book_value === undefined ? '' : germanText(row.book_value),\n sd: row.sd === undefined ? '' : germanText(row.sd),\n exhaustive: row.exhaustive,\n }))\n : base.strata\n return { methodId: base.methodId, values, finiteCorrection: request.finite_population_correction === true, strata }\n}\n","// Zustandsautomat von <flowaudit-sample-size-planner> (Vue und React): lädt den\n// Katalog über den Port, verwaltet das Formular und lässt den Umfang im\n// Backend berechnen. Vue bindet ihn mit useStore, React mit useStoreState.\n\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport { buildRequest, EMPTY_FORM, EMPTY_STRATUM, formFor, formFromRequest, methodById, type SampleSizeForm, type SampleSizeIssues, type StratumDraft } from './model'\nimport type { SampleSizeCatalogue, SampleSizePlan, SampleSizeRequest, SamplesizePort } from './types'\n\nexport type SamplesizeBusy = 'load' | 'plan'\n\nexport interface SamplesizeCallbacks {\n planned?: (plan: SampleSizePlan) => void\n failed?: (message: string) => void\n}\n\n/** Stand; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface SamplesizeData extends RequestState<string> {\n catalogue: SampleSizeCatalogue | null\n form: SampleSizeForm\n issues: SampleSizeIssues\n plan: SampleSizePlan | null\n}\n\nexport interface SamplesizeSource {\n port: () => SamplesizePort | null | undefined\n request?: () => SampleSizeRequest | null | undefined\n callbacks?: () => SamplesizeCallbacks\n}\n\nexport interface SamplesizeController {\n store: Store<SamplesizeData>\n load: () => Promise<void>\n selectMethod: (id: string) => void\n setValue: (field: string, text: string) => void\n setFiniteCorrection: (on: boolean) => void\n setStratum: (index: number, change: Partial<StratumDraft>) => void\n addStratum: () => void\n removeStratum: (index: number) => void\n calculate: () => Promise<void>\n}\n\nexport const INITIAL_SAMPLESIZE: SamplesizeData = { ...IDLE, catalogue: null, form: EMPTY_FORM, issues: {}, plan: null }\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nexport function createSamplesizeController(source: SamplesizeSource): SamplesizeController {\n const store = createStore<SamplesizeData>({ ...INITIAL_SAMPLESIZE })\n const run = createRunner(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n const edit = (form: Partial<SampleSizeForm>): void => store.set({ form: { ...store.get().form, ...form }, plan: null })\n const strata = (rows: readonly StratumDraft[]): void => edit({ strata: rows })\n return {\n store,\n async load() {\n const catalogue = await run('load', (port) => port.profiles())\n if (!catalogue) return\n const request = source.request?.()\n store.set({ catalogue, form: request ? formFromRequest(request, catalogue) : EMPTY_FORM, issues: {}, plan: null })\n },\n selectMethod(id) {\n const { catalogue } = store.get()\n store.set({ form: formFor(methodById(catalogue, id), catalogue), issues: {}, plan: null })\n },\n setValue(field, text) {\n edit({ values: { ...store.get().form.values, [field]: text } })\n },\n setFiniteCorrection(on) {\n edit({ finiteCorrection: on })\n },\n setStratum(index, change) {\n strata(store.get().form.strata.map((row, position) => (position === index ? { ...row, ...change } : row)))\n },\n addStratum() {\n strata([...store.get().form.strata, EMPTY_STRATUM])\n },\n removeStratum(index) {\n strata(store.get().form.strata.filter((_, position) => position !== index))\n },\n async calculate() {\n const { catalogue, form } = store.get()\n const method = methodById(catalogue, form.methodId)\n if (!method) return\n const built = buildRequest(form, method)\n if ('issues' in built) {\n store.set({ issues: built.issues, plan: null })\n return\n }\n store.set({ issues: {} })\n const plan = await run('plan', (port) => port.plan(built.request))\n if (!plan) return\n store.set({ plan })\n source.callbacks?.().planned?.(plan)\n },\n }\n}\n","import { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent } from '@auditcore/common'\nimport type { Locale, Translate } from '../i18n'\nimport type { SamplesizeData } from './controller'\nimport type { SamplesizeMessageKey } from './messages'\nimport { CHOICE_FIELDS, methodById, PERCENT_FIELDS, scalarFields, strataColumns, type StratumColumn } from './model'\nimport type { SampleSizeCatalogue, SampleSizeMethod, SampleSizePlan } from './types'\n\ntype T = Translate<SamplesizeMessageKey>\n\nexport interface SamplesizeOption {\n value: string\n label: string\n}\n\n/** Ein Eingabefeld, wie Vue und React es darstellen. */\nexport interface SamplesizeFieldView {\n key: string\n label: string\n kind: 'choice' | 'number'\n options: SamplesizeOption[]\n value: string\n issue: string | null\n inputMode: 'decimal' | 'numeric'\n}\n\nexport interface SamplesizeCell {\n key: string\n text: string\n}\n\nexport function samplesizeMethod(state: SamplesizeData): SampleSizeMethod | null {\n return methodById(state.catalogue, state.form.methodId)\n}\n\nfunction levels(catalogue: SampleSizeCatalogue, method: SampleSizeMethod, locale: Locale): SamplesizeOption[] {\n const table = method.confidence_table === 'reliability' ? catalogue.tables.reliability : catalogue.tables.z\n return [...table].sort((a, b) => a.level - b.level).map((row) => ({ value: String(row.level), label: formatPercent(row.level, locale) }))\n}\n\nfunction options(field: string, catalogue: SampleSizeCatalogue, method: SampleSizeMethod, locale: Locale, t: T): SamplesizeOption[] {\n const choices = (rows: readonly { id: string; label: string }[]) => rows.map((row) => ({ value: row.id, label: row.label }))\n if (field === 'confidence_level') return levels(catalogue, method, locale)\n if (field === 'factor_profile') return choices(catalogue.factor_profiles)\n if (field === 'rule') return choices(catalogue.nonstatistical_rules)\n return [{ value: '', label: t('optional') }, ...choices(catalogue.assurance_levels)]\n}\n\n/** Eingabefelder der gewählten Methode mit Beschriftung, Auswahl und Fehlermeldung. */\nexport function samplesizeFields(state: SamplesizeData, t: T, locale: Locale): SamplesizeFieldView[] {\n const method = samplesizeMethod(state)\n const catalogue = state.catalogue\n if (!method || !catalogue) return []\n return scalarFields(method).map((key) => {\n const choice = CHOICE_FIELDS.includes(key)\n const issue = state.issues[key]\n return {\n key,\n label: t(key as SamplesizeMessageKey),\n kind: choice ? 'choice' : 'number',\n options: choice ? options(key, catalogue, method, locale, t) : [],\n value: state.form.values[key] ?? '',\n issue: issue ? t(issue) : null,\n inputMode: key === 'population_size' ? 'numeric' : 'decimal',\n }\n })\n}\n\nconst COLUMN_LABELS: Record<StratumColumn, SamplesizeMessageKey> = {\n name: 'stratumName',\n populationSize: 'stratumPopulation',\n bookValue: 'stratumBookValue',\n sd: 'stratumSd',\n exhaustive: 'stratumExhaustive',\n}\n\nexport function samplesizeStrataColumns(state: SamplesizeData, t: T): { key: StratumColumn; label: string }[] {\n return strataColumns(samplesizeMethod(state)).map((key) => ({ key, label: t(COLUMN_LABELS[key]) }))\n}\n\n/** Zahl für die Anzeige: ganze Beträge gruppiert, kleine Werte mit bis zu sechs Stellen. */\nexport function samplesizeNumber(value: number, locale: Locale): string {\n return formatNumber(value, locale, { maximumFractionDigits: Math.abs(value) < 10 ? 6 : 2 })\n}\n\nexport function samplesizeSummary(plan: SampleSizePlan, t: T, locale: Locale): SamplesizeCell[] {\n const rows: SamplesizeCell[] = [\n { key: t('sampleSize'), text: formatNumber(plan.sample_size, locale) },\n { key: t('rawSize'), text: samplesizeNumber(plan.raw_size, locale) },\n ]\n if (plan.interval !== null) rows.push({ key: t('interval'), text: `${samplesizeNumber(plan.interval, locale)} €` })\n return rows\n}\n\nexport function samplesizeAllocation(plan: SampleSizePlan, t: T, locale: Locale): string[][] {\n return plan.strata.map((row) => [\n row.name,\n formatNumber(row.sample_size, locale),\n row.share === null ? '–' : formatPercent(row.share, locale, 1),\n row.cut_off === null ? '–' : `${samplesizeNumber(row.cut_off, locale)} €`,\n row.exhaustive ? t('yes') : t('no'),\n ])\n}\n\nexport function samplesizeDerivation(plan: SampleSizePlan, locale: Locale): string[][] {\n return plan.derivation.map((step) => [step.label, step.formula, samplesizeNumber(step.value, locale), step.source])\n}\n\n/** Anteile werden in Prozent erfasst (Beschriftung „(%)“). */\nexport const samplesizePercentFields = PERCENT_FIELDS\n","import { defineMessages } from '../i18n'\n\n/** Texte von AttributeSampling (Vue) und FlowauditAttributeSampling (React); sichtbare Texte nur hier. */\nexport const attributesMessages = defineMessages({\n de: {\n title: 'Merkmalsstichprobe (Systemprüfung)',\n loading: 'Profile werden geladen …',\n failed: 'Anfrage abgelehnt: {message}',\n notice: 'Test von Kontrollen nach Leitfaden 7.9; Discovery- und Stop-or-go-Stichprobe (7.9.6) mit exakter Binomialgrenze – der Leitfaden nennt dafür keine Formel.',\n approach: 'Verfahren',\n approachnormal: 'Merkmalsstichprobe (Normalapproximation)',\n approachdiscovery: 'Discovery-Stichprobe',\n approachstop_or_go: 'Stop-or-go-Stichprobe',\n deviations: 'Abweichungen in der Stichprobe',\n sampleSize: 'Geprüfte Elemente (n)',\n confidence: 'Konfidenzniveau',\n factorProfile: 'Faktorprofil (z-Wert)',\n tolerable: 'Tolerierbare Abweichungsquote (%)',\n critical: 'Kritische Abweichungsquote (%)',\n choose: 'Bitte wählen',\n evaluate: 'Auswerten',\n issueRequired: 'Pflichtfeld.',\n issueInvalid: 'Keine gültige Zahl.',\n issueRange: 'Wert außerhalb des zulässigen Bereichs.',\n formIncomplete: 'Bitte die markierten Felder prüfen.',\n resultTitle: 'Ergebnis',\n rate: 'Abweichungsquote (EDR)',\n precision: 'Präzision (SE)',\n upperLimit: 'Obere Abweichungsgrenze (ULD)',\n threshold: 'Schwelle',\n derivation: 'Herleitung',\n colStep: 'Schritt',\n colFormula: 'Formel',\n colValue: 'Wert',\n colSource: 'Quelle',\n conclusionsupported: 'Kriterium erfüllt: ULD höchstens tolerierbare Quote',\n conclusionnot_supported: 'Kriterium nicht erfüllt: ULD über der tolerierbaren Quote',\n conclusioncriterion_met: 'Keine Abweichung: Quote unter der kritischen Schwelle',\n conclusiondeviation_found: 'Kritische Abweichung gefunden – Einzelfall untersuchen',\n conclusionstop: 'Stopp: Quote unter der tolerierbaren Schwelle',\n conclusiongo: 'Weiter: Stichprobe erweitern',\n fingerprint: 'Fingerabdruck der Eingabe',\n },\n en: {\n title: 'Attribute sampling (system audit)',\n loading: 'Loading profiles …',\n failed: 'Request rejected: {message}',\n evaluate: 'Evaluate',\n },\n})\n\nexport type AttributesMessageKey = keyof typeof attributesMessages.de\n","import { requestJson, type RestOptions } from '@auditcore/common'\nimport type { AttributesPort } from './types'\n\n/** Port auf `auditcore_extrapolation.web` (`GET /profiles`, `POST /attributes`). */\nexport function createAttributesRestPort(options: RestOptions): AttributesPort {\n return {\n profiles: () => requestJson(options, '/profiles'),\n evaluate: (request) => requestJson(options, '/attributes', request),\n }\n}\n","/**\n * Formular und Anzeige der Merkmalsstichprobe (reine Funktionen für Vue und\n * React): Prüfung der Eingaben, Aufbau der Anfrage, Kennzahlen und Herleitung.\n */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent, type TableColumn, type TableRow } from '@auditcore/common'\nimport type { BadgeTone } from '../base/types'\nimport type { Locale, Translate } from '../i18n'\nimport { parseInput } from '../sampling/model'\nimport type { AttributesMessageKey } from './messages'\nimport type { AttributeApproach, AttributesCatalogue, AttributesConclusion, AttributesRequest, AttributesResult } from './types'\n\nexport type AttributesTranslate = Translate<AttributesMessageKey>\n\nexport interface AttributesForm {\n approach: AttributeApproach\n deviations: string\n sampleSize: string\n confidence: number | null\n profileId: string | null\n /** Tolerierbare bzw. kritische Quote in Prozent. */\n rate: string\n}\n\nexport type AttributesIssue = 'required' | 'invalid' | 'range'\nexport type AttributesIssues = Readonly<Record<string, AttributesIssue>>\nexport type AttributesValidation = { ok: true; request: AttributesRequest } | { ok: false; issues: AttributesIssues }\n\nexport const EMPTY_ATTRIBUTES_FORM: AttributesForm = { approach: 'normal', deviations: '', sampleSize: '', confidence: null, profileId: null, rate: '' }\n\nconst APPROACHES: readonly AttributeApproach[] = ['normal', 'discovery', 'stop_or_go']\n\nexport function attributesApproachChoices(t: AttributesTranslate): { id: AttributeApproach; label: string }[] {\n return APPROACHES.map((id) => ({ id, label: t(`approach${id}`) }))\n}\n\nfunction whole(text: string, minimum: number): number | AttributesIssue {\n const value = parseInput(text)\n if (value === null) return 'required'\n if (value === undefined || !Number.isInteger(value)) return 'invalid'\n return value < minimum ? 'range' : value\n}\n\nfunction percent(text: string): number | AttributesIssue {\n const value = parseInput(text)\n if (value === null) return 'required'\n if (value === undefined) return 'invalid'\n return value <= 0 || value >= 100 ? 'range' : value / 100\n}\n\nfunction selectionIssues(form: AttributesForm, issues: Record<string, AttributesIssue>): void {\n if (form.confidence === null) issues.confidence = 'required'\n if (form.approach === 'normal' && form.profileId === null) issues.profileId = 'required'\n}\n\n/** Anfrage für `POST /attributes`; bei Befunden die Feldschlüssel mit ihrem Fehler. */\nexport function buildAttributesRequest(form: AttributesForm): AttributesValidation {\n const issues: Record<string, AttributesIssue> = {}\n const take = (key: string, value: number | AttributesIssue): number => {\n if (typeof value === 'number') return value\n issues[key] = value\n return 0\n }\n const size = take('sampleSize', whole(form.sampleSize, 1))\n const deviations = take('deviations', whole(form.deviations, 0))\n if (!issues.sampleSize && !issues.deviations && deviations > size) issues.deviations = 'range'\n const rate = take('rate', percent(form.rate))\n selectionIssues(form, issues)\n if (Object.keys(issues).length || form.confidence === null) return { ok: false, issues }\n const request: AttributesRequest = { approach: form.approach, deviations, sample_size: size, confidence_level: form.confidence, tolerable_rate: rate }\n const profile = form.approach === 'normal' && form.profileId ? { factor_profile: form.profileId } : {}\n return { ok: true, request: { ...request, ...profile } }\n}\n\nexport function attributesConfidenceChoices(catalogue: AttributesCatalogue | null): readonly number[] {\n return catalogue?.confidence_levels.z ?? []\n}\n\nexport function attributesPercent(value: number, locale: Locale): string {\n return formatPercent(value, locale, 2)\n}\n\nexport function attributesIssueKey(issue: AttributesIssue): AttributesMessageKey {\n return issue === 'required' ? 'issueRequired' : issue === 'invalid' ? 'issueInvalid' : 'issueRange'\n}\n\nconst TONES: Readonly<Record<AttributesConclusion, BadgeTone>> = {\n supported: 'success', criterion_met: 'success', stop: 'success', not_supported: 'danger', deviation_found: 'danger', go: 'warning',\n}\n\nexport function attributesConclusionTone(conclusion: AttributesConclusion): BadgeTone {\n return TONES[conclusion]\n}\n\nexport interface AttributesMetric {\n id: string\n label: string\n value: string\n}\n\nexport function attributesMetrics(result: AttributesResult, t: AttributesTranslate, locale: Locale): AttributesMetric[] {\n const outcome = result.attributes\n const metrics: AttributesMetric[] = [{ id: 'rate', label: t('rate'), value: attributesPercent(outcome.rate, locale) }]\n if (outcome.precision !== undefined) metrics.push({ id: 'precision', label: t('precision'), value: attributesPercent(outcome.precision, locale) })\n metrics.push({ id: 'upper', label: t('upperLimit'), value: attributesPercent(outcome.upper_limit, locale) })\n const threshold = outcome.tolerable_rate ?? outcome.threshold\n if (threshold !== undefined) metrics.push({ id: 'threshold', label: t('threshold'), value: attributesPercent(threshold, locale) })\n return metrics\n}\n\nexport function attributesStepColumns(t: AttributesTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'label', label: t('colStep') },\n { key: 'formula', label: t('colFormula') },\n { key: 'value', label: t('colValue'), align: 'end', format: (value) => (typeof value === 'number' ? formatNumber(value, locale, { maximumFractionDigits: 6 }) : '') },\n { key: 'source', label: t('colSource') },\n ]\n}\n\nexport function attributesStepRows(result: AttributesResult): TableRow[] {\n return result.attributes.steps.map((step, index) => ({ id: index + 1, ...step }))\n}\n\nexport const ATTRIBUTE_FIELDS: readonly { key: 'deviations' | 'sampleSize' | 'rate'; numeric: true }[] = [\n { key: 'sampleSize', numeric: true },\n { key: 'deviations', numeric: true },\n { key: 'rate', numeric: true },\n]\n\nexport function attributesFieldLabel(key: 'deviations' | 'sampleSize' | 'rate', approach: AttributeApproach, t: AttributesTranslate): string {\n if (key === 'rate') return t(approach === 'discovery' ? 'critical' : 'tolerable')\n return t(key)\n}\n\nexport function attributesFormMessage(issues: AttributesIssues, t: AttributesTranslate): string {\n return Object.keys(issues).length ? t('formIncomplete') : ''\n}\n","// Zustandsautomat von <flowaudit-attribute-sampling> (Vue und React): lädt die\n// Profile, hält das Formular, wertet über den Port aus (Leitfaden 7.9).\n\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport type { AttributesCatalogue, AttributesPort, AttributesResult } from './types'\nimport { buildAttributesRequest, EMPTY_ATTRIBUTES_FORM, type AttributesForm, type AttributesIssues } from './view'\n\nexport interface AttributesCallbacks {\n evaluated?: (result: AttributesResult) => void\n failed?: (message: string) => void\n}\n\n/** Stand; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface AttributesData extends RequestState<string> {\n catalogue: AttributesCatalogue | null\n form: AttributesForm\n issues: AttributesIssues\n result: AttributesResult | null\n}\n\nexport interface AttributesSource {\n port: () => AttributesPort | null | undefined\n callbacks?: () => AttributesCallbacks\n}\n\nexport interface AttributesController {\n store: Store<AttributesData>\n load: () => Promise<void>\n update: (patch: Partial<AttributesForm>) => void\n evaluate: () => Promise<void>\n}\n\nexport const INITIAL_ATTRIBUTES: AttributesData = { ...IDLE, catalogue: null, form: EMPTY_ATTRIBUTES_FORM, issues: {}, result: null }\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nexport function createAttributesController(source: AttributesSource): AttributesController {\n const store = createStore<AttributesData>({ ...INITIAL_ATTRIBUTES })\n const run = createRunner(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n return {\n store,\n async load() {\n const catalogue = await run('load', (port) => port.profiles())\n if (catalogue) store.set((state) => ({ catalogue, form: { ...state.form, profileId: state.form.profileId ?? catalogue.recommended_profile } }))\n },\n update(patch) {\n store.set((state) => ({ form: { ...state.form, ...patch } }))\n },\n async evaluate() {\n const checked = buildAttributesRequest(store.get().form)\n store.set({ issues: checked.ok ? {} : checked.issues })\n if (!checked.ok) return\n const result = await run('evaluate', (port) => port.evaluate(checked.request))\n if (!result) return\n store.set({ result })\n source.callbacks?.().evaluated?.(result)\n },\n }\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte der Berichtsvorlagen (Vue `ReportTemplates`, React `FlowauditReportTemplates`); sichtbare Texte nur hier. */\nexport const reporttemplatesMessages = defineMessages({\n de: {\n title: 'Berichtsvorlagen',\n loading: 'Vorlagen werden geladen …',\n loadingDetail: 'Datenvertrag wird geladen …',\n noPort: 'Kein Port übergeben: Vorlagen sind nicht verfügbar.',\n empty: 'Keine Vorlagen vorhanden.',\n failed: 'Anfrage abgelehnt: {message}',\n template: 'Vorlage',\n choose: 'Bitte wählen',\n version: 'Version {version} · {status}',\n kindstructured: 'Strukturierte Vorlage (DOCX, PDF, HTML)',\n kinddocx: 'Word-Vorlage (DOCX)',\n contract: 'Datenvertrag',\n field: 'Feld',\n fieldType: 'Typ',\n fieldRequired: 'Pflicht',\n yes: 'ja',\n no: 'nein',\n textBlocks: 'Textbausteine',\n required: 'Pflichtbaustein',\n conditional: 'bedingt',\n legalBasis: 'Rechtsgrundlage: {basis}',\n data: 'Daten',\n dataGiven: 'Daten der Anwendung',\n dataSample: 'Beispieldaten der Vorlage (keine Daten übergeben)',\n format: 'Format',\n design: 'Gestaltung',\n filename: 'Dateiname',\n preview: 'Vorschau',\n render: 'Bericht erzeugen',\n formatMissing: 'Format „{format}“ auf dem Server nicht verfügbar.',\n valid: 'Daten erfüllen den Datenvertrag.',\n invalid: 'Daten erfüllen den Datenvertrag nicht ({count} Punkte):',\n usedBlocks: 'Verwendete Textbausteine: {blocks}',\n noBlocks: 'Keine Textbausteine verwendet.',\n previewFrame: 'Vorschau des Berichts',\n previewStale: 'Eingaben geändert – Vorschau neu anfordern.',\n rendered: 'Erzeugt: {filename}',\n notice: 'Die Daten werden nur eingesetzt, nie als Vorlage ausgewertet; die Ausgabe enthält keine Makros.',\n },\n en: {\n title: 'Report templates',\n loading: 'Loading templates …',\n empty: 'No templates.',\n failed: 'Request rejected: {message}',\n template: 'Template',\n preview: 'Preview',\n render: 'Create report',\n format: 'Format',\n design: 'Design',\n filename: 'File name',\n },\n})\n\nexport type ReporttemplatesMessageKey = keyof typeof reporttemplatesMessages.de\n","import { requestFile, requestJson, type RestOptions } from '@auditcore/common'\nimport type { ReporttemplatesPort } from './types'\n\n/** Port auf die Vorlagen-Endpunkte von `reporting_ui/1` (`auditcore_reporting.web`, Starlette oder FastAPI). */\nexport function createReportTemplatesRestPort(options: RestOptions): ReporttemplatesPort {\n const path = (id: string, suffix = ''): string => `/templates/${encodeURIComponent(id)}${suffix}`\n return {\n templates: () => requestJson(options, '/templates'),\n template: (id, version) => requestJson(options, path(id, version ? `?version=${encodeURIComponent(version)}` : '')),\n preview: (id, request) => requestJson(options, path(id, '/preview'), request),\n render: (id, request) => requestFile(options, path(id, '/render'), request, `${id}.${request.format}`),\n }\n}\n","// Zustandsautomat der Berichtsvorlagen (Vue und React): Vorlagen laden, Vorlage\n// wählen, Datenvertrag anzeigen, Vorschau und Bericht über den Port (reporting_ui/1).\n\nimport type { DownloadFile } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport type {\n ReporttemplatesPort,\n TemplateCatalogue,\n TemplateData,\n TemplateDetail,\n TemplateFormat,\n TemplatePreview,\n TemplateRenderRequest,\n TemplateRequest,\n} from './types'\n\nexport interface ReporttemplatesCallbacks {\n selected?: (detail: TemplateDetail) => void\n previewed?: (result: TemplatePreview) => void\n rendered?: (file: DownloadFile) => void\n failed?: (message: string) => void\n}\n\n/** Stand; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface ReporttemplatesData extends RequestState<string> {\n catalogue: TemplateCatalogue | null\n templateId: string | null\n detail: TemplateDetail | null\n format: TemplateFormat | null\n designId: string | null\n filename: string\n preview: TemplatePreview | null\n /** Vorschau passt nicht mehr zu Vorlage, Gestaltung oder Daten. */\n stale: boolean\n renderedName: string | null\n}\n\nexport interface ReporttemplatesSource {\n port: () => ReporttemplatesPort | null | undefined\n /** Daten der Anwendung; ohne Daten gelten die Beispieldaten der Vorlage. */\n data?: () => TemplateData | null | undefined\n callbacks?: () => ReporttemplatesCallbacks\n}\n\nexport interface ReporttemplatesController {\n store: Store<ReporttemplatesData>\n load: () => Promise<void>\n select: (id: string | null) => Promise<void>\n preview: () => Promise<void>\n render: () => Promise<DownloadFile | null>\n setFormat: (format: TemplateFormat | null) => void\n setDesign: (designId: string | null) => void\n setFilename: (filename: string) => void\n /** Daten der Anwendung haben sich geändert. */\n dataChanged: () => void\n}\n\nexport const INITIAL_REPORTTEMPLATES: ReporttemplatesData = {\n ...IDLE, catalogue: null, templateId: null, detail: null, format: null, designId: null,\n filename: '', preview: null, stale: false, renderedName: null,\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\n/** Daten für Vorschau und Bericht: die der Anwendung, sonst die Beispieldaten. */\nexport function reporttemplatesData(state: ReporttemplatesData, data: TemplateData | null | undefined): TemplateData | null {\n return data ?? state.detail?.sample ?? null\n}\n\n/** Anfrage aus Zustand und Daten oder `null`, solange keine Vorlage geladen ist. */\nexport function buildTemplateRequest(state: ReporttemplatesData, data: TemplateData | null | undefined): TemplateRequest | null {\n const values = reporttemplatesData(state, data)\n if (!state.detail || !values) return null\n return { data: values, version: state.detail.version, ...(state.designId ? { design: state.designId } : {}) }\n}\n\nfunction firstFormat(detail: TemplateDetail, catalogue: TemplateCatalogue | null): TemplateFormat | null {\n return detail.formats.find((format) => catalogue?.formats[format] !== false) ?? detail.formats[0] ?? null\n}\n\nexport function createReporttemplatesController(source: ReporttemplatesSource): ReporttemplatesController {\n const store = createStore<ReporttemplatesData>({ ...INITIAL_REPORTTEMPLATES })\n const run = createRunner(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n const request = (): TemplateRequest | null => buildTemplateRequest(store.get(), source.data?.())\n const changed = (patch: Partial<ReporttemplatesData>): void =>\n store.set((state) => ({ ...patch, stale: state.preview !== null, renderedName: null }))\n\n async function select(id: string | null): Promise<void> {\n store.set({ templateId: id, detail: null, preview: null, stale: false, renderedName: null })\n if (!id) return\n const detail = await run('detail', (port) => port.template(id))\n if (!detail || store.get().templateId !== id) return\n store.set((state) => ({ detail, format: firstFormat(detail, state.catalogue) }))\n source.callbacks?.().selected?.(detail)\n }\n\n return {\n store,\n async load() {\n const catalogue = await run('load', (port) => port.templates())\n if (!catalogue) return\n store.set({ catalogue, designId: catalogue.designs[0]?.id ?? null })\n await select(catalogue.templates[0]?.id ?? null)\n },\n select,\n async preview() {\n const built = request()\n const id = store.get().templateId\n if (!built || !id) return\n const result = await run('preview', (port) => port.preview(id, built))\n if (!result) return\n store.set({ preview: result, stale: false })\n source.callbacks?.().previewed?.(result)\n },\n async render() {\n const built = request()\n const { templateId, format, filename, catalogue } = store.get()\n if (!built || !templateId || !format || catalogue?.formats[format] === false) return null\n const name = filename.trim()\n const body: TemplateRenderRequest = { ...built, format, ...(name ? { filename: name } : {}) }\n const file = await run('render', (port) => port.render(templateId, body))\n if (!file) return null\n store.set({ renderedName: file.filename })\n source.callbacks?.().rendered?.(file)\n return file\n },\n setFormat: (format) => store.set({ format, renderedName: null }),\n setDesign: (designId) => changed({ designId }),\n setFilename: (filename) => store.set({ filename, renderedName: null }),\n dataChanged: () => changed({}),\n }\n}\n","import type { ReporttemplatesData } from './controller'\nimport type { TemplateDetail, TemplateFormat, TemplateSchema } from './types'\n\n/** Zeile der Datenvertrags-Übersicht (oberste Ebene des Schemas). */\nexport interface SchemaFieldRow {\n name: string\n title: string\n type: string\n required: boolean\n}\n\nexport interface TextBlockRow {\n id: string\n title: string\n required: boolean\n conditional: boolean\n legalBasis: string\n}\n\nexport interface FormatOption {\n format: TemplateFormat\n available: boolean\n}\n\nfunction typeText(schema: TemplateSchema): string {\n const kind = Array.isArray(schema.type) ? schema.type.join(' | ') : (schema.type ?? '–')\n if (kind === 'array' && schema.items) return `Liste von ${typeText(schema.items)}`\n return schema.format ? `${kind} (${schema.format})` : String(kind)\n}\n\nexport function schemaFields(detail: TemplateDetail | null): SchemaFieldRow[] {\n const properties = detail?.schema.properties ?? {}\n const required = new Set(detail?.schema.required ?? [])\n return Object.entries(properties).map(([name, schema]) => ({\n name, title: schema.title ?? '', type: typeText(schema), required: required.has(name),\n }))\n}\n\nexport function textBlockRows(detail: TemplateDetail | null): TextBlockRow[] {\n return (detail?.text_blocks ?? []).map((block) => ({\n id: block.id,\n title: block.title || block.id,\n required: block.required,\n conditional: block.condition !== null && block.condition !== undefined,\n legalBasis: block.legal_basis,\n }))\n}\n\nexport function formatOptions(state: ReporttemplatesData): FormatOption[] {\n return (state.detail?.formats ?? []).map((format) => ({ format, available: state.catalogue?.formats[format] !== false }))\n}\n\n/** Bericht erzeugen ist möglich: Vorlage geladen, Format gewählt und auf dem Server verfügbar. */\nexport function reporttemplatesCanRender(state: ReporttemplatesData): boolean {\n const option = formatOptions(state).find((entry) => entry.format === state.format)\n return state.detail !== null && option?.available === true && state.busy === null\n}\n\n/** Hinweis „keine Vorlagen“ nur nach abgeschlossener, fehlerfreier Anfrage. */\nexport function reporttemplatesIsEmpty(state: ReporttemplatesData): boolean {\n return state.catalogue !== null && state.catalogue.templates.length === 0\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte der Runner-Konsole (Vue `RunnerConsole`, React `FlowauditRunnerConsole`); sichtbare Texte nur hier. */\nexport const runnerMessages = defineMessages({\n de: {\n title: 'Runner-Konsole',\n loading: 'Daten werden geladen …',\n working: 'Wird ausgeführt …',\n failed: 'Anfrage abgelehnt: {message}',\n tabs: 'Bereiche',\n tabStatus: 'Status',\n tabEinstellungen: 'Einstellungen',\n tabWerkzeuge: 'Werkzeuge',\n tabPrioritaeten: 'Prioritäten',\n meta: '{rechner} · Profilversion {version}',\n syncAus: 'nur lokal verwaltet',\n syncZentral: 'Abgleich mit {sync}',\n nurLesen: 'Nur lesen: Änderungen sind nur direkt auf dem Rechner möglich.',\n refresh: 'Aktualisieren',\n ueberblick: 'Überblick',\n ziel: 'Ziel',\n sollQuelle: 'Soll-Quelle',\n profilVersion: 'Profilversion',\n aenderung: 'Letzte Änderung',\n aenderungWert: '{zeit} · {quelle}',\n aenderungKeine: 'noch keine',\n image: 'Runner-Image',\n netzsperre: 'Netzsperre',\n kontingent: 'GitHub-Kontingent',\n runnerVersion: 'Runner-Version',\n runnerVersionFrist: '{version}, aktualisieren bis {frist}',\n vorhanden: 'vorhanden',\n fehlt: 'fehlt',\n aktiv: 'aktiv',\n inaktiv: 'nicht aktiv',\n unbekannt: 'unbekannt',\n klassen: 'Runner-Klassen',\n keineKlassen: 'Keine Runner-Klassen im Profil.',\n spalteKlasse: 'Klasse',\n spalteSoll: 'Soll',\n spalteMax: 'Max.',\n spalteInstanzen: 'Instanzen',\n spalteRegistriert: 'Registriert',\n spalteBelegt: 'Belegt',\n spalteWarteschlange: 'Warteschlange',\n spalteGruende: 'Begründung',\n hardware: 'Hardware',\n hinweisUnbekannt: 'Unbekannte Runner registriert: {namen}',\n hinweisImage: 'Das Runner-Image fehlt.',\n hinweisNetzsperre: 'Die Netzsperre ist nicht aktiv.',\n abschnittAllgemein: 'Allgemein',\n abschnittRegelung: 'Regelung',\n abschnittThermik: 'Thermikquelle',\n abschnittNetz: 'Netz',\n abschnittKlasse: 'Klasse {name}',\n abschnittKarte: 'Grafikkarte {index}: {name}',\n fSollQuelle: 'Soll-Quelle',\n fSollDatei: 'Soll-Datei',\n fBackend: 'Backend',\n fImage: 'Runner-Image',\n fReserveCpus: 'Reserve für den Rechner: CPUs',\n fReserveSpeicher: 'Reserve für den Rechner: Speicher (GB)',\n fVorrang: 'Vorrang interaktiver Nutzung',\n fLeerlauf: 'Leerlauf bis zur vollen Leistung (Minuten)',\n fAnteil: 'Anteil der Runner bei Nutzung (0–1)',\n fSwap: 'Swap-Sperre ab (GB, 0 = aus)',\n fRam: 'Mindestens frei: RAM (GB)',\n fLast: 'Höchstlast je Kern',\n fTemperatur: 'Höchsttemperatur (°C)',\n fVon: 'Volle Leistung ab (Uhr, 0 = aus)',\n fBis: 'Volle Leistung bis (Uhr)',\n fHaltezeit: 'Haltezeit gegen Flattern (s)',\n fThermikAktiv: 'Thermikquelle nutzen',\n fThermikUrl: 'Adresse der Thermikquelle (URL)',\n fNetzAktiv: 'Eigenes Docker-Netz',\n fSperre: 'Netzsperre verlangen',\n kArt: 'Art',\n oCpu: 'CPU',\n oGpu: 'GPU (Grafikkarte)',\n klasseName: 'Name der Klasse',\n umbenennen: 'Umbenennen',\n neueKlasse: 'Neue Klasse',\n hinzufuegen: 'Klasse hinzufügen',\n klasseNameUngueltig: 'Klassenname: a–z, 0–9, Bindestrich, höchstens 31 Zeichen',\n klasseNameVergeben: 'Dieser Name ist bereits vergeben.',\n anmeldung: 'Anmeldung bei GitHub',\n kAktiv: 'Aktiv',\n kMin: 'Mindestanzahl',\n kMax: 'Höchstanzahl',\n kLeise: 'Höchstanzahl im Leisemodus (−1 = wie Höchstanzahl)',\n kCpus: 'CPUs je Runner',\n kSpeicher: 'Speicher je Runner (GB)',\n kVram: 'Grafikspeicher je Runner (MB)',\n kLabels: 'Labels (durch Komma getrennt)',\n gErlaubt: 'Für Runner erlaubt',\n gKlasse: 'Klasse',\n oStatisch: 'statisch (Profil)',\n oLokal: 'lokal (eingebauter Regler)',\n oDatei: 'Datei (externer Regler)',\n pruefen: 'Prüfen',\n anwenden: 'Anwenden',\n verwerfen: 'Verwerfen',\n ungespeichert: 'Nicht angewendete Änderungen',\n gueltig: 'gültig',\n ungueltig: 'fehlerhaft',\n probleme: 'Fehler im Profil',\n vorschau: 'Vorschau der Änderungen',\n keineAenderung: 'Keine Dateiänderungen.',\n schritte: 'Schritte beim Anwenden',\n rootBefehl: 'Einmal als root ausführen (zum Kopieren markieren):',\n angewendet: 'Profil angewendet (Version {version}).',\n nichtAngewendet: 'Nicht angewendet: {meldung}',\n konflikt: 'Konflikt, nichts angewendet. {meldung}',\n konfliktFeld: 'Feld',\n konfliktEntwurf: 'Ihr Entwurf',\n konfliktGespeichert: 'Gespeichert ({quelle})',\n gespeichertUebernehmen: 'Gespeicherten Stand übernehmen',\n entwurfAnwenden: 'Entwurf trotzdem anwenden',\n werkzeugProfil: 'Prüfprofil {name}',\n spalteWerkzeug: 'Werkzeug',\n spalteBereich: 'Bereich',\n spalteImage: 'Im Image',\n spalteAktiv: 'Aktiv',\n spalteZeitlimit: 'Zeitlimit (s)',\n spaltePrioritaet: 'Priorität',\n nichtInstalliert: 'nicht installiert',\n speichern: 'Speichern',\n gespeichert: 'Werkzeug-Einstellungen gespeichert.',\n keineWerkzeuge: 'Keine Werkzeuge im Katalog.',\n prioritaetenHinweis: 'Rang 1 hat Vorrang. Bei knapper Kapazität weichen verdrängbare Einträge von unten nach oben.',\n keinePrioritaeten: 'Keine Prioritäten festgelegt.',\n rang: 'Rang {rang}',\n hoch: 'Nach oben: {name}',\n runter: 'Nach unten: {name}',\n verdraengbar: 'Verdrängbar',\n mindestens: 'Mindestens',\n weichtZuerst: 'Bei Platzmangel weicht zuerst: {name}',\n keinerVerdraengbar: 'Kein Eintrag ist verdrängbar.',\n },\n en: {\n title: 'Runner console',\n loading: 'Loading …',\n working: 'Working …',\n failed: 'Request rejected: {message}',\n tabs: 'Sections',\n tabStatus: 'Status',\n tabEinstellungen: 'Settings',\n tabWerkzeuge: 'Tools',\n tabPrioritaeten: 'Priorities',\n meta: '{rechner} · profile version {version}',\n syncAus: 'managed locally only',\n syncZentral: 'synchronised with {sync}',\n nurLesen: 'Read only: changes are only possible on the machine itself.',\n refresh: 'Refresh',\n ueberblick: 'Overview',\n ziel: 'Target',\n sollQuelle: 'Target source',\n profilVersion: 'Profile version',\n aenderung: 'Last change',\n aenderungWert: '{zeit} · {quelle}',\n aenderungKeine: 'none yet',\n image: 'Runner image',\n netzsperre: 'Network lock',\n kontingent: 'GitHub quota',\n runnerVersion: 'Runner version',\n runnerVersionFrist: '{version}, update by {frist}',\n vorhanden: 'present',\n fehlt: 'missing',\n aktiv: 'active',\n inaktiv: 'not active',\n unbekannt: 'unknown',\n klassen: 'Runner classes',\n keineKlassen: 'No runner classes in the profile.',\n spalteKlasse: 'Class',\n spalteSoll: 'Target',\n spalteMax: 'Max.',\n spalteInstanzen: 'Instances',\n spalteRegistriert: 'Registered',\n spalteBelegt: 'Busy',\n spalteWarteschlange: 'Queue',\n spalteGruende: 'Reason',\n hardware: 'Hardware',\n hinweisUnbekannt: 'Unknown runners registered: {namen}',\n hinweisImage: 'The runner image is missing.',\n hinweisNetzsperre: 'The network lock is not active.',\n abschnittAllgemein: 'General',\n abschnittRegelung: 'Scaling',\n abschnittThermik: 'Thermal source',\n abschnittNetz: 'Network',\n abschnittKlasse: 'Class {name}',\n abschnittKarte: 'Graphics card {index}: {name}',\n fSollQuelle: 'Target source',\n fSollDatei: 'Target file',\n fBackend: 'Backend',\n fImage: 'Runner image',\n fReserveCpus: 'Reserve for the machine: CPUs',\n fReserveSpeicher: 'Reserve for the machine: memory (GB)',\n fVorrang: 'Priority for interactive use',\n fLeerlauf: 'Idle time until full power (minutes)',\n fAnteil: 'Share of runners while in use (0–1)',\n fSwap: 'Swap lock from (GB, 0 = off)',\n fRam: 'Minimum free RAM (GB)',\n fLast: 'Maximum load per core',\n fTemperatur: 'Maximum temperature (°C)',\n fVon: 'Full power from (hour, 0 = off)',\n fBis: 'Full power until (hour)',\n fHaltezeit: 'Hold time against flapping (s)',\n fThermikAktiv: 'Use thermal source',\n fThermikUrl: 'Thermal source address (URL)',\n fNetzAktiv: 'Dedicated Docker network',\n fSperre: 'Require network lock',\n kArt: 'Kind',\n oCpu: 'CPU',\n oGpu: 'GPU (graphics card)',\n klasseName: 'Class name',\n umbenennen: 'Rename',\n neueKlasse: 'New class',\n hinzufuegen: 'Add class',\n klasseNameUngueltig: 'Class name: a–z, 0–9, hyphen, at most 31 characters',\n klasseNameVergeben: 'This name is already taken.',\n anmeldung: 'GitHub sign-in',\n kAktiv: 'Active',\n kMin: 'Minimum',\n kMax: 'Maximum',\n kLeise: 'Maximum in quiet mode (−1 = same as maximum)',\n kCpus: 'CPUs per runner',\n kSpeicher: 'Memory per runner (GB)',\n kVram: 'GPU memory per runner (MB)',\n kLabels: 'Labels (comma separated)',\n gErlaubt: 'Allowed for runners',\n gKlasse: 'Class',\n oStatisch: 'static (profile)',\n oLokal: 'local (built-in regulator)',\n oDatei: 'file (external regulator)',\n pruefen: 'Check',\n anwenden: 'Apply',\n verwerfen: 'Discard',\n ungespeichert: 'Changes not yet applied',\n gueltig: 'valid',\n ungueltig: 'invalid',\n probleme: 'Errors in the profile',\n vorschau: 'Preview of changes',\n keineAenderung: 'No file changes.',\n schritte: 'Steps when applying',\n rootBefehl: 'Run once as root (select to copy):',\n angewendet: 'Profile applied (version {version}).',\n nichtAngewendet: 'Not applied: {meldung}',\n konflikt: 'Conflict, nothing applied. {meldung}',\n konfliktFeld: 'Field',\n konfliktEntwurf: 'Your draft',\n konfliktGespeichert: 'Saved ({quelle})',\n gespeichertUebernehmen: 'Take saved version',\n entwurfAnwenden: 'Apply draft anyway',\n werkzeugProfil: 'Check profile {name}',\n spalteWerkzeug: 'Tool',\n spalteBereich: 'Area',\n spalteImage: 'In image',\n spalteAktiv: 'Active',\n spalteZeitlimit: 'Time limit (s)',\n spaltePrioritaet: 'Priority',\n nichtInstalliert: 'not installed',\n speichern: 'Save',\n gespeichert: 'Tool settings saved.',\n keineWerkzeuge: 'No tools in the catalogue.',\n prioritaetenHinweis: 'Rank 1 wins. When capacity is short, preemptible entries give way from the bottom up.',\n keinePrioritaeten: 'No priorities defined.',\n rang: 'Rank {rang}',\n hoch: 'Move up: {name}',\n runter: 'Move down: {name}',\n verdraengbar: 'Preemptible',\n mindestens: 'Minimum',\n weichtZuerst: 'Gives way first: {name}',\n keinerVerdraengbar: 'No entry is preemptible.',\n },\n})\n\nexport type RunnerMessageKey = keyof typeof runnerMessages.de\n","import { RestError, requestJson, type FetchLike, type RestOptions } from '@auditcore/common'\nimport type { RunnerPort, RunnerProfil, RunnerProfilStand, RunnerPruefung, RunnerStatus, RunnerWerkzeuge, RunnerWerkzeugProfile } from './types'\n\n/** Kopfzeile, ohne die `auditcore-runner ui` schreibende Anfragen ablehnt. */\nexport const RUNNER_SCHREIB_KOPF = { 'X-Auditcore-Runner': '1' } as const\nexport const RUNNER_WERKZEUG_SCHEMA = 'auditcore-runner/werkzeuge/1'\n\n/** Port im Arbeitsspeicher (Demo, Tests); Konflikt, wenn `erwarteteVersion` nicht zur gespeicherten passt. */\nexport function createRunnerMemoryPort(start: {\n status: RunnerStatus\n profil: RunnerProfilStand\n werkzeuge?: RunnerWerkzeuge\n pruefen?: (profil: RunnerProfil) => RunnerPruefung\n}): RunnerPort {\n let stand = start.profil\n let werkzeuge = start.werkzeuge ?? { werkzeuge: [], profile: {} }\n const pruefen = start.pruefen ?? (() => ({ gueltig: true, probleme: [], aktive_version: versionOf(stand.profil), aenderungen: [], schritte: [], netzsperre_befehl: null }))\n return {\n status: async () => ({ ...start.status, profil_version: versionOf(stand.profil) }),\n profil: async () => stand,\n pruefen: async (profil) => pruefen(profil),\n async anwenden(profil, erwarteteVersion) {\n const aktuell = versionOf(stand.profil)\n const ergebnis = pruefen(profil)\n if (erwarteteVersion !== null && erwarteteVersion !== aktuell) {\n return { ...ergebnis, angewendet: false, konflikt: true, meldung: `Version ${aktuell}, erwartet ${erwarteteVersion}` }\n }\n if (!ergebnis.gueltig) return { ...ergebnis, angewendet: false, konflikt: false }\n stand = { ...stand, profil: { ...profil, version: aktuell + 1 } }\n return { ...ergebnis, angewendet: true, konflikt: false, version: aktuell + 1 }\n },\n werkzeuge: async () => werkzeuge,\n async werkzeugeSpeichern(profile) {\n werkzeuge = { ...werkzeuge, profile }\n },\n }\n}\n\n/** Die Runner-API meldet Fehler als `{\"fehler\": \"…\"}`; umgesetzt in die auditcore-Hülle `{error: {message}}`. */\nfunction fehlerHuelle(basis: FetchLike | undefined): FetchLike {\n const fetchImpl: FetchLike = basis ?? ((input, init) => globalThis.fetch(input, init))\n return async (input, init) => {\n const response = await fetchImpl(input, init)\n if (response.ok) return response\n const data: unknown = await response.clone().json().catch(() => null)\n const fehler = typeof data === 'object' && data !== null ? (data as { fehler?: unknown }).fehler : undefined\n if (typeof fehler !== 'string') return response\n return new Response(JSON.stringify({ error: { code: `http_${response.status}`, message: fehler } }), {\n status: response.status,\n headers: { 'Content-Type': 'application/json' },\n })\n }\n}\n\nfunction versionOf(profil: RunnerProfil): number {\n return typeof profil.version === 'number' ? profil.version : 0\n}\n\n/**\n * Port auf die JSON-API von `auditcore-runner ui` (Basis z. B. `/api`).\n * Schreibende Aufrufe senden `X-Auditcore-Runner: 1`; HTTP 409 beim Anwenden\n * wird zum Ergebnis mit `konflikt: true`.\n */\nexport function createRunnerRestPort(rest: RestOptions): RunnerPort {\n const options: RestOptions = { ...rest, fetch: fehlerHuelle(rest.fetch) }\n const schreiben: RestOptions = { ...options, headers: { ...options.headers, ...RUNNER_SCHREIB_KOPF } }\n return {\n status: () => requestJson<RunnerStatus>(options, '/status'),\n profil: () => requestJson<RunnerProfilStand>(options, '/profil'),\n pruefen: (profil) => requestJson<RunnerPruefung>(schreiben, '/profil/pruefen', { profil }),\n async anwenden(profil, erwarteteVersion) {\n try {\n return await requestJson<RunnerPruefung>(schreiben, '/profil/anwenden', { profil, erwartete_version: erwarteteVersion })\n } catch (error) {\n if (error instanceof RestError && error.status === 409) {\n return { gueltig: true, probleme: [], aktive_version: null, aenderungen: [], schritte: [], netzsperre_befehl: null, angewendet: false, konflikt: true, meldung: error.message }\n }\n throw error\n }\n },\n werkzeuge: () => requestJson<RunnerWerkzeuge>(options, '/werkzeuge'),\n async werkzeugeSpeichern(profile: RunnerWerkzeugProfile) {\n await requestJson<unknown>(schreiben, '/werkzeuge', { schema: RUNNER_WERKZEUG_SCHEMA, profile })\n },\n }\n}\n","// Reine Hilfen für den Profil-Entwurf: Werte lesen und unveränderlich setzen,\n// Unterschiede zweier Stände, Prioritäten verschieben. Keine Fachregeln –\n// gültig ist, was `POST /api/profil/pruefen` sagt.\n\nimport type { RunnerProfil } from './types'\n\nexport type RunnerPfad = readonly (string | number)[]\n\nexport interface RunnerPrioritaet {\n klasse: string\n rang: number\n verdraengbar: boolean\n min: number\n}\n\nexport interface RunnerUnterschied {\n pfad: string\n entwurf: string\n gespeichert: string\n}\n\n/** Felder, die das Backend beim Anwenden selbst setzt; für Unterschiede und „geändert“ ohne Belang. */\nconst VERWALTET = new Set(['version', 'aenderung'])\n\nfunction isObject(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport function runnerWert(profil: RunnerProfil | null | undefined, pfad: RunnerPfad): unknown {\n let current: unknown = profil\n for (const teil of pfad) {\n if (Array.isArray(current) && typeof teil === 'number') current = current[teil]\n else if (isObject(current) && typeof teil === 'string') current = current[teil]\n else return undefined\n }\n return current\n}\n\nfunction setzeIn(container: unknown, pfad: RunnerPfad, wert: unknown): unknown {\n if (pfad.length === 0) return wert\n const [kopf, ...rest] = pfad\n if (typeof kopf === 'number') {\n const liste = Array.isArray(container) ? [...(container as unknown[])] : []\n liste[kopf] = setzeIn(liste[kopf], rest, wert)\n return liste\n }\n const objekt = isObject(container) ? { ...container } : {}\n objekt[kopf as string] = setzeIn(objekt[kopf as string], rest, wert)\n return objekt\n}\n\n/** Neuer Entwurf mit geändertem Wert; der alte bleibt unverändert. */\nexport function runnerSetze(profil: RunnerProfil, pfad: RunnerPfad, wert: unknown): RunnerProfil {\n return setzeIn(profil, pfad, wert) as RunnerProfil\n}\n\nfunction flach(wert: unknown, prefix: string, ziel: Map<string, string>): void {\n if (isObject(wert)) {\n for (const [key, inner] of Object.entries(wert)) {\n if (!prefix && VERWALTET.has(key)) continue\n flach(inner, prefix ? `${prefix}.${key}` : key, ziel)\n }\n return\n }\n ziel.set(prefix, JSON.stringify(wert ?? null))\n}\n\n/** Feldweise Unterschiede (Pfad in Punktschreibweise), sortiert; ohne `version` und `aenderung`. */\nexport function runnerUnterschiede(entwurf: RunnerProfil, gespeichert: RunnerProfil): RunnerUnterschied[] {\n const a = new Map<string, string>()\n const b = new Map<string, string>()\n flach(entwurf, '', a)\n flach(gespeichert, '', b)\n const pfade = [...new Set([...a.keys(), ...b.keys()])].sort()\n return pfade\n .filter((pfad) => a.get(pfad) !== b.get(pfad))\n .map((pfad) => ({ pfad, entwurf: a.get(pfad) ?? '–', gespeichert: b.get(pfad) ?? '–' }))\n}\n\nexport function runnerGeaendert(entwurf: RunnerProfil | null, gespeichert: RunnerProfil | null): boolean {\n if (!entwurf || !gespeichert) return false\n return runnerUnterschiede(entwurf, gespeichert).length > 0\n}\n\nexport function runnerVersion(profil: RunnerProfil | null | undefined): number {\n const version = runnerWert(profil, ['version'])\n return typeof version === 'number' ? version : 0\n}\n\n/** Prioritäten des Entwurfs nach Rang (1 = höchster), fehlerhafte Einträge übersprungen. */\nexport function runnerPrioritaeten(profil: RunnerProfil | null | undefined): RunnerPrioritaet[] {\n const liste = runnerWert(profil, ['prioritaeten'])\n if (!Array.isArray(liste)) return []\n return liste\n .filter(isObject)\n .map((eintrag) => ({\n klasse: String(eintrag.klasse ?? ''),\n rang: typeof eintrag.rang === 'number' ? eintrag.rang : 0,\n verdraengbar: eintrag.verdraengbar !== false,\n min: typeof eintrag.min === 'number' ? eintrag.min : 0,\n }))\n .sort((x, y) => x.rang - y.rang || x.klasse.localeCompare(y.klasse))\n}\n\n/** Eintrag an Position `index` um eine Stelle verschieben; Ränge werden fortlaufend neu vergeben. */\nexport function runnerVerschiebe(profil: RunnerProfil, index: number, richtung: -1 | 1): RunnerProfil {\n const liste = runnerPrioritaeten(profil)\n const ziel = index + richtung\n if (index < 0 || ziel < 0 || ziel >= liste.length) return profil\n const neu = [...liste]\n ;[neu[index], neu[ziel]] = [neu[ziel] as RunnerPrioritaet, neu[index] as RunnerPrioritaet]\n return runnerSetze(profil, ['prioritaeten'], neu.map((eintrag, i) => ({ ...eintrag, rang: i + 1 })))\n}\n\n/** Eigenschaft eines Prioritätseintrags (Position in der sortierten Liste) ändern. */\nexport function runnerPrioritaetSetze(profil: RunnerProfil, index: number, aenderung: Partial<Pick<RunnerPrioritaet, 'verdraengbar' | 'min'>>): RunnerProfil {\n const liste = runnerPrioritaeten(profil)\n if (!liste[index]) return profil\n return runnerSetze(profil, ['prioritaeten'], liste.map((eintrag, i) => (i === index ? { ...eintrag, ...aenderung } : eintrag)))\n}\n\n/** Wer bei knapper Kapazität zuerst weicht: der verdrängbare Eintrag mit dem niedrigsten Rang (größte Zahl). */\nexport function runnerWeichtZuerst(liste: readonly RunnerPrioritaet[]): RunnerPrioritaet | null {\n return [...liste].reverse().find((eintrag) => eintrag.verdraengbar) ?? null\n}\n\n/** Klassenname wie im Backend (`auditcore_runner.profile.CLASS_NAME`). */\nexport const RUNNER_KLASSEN_NAME = /^[a-z0-9][a-z0-9-]{0,30}$/\nexport type RunnerKlassenArt = 'cpu' | 'gpu'\n\nexport function runnerKlassen(profil: RunnerProfil | null | undefined): string[] {\n const klassen = runnerWert(profil, ['klassen'])\n return isObject(klassen) ? Object.keys(klassen).sort() : []\n}\n\nexport function runnerKlassenArt(profil: RunnerProfil | null | undefined, name: string): RunnerKlassenArt {\n return runnerWert(profil, ['klassen', name, 'art']) === 'gpu' ? 'gpu' : 'cpu'\n}\n\n/** Fehlerart eines Klassennamens; `null` = gültig. `alt` ist der bisherige Name beim Umbenennen. */\nexport function runnerKlassenNameFehler(profil: RunnerProfil | null | undefined, name: string, alt?: string): 'ungueltig' | 'vergeben' | null {\n if (!RUNNER_KLASSEN_NAME.test(name)) return 'ungueltig'\n if (name !== alt && runnerKlassen(profil).includes(name)) return 'vergeben'\n return null\n}\n\n/** Neue Klasse der Art `cpu` mit neutralen Werten (höchstens eine Instanz). */\nexport function runnerKlasseHinzu(profil: RunnerProfil, name: string): RunnerProfil {\n if (runnerKlassenNameFehler(profil, name)) return profil\n return runnerSetze(profil, ['klassen', name], {\n art: 'cpu', aktiv: true, cpus: 2, speicher_gb: 4, min_instanzen: 0, max_instanzen: 1, leise_max: -1, vram_mb: 0,\n labels: ['self-hosted', 'linux', 'x64', name],\n })\n}\n\n/** Klasse umbenennen; Verweise in Karten, Prioritäten und das gleichnamige Label ziehen mit. */\nexport function runnerKlasseUmbenennen(profil: RunnerProfil, alt: string, neu: string): RunnerProfil {\n const klassen = runnerWert(profil, ['klassen'])\n if (alt === neu || !isObject(klassen) || !(alt in klassen) || runnerKlassenNameFehler(profil, neu, alt)) return profil\n const eintrag = klassen[alt]\n const labels = runnerWert(eintrag as RunnerProfil, ['labels'])\n const umbenannt = isObject(eintrag) && Array.isArray(labels) ? { ...eintrag, labels: labels.map((l) => (l === alt ? neu : l)) } : eintrag\n const neueKlassen = Object.fromEntries(Object.entries(klassen).map(([k, v]) => (k === alt ? [neu, umbenannt] : [k, v])))\n let ergebnis = runnerSetze(profil, ['klassen'], neueKlassen)\n for (const liste of ['gpus', 'prioritaeten'] as const) {\n const eintraege = runnerWert(ergebnis, [liste])\n if (Array.isArray(eintraege)) {\n ergebnis = runnerSetze(ergebnis, [liste], eintraege.map((e) => (isObject(e) && e.klasse === alt ? { ...e, klasse: neu } : e)))\n }\n }\n return ergebnis\n}\n","// Umsetzung von Formulareingaben in Profilwerte (gemeinsam für Controller und Ansicht).\n\nexport type RunnerFeldArt = 'zahl' | 'schalter' | 'auswahl' | 'text' | 'liste'\n\n/** Eingabe eines Feldes in den Profilwert umsetzen (Zahl, Liste, Schalter, Text). */\nexport function runnerEingabe(feldArt: RunnerFeldArt, roh: string | boolean): unknown {\n if (feldArt === 'schalter') return Boolean(roh)\n const text = String(roh)\n if (feldArt === 'zahl') {\n const zahlWert = Number(text.replace(',', '.'))\n return text.trim() !== '' && Number.isFinite(zahlWert) ? zahlWert : text\n }\n if (feldArt === 'liste') return text.split(',').map((teil) => teil.trim()).filter(Boolean)\n return text\n}\n\n/** Schlüssel des Rohtexts einer Werkzeug-Zahleneingabe. */\nexport function runnerWerkzeugFeldId(profil: string, werkzeug: string, feld: string): string {\n return `werkzeug:${profil}:${werkzeug}:${feld}`\n}\n","// Aktionen der Runner-Konsole, nach Bereich getrennt: Profil-Entwurf (Prüfen,\n// Anwenden, Konflikt, Prioritäten) und Werkzeug-Einstellungen.\n\nimport type { Store } from '../store'\nimport type { RunnerController, RunnerData } from './controller'\nimport { runnerEingabe, runnerWerkzeugFeldId } from './eingabe'\nimport { runnerKlasseHinzu, runnerKlassenNameFehler, runnerKlasseUmbenennen, runnerPrioritaetSetze, runnerSetze, runnerUnterschiede, runnerVerschiebe, runnerVersion } from './profil'\nimport type { RunnerPort, RunnerProfil, RunnerProfilStand, RunnerPruefung } from './types'\n\ntype Run = <T>(kind: string, task: (port: RunnerPort) => Promise<T>) => Promise<T | null>\n\nexport interface RunnerKontext {\n store: Store<RunnerData>\n run: Run\n applied: (version: number) => void\n}\n\ntype ProfilAktionen = Pick<RunnerController, 'setze' | 'eingabe' | 'verwerfen' | 'pruefen' | 'anwenden' | 'gespeichertUebernehmen' | 'entwurfTrotzdemAnwenden' | 'verschiebe' | 'prioritaet'>\ntype WerkzeugAktionen = Pick<RunnerController, 'werkzeug' | 'werkzeugZahl' | 'werkzeugeSpeichern'>\ntype KlassenAktionen = Pick<RunnerController, 'neueKlasseEingabe' | 'klasseHinzufuegen' | 'klassenNameEingabe' | 'klasseUmbenennen'>\n\nfunction uebernimmStand(store: Store<RunnerData>, stand: RunnerProfilStand): void {\n store.set({ stand, entwurf: stand.profil, pruefung: null, konflikt: null, eingaben: {}, klassenNamen: {}, neueKlasse: '' })\n}\n\n/** Entwurf ändern; eine alte Prüfung und Rückmeldung gelten danach nicht mehr. */\nfunction aendere(store: Store<RunnerData>, aenderung: (entwurf: RunnerProfil) => RunnerProfil): void {\n const entwurf = store.get().entwurf\n if (entwurf) store.set({ entwurf: aenderung(entwurf), pruefung: null, meldung: null })\n}\n\nasync function konfliktLaden({ store, run }: RunnerKontext, entwurf: RunnerProfil, ergebnis: RunnerPruefung): Promise<void> {\n const gespeichert = await run('anwenden', (port) => port.profil())\n if (!gespeichert) return\n store.set({ pruefung: null, konflikt: { gespeichert, meldung: ergebnis.meldung ?? '', unterschiede: runnerUnterschiede(entwurf, gespeichert.profil) } })\n}\n\nasync function nachAnwenden({ store, run, applied }: RunnerKontext, ergebnis: RunnerPruefung, version: number): Promise<void> {\n const neu = await run('load', (port) => Promise.all([port.status(), port.profil()]))\n if (neu) {\n uebernimmStand(store, neu[1])\n store.set({ status: neu[0] })\n }\n store.set({ pruefung: ergebnis, meldung: { key: 'angewendet', params: { version }, ton: 'success' } })\n applied(version)\n}\n\nasync function anwendenMit(kontext: RunnerKontext, erwartet: number): Promise<void> {\n const { store, run } = kontext\n const entwurf = store.get().entwurf\n if (!entwurf) return\n store.set({ meldung: null })\n const ergebnis = await run('anwenden', (port) => port.anwenden(entwurf, erwartet))\n if (!ergebnis) return\n if (ergebnis.konflikt) return konfliktLaden(kontext, entwurf, ergebnis)\n if (!ergebnis.angewendet) {\n store.set({ pruefung: ergebnis, meldung: { key: 'nichtAngewendet', params: { meldung: ergebnis.meldung ?? '' }, ton: 'warning' } })\n return\n }\n return nachAnwenden(kontext, ergebnis, ergebnis.version ?? erwartet + 1)\n}\n\nexport function profilAktionen(kontext: RunnerKontext): ProfilAktionen {\n const { store, run } = kontext\n return {\n setze: (pfad, wert) => aendere(store, (entwurf) => runnerSetze(entwurf, pfad, wert)),\n eingabe(pfad, art, roh) {\n if (typeof roh === 'string') store.set({ eingaben: { ...store.get().eingaben, [pfad.join('.')]: roh } })\n aendere(store, (entwurf) => {\n const neu = runnerSetze(entwurf, pfad, runnerEingabe(art, roh))\n // Art cpu hat keinen Grafikspeicher (Backend: vram_mb nur für Klassen der Art gpu).\n const istArt = pfad.length === 3 && pfad[0] === 'klassen' && pfad[2] === 'art'\n return istArt && roh === 'cpu' ? runnerSetze(neu, ['klassen', pfad[1] as string, 'vram_mb'], 0) : neu\n })\n },\n verwerfen() {\n const stand = store.get().stand\n if (stand) uebernimmStand(store, stand)\n store.set({ meldung: null })\n },\n async pruefen() {\n const entwurf = store.get().entwurf\n if (!entwurf) return\n store.set({ meldung: null })\n const pruefung = await run('pruefen', (port) => port.pruefen(entwurf))\n if (pruefung) store.set({ pruefung })\n },\n anwenden: () => anwendenMit(kontext, runnerVersion(store.get().stand?.profil)),\n gespeichertUebernehmen() {\n const konflikt = store.get().konflikt\n if (konflikt) uebernimmStand(store, konflikt.gespeichert)\n },\n async entwurfTrotzdemAnwenden() {\n const konflikt = store.get().konflikt\n if (!konflikt) return\n store.set({ stand: konflikt.gespeichert, konflikt: null })\n await anwendenMit(kontext, runnerVersion(konflikt.gespeichert.profil))\n },\n verschiebe: (index, richtung) => aendere(store, (entwurf) => runnerVerschiebe(entwurf, index, richtung)),\n prioritaet: (index, aenderung) => aendere(store, (entwurf) => runnerPrioritaetSetze(entwurf, index, aenderung)),\n }\n}\n\nexport function werkzeugAktionen({ store, run }: RunnerKontext): WerkzeugAktionen {\n return {\n werkzeug(profil, werkzeug, aenderung) {\n const alle = store.get().werkzeugEntwurf\n const bisher = alle?.[profil]?.[werkzeug]\n if (!alle || !bisher) return\n store.set({ werkzeugEntwurf: { ...alle, [profil]: { ...alle[profil], [werkzeug]: { ...bisher, ...aenderung } } }, meldung: null })\n },\n werkzeugZahl(profil, werkzeug, feld, roh) {\n const zahl = Number(roh)\n store.set({ eingaben: { ...store.get().eingaben, [runnerWerkzeugFeldId(profil, werkzeug, feld)]: roh } })\n if (roh.trim() !== '' && Number.isInteger(zahl) && zahl >= 0) this.werkzeug(profil, werkzeug, { [feld]: zahl })\n },\n async werkzeugeSpeichern() {\n const profile = store.get().werkzeugEntwurf\n if (!profile) return\n const ok = await run('werkzeuge', async (port) => {\n await port.werkzeugeSpeichern(profile)\n return true\n })\n if (!ok) return\n const werkzeuge = store.get().werkzeuge\n store.set({ werkzeuge: werkzeuge ? { ...werkzeuge, profile } : werkzeuge, meldung: { key: 'gespeichert', ton: 'success' } })\n },\n }\n}\n\nexport function klassenAktionen({ store }: RunnerKontext): KlassenAktionen {\n return {\n neueKlasseEingabe: (roh) => store.set({ neueKlasse: roh }),\n klasseHinzufuegen() {\n const { entwurf, neueKlasse } = store.get()\n const name = neueKlasse.trim()\n if (!entwurf || runnerKlassenNameFehler(entwurf, name)) return\n aendere(store, (profil) => runnerKlasseHinzu(profil, name))\n store.set({ neueKlasse: '' })\n },\n klassenNameEingabe: (alt, roh) => store.set({ klassenNamen: { ...store.get().klassenNamen, [alt]: roh } }),\n klasseUmbenennen(alt) {\n const { entwurf, klassenNamen } = store.get()\n const neu = (klassenNamen[alt] ?? alt).trim()\n if (!entwurf || neu === alt || runnerKlassenNameFehler(entwurf, neu, alt)) return\n const rest = Object.fromEntries(Object.entries(klassenNamen).filter(([k]) => k !== alt))\n aendere(store, (profil) => runnerKlasseUmbenennen(profil, alt, neu))\n store.set({ klassenNamen: rest })\n },\n }\n}\n","// Zustandsautomat von <flowaudit-runner-console> (Vue und React): lädt Status,\n// Profil und Werkzeuge über den Port, verwaltet den Profil-Entwurf mit Prüfen,\n// Anwenden und Konfliktauflösung sowie die Werkzeug-Einstellungen. Vue bindet\n// ihn mit useStore, React mit useStoreState.\n\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport type { MessageParams } from '../i18n'\nimport type { RunnerMessageKey } from './messages'\nimport type { RunnerFeldArt } from './eingabe'\nimport { createRunnerRestPort } from './port'\nimport { klassenAktionen, profilAktionen, werkzeugAktionen, type RunnerKontext } from './aktionen'\nimport type { RunnerPfad, RunnerPrioritaet, RunnerUnterschied } from './profil'\nimport type {\n RunnerAnsicht,\n RunnerPort,\n RunnerProfil,\n RunnerProfilStand,\n RunnerPruefung,\n RunnerStatus,\n RunnerWerkzeugEinstellung,\n RunnerWerkzeuge,\n RunnerWerkzeugProfile,\n} from './types'\n\nexport interface RunnerCallbacks {\n applied?: (version: number) => void\n failed?: (message: string) => void\n}\n\nexport interface RunnerKonfliktStand {\n gespeichert: RunnerProfilStand\n meldung: string\n unterschiede: readonly RunnerUnterschied[]\n}\n\n/** Rückmeldung nach einer Aktion (übersetzt in der Ansicht). */\nexport interface RunnerMeldung {\n key: RunnerMessageKey\n params?: MessageParams\n ton: 'success' | 'warning'\n}\n\n/** Stand; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface RunnerData extends RequestState<string> {\n ansicht: RunnerAnsicht\n status: RunnerStatus | null\n stand: RunnerProfilStand | null\n entwurf: RunnerProfil | null\n pruefung: RunnerPruefung | null\n konflikt: RunnerKonfliktStand | null\n werkzeuge: RunnerWerkzeuge | null\n werkzeugEntwurf: RunnerWerkzeugProfile | null\n meldung: RunnerMeldung | null\n /** Rohtext der Eingabefelder je Feld-ID, solange getippt wird (Zahlen, Listen). */\n eingaben: Readonly<Record<string, string>>\n /** Entwürfe der Klassennamen beim Umbenennen (bisheriger Name → Eingabe). */\n klassenNamen: Readonly<Record<string, string>>\n /** Eingabe „Neue Klasse“. */\n neueKlasse: string\n}\n\nexport interface RunnerSource {\n /** Fachlogik; hat Vorrang vor `api`. */\n port: () => RunnerPort | null | undefined\n /** Basis-URL der JSON-API (z. B. `/api`), wenn kein Port übergeben wird. */\n api?: () => string | null | undefined\n callbacks?: () => RunnerCallbacks\n}\n\nexport interface RunnerController {\n store: Store<RunnerData>\n load: () => Promise<void>\n zeige: (ansicht: RunnerAnsicht) => void\n setze: (pfad: RunnerPfad, wert: unknown) => void\n /** Eingabe eines Formularfelds: Rohtext merken, umgesetzten Wert in den Entwurf. */\n eingabe: (pfad: RunnerPfad, art: RunnerFeldArt, roh: string | boolean) => void\n verwerfen: () => void\n pruefen: () => Promise<void>\n anwenden: () => Promise<void>\n gespeichertUebernehmen: () => void\n entwurfTrotzdemAnwenden: () => Promise<void>\n verschiebe: (index: number, richtung: -1 | 1) => void\n prioritaet: (index: number, aenderung: Partial<Pick<RunnerPrioritaet, 'verdraengbar' | 'min'>>) => void\n werkzeug: (profil: string, werkzeug: string, aenderung: Partial<RunnerWerkzeugEinstellung>) => void\n /** Zahleneingabe (Zeitlimit, Priorität) eines Werkzeugs; ungültiger Rohtext bleibt nur sichtbar. */\n werkzeugZahl: (profil: string, werkzeug: string, feld: 'zeitlimit_s' | 'prioritaet', roh: string) => void\n werkzeugeSpeichern: () => Promise<void>\n neueKlasseEingabe: (roh: string) => void\n klasseHinzufuegen: () => void\n klassenNameEingabe: (alt: string, roh: string) => void\n klasseUmbenennen: (alt: string) => void\n}\n\nexport const INITIAL_RUNNER: RunnerData = {\n ...IDLE,\n ansicht: 'status',\n status: null,\n stand: null,\n entwurf: null,\n pruefung: null,\n konflikt: null,\n werkzeuge: null,\n werkzeugEntwurf: null,\n meldung: null,\n eingaben: {},\n klassenNamen: {},\n neueKlasse: '',\n}\n\nexport const RUNNER_ANSICHTEN: readonly RunnerAnsicht[] = ['status', 'einstellungen', 'werkzeuge', 'prioritaeten']\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nfunction resolvePort(source: RunnerSource): RunnerPort | null {\n const port = source.port()\n if (port) return port\n const api = source.api?.()\n return api ? createRunnerRestPort({ baseUrl: api }) : null\n}\n\nexport function createRunnerController(source: RunnerSource): RunnerController {\n const store = createStore<RunnerData>({ ...INITIAL_RUNNER })\n const run = createRunner(store, () => resolvePort(source), errorText, (message) => source.callbacks?.().failed?.(message))\n const kontext: RunnerKontext = { store, run, applied: (version) => source.callbacks?.().applied?.(version) }\n return {\n store,\n async load() {\n const daten = await run('load', (port) => Promise.all([port.status(), port.profil(), port.werkzeuge()]))\n if (!daten) return\n const [status, stand, werkzeuge] = daten\n store.set({ status, werkzeuge, werkzeugEntwurf: werkzeuge.profile, stand, entwurf: stand.profil, pruefung: null, konflikt: null, eingaben: {}, klassenNamen: {}, neueKlasse: '' })\n },\n zeige(ansicht) {\n store.set({ ansicht })\n },\n ...profilAktionen(kontext),\n ...werkzeugAktionen(kontext),\n ...klassenAktionen(kontext),\n }\n}\n","// Ansichtsmodelle der Runner-Konsole: alles, was Vue und React darstellen,\n// wird hier aus dem Zustand abgeleitet (gleiche Zeilen, gleiche Texte).\n\nimport type { Translate } from '../i18n'\nimport type { RunnerData } from './controller'\nimport { RUNNER_ANSICHTEN } from './controller'\nimport type { RunnerMessageKey } from './messages'\nimport type { RunnerFeldArt } from './eingabe'\nimport { runnerGeaendert, runnerKlassen, runnerKlassenArt, runnerKlassenNameFehler, runnerWert, type RunnerPfad } from './profil'\nimport type { RunnerAnsicht, RunnerDateiAenderung, RunnerProblem, RunnerProfil, RunnerStatus } from './types'\n\ntype T = Translate<RunnerMessageKey>\n\nconst TAB_KEYS: Readonly<Record<RunnerAnsicht, RunnerMessageKey>> = {\n status: 'tabStatus',\n einstellungen: 'tabEinstellungen',\n werkzeuge: 'tabWerkzeuge',\n prioritaeten: 'tabPrioritaeten',\n}\n\nexport interface RunnerTab {\n id: RunnerAnsicht\n label: string\n selected: boolean\n}\n\nexport function runnerTabs(state: RunnerData, t: T): RunnerTab[] {\n return RUNNER_ANSICHTEN.map((id) => ({ id, label: t(TAB_KEYS[id]), selected: state.ansicht === id }))\n}\n\n/** Nächster Reiter für Pfeiltasten (zyklisch). */\nexport function runnerNachbarTab(aktuell: RunnerAnsicht, richtung: -1 | 1): RunnerAnsicht {\n const index = RUNNER_ANSICHTEN.indexOf(aktuell)\n const next = (index + richtung + RUNNER_ANSICHTEN.length) % RUNNER_ANSICHTEN.length\n return RUNNER_ANSICHTEN[next] as RunnerAnsicht\n}\n\nexport function runnerNurLesen(state: RunnerData): boolean {\n return Boolean(state.status?.nur_lesen || state.stand?.nur_lesen)\n}\n\nexport function runnerIstGeaendert(state: RunnerData): boolean {\n return runnerGeaendert(state.entwurf, state.stand?.profil ?? null)\n}\n\nexport function runnerMeta(state: RunnerData, t: T): string {\n const status = state.status\n if (!status) return ''\n const sync = !status.sync || status.sync === 'aus' ? t('syncAus') : t('syncZentral', { sync: status.sync })\n return `${t('meta', { rechner: status.rechner, version: status.profil_version })} · ${sync}`\n}\n\nexport interface RunnerHinweis {\n ton: 'danger' | 'warning' | 'info'\n text: string\n}\n\nexport function runnerHinweise(state: RunnerData, t: T): RunnerHinweis[] {\n const status = state.status\n const hinweise: RunnerHinweis[] = []\n if (runnerNurLesen(state)) hinweise.push({ ton: 'info', text: t('nurLesen') })\n if (!status) return hinweise\n if (status.unbekannte_runner?.length) hinweise.push({ ton: 'danger', text: t('hinweisUnbekannt', { namen: status.unbekannte_runner.join(', ') }) })\n if (!status.image_vorhanden) hinweise.push({ ton: 'warning', text: t('hinweisImage') })\n if (status.netzsperre_aktiv === false) hinweise.push({ ton: 'warning', text: t('hinweisNetzsperre') })\n return hinweise\n}\n\nexport interface RunnerEintrag {\n label: string\n wert: string\n}\n\nfunction jaNein(wert: boolean | null | undefined, ja: string, nein: string, t: T): string {\n if (wert === null || wert === undefined) return t('unbekannt')\n return wert ? ja : nein\n}\n\nexport function runnerUeberblick(status: RunnerStatus | null, t: T): RunnerEintrag[] {\n if (!status) return []\n const aenderung = status.aenderung?.zeit ? t('aenderungWert', { zeit: status.aenderung.zeit, quelle: status.aenderung.quelle }) : t('aenderungKeine')\n const eintraege: RunnerEintrag[] = [\n { label: t('ziel'), wert: status.ziel || t('unbekannt') },\n { label: t('sollQuelle'), wert: status.soll_quelle },\n ...(status.auth_art ? [{ label: t('anmeldung'), wert: status.auth_art }] : []),\n { label: t('profilVersion'), wert: String(status.profil_version) },\n { label: t('aenderung'), wert: aenderung },\n { label: t('image'), wert: jaNein(status.image_vorhanden, t('vorhanden'), t('fehlt'), t) },\n { label: t('netzsperre'), wert: jaNein(status.netzsperre_aktiv, t('aktiv'), t('inaktiv'), t) },\n { label: t('kontingent'), wert: status.github_rest_kontingent === null ? t('unbekannt') : String(status.github_rest_kontingent) },\n ]\n if (status.runner_version) {\n eintraege.push({\n label: t('runnerVersion'),\n wert: status.runner_frist ? t('runnerVersionFrist', { version: status.runner_version, frist: status.runner_frist }) : status.runner_version,\n })\n }\n return eintraege\n}\n\nexport interface RunnerKlassenZeile {\n name: string\n aktiv: boolean\n soll: string\n max: string\n instanzen: string\n registriert: string\n belegt: string\n warteschlange: string\n gruende: string\n}\n\nconst zahl = (wert: number | null | undefined): string => (wert === null || wert === undefined ? '–' : String(wert))\n\nexport function runnerKlassenZeilen(status: RunnerStatus | null): RunnerKlassenZeile[] {\n if (!status) return []\n return Object.entries(status.klassen)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, klasse]) => ({\n name,\n aktiv: klasse.aktiv,\n soll: zahl(klasse.soll),\n max: zahl(klasse.max),\n instanzen: zahl(klasse.instanzen_aktiv),\n registriert: zahl(klasse.registriert),\n belegt: zahl(klasse.belegt),\n warteschlange: zahl(klasse.warteschlange),\n gruende: klasse.gruende.join('; '),\n }))\n}\n\nexport function runnerHatWarteschlange(status: RunnerStatus | null): boolean {\n return Boolean(status && Object.values(status.klassen).some((klasse) => typeof klasse.warteschlange === 'number'))\n}\n\nfunction kurz(wert: unknown): string {\n if (wert === null || wert === undefined) return '–'\n if (Array.isArray(wert)) {\n const namen = wert.map((eintrag) => (typeof eintrag === 'object' && eintrag !== null ? String((eintrag as Record<string, unknown>).name ?? '') : String(eintrag))).filter(Boolean)\n return namen.length ? namen.join(', ') : String(wert.length)\n }\n if (typeof wert === 'object') return JSON.stringify(wert)\n return String(wert)\n}\n\n/** Hardware-Angaben des Rechners als Liste (Schlüssel wie vom Backend geliefert). */\nexport function runnerHardware(hardware: Readonly<Record<string, unknown>> | null | undefined): RunnerEintrag[] {\n if (!hardware) return []\n return Object.entries(hardware)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([label, wert]) => ({ label, wert: kurz(wert) }))\n}\n\n// ---------------------------------------------------------------- Einstellungen\n\n\nexport interface RunnerOption {\n wert: string\n label: string\n}\n\nexport interface RunnerFeld {\n /** Pfad in Punktschreibweise; zugleich Zuordnung der Fehlermeldungen des Backends. */\n id: string\n pfad: RunnerPfad\n label: string\n art: RunnerFeldArt\n /** Anzeigewert für Eingabe- und Auswahlfelder. */\n wert: string\n /** Zustand eines Schalters. */\n an: boolean\n optionen: readonly RunnerOption[]\n schritt: string\n fehler: string\n}\n\n/** Umbenennen einer Klasse (nur Abschnitte vom Typ Klasse). */\nexport interface RunnerKlassenName {\n alt: string\n wert: string\n fehler: string\n geaendert: boolean\n}\n\nexport interface RunnerAbschnitt {\n id: string\n titel: string\n felder: RunnerFeld[]\n klasse?: RunnerKlassenName\n}\n\ninterface FeldDef {\n pfad: RunnerPfad\n key: RunnerMessageKey\n art: RunnerFeldArt\n schritt?: string\n optionen?: (t: T) => readonly RunnerOption[]\n}\n\nconst SOLL_QUELLEN = [['statisch', 'oStatisch'], ['lokal', 'oLokal'], ['datei', 'oDatei']] as const\nconst sollQuellen = (t: T): RunnerOption[] => SOLL_QUELLEN.map(([wert, key]) => ({ wert, label: t(key) }))\n\nconst ALLGEMEIN: readonly FeldDef[] = [\n { pfad: ['soll_quelle', 'art'], key: 'fSollQuelle', art: 'auswahl', optionen: sollQuellen },\n { pfad: ['soll_quelle', 'datei'], key: 'fSollDatei', art: 'text' },\n { pfad: ['backend'], key: 'fBackend', art: 'text' },\n { pfad: ['image'], key: 'fImage', art: 'text' },\n { pfad: ['reserve', 'cpus'], key: 'fReserveCpus', art: 'zahl' },\n { pfad: ['reserve', 'speicher_gb'], key: 'fReserveSpeicher', art: 'zahl' },\n]\n\nconst REGELUNG: readonly FeldDef[] = [\n { pfad: ['skalierung', 'vorrang_interaktiv'], key: 'fVorrang', art: 'schalter' },\n { pfad: ['skalierung', 'leerlauf_minuten'], key: 'fLeerlauf', art: 'zahl' },\n { pfad: ['skalierung', 'anteil_bei_nutzung'], key: 'fAnteil', art: 'zahl', schritt: '0.05' },\n { pfad: ['skalierung', 'swap_sperre_gb'], key: 'fSwap', art: 'zahl', schritt: '0.5' },\n { pfad: ['skalierung', 'ram_frei_min_gb'], key: 'fRam', art: 'zahl', schritt: '0.5' },\n { pfad: ['skalierung', 'last_je_kern_max'], key: 'fLast', art: 'zahl', schritt: '0.05' },\n { pfad: ['skalierung', 'temperatur_max_c'], key: 'fTemperatur', art: 'zahl' },\n { pfad: ['skalierung', 'volllast_von'], key: 'fVon', art: 'zahl' },\n { pfad: ['skalierung', 'volllast_bis'], key: 'fBis', art: 'zahl' },\n { pfad: ['skalierung', 'haltezeit_s'], key: 'fHaltezeit', art: 'zahl' },\n]\n\nconst THERMIK: readonly FeldDef[] = [\n { pfad: ['skalierung', 'thermik', 'aktiv'], key: 'fThermikAktiv', art: 'schalter' },\n { pfad: ['skalierung', 'thermik', 'url'], key: 'fThermikUrl', art: 'text' },\n]\n\nconst NETZ: readonly FeldDef[] = [\n { pfad: ['netz', 'aktiv'], key: 'fNetzAktiv', art: 'schalter' },\n { pfad: ['netz', 'sperre_pflicht'], key: 'fSperre', art: 'schalter' },\n]\n\nconst ARTEN = (t: T): RunnerOption[] => [{ wert: 'cpu', label: t('oCpu') }, { wert: 'gpu', label: t('oGpu') }]\n\nconst KLASSE: readonly (Omit<FeldDef, 'pfad'> & { feld: string })[] = [\n { feld: 'art', key: 'kArt', art: 'auswahl', optionen: ARTEN },\n { feld: 'aktiv', key: 'kAktiv', art: 'schalter' },\n { feld: 'min_instanzen', key: 'kMin', art: 'zahl' },\n { feld: 'max_instanzen', key: 'kMax', art: 'zahl' },\n { feld: 'leise_max', key: 'kLeise', art: 'zahl' },\n { feld: 'cpus', key: 'kCpus', art: 'zahl' },\n { feld: 'speicher_gb', key: 'kSpeicher', art: 'zahl' },\n { feld: 'vram_mb', key: 'kVram', art: 'zahl' },\n { feld: 'labels', key: 'kLabels', art: 'liste' },\n]\n\nfunction anzeige(wert: unknown, art: RunnerFeldArt): string {\n if (art === 'liste') return Array.isArray(wert) ? wert.map(String).join(', ') : ''\n if (wert === null || wert === undefined) return ''\n return String(wert)\n}\n\ninterface Kontext {\n t: T\n fehler: ReadonlyMap<string, string>\n eingaben: Readonly<Record<string, string>>\n}\n\nfunction feld(profil: RunnerProfil, def: FeldDef, { t, fehler, eingaben }: Kontext): RunnerFeld | null {\n const wert = runnerWert(profil, def.pfad)\n if (wert === undefined) return null\n const id = def.pfad.join('.')\n return {\n id,\n pfad: def.pfad,\n label: t(def.key),\n art: def.art,\n wert: eingaben[id] ?? anzeige(wert, def.art),\n an: wert === true,\n optionen: def.optionen?.(t) ?? [],\n schritt: def.schritt ?? '1',\n fehler: fehler.get(id) ?? '',\n }\n}\n\nfunction abschnitt(id: string, titel: string, profil: RunnerProfil, defs: readonly FeldDef[], kontext: Kontext): RunnerAbschnitt | null {\n const felder = defs.map((def) => feld(profil, def, kontext)).filter((entry): entry is RunnerFeld => entry !== null)\n return felder.length ? { id, titel, felder } : null\n}\n\n/** Feldpfad des Backends (`gpus[0].erlaubt`) in die Feld-ID der Ansicht (`gpus.0.erlaubt`). */\nexport function runnerFeldId(feld: string): string {\n return feld.replace(/\\[(\\d+)\\]/g, '.$1')\n}\n\n/** Meldungen des Backends: aus der letzten Prüfung, sonst aus dem geladenen Stand. */\nexport function runnerProbleme(state: RunnerData): readonly RunnerProblem[] {\n return state.pruefung?.probleme ?? state.stand?.probleme ?? []\n}\n\n/** Formularabschnitte aus dem Entwurf; nur Felder, die das Profil tatsächlich enthält. */\nfunction namensFehler(t: T, fehler: 'ungueltig' | 'vergeben' | null): string {\n if (fehler === 'ungueltig') return t('klasseNameUngueltig')\n return fehler === 'vergeben' ? t('klasseNameVergeben') : ''\n}\n\nfunction klassenAbschnitt(state: RunnerData, profil: RunnerProfil, name: string, kontext: Kontext): RunnerAbschnitt | null {\n const gpu = runnerKlassenArt(profil, name) === 'gpu'\n const defs = KLASSE.filter((def) => gpu || def.feld !== 'vram_mb').map(({ feld: schluessel, ...rest }) => ({ ...rest, pfad: ['klassen', name, schluessel] }))\n const eintrag = abschnitt(`klasse-${name}`, kontext.t('abschnittKlasse', { name }), profil, defs, kontext)\n if (!eintrag) return null\n const wert = state.klassenNamen[name] ?? name\n const fehler = wert === name ? '' : namensFehler(kontext.t, runnerKlassenNameFehler(profil, wert.trim(), name))\n return { ...eintrag, klasse: { alt: name, wert, fehler, geaendert: wert.trim() !== name && !fehler } }\n}\n\n/** Formularabschnitte aus dem Entwurf; nur Felder, die das Profil tatsächlich enthält. */\nexport function runnerAbschnitte(state: RunnerData, t: T): RunnerAbschnitt[] {\n const profil = state.entwurf\n if (!profil) return []\n const kontext: Kontext = { t, fehler: new Map(runnerProbleme(state).map((problem) => [runnerFeldId(problem.feld), problem.meldung])), eingaben: state.eingaben }\n const klassenNamen = runnerKlassen(profil)\n const gpuKlassen = klassenNamen.filter((name) => runnerKlassenArt(profil, name) === 'gpu')\n const result: (RunnerAbschnitt | null)[] = [\n abschnitt('allgemein', t('abschnittAllgemein'), profil, ALLGEMEIN, kontext),\n abschnitt('regelung', t('abschnittRegelung'), profil, REGELUNG, kontext),\n abschnitt('thermik', t('abschnittThermik'), profil, THERMIK, kontext),\n abschnitt('netz', t('abschnittNetz'), profil, NETZ, kontext),\n ...klassenNamen.map((name) => klassenAbschnitt(state, profil, name, kontext)),\n ]\n const gpus = runnerWert(profil, ['gpus'])\n // Kartenauswahl nur, wenn es eine Klasse der Art gpu gibt; angeboten werden nur diese.\n if (Array.isArray(gpus) && gpuKlassen.length) {\n const optionen = (): RunnerOption[] => gpuKlassen.map((klasse) => ({ wert: klasse, label: klasse }))\n gpus.forEach((karte, index) => {\n const name = typeof karte === 'object' && karte !== null ? String((karte as Record<string, unknown>).name ?? index) : String(index)\n result.push(\n abschnitt(`karte-${index}`, t('abschnittKarte', { index, name }), profil, [\n { pfad: ['gpus', index, 'erlaubt'], key: 'gErlaubt', art: 'schalter' },\n { pfad: ['gpus', index, 'klasse'], key: 'gKlasse', art: 'auswahl', optionen },\n ], kontext),\n )\n })\n }\n return result.filter((entry): entry is RunnerAbschnitt => entry !== null)\n}\n\nexport interface RunnerNeueKlasse {\n wert: string\n fehler: string\n moeglich: boolean\n}\n\n/** Eingabe „Neue Klasse“ mit Prüfung wie im Backend (Fehler erst nach einer Eingabe). */\nexport function runnerNeueKlasse(state: RunnerData, t: T): RunnerNeueKlasse {\n const name = state.neueKlasse.trim()\n const fehler = name ? namensFehler(t, runnerKlassenNameFehler(state.entwurf, name)) : ''\n return { wert: state.neueKlasse, fehler, moeglich: Boolean(name) && !fehler }\n}\n\nexport interface RunnerVorschau {\n gueltig: boolean\n aenderungen: readonly RunnerDateiAenderung[]\n schritte: readonly string[]\n rootBefehl: string\n}\n\nexport function runnerVorschau(state: RunnerData): RunnerVorschau | null {\n const pruefung = state.pruefung\n if (!pruefung) return null\n return { gueltig: pruefung.gueltig, aenderungen: pruefung.aenderungen, schritte: pruefung.schritte, rootBefehl: pruefung.netzsperre_befehl ?? '' }\n}\n","// Ansichtsmodelle der Bereiche „Werkzeuge“ und „Prioritäten“.\n\nimport type { Translate } from '../i18n'\nimport type { RunnerData } from './controller'\nimport { runnerWerkzeugFeldId } from './eingabe'\nimport type { RunnerMessageKey } from './messages'\nimport { runnerPrioritaeten, runnerWeichtZuerst, type RunnerPrioritaet } from './profil'\n\ntype T = Translate<RunnerMessageKey>\n\n// ---------------------------------------------------------------- Werkzeuge\n\nexport interface RunnerWerkzeugZeile {\n id: string\n werkzeug: string\n bereich: string\n imImage: string\n aktiv: boolean\n zeitlimit: string\n prioritaet: string\n}\n\nexport interface RunnerWerkzeugGruppe {\n profil: string\n titel: string\n zeilen: RunnerWerkzeugZeile[]\n}\n\nexport function runnerWerkzeugGruppen(state: RunnerData, t: T): RunnerWerkzeugGruppe[] {\n const katalog = new Map((state.werkzeuge?.werkzeuge ?? []).map((w) => [w.name, w]))\n const profile = state.werkzeugEntwurf ?? {}\n return Object.keys(profile)\n .sort()\n .map((profil) => ({\n profil,\n titel: t('werkzeugProfil', { name: profil }),\n zeilen: Object.entries(profile[profil] ?? {})\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([werkzeug, einstellung]) => ({\n id: `${profil}-${werkzeug}`,\n werkzeug,\n bereich: katalog.get(werkzeug)?.bereich ?? '',\n imImage: katalog.get(werkzeug)?.im_image || t('nichtInstalliert'),\n aktiv: einstellung.aktiv,\n zeitlimit: state.eingaben[runnerWerkzeugFeldId(profil, werkzeug, 'zeitlimit_s')] ?? String(einstellung.zeitlimit_s),\n prioritaet: state.eingaben[runnerWerkzeugFeldId(profil, werkzeug, 'prioritaet')] ?? String(einstellung.prioritaet),\n })),\n }))\n}\n\nexport function runnerWerkzeugeGeaendert(state: RunnerData): boolean {\n return JSON.stringify(state.werkzeugEntwurf) !== JSON.stringify(state.werkzeuge?.profile ?? null)\n}\n\n// ---------------------------------------------------------------- Prioritäten\n\nexport interface RunnerPrioritaetZeile extends RunnerPrioritaet {\n index: number\n rangText: string\n hoch: string\n runter: string\n ersteZeile: boolean\n letzteZeile: boolean\n}\n\nexport function runnerPrioritaetZeilen(state: RunnerData, t: T): RunnerPrioritaetZeile[] {\n const liste = runnerPrioritaeten(state.entwurf)\n return liste.map((eintrag, index) => ({\n ...eintrag,\n index,\n rangText: t('rang', { rang: eintrag.rang }),\n hoch: t('hoch', { name: eintrag.klasse }),\n runter: t('runter', { name: eintrag.klasse }),\n ersteZeile: index === 0,\n letzteZeile: index === liste.length - 1,\n }))\n}\n\nexport function runnerWeichtZuerstText(state: RunnerData, t: T): string {\n const liste = runnerPrioritaeten(state.entwurf)\n if (!liste.length) return ''\n const eintrag = runnerWeichtZuerst(liste)\n return eintrag ? t('weichtZuerst', { name: eintrag.klasse }) : t('keinerVerdraengbar')\n}\n","import { defineMessages } from '../i18n'\nexport const accountMessages = defineMessages({\n de: {\n crop: 'Quadratisch zuschneiden', zoom: 'Zoom', horizontal: 'Horizontaler Ausschnitt', vertical: 'Vertikaler Ausschnitt',\n title: 'Konto und Organisation', loading: 'Daten werden geladen …', empty: 'Keine Einträge vorhanden.',\n failed: 'Anfrage abgelehnt: {message}', choose: 'Wählen Sie einen Bereich aus.',\n save: 'Änderungen speichern', discard: 'Änderungen verwerfen', saved: 'Änderungen gespeichert.',\n dirty: 'Ungespeicherte Änderungen. Bitte speichern oder verwerfen, bevor Sie den Bereich wechseln.',\n readonly: 'Diese Angaben werden zentral verwaltet.', preview: 'Vorschau', camera: 'Webcam aktivieren',\n capture: 'Foto aufnehmen', stop: 'Kamera schließen', upload: 'Bild auswählen', remove: 'Bild entfernen',\n cameraFailed: 'Kamera nicht verfügbar. Bitte ein Bild auswählen.',\n },\n en: {\n crop: 'Crop square', zoom: 'Zoom', horizontal: 'Horizontal crop position', vertical: 'Vertical crop position',\n title: 'Account and organisation', loading: 'Loading data …', empty: 'No entries.',\n failed: 'Request rejected: {message}', choose: 'Choose a section.',\n save: 'Save changes', discard: 'Discard changes', saved: 'Changes saved.',\n dirty: 'Unsaved changes. Save or discard before switching sections.',\n readonly: 'These details are managed centrally.', preview: 'Preview', camera: 'Enable webcam',\n capture: 'Take photo', stop: 'Close camera', upload: 'Choose image', remove: 'Remove image',\n cameraFailed: 'Camera unavailable. Please choose an image.',\n },\n})\nexport type AccountMessageKey = keyof typeof accountMessages.de\n","import type { AccountDocument, AccountItem, AccountPort } from './types'\n\n/** Nur synthetische Demo/Testdaten; keine Autorisierungs- oder Persistenzschicht. */\nexport function createAccountMemoryPort(items: readonly AccountItem[], documents: readonly AccountDocument[] = []): AccountPort {\n const records = new Map(documents.map((document) => [document.id, structuredClone(document)]))\n const read = async (id: string): Promise<AccountDocument> => {\n const record = records.get(id)\n if (record) return structuredClone(record)\n const item = items.find((entry) => entry.id === id)\n if (!item) throw new Error('Eintrag nicht verfügbar.')\n return { id, title: item.label, description: '', kind: 'profile', revision: 0, fields: [], values: {}, editable: false }\n }\n return { list: async () => items, read,\n async save(id, revision, values) {\n const record = await read(id)\n if (!record.editable) throw new Error('Keine Schreibberechtigung.')\n if (record.revision !== revision) throw new Error('Die Daten wurden inzwischen geändert.')\n const allowed = record.fields.filter((f) => !f.readonly).map((f) => f.id)\n if (Object.keys(values).some((key) => !allowed.includes(key))) throw new Error('Feld nicht bearbeitbar.')\n const saved = { ...record, revision: revision + 1, values: { ...record.values, ...values } }\n records.set(id, saved)\n return structuredClone(saved)\n },\n }\n}\n\n/** Der injizierte Transport ergänzt Session, CSRF und Fehlerabbildung der Anwendung. */\nexport interface AccountTransport {\n request: <T>(method: 'GET' | 'POST', path: string, body?: unknown) => Promise<T>\n upload?: AccountPort['upload']\n imageUrl?: AccountPort['imageUrl']\n}\nexport function createAccountRestPort(transport: AccountTransport, base = '/api/account'): AccountPort {\n const path = (id: string) => `${base}/documents/${encodeURIComponent(id)}`\n return {\n list: () => transport.request('GET', `${base}/documents`),\n read: (id) => transport.request('GET', path(id)),\n save: (id, revision, values) => transport.request('POST', path(id), { revision, values }),\n upload: transport.upload, imageUrl: transport.imageUrl,\n }\n}\n","/** Opt-in Kamera, keine Aufnahme ohne Benutzeraktion, Tracks immer schließen. */\nexport function createAccountCamera() {\n let stream: MediaStream | null = null\n let generation = 0\n const stop = () => { generation++; stream?.getTracks().forEach((track) => track.stop()); stream = null }\n return {\n stop,\n async start(video: HTMLVideoElement) {\n stop()\n const current = generation\n const acquired = await navigator.mediaDevices.getUserMedia({ video: { facingMode: 'user' }, audio: false })\n if (generation !== current) { acquired.getTracks().forEach((track) => track.stop()); return }\n stream = acquired\n video.srcObject = stream\n try { await video.play() } catch (error) { stop(); throw error }\n },\n async capture(video: HTMLVideoElement): Promise<Blob> {\n if (!stream || !video.videoWidth) throw new Error('Kamera noch nicht bereit.')\n const canvas = document.createElement('canvas')\n const edge = Math.min(video.videoWidth, video.videoHeight)\n canvas.width = canvas.height = Math.min(edge, 1024)\n const context = canvas.getContext('2d')\n if (!context) throw new Error('Bildaufnahme nicht verfügbar.')\n context.drawImage(video, (video.videoWidth - edge) / 2, (video.videoHeight - edge) / 2, edge, edge, 0, 0, canvas.width, canvas.height)\n const blob = await new Promise<Blob>((resolve, reject) => canvas.toBlob((result) => result ? resolve(result) : reject(new Error('Bildaufnahme fehlgeschlagen.')), 'image/png'))\n stop()\n video.srcObject = null\n return blob\n },\n }\n}\n\n/** Quadratischer Zuschnitt: Position 0..1 und Zoom 1..4, Metadaten übernimmt der Server nicht. */\nexport async function cropAccountImage(file: Blob, zoom: number, x: number, y: number): Promise<Blob> {\n if (![zoom, x, y].every(Number.isFinite) || zoom < 1 || zoom > 4 || x < 0 || x > 1 || y < 0 || y > 1) throw new Error('Ungültiger Bildausschnitt.')\n const image = await createImageBitmap(file)\n try {\n const edge = Math.min(image.width, image.height) / zoom\n const canvas = document.createElement('canvas')\n canvas.width = canvas.height = Math.min(1024, Math.round(edge))\n const context = canvas.getContext('2d')\n if (!context) throw new Error('Bildbearbeitung nicht verfügbar.')\n context.drawImage(image, (image.width - edge) * x, (image.height - edge) * y, edge, edge, 0, 0, canvas.width, canvas.height)\n return await new Promise<Blob>((resolve, reject) => canvas.toBlob((blob) => blob ? resolve(blob) : reject(new Error('Zuschnitt fehlgeschlagen.')), 'image/png'))\n } finally { image.close() }\n}\n","import type { AccountDocument, AccountPort } from './types'\n/** Keine beliebigen CSS-Werte aus editierbaren Feldern einsetzen. */\nexport function accountPreviewStyle(values: Readonly<Record<string, string>>) {\n const color = (value: string | undefined, fallback: string) => /^#[0-9a-f]{6}$/i.test(value ?? '') ? value : fallback\n const fonts: Record<string, string> = { system: 'system-ui, sans-serif', sans: \"'DejaVu Sans', sans-serif\", serif: \"'DejaVu Serif', serif\" }\n return { backgroundColor: color(values.primary, '#164e63'), color: color(values.text_on_primary, '#ffffff'),\n fontFamily: fonts[values.body_font ?? ''] ?? fonts.system }\n}\nexport function accountImageUrl(port: AccountPort | null | undefined, id: string): string {\n const url = id ? port?.imageUrl?.(id) ?? '' : ''\n return /^(https?:\\/\\/|blob:|\\/(?!\\/))/.test(url) ? url : ''\n}\nexport function accountWelcomePreview(document: AccountDocument, values: Readonly<Record<string, string>>): string {\n if (document.kind !== 'welcome') return ''\n return `${values.heading ?? ''}\\n\\n${values.body ?? ''}`\n .replace(/{{\\s*display_name\\s*}}/g, 'Alex Beispiel')\n .replace(/{{\\s*tenant_name\\s*}}/g, 'Beispielorganisation')\n .replace(/{{\\s*contact_name\\s*}}/g, 'Organisationskontakt')\n}\n","import { createStore, IDLE, type RequestState } from '../store'\nimport type { AccountDocument, AccountItem, AccountPort } from './types'\n\nexport interface AccountCallbacks {\n selected?: (item: AccountItem) => void\n failed?: (message: string) => void\n}\nexport interface AccountData extends RequestState<string> {\n items: readonly AccountItem[]\n selectedId: string | null\n document: AccountDocument | null\n draft: Readonly<Record<string, string>>\n dirty: boolean\n images: Readonly<Record<string, string>>\n}\nexport interface AccountSource {\n port: () => AccountPort | null | undefined\n callbacks?: () => AccountCallbacks\n}\nexport const INITIAL_ACCOUNT: AccountData = {\n ...IDLE, items: [], selectedId: null, document: null, draft: {}, dirty: false, images: {},\n}\nconst errorText = (error: unknown) => error instanceof Error ? error.message : String(error)\n\nfunction requests(source: AccountSource, store: ReturnType<typeof createStore<AccountData>>) {\n let epoch = 0\n async function run(kind: string, task: (port: AccountPort, current: () => boolean) => Promise<void>) {\n const port = source.port()\n if (!port) return\n const ticket = ++epoch\n const current = () => ticket === epoch && source.port() === port\n store.set({ busy: kind, error: null, notice: '' })\n try { await task(port, current) }\n catch (error) {\n if (current()) {\n store.set({ error: errorText(error) })\n source.callbacks?.().failed?.(errorText(error))\n }\n } finally { if (current()) store.set({ busy: null }) }\n }\n return { run, invalidate: () => { epoch++ } }\n}\n\nexport function createAccountController(source: AccountSource) {\n const store = createStore<AccountData>({ ...INITIAL_ACCOUNT })\n const accept = (document: AccountDocument) => store.set({\n document, draft: { ...document.values }, selectedId: document.id, dirty: false, images: {},\n })\n const { run, invalidate } = requests(source, store)\n return {\n store,\n dispose() { invalidate(); store.set({ ...INITIAL_ACCOUNT }) },\n async load() {\n invalidate()\n store.set({ ...INITIAL_ACCOUNT })\n await run('load', async (port, current) => {\n const items = await port.list()\n if (current()) store.set({ items })\n })\n },\n async select(id: string) {\n const state = store.get()\n const item = state.items.find((entry) => entry.id === id)\n if (!item || state.dirty || state.busy) return\n await run('read', async (port, current) => {\n const document = await port.read(id)\n if (current()) { accept(document); source.callbacks?.().selected?.(item) }\n })\n },\n edit(id: string, value: string) {\n const state = store.get()\n const field = state.document?.fields.find((entry) => entry.id === id)\n if (!state.document?.editable || !field || field.readonly || state.busy) return\n store.set({ draft: { ...state.draft, [id]: value }, dirty: true, notice: '', images: { ...state.images, [id]: '' } })\n },\n discard() {\n const document = store.get().document\n if (document && !store.get().busy) accept(document)\n },\n async save() {\n const state = store.get()\n if (!state.document?.editable || state.busy || !state.dirty) return\n const document = state.document\n const values = Object.fromEntries(document.fields.filter((f) => !f.readonly).map((f) => [f.id, state.draft[f.id] ?? '']))\n await run('save', async (port, current) => {\n const saved = await port.save(document.id, document.revision, values)\n if (current()) { accept(saved); store.set({ notice: 'saved' }) }\n })\n },\n async upload(fieldId: string, file: Blob) {\n const state = store.get()\n const document = state.document\n const field = document?.fields.find((f) => f.id === fieldId)\n if (!document?.editable || field?.type !== 'image' || field.readonly || state.busy) return\n await run('upload', async (port, current) => {\n if (!port.upload) throw new Error('Bilder werden von diesem Anschluss nicht unterstützt.')\n const image = await port.upload(document.id, fieldId, file)\n if (current()) store.set({ draft: { ...store.get().draft, [fieldId]: image.id },\n images: { ...store.get().images, [fieldId]: image.url }, dirty: true })\n })\n },\n }\n}\nexport type AccountController = ReturnType<typeof createAccountController>\n","import type { AccountData } from './controller'\nimport type { AccountItem } from './types'\n\n/** Zeile der Liste, wie Vue und React sie darstellen. */\nexport interface AccountRow {\n id: string\n label: string\n selected: boolean\n}\n\nexport function accountRows(state: AccountData): AccountRow[] {\n return state.items.map((item) => ({ id: item.id, label: item.label, selected: item.id === state.selectedId }))\n}\n\nexport function accountSelection(state: AccountData): AccountItem | null {\n return state.items.find((item) => item.id === state.selectedId) ?? null\n}\n\n/** Hinweis „keine Einträge“ nur nach abgeschlossener, fehlerfreier Anfrage. */\nexport function accountIsEmpty(state: AccountData): boolean {\n return state.busy === null && state.error === null && state.items.length === 0\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["STATUS_KEYS","statusLabel","fieldValue","parse","INITIAL","segment","escapeHtml","INITIAL","writeActions","INITIAL","writeActions","segment","INITIAL","moveActions","formatNumber","escapeHtml","INITIAL","formatNumber","formatPercent","errorText","CONTRACT","formatNumber","INITIAL","errorText","formatNumber","formatPercent","TONES","errorText","formatNumber","formatPercent","replaceAt","EMPTY_FORM","errorText","TONES","formatNumber","formatPercent","isRecord","titleOf","titleOf","errorText","formatBytes","TONES","errorText","errorText","formatNumber","formatPercent","cellText","cellText","errorText","percent","formatPercent","formatNumber","strataColumns","errorText","formatPercent","strataColumns","formatNumber","formatPercent","formatNumber","errorText","errorText","errorText","escapeHtml$2","formatBytes$1","LOCALES","DEFAULT_LOCALE","defineMessages","catalogs","interpolate","params","template","value","name","match","translate","locale","key","translator","isLocale","defaultLocale","listeners","setDefaultLocale","listener","getDefaultLocale","subscribeDefaultLocale","baseMessages","changes","patch","state","createStore","initial","next","IDLE","createRunner","active","port","kind","task","caught","error","toError","store","onError","createDelay","timer","ms","downloadText","saveFile","content","mimeType","printHtml","frame","target","html","deliverExport","payload","FOCUSABLE","focusableWithin","container","element","wrapTarget","first","items","last","backwards","current","createFocusTrap","previous","onKeydown","root","event","ICONS","isIconName","cellText","row","column","sortIcon","ariaSort","sort","rowKeyOf","rowKey","index","cellAlignClass","synopsisMessages","ROW_STATUSES","CHANGE_STATUSES","WORD_LIMIT","words","text","pushWord","out","word","visible","side","toSegments","operations","ndiffOperations","line","lines","prefix","lcsTable","width","b","table","a","j","walk","at","i","left","right","lcsOperations","oldText","newText","diffSegments","ndiff","wholeSegments","plainSegments","segmentsText","segments","segment","STATUS_KEYS$1","FIELDS","statusLabel$1","status","sides","highlight","inline","fieldValue$1","field","fieldViews","views","oldValue","newValue","t","haystack","parts","buildRowView","modeLabel","mode","notices","meta","result","list","countsText","labels","options","buildSynopsisView","DEFAULT_SYNOPSIS_FILTER","filterRows","query","filter","rows","changeIds","stepChange","ids","direction","positionText","applyRowOverrides","overrides","HTML_ESCAPES","escapeHtml","char","escapeMarkdown","exportFilename","title","extension","outputRows","htmlSegments","empty","htmlFields","htmlRow","input","reason","withReason","HTML_STYLE","htmlCommands","view","command","toHtml","reasonHead","notice","body","generated","markdownSegments","markdownRow","toMarkdown","parse$1","response","detail","message","RestError","formFields","fields","asFile","blob","createSynopsisRestClient","base","fetchImpl","init","request","url","path","item","id","json","format","form","oldFile","oldName","newFile","newName","SERVER_FORMATS","synopsisId","inputs","synopsisBase","serverExports","buildView","navigation","activeId","selectedText","all","highlightOf","selectSynopsis","currentId","buildSynopsisExport","selection","INITIAL$6","createSynopsisController","setFilter","reload","updateRow","update","toggleStatus","enabled","go","NEXT_KEYS","PREV_KEYS","isEditable","prefersReducedMotion","navigationDirection","focusRow","assistantDe","assistantEn","dataprotectionMessages","segment$2","createDataProtectionRestPort","one","action","requestJson","expectedRevision","requestFile","activityId","survey","decision","requestedFrom","requestedOn","CONTRACT","asError","raw","hooks","statusLabel","prefixedLabel","fallback","NO_DEPARTMENT","emptyActivity","activity","columns","department","emptyContent","cloneContent","groupByDepartment","needle","activityText","named","known","unknown","split","subject","activityKey","issuesFor","issues","issue","fieldIssues","coverIssues","completeness","blocking","completenessTone","statusTone","currentVersion","prefer","withField","withActivity","withoutActivity","withPerson","part","person","withDepartments","departments","d","displayValue","texts","parseCount","trimmed","editedBy","actor","version","ANSWER_VALUES","residualFrom","scenarioFrom","middle","profile","emptyScenario","surveyFrom","answers","answer","scenario","sameSurvey","answerOf","withAnswer","withJustification","blockProgress","values","block","question","withScenario","scenarios","addScenario","removeScenario","position","toggleMeasure","measures","measure","levelLabel","levels","level","bandTone","rank","band","bands","RECOMMENDATION_TONES","recommendationTone","recommendation","screeningTone","outcome","decisionTitle","isDeviation","proposal","parseConditions","mayRelease","decisionForm","canReleaseAssessment","dirty","cell","registerCsv","keys","titles","toCsv","issueLine","registerMarkdown","md","group","PRINT_CSS","escape","coverHtml","activitiesHtml","issuesHtml","registerHtml","registerFilename","editingOf","editBase","register","shownContent","editing","shownIssues","vvtView","vvtFourEyes","vvtVersionLabel","vvtExportTexts","MIME","buildVvtExport","render","lang","INITIAL$5","reset","editable","editActions","delay","check","run","show","draft","which","startDraft","discard","contentActions","selected","writeActions$2","save","expected","saved","release","released","createVvtController","edit","load","loaded","exportAs","dsfaDerived","dsfaReadonly","dsfaTabs","DSFA_NOTICES","INITIAL$4","readActions","open","found","assessmentId","openActivity","entry","calculate","writeActions$1","refreshRows","overview","step","changed","start","created","data","from","on","createDsfaController","exportReport","file","connect","read","segment$1","createAssistantRestPort","questionId","itemId","change","EMPTY_ASSISTANT","assistantView","assistant","steps","draftOf","isSuggestion","needsJustification","DPIA_TARGET","INITIAL$3","findQuestion","answerActions","revision","_done","drafts","_fixed","fieldErrors","accept","confirm","setDraft","moveActions$1","navigate","goTo","setMode","changeItem","createAssistantController","CLOSED_VALUES","questionOptions","closed","questionRoleLabel","questionFieldId","axisValueLabel","stepReachable","tableRows","c","parsed","tableValue","filled","geoMessages","TOLERANCE_STEPS","parseDegrees","parseLatLon","la","lat","lo","lon","parseMetres","parseUtm","number","zone","ost","east","nord","north","utmErrorKey","formatDistance","metres","intlFormatNumber","formatDegrees","formatMetres","vertexCount","geometry","sum","rings","inner","ring","areasFromGeoPackage","origin","area","displayName","uploadError","upload","createGeoRestPort","escapeHtml$1","textElement","span","tileLayer","tiles","L","drawAreas","layers","drawPoints","point","hit","reference","createLeafletView","map","bounds","layersOf","geocodingAvailable","selectGeo","areas","hitIds","INITIAL$2","rounded","factor","digits","utmTexts","missing","what","prepare","model","hint","needsArea","referenceActions","refreshUtm","setReference","callbacks","applyTexts","geocode","utmActions","applyUtm","zoneText","eastText","northText","northern","areaActions","simplifyArea","einheit","toleranz","added","selectArea","setSimplifyUnit","unit","loadFile","loadSource","calculations","searchRadius","given","punkte","checkLocation","boundaryInside","toleranceMetres","ellipsoid","createGeoController","runner","references","riskMessages","FLAG_STATES","flagState","code","skipped","flag","record","evaluationRules","evaluation","codes","recordRules","rule","summaryVolume","volume","summary","countStates","counts","distribution","total","totals","triggeredDataset","finding","DEFAULT_FILTER","matchesState","wanted","states","recordLabel","matchesQuery","filterRecords","hitEntry","ruleFacts","undeterminedEntry","recordEntries","byCode","rules","order","pairs","BOOLEAN_TEXT","formatBoolean","yes","no","formatValue","formatShare","intlFormatPercent","share","formatAmount","SEVERITY_TONES","severityTone","severity","STATE_ICONS","stateTone","PARAMETER_LABELS","parameterLabel","label","STATE_KEYS","STATE_FILTER_KEYS","STATUS_KEYS","STATUS_HINTS","statusKey","statusHintKey","REQUIREMENT_KEYS","requirementKey","requirement","WHEN_MISSING_KEYS","whenMissingKey","profilePath","createRiskRestPort","EMPTY_EVALUATION","riskTableColumns","recordText","riskTableRows","records","selectRisk","profileStatusText","profileHintText","errorText$12","failure","createRiskController","loadProfile","latest","screeningMessages","codeLabel","withQuery","createScreeningRestPort","runId","hitId","review","CONTRACT$1","emptyFilter","matchesText","acceptsHit","allowed","filterSubjects","subjects","filterOptions","lists","confidences","s","decimals","scale","formatScore","formatPoints","scorePercent","stepTone","breakdownRows","breakdown","isDelta","points","DATE","formatDate","year","month","day","hour","minute","date","freshnessTone","formatAge","days","compareState","notCompared","conflict","orDash","comparisonRows","f","aliases","more","findingState","indicatorLabels","requiresFourEyes","settings","canDecide","awaitsSecondReview","validateDecision","errors","nextOpenHit","hits","h","findHit","parseSubjects","birthDate","country","p","replaceHit","updated","selectScreening","asScreeningError","events","delegate","loadActions","guard","sources","client","openRun","log","createRun","decisionActions","refresh","submit","send","fourEyes","INITIAL$1","createScreeningController","context","selectedHitId","SCREENING_KINDS","profileKeyOf","kindProfiles","kindSources","source","selectedProfile","runFormDefaults","profiles","preferred","buildRunRequest","tabularMessages","INITIAL","importPreview","numberColumn","rejected","kept","pick","importDelimiterText","tab","importRejectedLines","preview","importOptionalColumn","createTableImportController","reparse","parseTable","valueColumn","guessNumberColumn","detectDecimal","columnCells","samplingMessages","isPercent","spec","parseInput","parseNumber","lowerBound","upperBound","inRange","fieldValue","min","max","buildSizeRequest","confidence","populationSuggestions","positive","initialTexts","formatter","strataOf","stratum","population","hasPartialStrata","stratified","optionalSeed","seed","sampleSizeOf","size","selectionProblem","buildSelectionRequest","problem","mus","itemsFromImport","positiveSum","createSamplingRestPort","INITIAL_SAMPLING","samplingProfile","method","samplingPopulation","isStratifiedPopulation","errorText$11","createActions","checked","draw","freshSeed","createSamplingController","selectMethod","applySuggestions","suggestions","exportSelection","parameterUnit","rangeText","fmt","samplingFieldError","selectionErrorKey","confidenceText","methodGroups","catalogue","methodTone","methodStatusKey","populationText","strata","numberFormat","amountFormat","plain","derivationColumns","derivationRows","sizeTexts","selectionColumns","strataColumns","amount","strataRows","selectionRows","excludedLines","selectionTexts","samplingInputNumber","benfordMessages","DEFAULT_BOX","axisMaximum","maximum","candidate","labelEvery","count","chartGeometry","plot","box","axis","slot","gap","scaleY","centre","bars","y","expectedPath","tickCount","yTicks","every","BENFORD_METRIC_IDS","activeMetrics","disabled","offeredMetrics","needsShortValues","test","buildAnalyseRequest","twoDigits","TONES$3","levelTone","digitLabel","digit","createBenfordRestPort","INITIAL_BENFORD","benfordValues","benfordProfile","errorText$10","createBenfordController","automatic","analyse","analysed","analyseErrorKey","benfordValuesText","benfordBarTitle","conformity","benfordChartTitle","testLabel","benfordTickText","benfordMetricTexts","analysis","excluded","bound","benfordDigitColumns","benfordDigitRows","benfordMetricLabel","pText","benfordChiTexts","metric","alpha","verdict","benfordDigitZTexts","correction","exceeding","largest","top","extrapolationMessages","designOf","stratumPart","periodNames","designRequest","units","design","populationUnits","systemAssessment","stratumKey","SAMPLED_PART","EXHAUSTIVE_PART","MAX_SUBSAMPLE_DEPTH","emptySubItem","emptySubStratum","emptySubsample","isSimple","sub","subsampleRows","simple","sampled","readItem","book","nested","depth","readSubsample","readItems","seen","names","simpleStrata","exhaustive","unitBook","ownStrata","EMPTY_RESIDUAL","emptyStratum","emptyUnit","optional","stratumRows","unitRows","violates","readExtrapolationAmount","Collector","withPart","readStrata","systemic","readUnit","anomalous","period","formError","materiality","checkPeriodGroups","buildEvaluationRequest","extra","residualFormFrom","ter","buildResidualRequest","materialityRate","extrapolationMethodById","confidenceChoices","createExtrapolationRestPort","patchUnit","replaceAt$1","openSubsample","createSubsampleActions","fresh","EMPTY_FORM$1","INITIAL_EXTRAPOLATION","extrapolationMethod","errorText$9","replaceAt","createRows","counter","patchForm","createRequests","evaluate","computeResidual","exportEvaluation","createExtrapolationController","applyInputs","methodId","keep","TONES$2","conclusionTone","conclusion","conclusionLabel","extrapolationAmount","extrapolationRate","extrapolationInputNumber","extrapolationIssueKey","extrapolationFormErrorKey","extrapolationMethodGroups","statistical","extrapolationConfidenceLabel","limitMetrics","metrics","terMetrics","stepValue","extrapolationStepColumns","extrapolationStepRows","residualColumns","residualRows","residual","residualMetrics","rate","STRATUM_FIELDS","UNIT_FIELDS","UNIT_FLAGS","RESIDUAL_FIELDS","extrapolationIssueText","extrapolationFormMessage","extrapolationCellLabel","DESIGNS","ESTIMATORS","extrapolationDesignChoices","subsampleEstimatorChoices","systemAssessmentChoices","SUB_ITEM_FIELDS","SUB_STRATUM_FIELDS","subsampleEditorView","unitLabel","periodColumns","periodRows","groupColumns","groupRows","subsampleColumns","subsampleResultRows","detailWarnings","recalculationView","recalculation","hasExtrapolationDetails","comparisonsMessages","COMPARISON_KINDS","COMPARISON_MODES","ACCEPTED_EXTENSIONS","DEFAULT_MAX_UPLOAD_BYTES","MIN_THRESHOLD","MAX_THRESHOLD","MAX_TITLE","DEFAULT_FORM","formatBytes","bytes","hasAcceptedExtension","lower","fileProblems","maxBytes","optionProblems","problems","threshold","formProblems","involvesPdf","toCompareFields","sections","common","toggleSection","defaultProfile","isRecord$1","looksLikeResult","withTitle","parseImport","kindLabel","formatDateTime","iso","summaryView","filterSummaries","sorted","summaryOf","comparison","synopsisPortOf","INITIAL_COMPARISONS","asComparisonsError","titleOf$2","formActions","writeActions","importText","fail","imported","confirmRemove","done","createComparisonsController","fileText","profileOptions","emptyText","shown","titleOf$1","comparisonsView","articleLaw","reportingMessages","createReportingRestPort","INITIAL_REPORTING","reportingProfile","buildWorkbookRequest","tables","filename","errorText$8","createReportingController","built","exportWorkbook","reportCellText","EMPTY_VALUE","reportingTablesText","reportingWorkbookText","reportingSheetHeading","reportingSampleNote","reportingErrorKey","identifierMessages","findIdentifierProfile","identifierProfileKinds","profileId","identifierProfileLabel","kindNeedsCountry","buildIdentifierCheck","land","resolveIdentifierKind","batchItem","mapping","buildIdentifierBatch","identifierErrorKey","TONES$1","identifierStatusTone","identifierStatusText","identifierReasonText","profileTitle","detailValue","identifierFacts","identifierRowStatus","identifierRowReason","identifierRowKind","identifierRowValue","visibleIdentifierRows","onlyIssues","identifierBatchSummary","notChecked","identifierBatchLines","identifierBatchCsv","recordsToCsv","identifierColumnFields","createIdentifiersRestPort","INITIAL_IDENTIFIERS","errorText$7","identifierBatchMapping","keepKind","offered","tableActions","hasHeader","createIdentifierController","setProfile","batchKind","checkBatch","extractionMessages","parse","createExtractionRestPort","headers","INITIAL_EXTRACTION","errorText$6","extractionValidation","createExtractionController","extract","validation","KNOWN","extractionSizeText","extractionProfileText","extractionFieldLabel","extractionRuleLabel","extractionValueText","extractionConfidenceText","extractionConfidenceTone","extractionDecisionText","extractionDecisionTone","extractionStatusText","extractionStatusTone","extractionDocumentText","pages","page_count","mime_type","extractionOcrText","ocr","avg","OUTCOME_ORDER","SEVERITY_ORDER","splitExtractionFindings","findings","extractionOutcomeTone","extractionFieldThreshold","extractionAccept","types","extractionProposalText","extractionValidationText","kanbanMessages","kanbanDialogMessages","dbKanbanMessages","cellText$1","titleProperty","property","columnLabel","cardView","groupBy","titleText","matchesRecord","groupRecords","groupOptions","option","dbKanbanView","groupableProperties","INITIAL_DB_KANBAN","asDbKanbanError","initialGroupBy","titleOf","rowId","moveActions","movable","groupOf","announce","move","dropValue","withCell","withRow","moveBy","groups","neighbourGroup","addCard","cells","createDbKanbanController","preferredGroupBy","setGroupBy","propertyId","batchchecksMessages","createBatchchecksMemoryPort","createBatchchecksRestPort","normalize","batchchecksAutoMapping","header","used","batchchecksDecimal","batchchecksLooksLikeJson","isRecord","jsonItems","batchchecksJsonDocuments","batchchecksCellValue","percent","decimal","batchchecksTableDocuments","mapped","totalVolume","documentsOf","buildBatchchecksRequest","documents","INITIAL_BATCHCHECKS","errorText$5","fileActions","remap","loadText","createBatchchecksController","exportRun","BATCHCHECKS_LISTED_DOCUMENTS","LEVEL_TONES","batchchecksLevelText","batchchecksLevelTone","batchchecksHasTable","batchchecksSourceText","batchchecksColumnFields","ruleStatus","ruleTone","batchchecksRuleRows","batchchecksFilterOptions","batchchecksAffectedText","refs","rest","batchchecksFindingRows","ruleFilter","batchchecksSummaryText","affected","percent$1","batchchecksMetricRows","m","samplesizeMessages","createSamplesizeRestPort","createSamplesizeMemoryPort","plan","plans","EMPTY_FORM","EMPTY_STRATUM","CHOICE_FIELDS","PERCENT_FIELDS","SPECIAL_FIELDS","OPTIONAL_FIELDS","INTEGER_FIELDS","methodById","scalarFields","hasStrata","hasFiniteCorrection","strataColumns$1","formFor","parseField","parseDecimal","scalarValue","germanText","optionalNumber","stratumRequest","sd","buildRequest","formFromRequest","INITIAL_SAMPLESIZE","errorText$4","createSamplesizeController","samplesizeMethod","choices","samplesizeFields","choice","COLUMN_LABELS","samplesizeStrataColumns","samplesizeNumber","samplesizeSummary","samplesizeAllocation","samplesizeDerivation","samplesizePercentFields","attributesMessages","createAttributesRestPort","EMPTY_ATTRIBUTES_FORM","APPROACHES","attributesApproachChoices","whole","minimum","selectionIssues","buildAttributesRequest","take","deviations","attributesConfidenceChoices","attributesPercent","attributesIssueKey","TONES","attributesConclusionTone","attributesMetrics","attributesStepColumns","attributesStepRows","ATTRIBUTE_FIELDS","attributesFieldLabel","approach","attributesFormMessage","INITIAL_ATTRIBUTES","errorText$3","createAttributesController","reporttemplatesMessages","createReportTemplatesRestPort","suffix","INITIAL_REPORTTEMPLATES","errorText$2","reporttemplatesData","buildTemplateRequest","firstFormat","createReporttemplatesController","select","templateId","typeText","schema","schemaFields","properties","required","textBlockRows","formatOptions","reporttemplatesCanRender","reporttemplatesIsEmpty","runnerMessages","RUNNER_SCHREIB_KOPF","RUNNER_WERKZEUG_SCHEMA","createRunnerMemoryPort","stand","werkzeuge","pruefen","versionOf","profil","aktuell","ergebnis","erwarteteVersion","fehlerHuelle","basis","fehler","createRunnerRestPort","schreiben","VERWALTET","isObject","runnerWert","teil","pfad","setzeIn","wert","kopf","liste","objekt","runnerSetze","flach","ziel","runnerUnterschiede","entwurf","gespeichert","runnerGeaendert","runnerVersion","runnerPrioritaeten","eintrag","x","runnerVerschiebe","richtung","neu","runnerPrioritaetSetze","aenderung","runnerWeichtZuerst","RUNNER_KLASSEN_NAME","runnerKlassen","klassen","runnerKlassenArt","runnerKlassenNameFehler","alt","runnerKlasseHinzu","runnerKlasseUmbenennen","umbenannt","l","k","v","eintraege","runnerEingabe","feldArt","roh","zahlWert","runnerWerkzeugFeldId","werkzeug","feld","uebernimmStand","aendere","konfliktLaden","nachAnwenden","applied","anwendenMit","kontext","erwartet","profilAktionen","art","pruefung","konflikt","werkzeugAktionen","alle","bisher","zahl","klassenAktionen","neueKlasse","klassenNamen","INITIAL_RUNNER","RUNNER_ANSICHTEN","errorText$1","resolvePort","api","createRunnerController","daten","TAB_KEYS","runnerTabs","runnerNachbarTab","runnerNurLesen","runnerIstGeaendert","runnerMeta","sync","runnerHinweise","hinweise","jaNein","ja","nein","runnerUeberblick","runnerKlassenZeilen","klasse","runnerHatWarteschlange","kurz","namen","runnerHardware","hardware","SOLL_QUELLEN","ALLGEMEIN","REGELUNG","THERMIK","NETZ","KLASSE","anzeige","def","eingaben","abschnitt","felder","defs","runnerFeldId","runnerProbleme","namensFehler","klassenAbschnitt","gpu","schluessel","runnerAbschnitte","gpuKlassen","gpus","optionen","karte","runnerNeueKlasse","runnerVorschau","runnerWerkzeugGruppen","katalog","w","einstellung","runnerWerkzeugeGeaendert","runnerPrioritaetZeilen","runnerWeichtZuerstText","accountMessages","createAccountMemoryPort","document","createAccountRestPort","transport","createAccountCamera","stream","generation","stop","track","acquired","video","canvas","edge","resolve","reject","cropAccountImage","zoom","image","accountPreviewStyle","color","fonts","accountImageUrl","accountWelcomePreview","INITIAL_ACCOUNT","errorText","requests","epoch","ticket","createAccountController","invalidate","fieldId","accountRows","accountSelection","accountIsEmpty"],"sources":["../src/i18n.ts","../src/messages.ts","../src/store.ts","../src/download.ts","../src/focus.ts","../src/base/icons.ts","../src/table/index.ts","../src/synopsis/messages.ts","../src/synopsis/types.ts","../src/synopsis/wordDiff.ts","../src/synopsis/viewModel.ts","../src/synopsis/exporters.ts","../src/synopsis/port.ts","../src/synopsis/controller.ts","../src/synopsis/navigation.ts","../src/dataprotection/assistantMessages.ts","../src/dataprotection/messages.ts","../src/dataprotection/rest-port.ts","../src/dataprotection/types.ts","../src/dataprotection/requests.ts","../src/dataprotection/registerView.ts","../src/dataprotection/dsfaView.ts","../src/dataprotection/exporters.ts","../src/dataprotection/vvt.ts","../src/dataprotection/dsfa.ts","../src/dataprotection/assistant.ts","../src/geo/messages.ts","../src/geo/model.ts","../src/geo/rest-port.ts","../src/geo/mapView.ts","../src/geo/controller.ts","../src/risk/messages.ts","../src/risk/state.ts","../src/risk/format.ts","../src/risk/labels.ts","../src/risk/port.ts","../src/risk/controller.ts","../src/screening/messages.ts","../src/screening/rest-port.ts","../src/screening/types.ts","../src/screening/view.ts","../src/screening/controller.ts","../src/screening/runForm.ts","../src/tabular/messages.ts","../src/tabular/tableImport.ts","../src/sampling/messages.ts","../src/sampling/model.ts","../src/sampling/rest-port.ts","../src/sampling/controller.ts","../src/sampling/view.ts","../src/benford/messages.ts","../src/benford/chart.ts","../src/benford/model.ts","../src/benford/rest-port.ts","../src/benford/controller.ts","../src/benford/view.ts","../src/extrapolation/messages.ts","../src/extrapolation/model-design.ts","../src/extrapolation/model-subsample.ts","../src/extrapolation/model.ts","../src/extrapolation/rest-port.ts","../src/extrapolation/controller-subsample.ts","../src/extrapolation/controller.ts","../src/extrapolation/view.ts","../src/extrapolation/view-details.ts","../src/documents/messages.ts","../src/documents/form.ts","../src/documents/importing.ts","../src/documents/list.ts","../src/documents/controller.ts","../src/documents/view.ts","../src/reporting/messages.ts","../src/reporting/rest-port.ts","../src/reporting/controller.ts","../src/reporting/view.ts","../src/identifiers/messages.ts","../src/identifiers/model.ts","../src/identifiers/rest-port.ts","../src/identifiers/controller.ts","../src/extraction/messages.ts","../src/extraction/rest-port.ts","../src/extraction/controller.ts","../src/extraction/view.ts","../src/kanban/messages.ts","../src/dbkanban/messages.ts","../src/dbkanban/view.ts","../src/dbkanban/controller.ts","../src/batchchecks/messages.ts","../src/batchchecks/port.ts","../src/batchchecks/rest-port.ts","../src/batchchecks/model.ts","../src/batchchecks/controller.ts","../src/batchchecks/view.ts","../src/samplesize/messages.ts","../src/samplesize/port.ts","../src/samplesize/model.ts","../src/samplesize/controller.ts","../src/samplesize/view.ts","../src/attributes/messages.ts","../src/attributes/port.ts","../src/attributes/view.ts","../src/attributes/controller.ts","../src/reporttemplates/messages.ts","../src/reporttemplates/port.ts","../src/reporttemplates/controller.ts","../src/reporttemplates/view.ts","../src/runner/messages.ts","../src/runner/port.ts","../src/runner/profil.ts","../src/runner/eingabe.ts","../src/runner/aktionen.ts","../src/runner/controller.ts","../src/runner/view.ts","../src/runner/view-listen.ts","../src/account/messages.ts","../src/account/port.ts","../src/account/camera.ts","../src/account/presentation.ts","../src/account/controller.ts","../src/account/view.ts"],"sourcesContent":["/**\n * Framework-freier Kern der Sprachunterstützung: Kataloge, Platzhalter,\n * Rückfall auf Deutsch. Vue (`useI18n` in `@auditcore/ui`) und React\n * (`useTranslation` in `@auditcore/ui-react`) setzen darauf auf.\n */\nexport type Locale = 'de' | 'en'\nexport const LOCALES: readonly Locale[] = ['de', 'en']\nexport const DEFAULT_LOCALE: Locale = 'de'\n\nexport type MessageParams = Readonly<Record<string, string | number>>\n\n/** Kataloge je Sprache; Deutsch ist vollständig, Englisch darf (noch) lückenhaft sein. */\nexport interface Catalogs<K extends string> {\n de: Readonly<Record<K, string>>\n en: Readonly<Partial<Record<K, string>>>\n}\n\nexport type Translate<K extends string> = (key: K, params?: MessageParams) => string\n\n/** Typisiert Kataloge einer Komponente; die Schlüssel ergeben sich aus dem deutschen Katalog. */\nexport function defineMessages<K extends string>(catalogs: Catalogs<K>): Catalogs<K> {\n return catalogs\n}\n\n/** Ersetzt {name}-Platzhalter; unbekannte Platzhalter bleiben sichtbar stehen. */\nexport function interpolate(template: string, params?: MessageParams): string {\n if (!params) return template\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => {\n const value = params[name]\n return value === undefined ? match : String(value)\n })\n}\n\n/** Übersetzt mit Rückfall auf Deutsch und zuletzt auf den Schlüssel. */\nexport function translate<K extends string>(\n catalogs: Catalogs<K>,\n locale: Locale,\n key: K,\n params?: MessageParams,\n): string {\n const template = (locale === 'en' ? catalogs.en[key] : undefined) ?? catalogs.de[key] ?? key\n return interpolate(template, params)\n}\n\n/** Übersetzungsfunktion für eine feste Sprache. */\nexport function translator<K extends string>(catalogs: Catalogs<K>, locale: Locale): Translate<K> {\n return (key, params) => translate(catalogs, locale, key, params)\n}\n\nexport function isLocale(value: unknown): value is Locale {\n return typeof value === 'string' && (LOCALES as readonly string[]).includes(value)\n}\n\nlet defaultLocale: Locale = DEFAULT_LOCALE\nconst listeners = new Set<() => void>()\n\n/** Sprache ohne Provider (Web Components, React ohne `LocaleProvider`). */\nexport function setDefaultLocale(locale: Locale): void {\n if (locale === defaultLocale) return\n defaultLocale = locale\n for (const listener of listeners) listener()\n}\n\nexport function getDefaultLocale(): Locale {\n return defaultLocale\n}\n\n/** Meldet Änderungen der Standardsprache; liefert die Abmeldung. */\nexport function subscribeDefaultLocale(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n","import { defineMessages } from './i18n'\n\n/** Texte der Basiskomponenten. */\nexport const baseMessages = defineMessages({\n de: {\n close: 'Schließen',\n loading: 'Wird geladen …',\n tableEmpty: 'Keine Einträge',\n sortAscending: 'aufsteigend sortiert',\n sortDescending: 'absteigend sortiert',\n sortBy: 'Nach {column} sortieren',\n },\n en: {\n close: 'Close',\n loading: 'Loading …',\n tableEmpty: 'No entries',\n sortAscending: 'sorted ascending',\n sortDescending: 'sorted descending',\n sortBy: 'Sort by {column}',\n },\n})\n","/**\n * Kleinster gemeinsamer Zustandsspeicher der Controller. Jeder Stand ist ein\n * neues, unveränderliches Objekt; React liest ihn über\n * `useSyncExternalStore`, Vue spiegelt ihn in ein `shallowRef`.\n */\nexport interface Store<S extends object> {\n get: () => S\n /** Teilstand übernehmen; Beobachter werden nur bei einer Änderung benachrichtigt. */\n set: (patch: Partial<S> | ((state: S) => Partial<S>)) => void\n subscribe: (listener: () => void) => () => void\n}\n\nfunction changes<S extends object>(state: S, patch: Partial<S>): boolean {\n return (Object.keys(patch) as (keyof S)[]).some((key) => !Object.is(state[key], patch[key]))\n}\n\nexport function createStore<S extends object>(initial: S): Store<S> {\n let state = initial\n const listeners = new Set<() => void>()\n return {\n get: () => state,\n set(patch) {\n const next = typeof patch === 'function' ? patch(state) : patch\n if (!changes(state, next)) return\n state = { ...state, ...next }\n for (const listener of [...listeners]) listener()\n },\n subscribe(listener) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n\n/** Beschäftigt-Status, Fehler und Erfolgsmeldung einer Portanfrage (gemeinsam für alle Controller). */\nexport interface RequestState<E> {\n busy: string | null\n error: E | null\n /** Letzte Erfolgsmeldung (für `aria-live`). */\n notice: string\n}\n\nexport const IDLE: RequestState<never> = { busy: null, error: null, notice: '' }\n\n/**\n * Führt eine Portanfrage aus: setzt `busy`, fängt Fehler (über `toError`) und\n * meldet sie an `onError`. Ohne Port geschieht nichts (`null`).\n */\nexport function createRunner<P, E, S extends RequestState<E>>(\n store: Store<S>,\n port: () => P | null,\n toError: (error: unknown) => E,\n onError?: (error: E) => void,\n) {\n return async function run<T>(kind: string, task: (active: P) => Promise<T>): Promise<T | null> {\n const active = port()\n if (!active) return null\n store.set({ busy: kind, error: null } as Partial<S>)\n try {\n return await task(active)\n } catch (caught) {\n const error = toError(caught)\n store.set({ error } as Partial<S>)\n onError?.(error)\n return null\n } finally {\n store.set({ busy: null } as Partial<S>)\n }\n }\n}\n\n/** Verzögerter Aufruf, der bei jeder neuen Eingabe neu startet (Vorschau, Vollständigkeitsprüfung). */\nexport function createDelay(ms: () => number) {\n let timer: ReturnType<typeof setTimeout> | undefined\n return {\n schedule(task: () => void): void {\n clearTimeout(timer)\n timer = setTimeout(task, ms())\n },\n cancel(): void {\n clearTimeout(timer)\n timer = undefined\n },\n }\n}\n","/**\n * Browser-Helfer für Exporte (DOM, aber framework-frei): Datei anbieten und\n * Druckansicht öffnen. Vue- und React-Fassung rufen dieselben Funktionen.\n */\nimport { saveFile } from '@auditcore/common/browser'\n\n/** Text als Datei anbieten (Blob-URL); ohne Blob-Unterstützung geschieht nichts. */\nexport function downloadText(content: string, filename: string, mimeType: string): boolean {\n if (typeof URL.createObjectURL !== 'function') return false\n saveFile({ blob: new Blob([content], { type: mimeType }), filename, mediaType: mimeType })\n return true\n}\n\n/**\n * Druckansicht in einem unsichtbaren Rahmen öffnen („Als PDF speichern“ im\n * Druckdialog). Kein Pop-up, daher auch mit Pop-up-Blocker nutzbar.\n */\nexport function printHtml(html: string): HTMLIFrameElement {\n const frame = document.createElement('iframe')\n frame.setAttribute('aria-hidden', 'true')\n frame.tabIndex = -1\n frame.style.cssText = 'position:fixed;width:0;height:0;border:0;right:0;bottom:0'\n frame.addEventListener('load', () => {\n const target = frame.contentWindow\n if (!target) return\n target.addEventListener('afterprint', () => frame.remove())\n target.focus()\n target.print()\n })\n frame.srcdoc = html\n document.body.append(frame)\n return frame\n}\n\n/** Export ausliefern: Druckansicht (`print`) oder Datei. */\nexport function deliverExport(payload: { format: string; content: string; filename: string; mimeType: string }): void {\n if (payload.format === 'print') printHtml(payload.content)\n else downloadText(payload.content, payload.filename, payload.mimeType)\n}\n","/** Fokusfalle für Dialoge (framework-frei, von Vue und React genutzt). */\nconst FOCUSABLE = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',')\n\nexport function focusableWithin(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (element) => !element.hasAttribute('inert') && element.getAttribute('aria-hidden') !== 'true',\n )\n}\n\n/** Nächstes Fokusziel beim Tabben am Rand des Containers, sonst null (Browser übernimmt). */\nexport function wrapTarget(items: HTMLElement[], current: Element | null, backwards: boolean): HTMLElement | null {\n const first = items[0]\n const last = items[items.length - 1]\n if (!first || !last) return null\n if (backwards && (current === first || !items.includes(current as HTMLElement))) return last\n if (!backwards && (current === last || !items.includes(current as HTMLElement))) return first\n return null\n}\n\nexport interface FocusTrap {\n /** Fokus in den Container (Element mit `autofocus`, sonst erstes fokussierbares) und Tab-Taste einfangen. */\n activate: () => void\n /** Falle lösen und den Fokus an das vorher fokussierte Element zurückgeben. */\n deactivate: () => void\n}\n\nexport function createFocusTrap(container: () => HTMLElement | null): FocusTrap {\n let previous: HTMLElement | null = null\n let active = false\n\n function onKeydown(event: KeyboardEvent): void {\n const root = container()\n if (event.key !== 'Tab' || !root) return\n const target = wrapTarget(focusableWithin(root), document.activeElement, event.shiftKey)\n if (target) {\n event.preventDefault()\n target.focus()\n }\n }\n\n return {\n activate() {\n const root = container()\n if (!root || active) return\n active = true\n previous = document.activeElement instanceof HTMLElement ? document.activeElement : null\n const autofocus = root.querySelector<HTMLElement>('[autofocus]')\n ;(autofocus ?? focusableWithin(root)[0] ?? root).focus()\n document.addEventListener('keydown', onKeydown, true)\n },\n deactivate() {\n if (!active) return\n active = false\n document.removeEventListener('keydown', onKeydown, true)\n previous?.focus()\n previous = null\n },\n }\n}\n","/**\n * Eigene Strichsymbole (24er-Raster, Strichstärke über CSS). Jede Zeile ist\n * eine Liste von SVG-Pfaden; neue Symbole nur hier ergänzen.\n */\nexport const ICONS = {\n close: ['M6 6l12 12', 'M18 6L6 18'],\n plus: ['M12 5v14', 'M5 12h14'],\n minus: ['M5 12h14'],\n check: ['M5 12.5l4.5 4.5L19 7.5'],\n search: ['M10.5 17a6.5 6.5 0 1 0 0-13 6.5 6.5 0 0 0 0 13z', 'M15.5 15.5L20 20'],\n filter: ['M4 5h16', 'M7 12h10', 'M10 19h4'],\n settings: ['M4 6h9', 'M17 6h3', 'M15 4v4', 'M4 12h3', 'M11 12h9', 'M9 10v4', 'M4 18h11', 'M19 18h1', 'M17 16v4'],\n share: ['M6 14a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z', 'M18 8a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z', 'M18 21a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z', 'M8.2 10.4l7.6-4.3', 'M8.2 12.6l7.6 4.3'],\n trash: ['M4 7h16', 'M9 7V4.5h6V7', 'M6.5 7l1 13h9l1-13', 'M10 11v6', 'M14 11v6'],\n edit: ['M4 20h4L19 9l-4-4L4 16v4z', 'M13.5 6.5l4 4'],\n 'chevron-down': ['M6 9l6 6 6-6'],\n 'chevron-up': ['M6 15l6-6 6 6'],\n 'chevron-left': ['M15 6l-6 6 6 6'],\n 'chevron-right': ['M9 6l6 6-6 6'],\n sort: ['M8 4v16', 'M4.5 7.5L8 4l3.5 3.5', 'M16 20V4', 'M12.5 16.5L16 20l3.5-3.5'],\n 'sort-asc': ['M12 19V5', 'M6.5 10.5L12 5l5.5 5.5'],\n 'sort-desc': ['M12 5v14', 'M6.5 13.5L12 19l5.5-5.5'],\n grip: ['M9 6h.01', 'M15 6h.01', 'M9 12h.01', 'M15 12h.01', 'M9 18h.01', 'M15 18h.01'],\n calendar: ['M4.5 6.5h15v13h-15z', 'M4.5 10.5h15', 'M8.5 4v4', 'M15.5 4v4'],\n clock: ['M12 20.5a8.5 8.5 0 1 0 0-17 8.5 8.5 0 0 0 0 17z', 'M12 7.5V12l3 2'],\n paperclip: ['M19 11.5l-7.2 7.2a4.5 4.5 0 0 1-6.4-6.4l7.8-7.8a3 3 0 0 1 4.2 4.2l-7.6 7.6a1.5 1.5 0 0 1-2.1-2.1l6.9-6.9'],\n user: ['M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8z', 'M4.5 20.5a7.5 7.5 0 0 1 15 0'],\n lock: ['M6 11h12v9H6z', 'M8.5 11V8a3.5 3.5 0 0 1 7 0v3'],\n pin: ['M9 4h6l-1 6 3 3H7l3-3-1-6z', 'M12 13v7'],\n sun: ['M12 16.5a4.5 4.5 0 1 0 0-9 4.5 4.5 0 0 0 0 9z', 'M12 2.5v2', 'M12 19.5v2', 'M2.5 12h2', 'M19.5 12h2', 'M5.3 5.3l1.4 1.4', 'M17.3 17.3l1.4 1.4', 'M5.3 18.7l1.4-1.4', 'M17.3 6.7l1.4-1.4'],\n moon: ['M19.5 14.5A8 8 0 0 1 9.5 4.5a8 8 0 1 0 10 10z'],\n warning: ['M12 4l9 16H3z', 'M12 10v4.5', 'M12 17.5h.01'],\n info: ['M12 20.5a8.5 8.5 0 1 0 0-17 8.5 8.5 0 0 0 0 17z', 'M12 11v5.5', 'M12 7.5h.01'],\n expand: ['M4 9V4h5', 'M20 9V4h-5', 'M4 15v5h5', 'M20 15v5h-5'],\n 'more-vertical': ['M12 5.5h.01', 'M12 12h.01', 'M12 18.5h.01'],\n} as const satisfies Readonly<Record<string, readonly string[]>>\n\nexport type IconName = keyof typeof ICONS\n\nexport function isIconName(value: string): value is IconName {\n return Object.prototype.hasOwnProperty.call(ICONS, value)\n}\n","/** Anzeige-Logik von FaTable/FlowauditTable; Sortierung selbst aus `@auditcore/common`. */\nimport { ariaSort, type SortState, type TableColumn, type TableRow } from '@auditcore/common'\n\nexport function cellText(column: TableColumn, row: TableRow): string {\n const value = row[column.key]\n if (column.format) return column.format(value, row)\n return value === null || value === undefined ? '' : String(value)\n}\n\nexport function sortIcon(sort: SortState | null, key: string): 'sort' | 'sort-asc' | 'sort-desc' {\n const state = ariaSort(sort, key)\n return state === 'ascending' ? 'sort-asc' : state === 'descending' ? 'sort-desc' : 'sort'\n}\n\n/** Schlüssel einer Zeile aus `rowKey`, sonst Position. */\nexport function rowKeyOf(row: TableRow, rowKey: string, index: number): string {\n const value = row[rowKey]\n return typeof value === 'string' || typeof value === 'number' ? String(value) : `row-${index}`\n}\n\nexport function cellAlignClass(column: TableColumn): string {\n return `fa-table__cell--${column.align ?? 'start'}`\n}\n","import { defineMessages } from '../i18n'\n\n/** Sichtbare Texte der Synopse; Begriffe wie im audit_designer und in ecohesion. */\nexport const synopsisMessages = defineMessages({\n de: {\n title: 'Synopse',\n statusChanged: 'Geändert',\n statusRemoved: 'Entfallen',\n statusAdded: 'Neu',\n statusMoved: 'Verschoben',\n statusUnchanged: 'Unverändert',\n oldLabel: 'Bisherige Fassung',\n newLabel: 'Neue Fassung',\n reasonLabel: 'Grund',\n location: 'Fundstelle',\n emptyOld: 'nicht vorhanden',\n emptyNew: 'nicht mehr enthalten',\n fieldAnswer: 'Antwort',\n fieldComment: 'Bemerkung',\n fieldNote: 'Hinweis',\n counts: '{changed} geändert · {removed} entfallen · {added} neu · {moved} verschoben · {matched} zugeordnet',\n modeChecklist: 'Checkliste',\n modeText: 'Fließtext',\n detected: 'Erkannte Dokumentart: {mode} · Vergleichsmodul {version}',\n files: '{old} → {new}',\n hashes: 'SHA-256 bisher {old} · neu {new}',\n workAid:\n 'Die Maschine stellt Unterschiede fest, trifft aber keine Prüfungsentscheidung. Zuordnung, Hervorhebungen und Begründungsvorschläge sind vor Verwendung fachlich zu prüfen.',\n commands: '{recognised} Änderungsbefehle erkannt; {open} müssen von Hand bearbeitet werden.',\n openCommands: 'Offene Änderungsbefehle',\n consolidated: 'Konsolidierte Arbeitsfassung',\n consolidatedEntry: '{section} Abs. {paragraph}',\n repealed: '(aufgehoben)',\n inserted: '(neu eingefügt)',\n toolbar: 'Ansicht, Filter und Export',\n layout: 'Darstellung',\n layoutSideBySide: 'Nebeneinander',\n layoutInline: 'Im Text',\n filterLegend: 'Änderungsart',\n filterAll: 'Alle Änderungen',\n search: 'Im Vergleich suchen',\n onlySelected: 'Nur ausgewählte Zeilen',\n highlight: 'Geänderte Wörter hervorheben',\n prevChange: 'Vorige Änderung',\n nextChange: 'Nächste Änderung',\n position: 'Änderung {current} von {total}',\n positionNone: '{total} Änderungen in dieser Ansicht',\n keyboardHint: 'Tasten: N oder J nächste, P oder K vorige Änderung',\n noMatches: 'Keine passenden Unterschiede in dieser Ansicht. Unveränderte Stellen lassen sich über den Filter einblenden.',\n exportLabel: 'Exportieren',\n exportHtml: 'HTML',\n exportMarkdown: 'Markdown',\n exportPrint: 'Druckansicht / PDF',\n serverDocx: 'Word (DOCX)',\n serverPdf: 'PDF (Server)',\n serverJson: 'JSON',\n include: 'In Ausgabe übernehmen',\n reasonPlaceholder: 'Optionaler Grund',\n flowagent: 'FlowAgent-Vorschlag',\n flowagentVerified: 'Fundstellen belegt',\n flowagentCheck: 'bitte Fundstellen prüfen',\n srRemoved: 'gestrichen:',\n srAdded: 'eingefügt:',\n srEnd: 'Ende',\n selectedCount: '{count} von {total} Zeilen für die Ausgabe ausgewählt',\n loading: 'Vergleich wird geladen …',\n loadError: 'Der Vergleich konnte nicht geladen werden.',\n saveError: 'Die Änderung konnte nicht gespeichert werden.',\n empty: 'Kein Vergleich ausgewählt.',\n generated: 'Erstellt am {date}',\n },\n en: {\n title: 'Synopsis',\n statusChanged: 'Changed',\n statusRemoved: 'Removed',\n statusAdded: 'Added',\n statusMoved: 'Moved',\n statusUnchanged: 'Unchanged',\n oldLabel: 'Previous version',\n newLabel: 'New version',\n reasonLabel: 'Reason',\n location: 'Location',\n emptyOld: 'not present',\n emptyNew: 'no longer present',\n fieldAnswer: 'Answer',\n fieldComment: 'Comment',\n fieldNote: 'Note',\n counts: '{changed} changed · {removed} removed · {added} added · {moved} moved · {matched} matched',\n modeChecklist: 'Checklist',\n modeText: 'Running text',\n detected: 'Detected document type: {mode} · comparison module {version}',\n hashes: 'SHA-256 previous {old} · new {new}',\n workAid: 'The comparison finds differences but makes no audit decision. Review matches, highlights and suggested reasons before use.',\n commands: '{recognised} amendment commands recognised; {open} need manual work.',\n openCommands: 'Open amendment commands',\n consolidated: 'Consolidated working version',\n consolidatedEntry: '{section} para. {paragraph}',\n repealed: '(repealed)',\n inserted: '(inserted)',\n toolbar: 'View, filter and export',\n layout: 'Layout',\n layoutSideBySide: 'Side by side',\n layoutInline: 'Inline',\n filterLegend: 'Change type',\n filterAll: 'All changes',\n search: 'Search comparison',\n onlySelected: 'Selected rows only',\n highlight: 'Highlight changed words',\n prevChange: 'Previous change',\n nextChange: 'Next change',\n position: 'Change {current} of {total}',\n positionNone: '{total} changes in this view',\n keyboardHint: 'Keys: N or J next, P or K previous change',\n noMatches: 'No matching differences in this view. Use the filter to show unchanged passages.',\n exportLabel: 'Export',\n exportPrint: 'Print view / PDF',\n include: 'Include in output',\n reasonPlaceholder: 'Optional reason',\n flowagent: 'FlowAgent suggestion',\n flowagentVerified: 'references verified',\n flowagentCheck: 'please check references',\n srRemoved: 'deleted:',\n srAdded: 'inserted:',\n srEnd: 'end',\n selectedCount: '{count} of {total} rows selected for output',\n loading: 'Loading comparison …',\n loadError: 'The comparison could not be loaded.',\n saveError: 'The change could not be saved.',\n empty: 'No comparison selected.',\n generated: 'Created on {date}',\n },\n})\n\nexport type SynopsisMessageKey = keyof typeof synopsisMessages.de\n","/**\n * JSON-Formen des REST-Vertrags (docs/ui/synopsis-rest.md). Sie entsprechen\n * `ComparisonResult.to_dict()` aus `auditcore_documents`; die Oberfläche kennt\n * keine zweite Datenform.\n */\n\nexport type RowStatus = 'changed' | 'removed' | 'added' | 'moved' | 'unchanged'\nexport const ROW_STATUSES: readonly RowStatus[] = ['changed', 'removed', 'added', 'moved', 'unchanged']\n/** Vorgabe des Filters „Alle Änderungen“: alles außer unverändert. */\nexport const CHANGE_STATUSES: readonly RowStatus[] = ['changed', 'removed', 'added', 'moved']\n\nexport type DiffField = 'text' | 'answer' | 'comment' | 'note'\n\nexport interface CompareRow {\n row_id: string\n status: RowStatus | string\n location: string\n old_text: string\n new_text: string\n old_answer?: string\n new_answer?: string\n old_comment?: string\n new_comment?: string\n old_note?: string\n new_note?: string\n reason?: string\n /** `''`, `flowagent` (KI-Vorschlag) oder `article_law` (Änderungsbefehl). */\n reason_source?: string\n reason_verified?: boolean | null\n reason_warning?: string\n selected?: boolean\n /** Wortdifferenz im Format von `difflib.ndiff` je Feld. */\n diff?: Partial<Record<DiffField, readonly string[]>>\n}\n\nexport interface ConsolidatedParagraph {\n section: string\n paragraph: number\n text: string\n repealed: boolean\n inserted: boolean\n}\n\nexport interface ComparisonMetadata {\n comparison_type?: 'standard' | 'article_law' | string\n detected_mode?: string\n highlight_words?: boolean\n output_sections?: readonly string[]\n pdf_notice?: string\n profile?: { id: string; version: string; fingerprint: string }\n old_label?: string\n new_label?: string\n reason_label?: string\n recognised_commands?: number\n open_commands?: readonly string[]\n open_command_count?: number\n consolidated_text?: readonly ConsolidatedParagraph[]\n work_aid_notice?: string\n [key: string]: unknown\n}\n\nexport interface ComparisonResult {\n version: string\n mode: 'checklist' | 'text' | string\n old_filename: string\n new_filename: string\n old_sha256: string\n new_sha256: string\n old_count: number\n new_count: number\n matched_count: number\n changed_count: number\n removed_count: number\n added_count: number\n moved_count?: number\n rows: readonly CompareRow[]\n created_at: string\n metadata?: ComparisonMetadata\n}\n\n/** Ein gespeicherter Vergleich (`GET /comparisons/{id}`). */\nexport interface Comparison {\n id: string\n title: string\n created_at: string\n result: ComparisonResult\n}\n\nexport interface ComparisonSummary {\n id: string\n title: string\n created_at: string\n old_filename: string\n new_filename: string\n comparison_type: string\n counts: { changed: number; removed: number; added: number; moved: number }\n}\n\nexport interface ComparisonProfile {\n id: string\n version: string\n fingerprint: string\n status: string\n default: boolean\n}\n\n/** Änderung einer Zeile (`PATCH /comparisons/{id}/rows`). */\nexport interface RowUpdate {\n row_id: string\n selected?: boolean\n reason?: string\n}\n\nexport type SynopsisLayout = 'side-by-side' | 'inline'\nexport type ClientExportFormat = 'html' | 'markdown' | 'print'\nexport type ServerExportFormat = 'json' | 'markdown' | 'docx' | 'pdf'\n\n/** Ergebnis eines Exports in der Oberfläche (Ereignis `export`). */\nexport interface ExportPayload {\n format: ClientExportFormat\n filename: string\n mimeType: string\n content: string\n}\n","/**\n * Wortdifferenz für die Anzeige, ohne Vue. Bevorzugt die vom Server gelieferte\n * `difflib.ndiff`-Folge (`\" \"` gleich, `\"- \"` entfallen, `\"+ \"` neu,\n * `\"? \"` Hinweis); fehlt sie (Gesetzessynopse), rechnet eine längste gemeinsame\n * Teilfolge über Wörter nach – wie `regulierung/frontend/src/lib/textDiff.ts`\n * mit einer Obergrenze, damit die Oberfläche nicht einfriert.\n */\n\nexport type SegmentKind = 'same' | 'removed' | 'added'\nexport type DiffSide = 'old' | 'new' | 'inline'\n\nexport interface DiffSegment {\n text: string\n kind: SegmentKind\n}\n\n/** Oberhalb dieser Wortzahl je Seite wird nicht wortweise verglichen. */\nexport const WORD_LIMIT = 1200\n\ntype Operation = readonly [SegmentKind, string]\n\nfunction words(text: string): string[] {\n return text.split(/\\s+/).filter(Boolean)\n}\n\nfunction pushWord(out: DiffSegment[], word: string, kind: SegmentKind): void {\n const last = out[out.length - 1]\n if (!last) {\n out.push({ text: word, kind })\n return\n }\n if (last.kind === kind) {\n last.text += ` ${word}`\n return\n }\n if (last.kind === 'same') {\n last.text += ' '\n out.push({ text: word, kind })\n return\n }\n if (kind === 'same') {\n out.push({ text: ` ${word}`, kind })\n return\n }\n out.push({ text: ' ', kind: 'same' }, { text: word, kind })\n}\n\nfunction visible(kind: SegmentKind, side: DiffSide): boolean {\n if (side === 'old') return kind !== 'added'\n if (side === 'new') return kind !== 'removed'\n return true\n}\n\nfunction toSegments(operations: readonly Operation[], side: DiffSide): DiffSegment[] {\n const out: DiffSegment[] = []\n for (const [kind, word] of operations) {\n if (visible(kind, side)) pushWord(out, word, kind)\n }\n return out\n}\n\n/** ndiff-Zeilen in Operationen übersetzen; Hinweiszeilen (`? `) entfallen. */\nexport function ndiffOperations(lines: readonly string[]): Operation[] {\n const operations: Operation[] = []\n for (const line of lines) {\n const prefix = line.slice(0, 2)\n const word = line.slice(2)\n if (prefix === ' ') operations.push(['same', word])\n else if (prefix === '- ') operations.push(['removed', word])\n else if (prefix === '+ ') operations.push(['added', word])\n }\n return operations\n}\n\nfunction lcsTable(a: readonly string[], b: readonly string[]): Int32Array {\n const width = b.length + 1\n const table = new Int32Array((a.length + 1) * width)\n for (let i = a.length - 1; i >= 0; i -= 1) {\n for (let j = b.length - 1; j >= 0; j -= 1) {\n const index = i * width + j\n table[index] =\n a[i] === b[j]\n ? (table[index + width + 1] ?? 0) + 1\n : Math.max(table[index + width] ?? 0, table[index + 1] ?? 0)\n }\n }\n return table\n}\n\nfunction walk(a: readonly string[], b: readonly string[], table: Int32Array): Operation[] {\n const width = b.length + 1\n const at = (i: number, j: number): number => table[i * width + j] ?? 0\n const operations: Operation[] = []\n let i = 0\n let j = 0\n while (i < a.length && j < b.length) {\n const left = a[i] as string\n const right = b[j] as string\n if (left === right) {\n operations.push(['same', left])\n i += 1\n j += 1\n } else if (at(i + 1, j) >= at(i, j + 1)) {\n operations.push(['removed', left])\n i += 1\n } else {\n operations.push(['added', right])\n j += 1\n }\n }\n for (const word of a.slice(i)) operations.push(['removed', word])\n for (const word of b.slice(j)) operations.push(['added', word])\n return operations\n}\n\n/** Längste gemeinsame Teilfolge über Wörter; `null` oberhalb von {@link WORD_LIMIT}. */\nexport function lcsOperations(oldText: string, newText: string): Operation[] | null {\n const a = words(oldText)\n const b = words(newText)\n if (a.length > WORD_LIMIT || b.length > WORD_LIMIT) return null\n return walk(a, b, lcsTable(a, b))\n}\n\n/**\n * Segmente einer Seite. `ndiff` hat Vorrang; ohne sie wird nachgerechnet.\n * Ist keine Wortdifferenz möglich, bleibt der Text unmarkiert (seitenweise)\n * bzw. erscheint inline als Streichung plus Einfügung.\n */\nexport function diffSegments(\n oldText: string,\n newText: string,\n side: DiffSide,\n ndiff?: readonly string[],\n): DiffSegment[] {\n const operations = ndiff && ndiff.length > 0 ? ndiffOperations(ndiff) : lcsOperations(oldText, newText)\n if (operations) return toSegments(operations, side)\n if (side === 'old') return oldText ? [{ text: oldText, kind: 'same' }] : []\n if (side === 'new') return newText ? [{ text: newText, kind: 'same' }] : []\n return wholeSegments(oldText, newText)\n}\n\n/** Ganze Texte als Streichung und Einfügung (neue/entfallene Stellen, Rückfall). */\nexport function wholeSegments(oldText: string, newText: string): DiffSegment[] {\n const out: DiffSegment[] = []\n if (oldText) out.push({ text: oldText, kind: 'removed' })\n if (oldText && newText) out.push({ text: ' ', kind: 'same' })\n if (newText) out.push({ text: newText, kind: 'added' })\n return out\n}\n\nexport function plainSegments(text: string): DiffSegment[] {\n return text ? [{ text, kind: 'same' }] : []\n}\n\nexport function segmentsText(segments: readonly DiffSegment[]): string {\n return segments.map((segment) => segment.text).join('')\n}\n","/**\n * Framework-freie Anzeige-Logik der Synopse: aus einem `ComparisonResult`\n * entsteht ein View-Model mit Beschriftungen, Wortsegmenten je Seite,\n * Filter und Navigation. Vue-Komponenten und Exporte nutzen nur dieses Modell.\n */\nimport type { MessageParams } from '../i18n'\nimport type { SynopsisMessageKey } from './messages'\nimport { CHANGE_STATUSES, type CompareRow, type ComparisonResult, type ConsolidatedParagraph, type DiffField, type RowStatus } from './types'\nimport { diffSegments, plainSegments, wholeSegments, type DiffSegment } from './wordDiff'\n\nexport type SynopsisTranslate = (key: SynopsisMessageKey, params?: MessageParams) => string\n\nexport interface FieldView {\n field: Exclude<DiffField, 'text'>\n label: string\n old: DiffSegment[]\n new: DiffSegment[]\n inline: DiffSegment[]\n}\n\nexport interface RowView {\n id: string\n status: RowStatus | string\n statusLabel: string\n location: string\n old: DiffSegment[]\n new: DiffSegment[]\n inline: DiffSegment[]\n fields: FieldView[]\n reason: string\n reasonSource: string\n reasonVerified: boolean | null\n reasonWarning: string\n selected: boolean\n isChange: boolean\n /** Suchtext: Fundstelle, beide Fassungen, Nebenfelder und Grund, kleingeschrieben. */\n haystack: string\n}\n\nexport interface SynopsisView {\n title: string\n oldLabel: string\n newLabel: string\n reasonLabel: string\n isArticleLaw: boolean\n countsText: string\n detectedText: string\n filesText: string\n hashesText: string\n createdAt: string\n notices: string[]\n recognisedCommands: number\n openCommands: string[]\n consolidated: readonly ConsolidatedParagraph[]\n rows: RowView[]\n}\n\nexport interface ViewOptions {\n title?: string\n oldLabel?: string\n newLabel?: string\n /** Wortweise Hervorhebung; ohne sie bleiben Texte unmarkiert. */\n highlight?: boolean\n}\n\nconst STATUS_KEYS: Record<RowStatus, SynopsisMessageKey> = {\n changed: 'statusChanged',\n removed: 'statusRemoved',\n added: 'statusAdded',\n moved: 'statusMoved',\n unchanged: 'statusUnchanged',\n}\n\nconst FIELDS: ReadonlyArray<[Exclude<DiffField, 'text'>, SynopsisMessageKey]> = [\n ['answer', 'fieldAnswer'],\n ['comment', 'fieldComment'],\n ['note', 'fieldNote'],\n]\n\nexport function statusLabel(status: string, t: SynopsisTranslate): string {\n const key = STATUS_KEYS[status as RowStatus]\n return key ? t(key) : status\n}\n\ninterface Sides {\n old: DiffSegment[]\n new: DiffSegment[]\n inline: DiffSegment[]\n}\n\nfunction sides(oldText: string, newText: string, status: string, ndiff: readonly string[] | undefined, highlight: boolean): Sides {\n if (!highlight || oldText === newText) {\n const inline = oldText === newText ? plainSegments(newText) : wholeSegments(oldText, newText)\n return { old: plainSegments(oldText), new: plainSegments(newText), inline }\n }\n if (status === 'added' || status === 'removed' || !oldText || !newText) {\n return { old: plainSegments(oldText), new: plainSegments(newText), inline: wholeSegments(oldText, newText) }\n }\n return {\n old: diffSegments(oldText, newText, 'old', ndiff),\n new: diffSegments(oldText, newText, 'new', ndiff),\n inline: diffSegments(oldText, newText, 'inline', ndiff),\n }\n}\n\nfunction fieldValue(row: CompareRow, side: 'old' | 'new', field: Exclude<DiffField, 'text'>): string {\n return row[`${side}_${field}`] ?? ''\n}\n\nfunction fieldViews(row: CompareRow, highlight: boolean, t: SynopsisTranslate): FieldView[] {\n const views: FieldView[] = []\n for (const [field, key] of FIELDS) {\n const oldValue = fieldValue(row, 'old', field)\n const newValue = fieldValue(row, 'new', field)\n if (!oldValue && !newValue) continue\n views.push({ field, label: t(key), ...sides(oldValue, newValue, row.status, row.diff?.[field], highlight) })\n }\n return views\n}\n\nfunction haystack(row: CompareRow): string {\n const parts = [row.location, row.old_text, row.new_text, row.reason ?? '']\n for (const [field] of FIELDS) parts.push(fieldValue(row, 'old', field), fieldValue(row, 'new', field))\n return parts.join('\\n').toLocaleLowerCase('de')\n}\n\nexport function buildRowView(row: CompareRow, highlight: boolean, t: SynopsisTranslate): RowView {\n return {\n id: row.row_id,\n status: row.status,\n statusLabel: statusLabel(row.status, t),\n location: row.location,\n ...sides(row.old_text, row.new_text, row.status, row.diff?.text, highlight),\n fields: fieldViews(row, highlight, t),\n reason: row.reason ?? '',\n reasonSource: row.reason_source ?? '',\n reasonVerified: row.reason_verified ?? null,\n reasonWarning: row.reason_warning ?? '',\n selected: row.selected ?? true,\n isChange: (CHANGE_STATUSES as readonly string[]).includes(row.status),\n haystack: haystack(row),\n }\n}\n\nfunction modeLabel(mode: string, t: SynopsisTranslate): string {\n if (mode === 'checklist') return t('modeChecklist')\n if (mode === 'text') return t('modeText')\n return mode\n}\n\nfunction notices(result: ComparisonResult, t: SynopsisTranslate): string[] {\n const meta = result.metadata ?? {}\n const list = [t('workAid')]\n for (const value of [meta.work_aid_notice, meta.pdf_notice]) {\n if (typeof value === 'string' && value) list.push(value)\n }\n return list\n}\n\nfunction countsText(result: ComparisonResult, t: SynopsisTranslate): string {\n return t('counts', {\n changed: result.changed_count,\n removed: result.removed_count,\n added: result.added_count,\n moved: result.moved_count ?? 0,\n matched: result.matched_count,\n })\n}\n\ntype Labels = Pick<SynopsisView, 'title' | 'oldLabel' | 'newLabel' | 'reasonLabel'>\n\nfunction labels(result: ComparisonResult, t: SynopsisTranslate, options: ViewOptions): Labels {\n const meta = result.metadata ?? {}\n return {\n title: options.title || t('files', { old: result.old_filename, new: result.new_filename }),\n oldLabel: options.oldLabel || meta.old_label || t('oldLabel'),\n newLabel: options.newLabel || meta.new_label || t('newLabel'),\n reasonLabel: meta.reason_label || t('reasonLabel'),\n }\n}\n\nexport function buildSynopsisView(result: ComparisonResult, t: SynopsisTranslate, options: ViewOptions = {}): SynopsisView {\n const meta = result.metadata ?? {}\n const highlight = options.highlight ?? meta.highlight_words ?? true\n return {\n ...labels(result, t, options),\n isArticleLaw: meta.comparison_type === 'article_law',\n countsText: countsText(result, t),\n detectedText: t('detected', { mode: modeLabel(result.mode, t), version: result.version }),\n filesText: t('files', { old: result.old_filename, new: result.new_filename }),\n hashesText: t('hashes', { old: result.old_sha256 || '–', new: result.new_sha256 || '–' }),\n createdAt: result.created_at,\n notices: notices(result, t),\n recognisedCommands: meta.recognised_commands ?? 0,\n openCommands: [...(meta.open_commands ?? [])],\n consolidated: meta.consolidated_text ?? [],\n rows: result.rows.map((row) => buildRowView(row, highlight, t)),\n }\n}\n\nexport interface SynopsisRowFilter {\n statuses: readonly string[]\n query: string\n onlySelected: boolean\n}\n\nexport const DEFAULT_SYNOPSIS_FILTER: SynopsisRowFilter = { statuses: CHANGE_STATUSES, query: '', onlySelected: false }\n\nexport function filterRows(rows: readonly RowView[], filter: SynopsisRowFilter): RowView[] {\n const query = filter.query.trim().toLocaleLowerCase('de')\n return rows.filter(\n (row) =>\n filter.statuses.includes(row.status) &&\n (!filter.onlySelected || row.selected) &&\n (!query || row.haystack.includes(query)),\n )\n}\n\n/** Kennungen der Änderungszeilen in Anzeigereihenfolge (Ziel der Navigation). */\nexport function changeIds(rows: readonly RowView[]): string[] {\n return rows.filter((row) => row.isChange).map((row) => row.id)\n}\n\n/**\n * Nächste bzw. vorige Änderung; ohne aktuelle Position beginnt `+1` bei der\n * ersten und `-1` bei der letzten. Am Rand bleibt die Position stehen.\n */\nexport function stepChange(ids: readonly string[], current: string | null, direction: 1 | -1): string | null {\n if (ids.length === 0) return null\n const index = current === null ? -1 : ids.indexOf(current)\n if (index === -1) return direction === 1 ? (ids[0] ?? null) : (ids[ids.length - 1] ?? null)\n const next = Math.min(ids.length - 1, Math.max(0, index + direction))\n return ids[next] ?? null\n}\n\nexport function positionText(ids: readonly string[], current: string | null, t: SynopsisTranslate): string {\n const index = current === null ? -1 : ids.indexOf(current)\n if (index === -1) return t('positionNone', { total: ids.length })\n return t('position', { current: index + 1, total: ids.length })\n}\n\n/** Zeilen mit lokalen Änderungen (Auswahl, Grund) zusammenführen. */\nexport function applyRowOverrides(rows: readonly CompareRow[], overrides: ReadonlyMap<string, Partial<CompareRow>>): CompareRow[] {\n if (overrides.size === 0) return [...rows]\n return rows.map((row) => {\n const patch = overrides.get(row.row_id)\n return patch ? { ...row, ...patch } : row\n })\n}\n","/**\n * Exporte aus dem View-Model, ohne Vue: eigenständiges HTML (auch als\n * Druckansicht für „Als PDF speichern“) und Markdown. Exportiert werden die\n * angezeigten Zeilen, die für die Ausgabe ausgewählt sind.\n */\nimport type { SynopsisTranslate, RowView, SynopsisView } from './viewModel'\nimport type { DiffSegment } from './wordDiff'\n\nexport interface ExportInput {\n view: SynopsisView\n rows: readonly RowView[]\n t: SynopsisTranslate\n /** Zeitpunkt der Ausgabe (Standard: jetzt), für reproduzierbare Tests injizierbar. */\n generatedAt?: string\n lang?: string\n}\n\nconst HTML_ESCAPES: Record<string, string> = { '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' }\n\nexport function escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (char) => HTML_ESCAPES[char] ?? char)\n}\n\nexport function escapeMarkdown(text: string): string {\n return text.replace(/([\\\\`*_[\\]<>#|])/g, '\\\\$1')\n}\n\nexport function exportFilename(title: string, extension: string): string {\n const stem = title.replace(/[^\\p{L}\\p{N}._-]+/gu, '_').replace(/^[._]+|[._]+$/g, '') || 'Synopse'\n return `${stem.slice(0, 80)}.${extension}`\n}\n\nfunction outputRows(rows: readonly RowView[]): RowView[] {\n return rows.filter((row) => row.selected)\n}\n\nfunction htmlSegments(segments: readonly DiffSegment[], empty: string): string {\n if (segments.length === 0) return `<span class=\"empty\">${escapeHtml(empty)}</span>`\n return segments\n .map((segment) => {\n const text = escapeHtml(segment.text)\n if (segment.kind === 'removed') return `<del>${text}</del>`\n if (segment.kind === 'added') return `<ins>${text}</ins>`\n return text\n })\n .join('')\n}\n\nfunction htmlFields(row: RowView, side: 'old' | 'new'): string {\n return row.fields\n .filter((field) => field[side].length > 0)\n .map((field) => `<p class=\"field\"><strong>${escapeHtml(field.label)}:</strong> ${htmlSegments(field[side], '')}</p>`)\n .join('')\n}\n\nfunction htmlRow(row: RowView, input: ExportInput, withReason: boolean): string {\n const { t } = input\n const reason = withReason ? `<td>${escapeHtml(row.reason)}</td>` : ''\n return (\n `<tr><th scope=\"row\">${escapeHtml(row.location || '—')}<br><span class=\"status\">${escapeHtml(row.statusLabel)}</span></th>` +\n `<td>${htmlSegments(row.old, t('emptyOld'))}${htmlFields(row, 'old')}</td>` +\n `<td>${htmlSegments(row.new, t('emptyNew'))}${htmlFields(row, 'new')}</td>${reason}</tr>`\n )\n}\n\nconst HTML_STYLE = `\nbody{font:11pt/1.45 'IBM Plex Sans',system-ui,sans-serif;color:#1b2230;margin:2rem}\nh1{font-size:16pt;margin:0 0 .5rem}p.meta{color:#5b6474;margin:.2rem 0}\n.notice{border-left:4px solid #a15c07;background:#fdf1dc;padding:.5rem .75rem;margin:.75rem 0}\ntable{border-collapse:collapse;width:100%;margin-top:1rem}th,td{border:1px solid #a9aea4;padding:.4rem .5rem;vertical-align:top;text-align:left;white-space:pre-wrap}\nthead th{background:#eceee9}.status{font-weight:400;color:#5b6474;font-size:9pt}.field{margin:.35rem 0 0;font-size:9.5pt}\ndel{background:#fdecea;color:#8a1c12;text-decoration:line-through}ins{background:#e3f4ea;color:#14532d;text-decoration:underline}\n.empty{color:#5b6474;font-style:italic}\n@media print{body{margin:0}thead{display:table-header-group}tr{break-inside:avoid}.notice{break-inside:avoid}}\n`\n\nfunction htmlCommands(view: SynopsisView, t: SynopsisTranslate): string {\n if (view.openCommands.length === 0) return ''\n const items = view.openCommands.map((command) => `<li>${escapeHtml(command)}</li>`).join('')\n return `<h2>${escapeHtml(t('openCommands'))}</h2><ul>${items}</ul>`\n}\n\n/** Eigenständiges HTML-Dokument mit Druck-CSS (keine externen Ressourcen). */\nexport function toHtml(input: ExportInput): string {\n const { view, t } = input\n const rows = outputRows(input.rows)\n const withReason = view.isArticleLaw || rows.some((row) => row.reason)\n const reasonHead = withReason ? `<th scope=\"col\">${escapeHtml(view.reasonLabel)}</th>` : ''\n const notices = view.notices.map((notice) => `<p class=\"notice\">${escapeHtml(notice)}</p>`).join('')\n const body = rows.length\n ? rows.map((row) => htmlRow(row, input, withReason)).join('')\n : `<tr><td colspan=\"${withReason ? 4 : 3}\">${escapeHtml(t('noMatches'))}</td></tr>`\n const generated = t('generated', { date: input.generatedAt ?? new Date().toISOString() })\n return (\n `<!doctype html><html lang=\"${escapeHtml(input.lang ?? 'de')}\"><head><meta charset=\"utf-8\">` +\n `<title>${escapeHtml(view.title)}</title><style>${HTML_STYLE}</style></head><body>` +\n `<h1>${escapeHtml(view.title)}</h1><p class=\"meta\">${escapeHtml(view.filesText)}</p>` +\n `<p class=\"meta\">${escapeHtml(view.countsText)}</p><p class=\"meta\">${escapeHtml(view.hashesText)}</p>` +\n `<p class=\"meta\">${escapeHtml(generated)}</p>${notices}` +\n `<table><thead><tr><th scope=\"col\">${escapeHtml(t('location'))}</th><th scope=\"col\">${escapeHtml(view.oldLabel)}</th>` +\n `<th scope=\"col\">${escapeHtml(view.newLabel)}</th>${reasonHead}</tr></thead><tbody>${body}</tbody></table>` +\n `${htmlCommands(view, t)}</body></html>`\n )\n}\n\nfunction markdownSegments(segments: readonly DiffSegment[], empty: string): string {\n if (segments.length === 0) return `_${escapeMarkdown(empty)}_`\n return segments\n .map((segment) => {\n const text = escapeMarkdown(segment.text)\n if (!text.trim() || segment.kind === 'same') return text\n return segment.kind === 'removed' ? `~~${text.trim()}~~` : `**${text.trim()}**`\n })\n .join('')\n}\n\nfunction markdownRow(row: RowView, input: ExportInput): string[] {\n const { view, t } = input\n const lines = [`### ${escapeMarkdown(row.location || '—')} (${row.statusLabel})`, '']\n lines.push(`**${view.oldLabel}:** ${markdownSegments(row.old, t('emptyOld'))}`, '')\n lines.push(`**${view.newLabel}:** ${markdownSegments(row.new, t('emptyNew'))}`, '')\n for (const field of row.fields) {\n lines.push(`- ${field.label}: ${markdownSegments(field.inline, '—')}`)\n }\n if (row.fields.length) lines.push('')\n if (row.reason) lines.push(`**${view.reasonLabel}:** ${escapeMarkdown(row.reason)}`, '')\n return lines\n}\n\n/** Markdown: gestrichene Wörter als ~~…~~, neue als **…**. */\nexport function toMarkdown(input: ExportInput): string {\n const { view, t } = input\n const rows = outputRows(input.rows)\n const lines = [`# ${escapeMarkdown(view.title)}`, '', `- ${escapeMarkdown(view.filesText)}`, `- ${view.countsText}`, `- ${view.hashesText}`, '']\n for (const notice of view.notices) lines.push(`> ${escapeMarkdown(notice)}`, '')\n if (rows.length === 0) lines.push(t('noMatches'), '')\n for (const row of rows) lines.push(...markdownRow(row, input))\n if (view.openCommands.length) {\n lines.push(`## ${t('openCommands')}`, '', ...view.openCommands.map((command) => `- ${escapeMarkdown(command)}`), '')\n }\n return `${lines.join('\\n').trimEnd()}\\n`\n}\n","/**\n * Port zur Anwendung. Die Komponente ruft nie selbst `fetch` auf: Anwendungen\n * übergeben einen Port – etwa {@link createSynopsisRestClient} für den\n * REST-Vertrag aus `auditcore_documents.web` – oder eigene Implementierungen.\n */\nimport { RestError, type FetchLike, type RestOptions } from '@auditcore/common'\nimport type { Comparison, ComparisonProfile, ComparisonResult, ComparisonSummary, RowUpdate, ServerExportFormat } from './types'\n\nexport interface SynopsisPort {\n /** Vergleich laden (`GET /comparisons/{id}`). */\n load(id: string): Promise<Comparison>\n /** Auswahl/Grund speichern (`PATCH /comparisons/{id}/rows`); liefert den neuen Stand. */\n updateRows?(id: string, rows: readonly RowUpdate[]): Promise<Comparison>\n /** Adresse einer Server-Ausgabe (DOCX, PDF, JSON, Markdown) für einen Download-Link. */\n exportUrl?(id: string, format: ServerExportFormat): string\n}\n\n/** Optionen wie bei `src/rest`: `baseUrl` (z. B. `/api/synopsis`), injizierbares `fetch`, Kopfzeilen. */\nexport type RestClientOptions = RestOptions\n\nexport interface CompareFields {\n title?: string\n comparison_type?: 'standard' | 'article_law'\n mode?: 'auto' | 'checklist' | 'text'\n threshold?: number\n include_answers?: boolean\n include_notes?: boolean\n include_editorial?: boolean\n highlight_words?: boolean\n output_sections?: readonly string[]\n profile?: string\n}\n\n/** Anfrage von `POST /comparisons/import`: ein fertiges Ergebnis aus der Auftragssteuerung ablegen. */\nexport interface ImportRequest {\n title?: string\n result: ComparisonResult\n}\n\nexport interface SynopsisRestClient extends Required<SynopsisPort> {\n profiles(): Promise<ComparisonProfile[]>\n list(): Promise<ComparisonSummary[]>\n create(oldFile: Blob, oldName: string, newFile: Blob, newName: string, fields?: CompareFields): Promise<Comparison>\n /** `POST /comparisons/import`. */\n importResult(request: ImportRequest): Promise<Comparison>\n remove(id: string): Promise<void>\n}\n\nasync function parse<T>(response: Response): Promise<T> {\n if (response.ok) return (response.status === 204 ? undefined : await response.json()) as T\n let detail = `HTTP ${response.status}`\n try {\n // auditcore_documents.web: {\"detail\": …}; andere Router: {\"error\": {\"message\": …}}.\n const body = (await response.json()) as { detail?: unknown; error?: { message?: unknown } }\n const message = body.detail ?? body.error?.message\n if (typeof message === 'string') detail = message\n } catch {\n // Kein JSON-Körper: Statuszeile genügt.\n }\n throw new RestError(detail, response.status, 'http_error')\n}\n\nfunction formFields(fields: CompareFields): Array<[string, string]> {\n return Object.entries(fields)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, Array.isArray(value) ? value.join(',') : String(value)])\n}\n\nfunction asFile(blob: Blob, name: string): File {\n return blob instanceof File && blob.name === name ? blob : new File([blob], name, { type: blob.type })\n}\n\nexport function createSynopsisRestClient(options: RestClientOptions): SynopsisRestClient {\n const base = options.baseUrl.replace(/\\/+$/, '')\n const fetchImpl: FetchLike = options.fetch ?? ((input, init) => globalThis.fetch(input, init))\n const request: FetchLike = (input, init) =>\n fetchImpl(input, { ...init, headers: { Accept: 'application/json', ...options.headers, ...init?.headers } })\n const url = (path: string): string => `${base}${path}`\n const item = (id: string): string => url(`/comparisons/${encodeURIComponent(id)}`)\n const json = { 'Content-Type': 'application/json' }\n return {\n load: async (id) => parse<Comparison>(await request(item(id))),\n updateRows: async (id, rows) =>\n parse<Comparison>(await request(`${item(id)}/rows`, { method: 'PATCH', headers: json, body: JSON.stringify({ rows }) })),\n exportUrl: (id, format) => `${item(id)}/export?format=${encodeURIComponent(format)}`,\n profiles: async () => (await parse<{ items: ComparisonProfile[] }>(await request(url('/profiles')))).items,\n list: async () => (await parse<{ items: ComparisonSummary[] }>(await request(url('/comparisons')))).items,\n async create(oldFile, oldName, newFile, newName, fields = {}) {\n const form = new FormData()\n form.append('old_file', asFile(oldFile, oldName))\n form.append('new_file', asFile(newFile, newName))\n for (const [key, value] of formFields(fields)) form.append(key, value)\n return parse<Comparison>(await request(url('/comparisons'), { method: 'POST', body: form }))\n },\n importResult: async (body) =>\n parse<Comparison>(await request(url('/comparisons/import'), { method: 'POST', headers: json, body: JSON.stringify(body) })),\n async remove(id) {\n await parse<undefined>(await request(item(id), { method: 'DELETE' }))\n },\n }\n}\n","// Zustandsautomat von <flowaudit-synopsis> (Vue und React): Laden über den\n// Port, lokale Zeilenänderungen, Filter, Navigation zwischen Änderungen, Exporte.\n\nimport { createStore } from '../store'\nimport { exportFilename, toHtml, toMarkdown } from './exporters'\nimport type { SynopsisPort } from './port'\nimport {\n CHANGE_STATUSES,\n type ClientExportFormat,\n type Comparison,\n type ComparisonResult,\n type CompareRow,\n type ExportPayload,\n type RowUpdate,\n type ServerExportFormat,\n} from './types'\nimport {\n applyRowOverrides,\n buildSynopsisView,\n changeIds,\n filterRows,\n positionText,\n stepChange,\n type RowView,\n type SynopsisTranslate,\n type SynopsisView,\n} from './viewModel'\n\n/** Eingaben der Komponente (Props). */\nexport interface SynopsisInputs {\n comparison?: Comparison | null\n result?: ComparisonResult | null\n comparisonId?: string\n port?: SynopsisPort | null\n title?: string\n oldLabel?: string\n newLabel?: string\n}\n\nexport interface SynopsisFilterState {\n statuses: string[]\n query: string\n onlySelected: boolean\n /** `null`: Vorgabe aus `metadata.highlight_words`. */\n highlight: boolean | null\n}\n\nexport interface SynopsisData {\n loaded: Comparison | null\n loading: boolean\n error: string\n overrides: ReadonlyMap<string, Partial<CompareRow>>\n filter: SynopsisFilterState\n activeId: string | null\n}\n\nexport interface ServerExportLink {\n label: string\n href: string\n}\n\n/** Alles, was die Oberfläche aus Stand und Eingaben anzeigt (reine Funktion). */\nexport interface SynopsisSelection {\n currentId: string | undefined\n result: ComparisonResult | null\n view: SynopsisView | null\n rows: RowView[]\n selectedText: string\n highlight: boolean\n activeId: string | null\n position: string\n canPrev: boolean\n canNext: boolean\n serverExports: ServerExportLink[]\n}\n\nconst SERVER_FORMATS: ReadonlyArray<[ServerExportFormat, 'serverDocx' | 'serverPdf' | 'serverJson']> = [\n ['docx', 'serverDocx'],\n ['pdf', 'serverPdf'],\n ['json', 'serverJson'],\n]\n\n/** Kennung des angezeigten Vergleichs (für Speichern und Server-Exporte). */\nexport function synopsisId(state: SynopsisData, inputs: SynopsisInputs): string | undefined {\n return (inputs.comparison ?? state.loaded)?.id ?? inputs.comparisonId\n}\n\n/** Ergebnisobjekt vor lokalen Änderungen: Prop `result`, sonst gespeicherter oder geladener Vergleich. */\nexport function synopsisBase(state: SynopsisData, inputs: SynopsisInputs): ComparisonResult | null {\n return inputs.result ?? (inputs.comparison ?? state.loaded)?.result ?? null\n}\n\nfunction serverExports(port: SynopsisPort | null | undefined, id: string | undefined, t: SynopsisTranslate): ServerExportLink[] {\n if (!id || !port?.exportUrl) return []\n return SERVER_FORMATS.map(([format, key]) => ({ label: t(key), href: port.exportUrl?.(id, format) ?? '' }))\n}\n\nfunction buildView(state: SynopsisData, inputs: SynopsisInputs, result: ComparisonResult, t: SynopsisTranslate): SynopsisView {\n return buildSynopsisView(result, t, {\n title: inputs.title || (inputs.comparison ?? state.loaded)?.title,\n oldLabel: inputs.oldLabel,\n newLabel: inputs.newLabel,\n highlight: state.filter.highlight ?? undefined,\n })\n}\n\ninterface Navigation {\n activeId: string | null\n position: string\n canPrev: boolean\n canNext: boolean\n}\n\n/** Position unter den sichtbaren Änderungen; eine ausgeblendete aktive Zeile gilt als keine. */\nfunction navigation(rows: readonly RowView[], active: string | null, t: SynopsisTranslate): Navigation {\n const ids = changeIds(rows)\n const activeId = active !== null && ids.includes(active) ? active : null\n const index = activeId === null ? -1 : ids.indexOf(activeId)\n return {\n activeId,\n position: positionText(ids, activeId, t),\n canPrev: ids.length > 0 && index !== 0,\n canNext: ids.length > 0 && index !== ids.length - 1,\n }\n}\n\nfunction selectedText(view: SynopsisView | null, t: SynopsisTranslate): string {\n const all = view?.rows ?? []\n return t('selectedCount', { count: all.filter((row) => row.selected).length, total: all.length })\n}\n\n/** Wortweise Hervorhebung: Auswahl der Werkzeugleiste, sonst Vorgabe des Ergebnisses, sonst an. */\nfunction highlightOf(state: SynopsisData, result: ComparisonResult | null): boolean {\n return state.filter.highlight ?? result?.metadata?.highlight_words ?? true\n}\n\nexport function selectSynopsis(state: SynopsisData, inputs: SynopsisInputs, t: SynopsisTranslate): SynopsisSelection {\n const currentId = synopsisId(state, inputs)\n const base = synopsisBase(state, inputs)\n const result = base ? { ...base, rows: applyRowOverrides(base.rows, state.overrides) } : null\n const view = result ? buildView(state, inputs, result, t) : null\n const rows = view ? filterRows(view.rows, state.filter) : []\n return {\n currentId,\n result,\n view,\n rows,\n selectedText: selectedText(view, t),\n highlight: highlightOf(state, result),\n ...navigation(rows, state.activeId, t),\n serverExports: serverExports(inputs.port, currentId, t),\n }\n}\n\n/** Export der sichtbaren Zeilen (HTML, Markdown, Druckansicht). */\nexport function buildSynopsisExport(selection: SynopsisSelection, format: ClientExportFormat, t: SynopsisTranslate, lang: string): ExportPayload | null {\n const view = selection.view\n if (!view) return null\n const input = { view, rows: selection.rows, t, lang }\n if (format === 'markdown') {\n return { format, filename: exportFilename(view.title, 'md'), mimeType: 'text/markdown;charset=utf-8', content: toMarkdown(input) }\n }\n return { format, filename: exportFilename(view.title, 'html'), mimeType: 'text/html;charset=utf-8', content: toHtml(input) }\n}\n\nconst INITIAL: SynopsisData = {\n loaded: null,\n loading: false,\n error: '',\n overrides: new Map(),\n filter: { statuses: [...CHANGE_STATUSES], query: '', onlySelected: false, highlight: null },\n activeId: null,\n}\n\nexport function createSynopsisController(t: () => SynopsisTranslate) {\n const store = createStore<SynopsisData>(INITIAL)\n const setFilter = (patch: Partial<SynopsisFilterState>): void => store.set((state) => ({ filter: { ...state.filter, ...patch } }))\n\n /** Mit `comparisonId` und `port`, aber ohne `comparison`/`result`: Vergleich laden. */\n async function reload(inputs: SynopsisInputs): Promise<void> {\n const { comparisonId: id, port } = inputs\n if (!id || !port || inputs.comparison || inputs.result) return\n store.set({ loading: true, error: '' })\n try {\n store.set({ loaded: await port.load(id) })\n } catch {\n store.set({ error: t()('loadError') })\n } finally {\n store.set({ loading: false })\n }\n }\n\n async function updateRow(inputs: SynopsisInputs, id: string, patch: Omit<RowUpdate, 'row_id'>): Promise<RowUpdate> {\n store.set((state) => {\n const overrides = new Map(state.overrides)\n overrides.set(id, { ...overrides.get(id), ...patch })\n return { overrides }\n })\n const update: RowUpdate = { row_id: id, ...patch }\n const target = synopsisId(store.get(), inputs)\n if (inputs.port?.updateRows && target) {\n try {\n await inputs.port.updateRows(target, [update])\n store.set({ error: '' })\n } catch {\n store.set({ error: t()('saveError') })\n }\n }\n return update\n }\n\n function toggleStatus(status: string, enabled: boolean): void {\n const next = new Set(store.get().filter.statuses)\n if (enabled) next.add(status)\n else next.delete(status)\n setFilter({ statuses: [...next] })\n }\n\n /** Zur nächsten/vorigen Änderung; liefert die neue Zeile oder `null`. */\n function go(selection: SynopsisSelection, direction: 1 | -1): string | null {\n const next = stepChange(changeIds(selection.rows), selection.activeId, direction)\n if (next !== null) store.set({ activeId: next })\n return next\n }\n\n return {\n store,\n reload,\n updateRow,\n toggleStatus,\n go,\n setAllChanges: () => setFilter({ statuses: [...CHANGE_STATUSES] }),\n setQuery: (query: string) => setFilter({ query }),\n setOnlySelected: (onlySelected: boolean) => setFilter({ onlySelected }),\n setHighlight: (highlight: boolean) => setFilter({ highlight }),\n activate: (id: string | null) => store.set({ activeId: id }),\n /** Neues Ergebnisobjekt: lokale Zeilenänderungen verwerfen. */\n resetOverrides: () => {\n if (store.get().overrides.size) store.set({ overrides: new Map() })\n },\n }\n}\n\nexport type SynopsisController = ReturnType<typeof createSynopsisController>\n","/** Tastatur- und Fokussteuerung der Synopse (framework-frei). */\n\nconst NEXT_KEYS = new Set(['n', 'j'])\nconst PREV_KEYS = new Set(['p', 'k'])\n\nfunction isEditable(target: EventTarget | null): boolean {\n if (typeof HTMLElement === 'undefined' || !(target instanceof HTMLElement)) return false\n return target.isContentEditable || ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName)\n}\n\nfunction prefersReducedMotion(): boolean {\n return typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/** Richtung für N/J (nächste) bzw. P/K (vorige Änderung); in Eingabefeldern und mit Modifikatoren `null`. */\nexport function navigationDirection(event: Pick<KeyboardEvent, 'key' | 'altKey' | 'ctrlKey' | 'metaKey' | 'target'>): 1 | -1 | null {\n if (event.altKey || event.ctrlKey || event.metaKey || isEditable(event.target)) return null\n const key = event.key.toLowerCase()\n if (NEXT_KEYS.has(key)) return 1\n return PREV_KEYS.has(key) ? -1 : null\n}\n\n/** Zeile fokussieren und sichtbar machen; Zeilen tragen `data-row-id` und `tabindex=\"-1\"`. */\nexport function focusRow(root: HTMLElement | null, id: string): void {\n const target = Array.from(root?.querySelectorAll<HTMLElement>('[data-row-id]') ?? []).find(\n (element) => element.dataset.rowId === id,\n )\n if (!target) return\n target.focus({ preventScroll: true })\n if (typeof target.scrollIntoView === 'function') {\n target.scrollIntoView({ block: 'center', behavior: prefersReducedMotion() ? 'auto' : 'smooth' })\n }\n}\n","// Texte des Datenschutz-Assistenten; in `dataprotectionMessages` eingebunden.\n\nexport const assistantDe = {\n assistantTitle: 'Datenschutz-Assistent',\n assistantIntro:\n 'Der Assistent führt auf Wunsch Schritt für Schritt durch die Fragen. Alle Angaben landen im selben Verzeichniseintrag wie bei der freien Bearbeitung.',\n modeLabel: 'Bearbeitungsweise',\n mode_gefuehrt: 'Geführt – Schritt für Schritt',\n mode_frei: 'Frei – alle Schritte direkt erreichbar',\n stepOf: 'Schritt {position} von {total}',\n stepsDone: '{done} von {total} Schritten vollständig',\n stepsNav: 'Schritte des Assistenten',\n previousStep: 'Zurück',\n nextStep: 'Weiter',\n saveAnswer: 'Antwort speichern',\n whyAsked: 'Hinweise und Fundstelle',\n addRow: 'Zeile hinzufügen',\n removeRow: 'Zeile {row} entfernen',\n tableCaption: '{question} – je Zeile ein Eintrag',\n numberInput: 'Ganze Zahl ab 0',\n dateInput: 'Datum',\n roleLabel: 'Zuständig: {role}',\n role_fachbereich: 'Fachbereich',\n role_it_betrieb: 'IT-Betrieb',\n role_recht: 'Recht/Datenschutz',\n answerJustification: 'Begründung',\n requiredQuestion: 'Pflichtfrage',\n optionalQuestion: 'freiwillig',\n chooseValue: 'Bitte wählen',\n value_ja: 'Ja',\n value_nein: 'Nein',\n value_unklar: 'Unklar',\n value_nicht_anwendbar: 'Nicht anwendbar (mit Begründung)',\n value_nicht_begonnen: 'Nicht begonnen',\n value_geplant: 'Geplant',\n value_umgesetzt: 'Umgesetzt',\n value_wirksam_nachgewiesen: 'Wirksamkeit nachgewiesen',\n stepStatus_vollstaendig: 'vollständig',\n stepStatus_klaerung: 'Klärungsbedarf',\n stepStatus_offen: 'offen',\n suggestion: 'Vorschlag ({origin}) – noch nicht bestätigt, wirkt noch nicht',\n confirmSuggestion: 'Vorschlag prüfen und übernehmen',\n hiddenAnswers: 'Frühere Antworten zu jetzt ausgeblendeten Fragen wirken nicht mehr: {ids}',\n tasksTitle: 'Offene Aufgaben ({count})',\n task_unklar: 'unklar – zu klären',\n task_unbestaetigt: 'Vorschlag unbestätigt',\n task_fehlt: 'Angabe fehlt',\n task_offene_punkte: 'offene Punkte gemeldet',\n errorSummary: 'Die Antwort wurde nicht gespeichert:',\n goToField: 'Zur Frage {id}',\n tabAssistant: 'Assistent',\n tabChecklist: 'Prüfpunkte',\n tabStatus: 'Status und Sperren',\n tabsLabel: 'Ansicht',\n axesTitle: 'Getrennte Status',\n axesNotice:\n 'Es gibt bewusst keinen Gesamtstatus „rechtskonform“. Die Bibliothek unterstützt Entscheidungen, übernimmt aber nicht die rechtliche Verantwortung.',\n axis_dokumentation: 'Dokumentation',\n axis_dsfa_erforderlichkeit: 'DSFA-Erforderlichkeit',\n axis_dsfa_bearbeitung: 'DSFA-Bearbeitung',\n axis_konsultation: 'Konsultation',\n axis_zentrale_uebernahme: 'Zentrale Übernahme',\n axis_betriebsentscheidung: 'Betriebsentscheidung',\n axisValue_entwurf: 'Entwurf',\n axisValue_vollstaendig: 'vollständig',\n axisValue_bestaetigt: 'bestätigt',\n axisValue_ueberarbeitungsbeduerftig: 'überarbeitungsbedürftig',\n axisValue_ungeklaert: 'ungeklärt',\n axisValue_erforderlich: 'erforderlich',\n axisValue_nicht_erforderlich_begruendet: 'nicht erforderlich (begründet)',\n axisValue_nicht_begonnen: 'nicht begonnen',\n axisValue_in_arbeit: 'in Arbeit',\n axisValue_fachlich_abgeschlossen: 'fachlich abgeschlossen',\n axisValue_erneut_zu_pruefen: 'erneut zu prüfen',\n axisValue_ungeprueft: 'ungeprüft',\n axisValue_eingeleitet: 'eingeleitet',\n axisValue_bearbeitet: 'bearbeitet',\n axisValue_nicht_uebertragen: 'nicht übertragen',\n axisValue_exportiert: 'exportiert',\n axisValue_uebertragen: 'übertragen',\n axisValue_uebernommen: 'übernommen',\n axisValue_konflikt: 'Konflikt',\n axisValue_nicht_beantragt: 'nicht beantragt',\n axisValue_in_pruefung: 'in Prüfung',\n axisValue_abgelehnt: 'abgelehnt',\n axisValue_fuer_definierten_umfang_erteilt: 'für definierten Umfang erteilt',\n axisValue_neu_zu_beurteilen: 'neu zu beurteilen',\n gatesTitle: 'Sperren',\n noGates: 'Derzeit greift keine Sperre.',\n gateRole: 'Zuständig: {role}',\n gateNext: 'Nächster Schritt: {step}',\n reference: 'Fundstelle: {reference}',\n checklistTitle: 'Prüfpunkte',\n checklistStatus: 'Status von {id}',\n evidenceIds: 'Nachweise (Kennungen, durch Komma getrennt)',\n saveItem: 'Prüfpunkt speichern',\n itemBlocks: 'wirkt auf {gate}',\n item_offen: 'offen',\n item_in_bearbeitung: 'in Bearbeitung',\n item_zur_pruefung: 'zur Prüfung',\n item_nachgewiesen: 'nachgewiesen',\n item_klaerungsbedarf: 'Klärungsbedarf',\n item_nicht_erfuellt: 'nicht erfüllt',\n item_nicht_anwendbar: 'nicht anwendbar – begründet',\n item_erneut_zu_pruefen: 'erneut zu prüfen',\n assistantSaved: 'Gespeichert.',\n assistantConfirmed: 'Vorschlag übernommen.',\n noActivity: 'Keine Tätigkeit gewählt: Eigenschaft „activityId“ setzen.',\n} as const\n\nexport const assistantEn: Partial<Record<keyof typeof assistantDe, string>> = {\n assistantTitle: 'Data protection assistant',\n modeLabel: 'Way of working',\n mode_gefuehrt: 'Guided – step by step',\n mode_frei: 'Free – every step directly',\n previousStep: 'Back',\n nextStep: 'Next',\n saveAnswer: 'Save answer',\n whyAsked: 'Hints and reference',\n answerJustification: 'Justification',\n value_ja: 'Yes',\n value_nein: 'No',\n value_unklar: 'Unclear',\n tabAssistant: 'Assistant',\n tabChecklist: 'Checklist',\n tabStatus: 'Status and gates',\n gatesTitle: 'Gates',\n}\n","import { defineMessages, type Translate } from '../i18n'\nimport { assistantDe, assistantEn } from './assistantMessages'\n\n/** Texte von `<flowaudit-vvt>` und `<flowaudit-dsfa>`. */\nexport const dataprotectionMessages = defineMessages({\n de: {\n vvtTitle: 'Verzeichnis von Verarbeitungstätigkeiten',\n vvtNorm: 'Art. 30 DSGVO',\n dsfaTitle: 'Datenschutz-Folgenabschätzung',\n dsfaNorm: 'Art. 35 DSGVO',\n profile: 'Regelprofil {id} {version}',\n noPort: 'Kein Port übergeben: Eigenschaft „port“ setzen (z. B. createDataProtectionRestPort).',\n networkError: 'Verbindung fehlgeschlagen: {message}',\n loading: 'Wird geladen …',\n yes: 'ja',\n no: 'nein',\n open: 'nicht angegeben',\n empty: '—',\n status_entwurf: 'Entwurf',\n status_freigegeben: 'freigegeben',\n status_abgeloest: 'abgelöst',\n status_dsb_beteiligung: 'Stellungnahme eingeholt',\n versionLabel: 'Fassung {version} – {status}',\n noVersion: 'Noch keine Fassung angelegt.',\n createdBy: 'Bearbeitet von {person} am {date}',\n releasedBy: 'Freigegeben von {person} am {date}',\n revision: 'Revision {revision}',\n save: 'Entwurf speichern',\n saving: 'Speichert …',\n discard: 'Änderungen verwerfen',\n release: 'Freigeben (Vier-Augen-Prinzip)',\n fourEyesHint: 'Vier-Augen-Prinzip: Wer den Entwurf bearbeitet hat, kann ihn nicht freigeben.',\n saveFirst: 'Zuerst die Änderungen speichern.',\n newDraft: 'Neuen Entwurf anlegen',\n showDraft: 'Entwurf anzeigen',\n showReleased: 'Freigegebene Fassung anzeigen',\n history: 'Versionshistorie',\n hideHistory: 'Historie ausblenden',\n exportLabel: 'Ausgabe',\n exportPrint: 'Druckansicht (PDF)',\n exportMarkdown: 'Markdown',\n exportCsv: 'CSV',\n unsaved: 'Ungespeicherte Änderungen',\n saved: 'Entwurf gespeichert (Fassung {version}, Revision {revision}).',\n released: 'Fassung {version} freigegeben.',\n exported: 'Datei „{filename}“ erstellt.',\n colVersion: 'Fassung',\n colStatus: 'Status',\n colCreated: 'Bearbeitet',\n colReleased: 'Freigegeben',\n colActivities: 'Tätigkeiten',\n noHistory: 'Noch keine Fassung erfasst.',\n cover: 'Deckblatt (Art. 30 Abs. 1 lit. a DSGVO)',\n controller: 'Verantwortlicher',\n dpo: 'Datenschutzbeauftragte/r',\n departments: 'Referate / Abteilungen',\n departmentNew: 'Neues Referat',\n departmentAdd: 'Referat hinzufügen',\n departmentRemove: '{name} entfernen',\n withoutDepartment: 'Ohne Referat',\n activities: 'Verarbeitungstätigkeiten ({count})',\n search: 'Tätigkeiten durchsuchen',\n noMatches: 'Keine Tätigkeit passt zur Suche.',\n noActivities: 'Noch keine Verarbeitungstätigkeit erfasst.',\n addActivity: 'Verarbeitungstätigkeit hinzufügen',\n removeActivity: 'Tätigkeit entfernen',\n unnamed: 'Tätigkeit ohne Bezeichnung',\n selectActivity: 'Tätigkeit auswählen, um die Angaben nach Art. 30 DSGVO zu sehen.',\n complete: 'vollständig',\n missing: '{count} Pflichtangaben fehlen',\n missingOne: '1 Pflichtangabe fehlt',\n hints: '{count} Hinweise',\n hintOne: '1 Hinweis',\n requiredMark: 'Pflichtangabe',\n invalidCount: 'Bitte eine ganze Zahl ab 0 eingeben.',\n completenessTitle: 'Vollständigkeitsprüfung',\n completenessSummary: '{blocking} Pflichtangaben fehlen, {hints} Hinweise',\n completenessOk: 'Alle Pflichtangaben nach Art. 30 Abs. 1 DSGVO sind ausgefüllt.',\n blockingLabel: 'Pflicht',\n hintLabel: 'Hinweis',\n issuesExport: 'Hinweise der Vollständigkeitsprüfung',\n noIssues: 'Keine offenen Angaben.',\n field: 'Angabe',\n content: 'Inhalt',\n generated: 'Erstellt am',\n overview: 'Verarbeitungstätigkeiten und Stand der Folgenabschätzung',\n colActivity: 'Tätigkeit',\n colDepartment: 'Referat',\n colState: 'Stand',\n colResult: 'Ergebnis',\n colAction: 'Aktion',\n noDsfa: 'keine Abschätzung',\n reviewRequired: 'Überprüfung erforderlich',\n openAssessment: 'Öffnen',\n startAssessment: 'Abschätzung beginnen',\n noRegister: 'Die Folgenabschätzung setzt auf das Verzeichnis von Verarbeitungstätigkeiten auf; es ist noch keines angelegt.',\n stepScreening: '1. Schwellwertanalyse',\n stepRisk: '2. Risiko und Maßnahmen',\n stepResult: '3. Ergebnis und Freigabe',\n steps: 'Abschnitte der Folgenabschätzung',\n lockedNotice: 'Diese Fassung ist freigegeben und gesperrt. Änderungen erfordern eine Neubewertung.',\n reassess: 'Neubewertung beginnen',\n preview: 'Vorschau der Bibliothek, noch nicht gespeichert',\n screeningResult: 'Ergebnis der Schwellwertanalyse',\n outcome_pflicht: 'DSFA erforderlich',\n outcome_keine_pflicht: 'keine DSFA erforderlich',\n outcome_unvollstaendig: 'unvollständig',\n points: '{points} von 9 Kriterien bejaht (ab {threshold} erforderlich)',\n hardTriggers: '{count} Muss-Kriterien bejaht',\n openAnswers: '{count} Fragen offen',\n progress: '{answered} von {total} beantwortet, {yes} × ja',\n effect_hart: 'Muss-Kriterium',\n effect_punkt: 'Kriterium WP 248',\n effect_fria: 'Hochrisiko-KI',\n answer_ja: 'Ja',\n answer_nein: 'Nein',\n answer_unbekannt: 'Unbekannt',\n justification: 'Begründung',\n explanation: 'Erläuterung',\n scenarios: 'Risikoszenarien',\n addScenario: 'Szenario hinzufügen',\n removeScenario: 'Szenario {index} entfernen',\n scenario: 'Szenario {index}',\n noScenarios: 'Noch kein Risikoszenario erfasst.',\n dimension: 'Schutzziel',\n description: 'Beschreibung des Risikos',\n severity: 'Schwere vor Maßnahmen',\n likelihood: 'Eintrittswahrscheinlichkeit vor Maßnahmen',\n measures: 'Maßnahmen',\n residual: 'Restrisiko ausdrücklich setzen',\n residualSeverity: 'Schwere nach Maßnahmen',\n residualLikelihood: 'Wahrscheinlichkeit nach Maßnahmen',\n computed: 'berechnet',\n residualJustification: 'Begründung des Restwerts',\n scenarioResult: 'brutto {gross} ({grossBand}) → netto {net} ({netBand})',\n riskSummary: 'Höchstes Risiko: brutto {gross}, netto {net} – Stufe {band}',\n necessityTitle: 'Notwendigkeit und Verhältnismäßigkeit (Art. 35 Abs. 7 lit. b DSGVO)',\n necessity: 'Notwendigkeit',\n proportionality: 'Verhältnismäßigkeit',\n dossierTitle: 'Angaben zur Abschätzung',\n proposalTitle: 'Vorschlag des Systems',\n recommendation_unvollstaendig: 'unvollständig',\n consultation: 'Konsultation der Aufsichtsbehörde',\n issuesTitle: 'Offene Punkte',\n decisionTitle: 'Entscheidung',\n decision: 'Entscheidung',\n chooseDecision: 'Entscheidung wählen',\n deviationHint: 'Die Entscheidung weicht vom Vorschlag ab; eine Begründung ist Pflicht.',\n decisionJustification: 'Begründung der Entscheidung',\n conditions: 'Auflagen (eine je Zeile)',\n decide: 'Entscheidung speichern',\n decidedBy: 'Entschieden von {person} am {date}: {decision}',\n dpoTitle: 'Beteiligung der oder des Datenschutzbeauftragten (Art. 35 Abs. 2 DSGVO)',\n dpoFrom: 'Eingeholt bei',\n dpoOn: 'Datum der Anfrage',\n dpoRecord: 'Einholung dokumentieren',\n dpoRecorded: 'Stellungnahme eingeholt bei {person} am {date}',\n releaseTitle: 'Freigabe',\n releaseOpenPoints: 'Mit der Freigabe dokumentierte offene Punkte',\n releaseInfo: 'Die offenen Punkte verhindern die Freigabe nicht; sie werden mit ihr gespeichert.',\n releaseBlockers: 'Die Freigabe ist noch nicht möglich:',\n assessmentSaved: 'Folgenabschätzung gespeichert (Revision {revision}).',\n assessmentReleased: 'Folgenabschätzung Fassung {version} freigegeben.',\n decisionSaved: 'Entscheidung gespeichert.',\n dpoSaved: 'Einholung der Stellungnahme dokumentiert.',\n versions: 'Fassungen dieser Tätigkeit',\n reportHtml: 'Bericht (Druckansicht)',\n reportMarkdown: 'Bericht (Markdown)',\n colDecision: 'Entscheidung',\n ...assistantDe,\n },\n en: {\n ...assistantEn,\n vvtTitle: 'Record of processing activities',\n vvtNorm: 'Art. 30 GDPR',\n dsfaTitle: 'Data protection impact assessment',\n dsfaNorm: 'Art. 35 GDPR',\n profile: 'Rule profile {id} {version}',\n loading: 'Loading …',\n yes: 'yes',\n no: 'no',\n open: 'not specified',\n save: 'Save draft',\n release: 'Release (four-eyes principle)',\n newDraft: 'Create new draft',\n history: 'Version history',\n cover: 'Cover sheet (Art. 30(1)(a) GDPR)',\n controller: 'Controller',\n dpo: 'Data protection officer',\n search: 'Search activities',\n addActivity: 'Add processing activity',\n stepScreening: '1. Threshold analysis',\n stepRisk: '2. Risk and measures',\n stepResult: '3. Result and release',\n answer_ja: 'Yes',\n answer_nein: 'No',\n answer_unbekannt: 'Unknown',\n },\n})\n\nexport type DataProtectionKey = keyof typeof dataprotectionMessages.de\nexport type DataProtectionTranslate = Translate<DataProtectionKey>\n","import { requestFile, requestJson, type RestOptions } from '@auditcore/common'\nimport type { DataProtectionPort } from './types'\n\nconst segment = encodeURIComponent\n\n/** Port auf den REST-Vertrag `dataprotection_ui/1` von `auditcore_dataprotection.web`. */\nexport function createDataProtectionRestPort(options: RestOptions): DataProtectionPort {\n const one = (id: string, action = ''): string => `/assessments/${segment(id)}${action}`\n return {\n profile: () => requestJson(options, '/profile'),\n register: () => requestJson(options, '/register'),\n checkRegister: (content) => requestJson(options, '/register/check', { content }),\n saveDraft: (content, expectedRevision) =>\n requestJson(options, '/register/draft', { content, expected_revision: expectedRevision }),\n releaseRegister: (expectedRevision) => requestJson(options, '/register/release', { expected_revision: expectedRevision }),\n exportRegister: (format, source) =>\n requestFile(options, '/register/export', { format, source }, `verarbeitungsverzeichnis.${format === 'markdown' ? 'md' : format}`),\n overview: () => requestJson(options, '/assessments'),\n startAssessment: (activityId) => requestJson(options, '/assessments', { activity_id: activityId }),\n assessment: (id) => requestJson(options, one(id)),\n calculate: (answers, scenarios) => requestJson(options, '/calculate', { answers, scenarios }),\n updateAssessment: (id, expectedRevision, survey) => requestJson(options, one(id), { expected_revision: expectedRevision, ...survey }),\n decide: (id, expectedRevision, decision) => requestJson(options, one(id, '/decide'), { expected_revision: expectedRevision, ...decision }),\n requestDpo: (id, expectedRevision, requestedFrom, requestedOn) =>\n requestJson(options, one(id, '/dpo-request'), {\n expected_revision: expectedRevision,\n requested_from: requestedFrom,\n requested_on: requestedOn,\n }),\n releaseAssessment: (id, expectedRevision) => requestJson(options, one(id, '/release'), { expected_revision: expectedRevision }),\n reassess: (id) => requestJson(options, one(id, '/reassess'), {}),\n exportAssessment: (id, format) => requestFile(options, one(id, '/export'), { format }, `dsfa.${format === 'markdown' ? 'md' : 'html'}`),\n }\n}\n","// Vertrag `dataprotection_ui/1` von `auditcore_dataprotection.web` (docs/ui/dataprotection-rest.md).\n// Feldnamen wie im JSON des Servers; Inhalte des Verzeichnisses mit den Feldnamen der Bibliothek.\n\nexport const CONTRACT = 'dataprotection_ui/1'\n\nexport type FieldKind = 'text' | 'flag' | 'count'\nexport type FieldValue = string | boolean | number | null\n\nexport interface RegisterColumn {\n key: string\n title: string\n reference: string\n kind: FieldKind\n required: boolean\n}\n\nexport interface QuestionView {\n key: string\n text: string\n reference: string\n /** `hart` = Muss-Kriterium, `punkt` = Kriterium WP 248, `fria` = Hochrisiko-KI. */\n effect: string\n explanation: string\n}\n\nexport interface BlockView {\n key: string\n title: string\n questions: QuestionView[]\n}\n\nexport interface LevelView {\n value: number\n label: string\n}\n\nexport interface MeasureView {\n key: string\n title: string\n category: string\n reduces_severity: number\n reduces_likelihood: number\n}\n\nexport interface KeyTitle {\n key: string\n title: string\n}\n\nexport interface DossierFieldView extends KeyTitle {\n kind: 'text' | 'date' | 'choice'\n required: boolean\n choices: KeyTitle[]\n}\n\nexport interface DataProtectionProfile {\n contract: string\n profile: { id: string; version: string; fingerprint: string; regime: string; regime_title: string; release_mode: string }\n register: { columns: RegisterColumn[] }\n screening: { blocks: BlockView[]; points_threshold: number }\n risk: {\n scale_min: number\n scale_max: number\n severity_levels: LevelView[]\n likelihood_levels: LevelView[]\n dimensions: KeyTitle[]\n measures: MeasureView[]\n bands: string[]\n method: string\n }\n decisions: KeyTitle[]\n dossier_fields: DossierFieldView[]\n}\n\n/** Hinweis der Vollständigkeitsprüfung; `subject` = `<Tätigkeits-ID>:<Feld>` oder `deckblatt:<Teil>`. */\nexport interface Issue {\n code: string\n message: string\n blocking: boolean\n subject: string\n}\n\nexport type Activity = Record<string, FieldValue> & { id?: string }\n\nexport interface Person {\n name?: string\n [field: string]: string | undefined\n}\n\nexport interface RegisterContent {\n deckblatt: { verantwortlicher?: Person; dsb?: Person; [part: string]: Person | undefined }\n referate: string[]\n taetigkeiten: Activity[]\n}\n\nexport type RegisterStatus = 'entwurf' | 'freigegeben' | 'abgeloest'\n\nexport interface VersionSummary {\n version: number\n status: RegisterStatus\n created_by: string\n created_at: string\n released_by: string | null\n released_at: string | null\n activities: number\n}\n\nexport interface VersionView extends VersionSummary {\n revision: number\n locked: boolean\n content: RegisterContent\n content_hash: string\n editors: string[]\n predecessor_version: number | null\n issues: Issue[]\n}\n\nexport interface RegisterState {\n contract: string\n draft: VersionView | null\n released: VersionView | null\n versions: VersionSummary[]\n}\n\nexport interface OverviewRow {\n id: string\n position: number\n name: string\n referat: string\n zweck: string\n vvt_version: number\n vvt_status: RegisterStatus\n dsfa: null | {\n id: string\n version: number\n status: AssessmentStatus\n entscheidung: string | null\n freigegeben_am: string | null\n pruefung_erforderlich: boolean\n }\n}\n\nexport type AnswerValue = 'ja' | 'nein' | 'unbekannt'\nexport type AssessmentStatus = 'entwurf' | 'dsb_beteiligung' | 'freigegeben' | 'abgeloest'\n\nexport interface AnswerInput {\n value: AnswerValue\n justification: string\n}\n\nexport interface ScenarioInput {\n dimension: string\n description: string\n severity: number\n likelihood: number\n measures: string[]\n residual_severity: number | null\n residual_likelihood: number | null\n residual_justification: string\n}\n\nexport interface ScenarioResult {\n index: number\n dimension_title: string\n description: string\n gross: number\n gross_band: string\n net: number\n net_band: string\n net_severity: number\n net_likelihood: number\n measure_titles: string[]\n explicit_residual: string[]\n}\n\nexport interface Proposal {\n profile: { id: string; version: string; fingerprint: string }\n recommendation: string\n recommendation_text: string\n reasoning: string\n consultation_required: boolean\n consultation_notice?: { status: string; text: string; final: boolean }\n issues: Issue[]\n screening: {\n outcome: 'pflicht' | 'keine_pflicht' | 'unvollstaendig'\n points: number\n points_threshold: number\n hard_triggers: string[]\n point_criteria: string[]\n fria_required: boolean | null\n unanswered: string[]\n unknown: string[]\n complete: boolean\n reasoning: string\n }\n risk: null | {\n gross_maximum: number\n net_maximum: number\n net_band: string\n gross_band?: string\n scenarios: ScenarioResult[]\n }\n}\n\nexport interface AssessmentSummary {\n id: string\n version: number\n status: AssessmentStatus\n decision: string | null\n created_at: string\n released_by: string | null\n released_at: string | null\n}\n\nexport interface AssessmentView extends AssessmentSummary {\n contract: string\n activity_id: string\n activity_name: string\n revision: number\n locked: boolean\n register_version: number\n profile: { id: string; version: string }\n answers: Record<string, AnswerInput>\n scenarios: ScenarioInput[]\n necessity: string\n proportionality: string\n dossier: Record<string, string>\n proposal: Proposal\n created_by: string\n updated_at: string\n editors: string[]\n deviation: boolean\n deviation_justification: string | null\n conditions: string[]\n decided_by: string | null\n decided_at: string | null\n dpo_requested_from: string | null\n dpo_requested_on: string | null\n release_open_points: string[]\n open_points: string[]\n release_blockers: string[]\n versions: AssessmentSummary[]\n}\n\n/** Erhebung einer Folgenabschätzung, wie sie `POST /assessments/{id}` erwartet. */\nexport interface SurveyInput {\n answers: Record<string, AnswerInput>\n scenarios: ScenarioInput[]\n necessity: string\n proportionality: string\n /** Nur Profile nach Schema 2 (EDSA-Vorlage); sonst weglassen. */\n dossier?: Record<string, string>\n}\n\nexport interface DecisionInput {\n decision: string\n justification: string\n conditions: string[]\n}\n\nexport type RegisterExportFormat = 'html' | 'markdown' | 'csv'\nexport type AssessmentExportFormat = 'html' | 'markdown'\n\nexport interface ExportedFile {\n blob: Blob\n filename: string\n mediaType: string\n}\n\n/**\n * Datenzugang der Komponenten. Die mitgelieferte Umsetzung ist\n * `createDataProtectionRestPort`; Anwendungen können eigene Ports übergeben.\n */\nexport interface DataProtectionPort {\n profile: () => Promise<DataProtectionProfile>\n register: () => Promise<RegisterState>\n checkRegister: (content: RegisterContent) => Promise<{ issues: Issue[] }>\n saveDraft: (content: RegisterContent, expectedRevision: number | null) => Promise<VersionView>\n releaseRegister: (expectedRevision: number) => Promise<VersionView>\n exportRegister: (format: RegisterExportFormat, source: 'draft' | 'released') => Promise<ExportedFile>\n overview: () => Promise<{ items: OverviewRow[] }>\n startAssessment: (activityId: string) => Promise<AssessmentView>\n assessment: (id: string) => Promise<AssessmentView>\n calculate: (answers: Record<string, AnswerInput>, scenarios: ScenarioInput[]) => Promise<Proposal>\n updateAssessment: (id: string, expectedRevision: number, survey: SurveyInput) => Promise<AssessmentView>\n decide: (id: string, expectedRevision: number, decision: DecisionInput) => Promise<AssessmentView>\n requestDpo: (id: string, expectedRevision: number, requestedFrom: string, requestedOn: string) => Promise<AssessmentView>\n releaseAssessment: (id: string, expectedRevision: number) => Promise<AssessmentView>\n reassess: (id: string) => Promise<AssessmentView>\n exportAssessment: (id: string, format: AssessmentExportFormat) => Promise<ExportedFile>\n}\n","import { RestError } from '@auditcore/common'\nimport { dataprotectionMessages, type DataProtectionKey, type DataProtectionTranslate } from './messages'\n\n/** Fehler einer Portanfrage: Code und Meldung des Servers bzw. `network_error` mit Status 0. */\nexport interface DataProtectionError {\n code: string\n message: string\n status: number\n}\n\nexport interface RequestHooks {\n onError?: (error: DataProtectionError) => void\n /** Meldung für Fehler ohne Serverantwort (Netz, Programmfehler). */\n networkMessage?: (message: string) => string\n}\n\nexport function asError(error: unknown, hooks: RequestHooks): DataProtectionError {\n if (error instanceof RestError) return { code: error.code, message: error.message, status: error.status }\n const raw = error instanceof Error ? error.message : String(error)\n return { code: 'network_error', message: hooks.networkMessage?.(raw) ?? raw, status: 0 }\n}\n\n/** Übersetzter Status (`entwurf`, `freigegeben`, …); unbekannte Werte bleiben stehen. */\nexport function statusLabel(t: DataProtectionTranslate, status: string): string {\n const key = `status_${status}`\n return key in dataprotectionMessages.de ? t(key as DataProtectionKey) : status\n}\n\nexport function prefixedLabel(t: DataProtectionTranslate, prefix: string, value: string, fallback = value): string {\n const key = `${prefix}_${value}`\n return key in dataprotectionMessages.de ? t(key as DataProtectionKey) : fallback\n}\n","// View-Logik des Verzeichnisses von Verarbeitungstätigkeiten, ohne Vue und ohne DOM.\n// Die Vollständigkeitsprüfung selbst rechnet die Bibliothek (Hinweise `Issue`);\n// hier werden die Hinweise nur Tätigkeiten und Feldern zugeordnet.\n\nimport type { BadgeTone } from '../base/types'\nimport type { Activity, RegisterColumn, FieldValue, Issue, Person, RegisterContent, RegisterState, VersionView } from './types'\n\nexport const NO_DEPARTMENT = ''\n\nexport interface ActivityGroup {\n department: string\n items: { index: number; activity: Activity }[]\n}\n\nexport interface Completeness {\n blocking: number\n hints: number\n}\n\n/** Tätigkeit ohne Kennung (die vergibt der Server beim Speichern). */\nexport function emptyActivity(columns: readonly RegisterColumn[], department: string): Activity {\n const activity: Activity = {}\n for (const column of columns) activity[column.key] = column.kind === 'text' ? '' : null\n activity.referat = department\n return activity\n}\n\nexport function emptyContent(): RegisterContent {\n return { deckblatt: { verantwortlicher: { name: '' }, dsb: { name: '' } }, referate: [], taetigkeiten: [] }\n}\n\n/** Tiefe Kopie (JSON-Daten), damit Eingaben den gelesenen Stand nie verändern. */\nexport function cloneContent(content: RegisterContent): RegisterContent {\n return JSON.parse(JSON.stringify(content)) as RegisterContent\n}\n\n/** Referate wie in der Quelle: konfigurierte zuerst, dann unbekannte; leere entfallen. */\nexport function groupByDepartment(content: RegisterContent, query = ''): ActivityGroup[] {\n const needle = query.trim().toLocaleLowerCase('de')\n const rows = content.taetigkeiten\n .map((activity, index) => ({ index, activity }))\n .filter(({ activity }) => !needle || activityText(activity).includes(needle))\n const named = (activity: Activity): string => (typeof activity.referat === 'string' ? activity.referat.trim() : '')\n const known = content.referate.filter((department) => rows.some(({ activity }) => named(activity) === department))\n const unknown = [...new Set(rows.map(({ activity }) => named(activity)))]\n .filter((department) => !known.includes(department))\n .sort((a, b) => a.localeCompare(b, 'de'))\n return [...known, ...unknown].map((department) => ({\n department,\n items: rows.filter(({ activity }) => named(activity) === department),\n }))\n}\n\nfunction activityText(activity: Activity): string {\n return Object.values(activity)\n .filter((value): value is string => typeof value === 'string')\n .join(' ')\n .toLocaleLowerCase('de')\n}\n\nfunction split(subject: string): [string, string] {\n const at = subject.lastIndexOf(':')\n return at < 0 ? [subject, ''] : [subject.slice(0, at), subject.slice(at + 1)]\n}\n\n/** Schlüssel einer Tätigkeit für die Zuordnung der Hinweise (Kennung, sonst Name wie in der Bibliothek). */\nexport function activityKey(activity: Activity): string {\n return String(activity.id || activity.name || '')\n}\n\nexport function issuesFor(issues: readonly Issue[], activity: Activity): Issue[] {\n const key = activityKey(activity)\n return issues.filter((issue) => split(issue.subject)[0] === key)\n}\n\nexport function fieldIssues(issues: readonly Issue[], activity: Activity, field: string): Issue[] {\n const key = activityKey(activity)\n return issues.filter((issue) => {\n const [subject, name] = split(issue.subject)\n return subject === key && name === field\n })\n}\n\n/** Hinweise zum Deckblatt (Verantwortlicher, DSB). */\nexport function coverIssues(issues: readonly Issue[]): Issue[] {\n return issues.filter((issue) => split(issue.subject)[0] === 'deckblatt')\n}\n\nexport function completeness(issues: readonly Issue[]): Completeness {\n const blocking = issues.filter((issue) => issue.blocking).length\n return { blocking, hints: issues.length - blocking }\n}\n\nexport function completenessTone(value: Completeness): BadgeTone {\n if (value.blocking > 0) return 'danger'\n return value.hints > 0 ? 'warning' : 'success'\n}\n\nexport function statusTone(status: string): BadgeTone {\n if (status === 'freigegeben') return 'success'\n if (status === 'entwurf' || status === 'dsb_beteiligung') return 'warning'\n return 'neutral'\n}\n\n/** Angezeigte Fassung: offener Entwurf vor Freigabe (dort wird gearbeitet). */\nexport function currentVersion(state: RegisterState | null, prefer: 'draft' | 'released' = 'draft'): VersionView | null {\n if (!state) return null\n return prefer === 'released' ? state.released ?? state.draft : state.draft ?? state.released\n}\n\nexport function withField(content: RegisterContent, index: number, key: string, value: FieldValue): RegisterContent {\n const next = cloneContent(content)\n const activity = next.taetigkeiten[index]\n if (activity) activity[key] = value\n return next\n}\n\nexport function withActivity(content: RegisterContent, activity: Activity): RegisterContent {\n const next = cloneContent(content)\n next.taetigkeiten.push(activity)\n return next\n}\n\nexport function withoutActivity(content: RegisterContent, index: number): RegisterContent {\n const next = cloneContent(content)\n next.taetigkeiten.splice(index, 1)\n return next\n}\n\nexport function withPerson(content: RegisterContent, part: 'verantwortlicher' | 'dsb', person: Person): RegisterContent {\n const next = cloneContent(content)\n next.deckblatt[part] = { ...next.deckblatt[part], ...person }\n return next\n}\n\nexport function withDepartments(content: RegisterContent, departments: readonly string[]): RegisterContent {\n const next = cloneContent(content)\n next.referate = [...new Set(departments.map((d) => d.trim()).filter(Boolean))]\n return next\n}\n\n/** Anzeigewert eines Feldes; Wahrheitswerte und Leerwerte über die Texte der Komponente. */\nexport function displayValue(value: FieldValue | undefined, texts: { yes: string; no: string; empty: string }): string {\n if (value === true) return texts.yes\n if (value === false) return texts.no\n if (value === null || value === undefined || value === '') return texts.empty\n return String(value)\n}\n\n/** Eingabe eines Zahlfeldes: leer → null, sonst nichtnegative ganze Zahl; ungültig → undefined. */\nexport function parseCount(text: string): number | null | undefined {\n const trimmed = text.trim()\n if (!trimmed) return null\n if (!/^\\d+$/.test(trimmed)) return undefined\n return Number(trimmed)\n}\n\n/** Vier-Augen-Prinzip vorab anzeigen: wer den Entwurf bearbeitet hat, kann ihn nicht freigeben. */\nexport function editedBy(version: VersionView | null, actor: string): boolean {\n return !!actor && !!version && version.editors.includes(actor)\n}\n","// View-Logik der Datenschutz-Folgenabschätzung, ohne Vue und ohne DOM.\n// Schwellwertanalyse, Brutto-/Nettorisiko und Vorschlag rechnet ausschließlich\n// die Bibliothek (Port `calculate` bzw. gespeicherter Vorschlag); hier werden\n// nur Eingaben verwaltet und Ergebnisse für die Anzeige eingeordnet.\n\nimport type { BadgeTone } from '../base/types'\nimport type {\n AnswerInput,\n AnswerValue,\n AssessmentView,\n BlockView,\n LevelView,\n DataProtectionProfile,\n Proposal,\n ScenarioInput,\n SurveyInput,\n} from './types'\n\nexport const ANSWER_VALUES: readonly AnswerValue[] = ['ja', 'nein', 'unbekannt']\n\nexport interface TabItem {\n key: string\n label: string\n}\n\nexport interface BlockProgress {\n answered: number\n total: number\n yes: number\n}\n\nfunction residualFrom(raw: Partial<ScenarioInput>): Pick<ScenarioInput, 'residual_severity' | 'residual_likelihood' | 'residual_justification'> {\n return {\n residual_severity: raw.residual_severity ?? null,\n residual_likelihood: raw.residual_likelihood ?? null,\n residual_justification: raw.residual_justification ?? '',\n }\n}\n\nfunction scenarioFrom(raw: Partial<ScenarioInput>, profile: DataProtectionProfile): ScenarioInput {\n const middle = Math.ceil((profile.risk.scale_min + profile.risk.scale_max) / 2)\n return {\n dimension: raw.dimension ?? profile.risk.dimensions[0]?.key ?? '',\n description: raw.description ?? '',\n severity: raw.severity ?? middle,\n likelihood: raw.likelihood ?? middle,\n measures: [...(raw.measures ?? [])],\n ...residualFrom(raw),\n }\n}\n\nexport function emptyScenario(profile: DataProtectionProfile): ScenarioInput {\n return scenarioFrom({}, profile)\n}\n\n/** Bearbeitbare Kopie der gespeicherten Erhebung. */\nexport function surveyFrom(view: AssessmentView, profile: DataProtectionProfile): SurveyInput {\n const answers: Record<string, AnswerInput> = {}\n for (const [key, answer] of Object.entries(view.answers)) answers[key] = { value: answer.value, justification: answer.justification ?? '' }\n return {\n answers,\n scenarios: view.scenarios.map((scenario) => scenarioFrom(scenario, profile)),\n necessity: view.necessity,\n proportionality: view.proportionality,\n dossier: { ...view.dossier },\n }\n}\n\nexport function sameSurvey(a: SurveyInput | null, b: SurveyInput | null): boolean {\n return JSON.stringify(a) === JSON.stringify(b)\n}\n\nexport function answerOf(survey: SurveyInput, key: string): AnswerValue | null {\n return survey.answers[key]?.value ?? null\n}\n\nexport function withAnswer(survey: SurveyInput, key: string, value: AnswerValue): SurveyInput {\n const previous = survey.answers[key]\n return { ...survey, answers: { ...survey.answers, [key]: { value, justification: previous?.justification ?? '' } } }\n}\n\nexport function withJustification(survey: SurveyInput, key: string, justification: string): SurveyInput {\n const previous = survey.answers[key] ?? { value: 'unbekannt' as AnswerValue, justification: '' }\n return { ...survey, answers: { ...survey.answers, [key]: { ...previous, justification } } }\n}\n\nexport function blockProgress(block: BlockView, survey: SurveyInput): BlockProgress {\n const values = block.questions.map((question) => answerOf(survey, question.key))\n return {\n answered: values.filter((value) => value === 'ja' || value === 'nein').length,\n total: values.length,\n yes: values.filter((value) => value === 'ja').length,\n }\n}\n\nexport function withScenario(survey: SurveyInput, index: number, scenario: ScenarioInput): SurveyInput {\n const scenarios = survey.scenarios.slice()\n scenarios[index] = scenario\n return { ...survey, scenarios }\n}\n\nexport function addScenario(survey: SurveyInput, profile: DataProtectionProfile): SurveyInput {\n return { ...survey, scenarios: [...survey.scenarios, emptyScenario(profile)] }\n}\n\nexport function removeScenario(survey: SurveyInput, index: number): SurveyInput {\n return { ...survey, scenarios: survey.scenarios.filter((_, position) => position !== index) }\n}\n\nexport function toggleMeasure(scenario: ScenarioInput, measure: string): ScenarioInput {\n const measures = scenario.measures.includes(measure)\n ? scenario.measures.filter((key) => key !== measure)\n : [...scenario.measures, measure]\n return { ...scenario, measures }\n}\n\nexport function levelLabel(levels: readonly LevelView[], value: number | null): string {\n if (value === null) return ''\n return levels.find((level) => level.value === value)?.label ?? String(value)\n}\n\n/** Stufe eines Risikos nach Rang im Profil: höchste Stufe rot, zweithöchste gelb. */\nexport function bandTone(band: string | undefined, bands: readonly string[]): BadgeTone {\n const rank = band ? bands.indexOf(band) : -1\n if (rank <= 0) return 'neutral'\n if (rank === bands.length - 1) return 'danger'\n return rank === bands.length - 2 ? 'warning' : 'success'\n}\n\nconst RECOMMENDATION_TONES: Readonly<Record<string, BadgeTone>> = {\n freigabe: 'success',\n freigabe_mit_auflagen: 'warning',\n konsultation_aufsichtsbehoerde: 'danger',\n verworfen: 'danger',\n nur_schwellwert: 'accent',\n}\n\nexport function recommendationTone(recommendation: string | null | undefined): BadgeTone {\n return (recommendation && RECOMMENDATION_TONES[recommendation]) || 'neutral'\n}\n\nexport function screeningTone(outcome: Proposal['screening']['outcome']): BadgeTone {\n if (outcome === 'pflicht') return 'warning'\n return outcome === 'keine_pflicht' ? 'success' : 'neutral'\n}\n\nexport function decisionTitle(profile: DataProtectionProfile, key: string | null | undefined): string {\n if (!key) return ''\n return profile.decisions.find((decision) => decision.key === key)?.title ?? key\n}\n\n/** Abweichung vom Vorschlag verlangt eine Begründung (Bibliothek prüft Mindestlänge). */\nexport function isDeviation(proposal: Proposal, decision: string): boolean {\n return !!decision && proposal.recommendation !== 'unvollstaendig' && decision !== proposal.recommendation\n}\n\n/** Auflagen: eine je Zeile, leere Zeilen entfallen. */\nexport function parseConditions(text: string): string[] {\n return text.split('\\n').map((line) => line.trim()).filter(Boolean)\n}\n\n/** Vier-Augen-Prinzip vorab anzeigen; maßgeblich bleibt die Prüfung des Servers. */\nexport function mayRelease(view: AssessmentView, actor: string): boolean {\n return !view.locked && !(actor && view.editors.includes(actor))\n}\n\n/** Eingabefelder der Entscheidung, vorbelegt aus der Fassung bzw. dem Vorschlag. */\nexport interface DecisionForm {\n decision: string\n justification: string\n conditions: string\n}\n\nexport function decisionForm(view: AssessmentView, proposal: Proposal): DecisionForm {\n return {\n decision: view.decision ?? (proposal.recommendation === 'unvollstaendig' ? '' : proposal.recommendation),\n justification: view.deviation_justification ?? '',\n conditions: view.conditions.join('\\n'),\n }\n}\n\n/** Freigabe möglich: Vier-Augen-Vorprüfung, keine ungespeicherten Eingaben, keine Sperrgründe. */\nexport function canReleaseAssessment(view: AssessmentView, actor: string, dirty: boolean): boolean {\n return mayRelease(view, actor) && !dirty && !view.release_blockers.length\n}\n","/**\n * Exporte des Verzeichnisses aus dem angezeigten Stand, ohne Vue: CSV mit\n * Formelschutz (`toCsv` aus @auditcore/common, Verträge `csv-cell`/`csv-document`),\n * Markdown und eigenständiges HTML als Druckansicht („Als PDF speichern“).\n */\nimport { escapeHtml, toCsv } from '@auditcore/common'\nimport { escapeMarkdown, exportFilename } from '../synopsis/exporters'\nimport { displayValue, groupByDepartment } from './registerView'\nimport type { RegisterColumn, FieldValue, Issue, RegisterContent } from './types'\n\nexport interface ExportTexts {\n yes: string\n no: string\n empty: string\n title: string\n department: string\n withoutDepartment: string\n controller: string\n dpo: string\n version: string\n issues: string\n noIssues: string\n required: string\n hint: string\n field: string\n content: string\n generated: string\n}\n\nexport interface RegisterExportInput {\n content: RegisterContent\n columns: readonly RegisterColumn[]\n issues: readonly Issue[]\n /** Zeile unter dem Titel, z. B. „Fassung 2 – Entwurf“. */\n versionLabel: string\n texts: ExportTexts\n lang?: string\n generatedAt?: string\n}\n\nfunction cell(value: FieldValue | undefined, texts: ExportTexts): string {\n return displayValue(value, texts)\n}\n\nexport function registerCsv(input: RegisterExportInput): string {\n const { content, columns, texts } = input\n const keys = ['referat', ...columns.map((column) => column.key).filter((key) => key !== 'referat')]\n const titles = keys.map((key) => columns.find((column) => column.key === key)?.title ?? texts.department)\n const rows = content.taetigkeiten.map((activity) => keys.map((key) => {\n const value = activity[key]\n return typeof value === 'boolean' ? (value ? texts.yes : texts.no) : value\n }))\n return toCsv([titles, ...rows])\n}\n\nfunction issueLine(issue: Issue, texts: ExportTexts): string {\n return `${issue.blocking ? texts.required : texts.hint}: ${issue.message}`\n}\n\nexport function registerMarkdown(input: RegisterExportInput): string {\n const { content, columns, issues, texts } = input\n const md = (value: string): string => escapeMarkdown(value.replace(/\\s+/g, ' ').trim())\n const lines = [`# ${texts.title}`, '', md(input.versionLabel), '']\n lines.push(`- ${texts.controller}: ${md(content.deckblatt.verantwortlicher?.name || texts.empty)}`)\n lines.push(`- ${texts.dpo}: ${md(content.deckblatt.dsb?.name || texts.empty)}`)\n for (const group of groupByDepartment(content)) {\n lines.push('', `## ${md(group.department || texts.withoutDepartment)}`)\n for (const { activity } of group.items) {\n lines.push('', `### ${md(cell(activity.name, texts))}`, '', `| ${texts.field} | ${texts.content} |`, '|---|---|')\n for (const column of columns) lines.push(`| ${md(column.title)} | ${md(cell(activity[column.key], texts))} |`)\n }\n }\n lines.push('', `## ${texts.issues}`, '')\n lines.push(...(issues.length ? issues.map((issue) => `- ${md(issueLine(issue, texts))}`) : [`- ${texts.noIssues}`]))\n return lines.join('\\n') + '\\n'\n}\n\nconst PRINT_CSS = `body{font:11pt/1.4 system-ui,sans-serif;color:#111;margin:2rem}\nh1{font-size:16pt}h2{font-size:13pt;margin-top:1.5rem}h3{font-size:11pt;margin:1rem 0 .25rem}\ntable{border-collapse:collapse;width:100%;margin-bottom:.75rem}th,td{border:1px solid #999;padding:.25rem .4rem;text-align:left;vertical-align:top}\nth{width:32%;background:#f0f0f0}.issues li.required{color:#8a1c12}footer{margin-top:2rem;font-size:9pt;color:#555}\n@media print{h3{break-after:avoid}table{break-inside:auto}tr{break-inside:avoid}}`\n\nconst escape = (value: string): string => escapeHtml(value)\n\nfunction coverHtml(input: RegisterExportInput): string[] {\n const { content, texts } = input\n return [\n `<h1>${escape(texts.title)}</h1>`, `<p>${escape(input.versionLabel)}</p>`, '<table>',\n `<tr><th scope=\"row\">${escape(texts.controller)}</th><td>${escape(content.deckblatt.verantwortlicher?.name || texts.empty)}</td></tr>`,\n `<tr><th scope=\"row\">${escape(texts.dpo)}</th><td>${escape(content.deckblatt.dsb?.name || texts.empty)}</td></tr></table>`,\n ]\n}\n\nfunction activitiesHtml(input: RegisterExportInput): string[] {\n const { content, columns, texts } = input\n const parts: string[] = []\n for (const group of groupByDepartment(content)) {\n parts.push(`<h2>${escape(group.department || texts.withoutDepartment)}</h2>`)\n for (const { activity } of group.items) {\n parts.push(`<h3>${escape(cell(activity.name, texts))}</h3><table>`)\n for (const column of columns) {\n parts.push(`<tr><th scope=\"row\">${escape(column.title)}</th><td>${escape(cell(activity[column.key], texts))}</td></tr>`)\n }\n parts.push('</table>')\n }\n }\n return parts\n}\n\nfunction issuesHtml({ issues, texts }: RegisterExportInput): string[] {\n const items = issues.length\n ? issues.map((issue) => `<li class=\"${issue.blocking ? 'required' : 'hint'}\">${escape(issueLine(issue, texts))}</li>`)\n : [`<li>${escape(texts.noIssues)}</li>`]\n return [`<h2>${escape(texts.issues)}</h2><ul class=\"issues\">`, ...items, '</ul>']\n}\n\nexport function registerHtml(input: RegisterExportInput): string {\n const { texts } = input\n const parts = [...coverHtml(input), ...activitiesHtml(input), ...issuesHtml(input)]\n if (input.generatedAt) parts.push(`<footer>${escape(texts.generated)} ${escape(input.generatedAt)}</footer>`)\n return `<!DOCTYPE html><html lang=\"${escape(input.lang ?? 'de')}\"><head><meta charset=\"utf-8\"><title>${escape(texts.title)}</title>` +\n `<style>${PRINT_CSS}</style></head><body>${parts.join('')}</body></html>`\n}\n\nexport function registerFilename(version: number | null, extension: string): string {\n return exportFilename(`Verarbeitungsverzeichnis${version ? `_Fassung_${version}` : ''}`, extension)\n}\n","// Zustandsautomat von <flowaudit-vvt> (Vue und React): Laden, Bearbeiten,\n// Vollständigkeitsprüfung, Speichern, Freigeben, Export.\n\nimport { createDelay, createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport { registerCsv, registerFilename, registerHtml, registerMarkdown, type ExportTexts } from './exporters'\nimport type { DataProtectionTranslate } from './messages'\nimport {\n cloneContent,\n currentVersion,\n editedBy,\n emptyActivity,\n emptyContent,\n withActivity,\n withDepartments,\n withField,\n withoutActivity,\n withPerson,\n} from './registerView'\nimport { asError, statusLabel, type DataProtectionError, type RequestHooks } from './requests'\nimport type { DataProtectionPort, DataProtectionProfile, FieldValue, Issue, Person, RegisterContent, RegisterState, VersionView } from './types'\n\nexport type VvtExportFormat = 'print' | 'markdown' | 'csv'\n\nexport interface VvtExport {\n format: VvtExportFormat\n filename: string\n mimeType: string\n content: string\n}\n\nexport interface VvtHooks extends RequestHooks {\n onSaved?: (version: VersionView) => void\n onReleased?: (version: VersionView) => void\n /** Wartezeit der Vollständigkeitsprüfung nach einer Eingabe (ms). */\n checkDelay?: number\n}\n\nexport interface VvtData extends RequestState<DataProtectionError> {\n profile: DataProtectionProfile | null\n register: RegisterState | null\n showing: 'draft' | 'released'\n working: RegisterContent | null\n checked: Issue[] | null\n /** Ausgewählte Tätigkeit (Index in `content.taetigkeiten`). */\n selected: number | null\n history: boolean\n}\n\n/** Abgeleitete Werte eines Stands (reine Funktion, von beiden Oberflächen genutzt). */\nexport interface VvtView {\n version: VersionView | null\n editing: boolean\n content: RegisterContent\n dirty: boolean\n issues: Issue[]\n}\n\nfunction editingOf(state: VvtData): boolean {\n return state.working !== null && state.showing === 'draft'\n}\n\n/** Inhalt als Grundlage des Bearbeitens: offener Entwurf, sonst freigegebene Fassung. */\nfunction editBase(register: RegisterState | null): RegisterContent {\n return register?.draft?.content ?? register?.released?.content ?? emptyContent()\n}\n\nfunction shownContent(state: VvtData, version: VersionView | null, editing: boolean): RegisterContent {\n if (editing && state.working) return state.working\n return version?.content ?? emptyContent()\n}\n\nfunction shownIssues(state: VvtData, version: VersionView | null, editing: boolean): Issue[] {\n if (editing && state.checked) return state.checked\n return version?.issues ?? []\n}\n\nexport function vvtView(state: VvtData): VvtView {\n const version = currentVersion(state.register, state.showing)\n const editing = editingOf(state)\n const dirty = state.working !== null && JSON.stringify(state.working) !== JSON.stringify(editBase(state.register))\n return { version, editing, content: shownContent(state, version, editing), dirty, issues: shownIssues(state, version, editing) }\n}\n\n/** Vier-Augen-Hinweis: die angemeldete Person hat den offenen Entwurf bearbeitet. */\nexport function vvtFourEyes(state: VvtData, actor: string): boolean {\n return editedBy(state.register?.draft ?? null, actor)\n}\n\nexport function vvtVersionLabel(t: DataProtectionTranslate, version: VersionView | null): string {\n return version ? t('versionLabel', { version: version.version, status: statusLabel(t, version.status) }) : t('noVersion')\n}\n\n/** Beschriftungen der Exporte (Druckansicht, Markdown, CSV). */\nexport function vvtExportTexts(t: DataProtectionTranslate): ExportTexts {\n return {\n yes: t('yes'), no: t('no'), empty: t('empty'), title: t('vvtTitle'), department: t('colDepartment'),\n withoutDepartment: t('withoutDepartment'), controller: t('controller'), dpo: t('dpo'), version: t('colVersion'),\n issues: t('issuesExport'), noIssues: t('noIssues'), required: t('blockingLabel'), hint: t('hintLabel'),\n field: t('field'), content: t('content'), generated: t('generated'),\n }\n}\n\nconst MIME: Readonly<Record<VvtExportFormat, [string, string]>> = {\n print: ['text/html;charset=utf-8', 'html'],\n markdown: ['text/markdown;charset=utf-8', 'md'],\n csv: ['text/csv;charset=utf-8', 'csv'],\n}\n\nexport function buildVvtExport(state: VvtData, format: VvtExportFormat, t: DataProtectionTranslate, lang: string): VvtExport {\n const view = vvtView(state)\n const input = {\n content: view.content,\n columns: state.profile?.register.columns ?? [],\n issues: view.issues,\n versionLabel: vvtVersionLabel(t, view.version),\n texts: vvtExportTexts(t),\n lang,\n }\n const [mimeType, extension] = MIME[format]\n const render = { csv: registerCsv, markdown: registerMarkdown, print: registerHtml }[format]\n const text = render({ ...input, generatedAt: new Date().toLocaleString(lang) })\n return { format, filename: registerFilename(view.version?.version ?? null, extension), mimeType, content: text }\n}\n\nconst INITIAL: VvtData = {\n ...IDLE, profile: null, register: null, showing: 'draft', working: null, checked: null, selected: null, history: false,\n}\n\nfunction reset(store: Store<VvtData>, register: RegisterState, editable: boolean): void {\n store.set({\n register,\n checked: null,\n showing: register.draft ? 'draft' : 'released',\n working: editable && register.draft ? cloneContent(register.draft.content) : null,\n })\n}\n\ntype Run = ReturnType<typeof createRunner<DataProtectionPort, DataProtectionError, VvtData>>\n\n/** Eingaben im Entwurf: Inhalt ändern, Prüfung der Bibliothek anstoßen, Ansicht wechseln. */\nfunction editActions(store: Store<VvtData>, run: Run, hooks: VvtHooks) {\n const delay = createDelay(() => hooks.checkDelay ?? 400)\n\n async function check(): Promise<void> {\n const current = store.get().working\n if (!current) return\n const result = await run('check', (active) => active.checkRegister(current))\n if (result && store.get().working === current) store.set({ checked: result.issues })\n }\n\n function update(next: RegisterContent): void {\n store.set({ working: next })\n delay.schedule(() => void check())\n }\n\n function show(which: 'draft' | 'released'): void {\n const draft = store.get().register?.draft\n store.set((state) => ({ showing: which, working: which === 'draft' && draft && !state.working ? cloneContent(draft.content) : state.working }))\n }\n\n function startDraft(): void {\n const register = store.get().register\n if (register?.draft) return show('draft')\n store.set({ working: cloneContent(register?.released?.content ?? emptyContent()), showing: 'draft', checked: null })\n }\n\n function discard(): void {\n const draft = store.get().register?.draft\n store.set({ working: draft ? cloneContent(draft.content) : null, checked: null })\n }\n\n return { check, update, show, startDraft, discard, dispose: delay.cancel }\n}\n\n/** Änderungen am Inhalt über die reinen Funktionen aus `registerView`. */\nfunction contentActions(store: Store<VvtData>, update: (next: RegisterContent) => void) {\n const content = (): RegisterContent => vvtView(store.get()).content\n return {\n select: (index: number | null) => store.set({ selected: index }),\n toggleHistory: () => store.set((state) => ({ history: !state.history })),\n changeField(key: string, value: FieldValue): void {\n const selected = store.get().selected\n if (selected !== null) update(withField(content(), selected, key, value))\n },\n addActivity(department: string): void {\n const columns = store.get().profile?.register.columns ?? []\n update(withActivity(content(), emptyActivity(columns, department)))\n store.set({ selected: content().taetigkeiten.length - 1 })\n },\n removeActivity(): void {\n const selected = store.get().selected\n if (selected === null) return\n update(withoutActivity(content(), selected))\n store.set({ selected: content().taetigkeiten.length ? 0 : null })\n },\n changePerson: (part: 'verantwortlicher' | 'dsb', person: Person) => update(withPerson(content(), part, person)),\n changeDepartments: (departments: readonly string[]) => update(withDepartments(content(), departments)),\n }\n}\n\n/** Speichern und Freigeben über den Port; danach wird der Stand neu gelesen. */\nfunction writeActions(store: Store<VvtData>, run: Run, hooks: VvtHooks, t: () => DataProtectionTranslate) {\n async function reload(): Promise<void> {\n const register = await run('load', (active) => active.register())\n if (register) reset(store, register, true)\n }\n\n async function save(): Promise<VersionView | null> {\n const current = store.get().working\n if (!current) return null\n const expected = store.get().register?.draft?.revision ?? null\n const saved = await run('save', (active) => active.saveDraft(current, expected))\n if (!saved) return null\n await reload()\n store.set({ notice: t()('saved', { version: saved.version, revision: saved.revision }) })\n hooks.onSaved?.(saved)\n return saved\n }\n\n async function release(): Promise<VersionView | null> {\n const draft = store.get().register?.draft\n if (!draft) return null\n const released = await run('release', (active) => active.releaseRegister(draft.revision))\n if (!released) return null\n await reload()\n store.set({ notice: t()('released', { version: released.version }) })\n hooks.onReleased?.(released)\n return released\n }\n\n return { save, release }\n}\n\nexport interface VvtControllerOptions extends VvtHooks {\n port: () => DataProtectionPort | null\n t: () => DataProtectionTranslate\n}\n\nexport function createVvtController(options: VvtControllerOptions) {\n const store = createStore<VvtData>(INITIAL)\n const hooks: VvtHooks = { ...options, networkMessage: options.networkMessage ?? ((message) => options.t()('networkError', { message })) }\n const run = createRunner(store, options.port, (error) => asError(error, hooks), hooks.onError)\n const edit = editActions(store, run, hooks)\n\n async function load(editable: boolean): Promise<void> {\n const loaded = await run('load', async (active) => Promise.all([active.profile(), active.register()]))\n if (!loaded) return\n store.set({ profile: loaded[0] })\n reset(store, loaded[1], editable)\n if (store.get().selected === null && vvtView(store.get()).content.taetigkeiten.length) store.set({ selected: 0 })\n }\n\n function exportAs(format: VvtExportFormat, lang: string): VvtExport {\n const payload = buildVvtExport(store.get(), format, options.t(), lang)\n store.set({ notice: options.t()('exported', { filename: payload.filename }) })\n return payload\n }\n\n return {\n store,\n load,\n exportAs,\n setNotice: (notice: string) => store.set({ notice }),\n ...edit,\n ...contentActions(store, edit.update),\n ...writeActions(store, run, hooks, options.t),\n }\n}\n\nexport type VvtController = ReturnType<typeof createVvtController>\n","// Zustandsautomat von <flowaudit-dsfa> (Vue und React): Übersicht, Erhebung mit\n// Vorschau der Bibliothek, Entscheidung, DSB-Stellungnahme, Freigabe, Neubewertung.\n\nimport { saveFile } from '@auditcore/common/browser'\nimport { createDelay, createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport { sameSurvey, surveyFrom, type TabItem } from './dsfaView'\nimport type { DataProtectionKey, DataProtectionTranslate } from './messages'\nimport { asError, type DataProtectionError, type RequestHooks } from './requests'\nimport type {\n AssessmentExportFormat,\n AssessmentView,\n DataProtectionPort,\n DataProtectionProfile,\n DecisionInput,\n OverviewRow,\n Proposal,\n SurveyInput,\n} from './types'\n\nexport type DsfaStep = 'saved' | 'decided' | 'dpo' | 'released' | 'started'\nexport type DsfaTab = 'screening' | 'risk' | 'result'\n\nexport interface DsfaHooks extends RequestHooks {\n onChanged?: (step: DsfaStep, view: AssessmentView) => void\n /** Wartezeit der Vorschau nach einer Eingabe (ms). */\n previewDelay?: number\n}\n\nexport interface DsfaData extends RequestState<DataProtectionError> {\n profile: DataProtectionProfile | null\n rows: OverviewRow[]\n view: AssessmentView | null\n survey: SurveyInput | null\n preview: Proposal | null\n tab: DsfaTab\n}\n\nexport interface DsfaDerived {\n dirty: boolean\n proposal: Proposal | null\n /** Vorschau anzeigen: ungespeicherte Eingaben und eine berechnete Vorschau liegen vor. */\n showPreview: boolean\n}\n\nexport function dsfaDerived(state: DsfaData): DsfaDerived {\n const saved = state.view && state.profile ? surveyFrom(state.view, state.profile) : null\n const dirty = !!state.survey && !sameSurvey(state.survey, saved)\n const proposal = dirty && state.preview ? state.preview : state.view?.proposal ?? null\n return { dirty, proposal, showPreview: dirty && !!state.preview }\n}\n\n/** Nur lesen: nicht bearbeitbar oder gesperrte (freigegebene) Fassung. */\nexport function dsfaReadonly(state: DsfaData, editable: boolean): boolean {\n return !editable || !!state.view?.locked\n}\n\nexport function dsfaTabs(t: DataProtectionTranslate): TabItem[] {\n return [\n { key: 'screening', label: t('stepScreening') },\n { key: 'risk', label: t('stepRisk') },\n { key: 'result', label: t('stepResult') },\n ]\n}\n\nexport const DSFA_NOTICES: Readonly<Record<DsfaStep, DataProtectionKey>> = {\n saved: 'assessmentSaved', decided: 'decisionSaved', dpo: 'dpoSaved', released: 'assessmentReleased', started: 'assessmentSaved',\n}\n\nconst INITIAL: DsfaData = { ...IDLE, profile: null, rows: [], view: null, survey: null, preview: null, tab: 'screening' }\n\ntype Run = ReturnType<typeof createRunner<DataProtectionPort, DataProtectionError, DsfaData>>\n\nfunction show(store: Store<DsfaData>, next: AssessmentView): void {\n const profile = store.get().profile\n store.set({ view: next, preview: null, survey: profile ? surveyFrom(next, profile) : null })\n}\n\n/** Lesen: Profil und Übersicht, einzelne Abschätzung, Vorschau der Bibliothek. */\nfunction readActions(store: Store<DsfaData>, run: Run, hooks: DsfaHooks) {\n const delay = createDelay(() => hooks.previewDelay ?? 400)\n\n async function load(): Promise<void> {\n const loaded = await run('load', async (active) => Promise.all([active.profile(), active.overview()]))\n if (loaded) store.set({ profile: loaded[0], rows: loaded[1].items })\n }\n\n async function open(assessmentId: string): Promise<void> {\n const found = await run('open', (active) => active.assessment(assessmentId))\n if (found) show(store, found)\n }\n\n async function openActivity(activityId: string): Promise<void> {\n const row = store.get().rows.find((entry) => entry.id === activityId)\n if (row?.dsfa) await open(row.dsfa.id)\n }\n\n async function calculate(): Promise<void> {\n const current = store.get().survey\n if (!current) return\n const result = await run('preview', (active) => active.calculate(current.answers, current.scenarios))\n if (result && store.get().survey === current) store.set({ preview: result })\n }\n\n function edit(next: SurveyInput): void {\n store.set({ survey: next })\n delay.schedule(() => void calculate())\n }\n\n return { load, open, openActivity, calculate, edit, dispose: delay.cancel }\n}\n\ntype Task = (active: DataProtectionPort, current: AssessmentView) => Promise<AssessmentView>\n\n/** Schreiben: jede Aktion ersetzt die angezeigte Fassung und liest die Übersicht neu. */\nfunction writeActions(store: Store<DsfaData>, run: Run, changed: (step: DsfaStep, view: AssessmentView) => void) {\n async function refreshRows(): Promise<void> {\n const overview = await run('overview', (active) => active.overview())\n if (overview) store.set({ rows: overview.items })\n }\n\n async function step(kind: DsfaStep, task: Task): Promise<AssessmentView | null> {\n const current = store.get().view\n if (!current) return null\n const next = await run(kind, (active) => task(active, current))\n if (!next) return null\n show(store, next)\n changed(kind, next)\n await refreshRows()\n return next\n }\n\n async function start(activityId: string): Promise<void> {\n const created = await run('started', (active) => active.startAssessment(activityId))\n if (!created) return\n show(store, created)\n changed('started', created)\n await refreshRows()\n }\n\n function payload(current: AssessmentView): SurveyInput {\n const { survey, profile } = store.get()\n const data = survey ?? surveyFrom(current, profile as DataProtectionProfile)\n return profile?.dossier_fields.length ? data : { ...data, dossier: undefined }\n }\n\n return {\n start,\n save: () => step('saved', (active, current) => active.updateAssessment(current.id, current.revision, payload(current))),\n decide: (decision: DecisionInput) => step('decided', (active, current) => active.decide(current.id, current.revision, decision)),\n requestDpo: (from: string, on: string) => step('dpo', (active, current) => active.requestDpo(current.id, current.revision, from, on)),\n release: () => step('released', (active, current) => active.releaseAssessment(current.id, current.revision)),\n reassess: () => step('started', (active, current) => active.reassess(current.id)),\n }\n}\n\nexport interface DsfaControllerOptions extends DsfaHooks {\n port: () => DataProtectionPort | null\n t: () => DataProtectionTranslate\n}\n\nexport function createDsfaController(options: DsfaControllerOptions) {\n const store = createStore<DsfaData>(INITIAL)\n const hooks: DsfaHooks = { ...options, networkMessage: options.networkMessage ?? ((message) => options.t()('networkError', { message })) }\n const run = createRunner(store, options.port, (error) => asError(error, hooks), hooks.onError)\n const changed = (step: DsfaStep, view: AssessmentView): void => {\n store.set({ notice: options.t()(DSFA_NOTICES[step], { revision: view.revision, version: view.version }) })\n hooks.onChanged?.(step, view)\n }\n\n async function exportReport(format: AssessmentExportFormat): Promise<boolean> {\n const current = store.get().view\n if (!current) return false\n const file = await run('export', (active) => active.exportAssessment(current.id, format))\n if (!file) return false\n if (typeof URL.createObjectURL === 'function') saveFile(file)\n return true\n }\n\n /** Beim Setzen eines Ports: Profil und Übersicht laden, optional eine Tätigkeit öffnen. */\n async function connect(activityId: string): Promise<void> {\n await read.load()\n if (activityId) await read.openActivity(activityId)\n }\n\n const read = readActions(store, run, hooks)\n return {\n store,\n connect,\n exportReport,\n setTab: (tab: string) => store.set({ tab: tab as DsfaTab }),\n setNotice: (notice: string) => store.set({ notice }),\n ...read,\n ...writeActions(store, run, changed),\n }\n}\n\nexport type DsfaController = ReturnType<typeof createDsfaController>\n","// Zustandsautomat des Datenschutz-Assistenten (Vue und React): Laden,\n// Antworten, geführter oder freier Modus, Checkliste. Der Assistent ist\n// optional: im freien Modus ist jeder Schritt erreichbar, im geführten Modus\n// geht es Schritt für Schritt. Alle Prüfungen laufen auf dem Server.\n\nimport { requestJson, type RestOptions } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState } from '../store'\nimport type {\n AssistantMode,\n AssistantPort,\n AssistantQuestion,\n AssistantStep,\n ChecklistChange,\n WorkspaceOverview,\n} from './assistantTypes'\nimport type { DataProtectionTranslate } from './messages'\nimport { asError, prefixedLabel, type DataProtectionError, type RequestHooks } from './requests'\n\nconst segment = encodeURIComponent\n\n/** Port auf die Arbeitsbereichs-Endpunkte von `auditcore_dataprotection.web`. */\nexport function createAssistantRestPort(options: RestOptions): AssistantPort {\n const one = (id: string, action: string): string => `/activities/${segment(id)}${action}`\n return {\n workspace: (id) => requestJson(options, one(id, '/workspace')),\n answer: (id, questionId, value, justification, expectedRevision) =>\n requestJson(options, one(id, '/answers'), {\n question_id: questionId,\n value,\n justification,\n expected_revision: expectedRevision,\n }),\n confirm: (id, questionId, expectedRevision) =>\n requestJson(options, one(id, '/answers/confirm'), { question_id: questionId, expected_revision: expectedRevision }),\n navigate: (id, mode, step, expectedRevision) =>\n requestJson(options, one(id, '/navigate'), { mode, step, expected_revision: expectedRevision }),\n checklist: (id, itemId, change, expectedRevision) =>\n requestJson(options, one(id, `/checklist/${segment(itemId)}`), { ...change, expected_revision: expectedRevision }),\n }\n}\n\nexport interface Draft {\n value: string\n justification: string\n}\n\nexport type AssistantTab = 'assistent' | 'checkliste' | 'status'\n\nexport interface AssistantData extends RequestState<DataProtectionError> {\n overview: WorkspaceOverview | null\n drafts: Readonly<Record<string, Draft>>\n /** Fehler je Frage (GUI-08: Sprung zum Feld, Eingabe bleibt erhalten). */\n fieldErrors: Readonly<Record<string, string>>\n tab: AssistantTab\n}\n\nexport interface AssistantView {\n mode: AssistantMode\n step: AssistantStep | null\n steps: AssistantStep[]\n position: number\n completed: number\n previous: string | null\n next: string | null\n openTasks: number\n}\n\nconst EMPTY_ASSISTANT = {\n mode: 'gefuehrt' as AssistantMode,\n current_step: '',\n previous_step: null,\n next_step: null,\n steps: [] as AssistantStep[],\n tasks: [] as unknown[],\n}\n\n/** Abgeleitete Werte für beide Oberflächen (reine Funktion). */\nexport function assistantView(state: AssistantData): AssistantView {\n const assistant = state.overview?.assistent ?? EMPTY_ASSISTANT\n const steps = assistant.steps\n const step = steps.find((entry) => entry.id === assistant.current_step) ?? steps[0] ?? null\n return {\n mode: assistant.mode,\n step,\n steps,\n position: step ? steps.indexOf(step) + 1 : 0,\n completed: steps.filter((entry) => entry.status === 'vollstaendig').length,\n previous: assistant.previous_step,\n next: assistant.next_step,\n openTasks: assistant.tasks.length,\n }\n}\n\n/** Eingabe einer Frage: lokaler Entwurf, sonst gespeicherte Antwort bzw. Verzeichniswert. */\nexport function draftOf(state: AssistantData, question: AssistantQuestion): Draft {\n return (\n state.drafts[question.id] ?? {\n value: question.answer?.value ?? question.value ?? '',\n justification: question.answer?.justification ?? '',\n }\n )\n}\n\n/** Vorschläge aus Vorlage, Import oder KI sind bis zur Bestätigung unbestätigt (GUI-16). */\nexport function isSuggestion(question: AssistantQuestion): boolean {\n return question.answer !== null && question.answer.origin !== 'bestaetigt'\n}\n\nexport function needsJustification(question: AssistantQuestion, value: string): boolean {\n return value === 'nicht_anwendbar' || question.justify_values.includes(value)\n}\n\nconst DPIA_TARGET = /^(screening|assessment):/\n\nfunction expectedRevision(overview: WorkspaceOverview | null, question?: AssistantQuestion): number | null {\n if (!overview) return null\n if (question && DPIA_TARGET.test(question.target)) return overview.folgenabschaetzung?.revision ?? null\n return overview.register.status === 'entwurf' ? overview.register.revision : null\n}\n\nexport interface AssistantControllerOptions extends RequestHooks {\n port: () => AssistantPort | null\n activityId: () => string\n t: () => DataProtectionTranslate\n onChange?: (overview: WorkspaceOverview) => void\n}\n\nconst INITIAL: AssistantData = { ...IDLE, overview: null, drafts: {}, fieldErrors: {}, tab: 'assistent' }\n\ntype Store = ReturnType<typeof createStore<AssistantData>>\ntype Run = ReturnType<typeof createRunner<AssistantPort, DataProtectionError, AssistantData>>\ntype Accept = (overview: WorkspaceOverview | null, notice?: string) => void\n\nfunction findQuestion(store: Store, questionId: string): AssistantQuestion | undefined {\n return store.get().overview?.assistent.steps.flatMap((step) => step.questions).find((entry) => entry.id === questionId)\n}\n\n/** Antworten und Vorschläge übernehmen; Fehler bleiben an der Frage stehen (GUI-08). */\nfunction answerActions(store: Store, run: Run, accept: Accept, options: AssistantControllerOptions) {\n async function answer(questionId: string): Promise<boolean> {\n const current = findQuestion(store, questionId)\n if (!current) return false\n const draft = draftOf(store.get(), current)\n const revision = expectedRevision(store.get().overview, current)\n const result = await run('answer', (port) =>\n port.answer(options.activityId(), questionId, draft.value, draft.justification, revision),\n )\n if (!result) {\n const message = store.get().error?.message ?? ''\n store.set((state) => ({ fieldErrors: { ...state.fieldErrors, [questionId]: message } }))\n return false\n }\n store.set((state) => {\n const { [questionId]: _done, ...drafts } = state.drafts\n const { [questionId]: _fixed, ...fieldErrors } = state.fieldErrors\n return { drafts, fieldErrors }\n })\n accept(result, options.t()('assistantSaved'))\n return true\n }\n\n async function confirm(questionId: string): Promise<void> {\n const revision = expectedRevision(store.get().overview, findQuestion(store, questionId))\n const result = await run('confirm', (port) => port.confirm(options.activityId(), questionId, revision))\n accept(result, options.t()('assistantConfirmed'))\n }\n\n function setDraft(questionId: string, draft: Draft): void {\n store.set((state) => ({ drafts: { ...state.drafts, [questionId]: draft } }))\n }\n\n return { answer, confirm, setDraft }\n}\n\n/** Schritte, Modus und Checkliste. */\nfunction moveActions(store: Store, run: Run, accept: Accept, options: AssistantControllerOptions) {\n async function navigate(mode: AssistantMode, step: string): Promise<void> {\n const revision = expectedRevision(store.get().overview)\n accept(await run('navigate', (port) => port.navigate(options.activityId(), mode, step, revision)))\n }\n\n async function goTo(step: string | null): Promise<void> {\n if (step) await navigate(assistantView(store.get()).mode, step)\n }\n\n async function setMode(mode: AssistantMode): Promise<void> {\n const view = assistantView(store.get())\n if (view.step) await navigate(mode, view.step.id)\n }\n\n async function changeItem(itemId: string, change: ChecklistChange): Promise<void> {\n const revision = expectedRevision(store.get().overview)\n const result = await run('checklist', (port) => port.checklist(options.activityId(), itemId, change, revision))\n accept(result, options.t()('assistantSaved'))\n }\n\n return {\n goTo,\n setMode,\n changeItem,\n next: () => goTo(assistantView(store.get()).next),\n previous: () => goTo(assistantView(store.get()).previous),\n }\n}\n\nexport function createAssistantController(options: AssistantControllerOptions) {\n const store = createStore<AssistantData>(INITIAL)\n const hooks: RequestHooks = { ...options, networkMessage: options.networkMessage ?? ((message) => options.t()('networkError', { message })) }\n const run = createRunner(store, options.port, (error) => asError(error, hooks), hooks.onError)\n\n function accept(overview: WorkspaceOverview | null, notice = ''): void {\n if (!overview) return\n store.set({ overview, notice })\n options.onChange?.(overview)\n }\n\n async function load(): Promise<void> {\n accept(await run('load', (port) => port.workspace(options.activityId())))\n }\n\n return {\n store,\n load,\n ...answerActions(store, run, accept, options),\n ...moveActions(store, run, accept, options),\n setTab: (tab: AssistantTab) => store.set({ tab }),\n }\n}\n\nexport type AssistantController = ReturnType<typeof createAssistantController>\n\nconst CLOSED_VALUES: Readonly<Partial<Record<AssistantQuestion['kind'], readonly string[]>>> = {\n ja_nein_unklar: ['ja', 'nein', 'unklar'],\n umsetzung: ['nicht_begonnen', 'geplant', 'umgesetzt', 'wirksam_nachgewiesen'],\n}\n\n/** Auswahlwerte einer Frage mit Beschriftung; „nicht anwendbar“ nur, wo vorgesehen. */\nexport function questionOptions(t: DataProtectionTranslate, question: AssistantQuestion): { key: string; title: string }[] {\n const closed = CLOSED_VALUES[question.kind]\n const base = closed ? closed.map((key) => ({ key, title: prefixedLabel(t, 'value', key) })) : question.choices\n return question.na_allowed ? [...base, { key: 'nicht_anwendbar', title: t('value_nicht_anwendbar') }] : base\n}\n\n/** Kennzeichen der zuständigen Stelle („Zuständig: IT-Betrieb“); leer ohne Zuständigkeit. */\nexport function questionRoleLabel(t: DataProtectionTranslate, question: AssistantQuestion): string {\n return question.role ? t('roleLabel', { role: prefixedLabel(t, 'role', question.role) }) : ''\n}\n\n/** Feldkennung einer Frage im DOM (Sprungziel der Fehlerübersicht). */\nexport function questionFieldId(question: { id: string }): string {\n return `fa-q-${question.id.replace(/[^A-Za-z0-9_-]/g, '-')}`\n}\n\n/** Beschriftung eines Statuswerts (Unterstriche als Leerzeichen, falls kein Text hinterlegt). */\nexport function axisValueLabel(t: DataProtectionTranslate, value: string): string {\n return prefixedLabel(t, 'axisValue', value, value.replace(/_/g, ' '))\n}\n\n/** Geführt: zurück zu jedem früheren Schritt, vorwärts nur zum nächsten; frei: jeder Schritt. */\nexport function stepReachable(view: AssistantView, index: number): boolean {\n if (view.mode === 'frei') return true\n return index < view.position || view.steps[index]?.id === view.next\n}\n\nexport type TableRow = Record<string, string>\n\n/** Zeilen einer Tabellenantwort (JSON-Text des Vertrags); leere oder fehlerhafte Eingabe ergibt eine leere Zeile. */\nexport function tableRows(question: AssistantQuestion, value: string): TableRow[] {\n const empty = (): TableRow => Object.fromEntries(question.columns.map((c) => [c.key, '']))\n try {\n const parsed: unknown = JSON.parse(value || '[]')\n if (Array.isArray(parsed) && parsed.length) return parsed.map((row) => ({ ...empty(), ...(row as TableRow) }))\n } catch {\n // ungültiger Entwurf: mit einer leeren Zeile neu beginnen\n }\n return [empty()]\n}\n\n/** Tabellenzeilen als Antworttext; vollständig leere Zeilen entfallen. */\nexport function tableValue(rows: TableRow[]): string {\n const filled = rows.filter((row) => Object.values(row).some((cell) => cell.trim() !== ''))\n return filled.length ? JSON.stringify(filled) : ''\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte der Geo-Karte. */\nexport const geoMessages = defineMessages({\n de: {\n title: 'Karte',\n loading: 'Erdmodelle und Grenzen werden geladen …',\n noPort: 'Kein Port übergeben: Berechnungen sind nicht verfügbar.',\n failed: 'Anfrage abgelehnt: {message}',\n mapLabel: 'Karte mit {points} Punkten und {areas} Flächen. Klick setzt den Bezugspunkt; Pfeiltasten verschieben, Plus und Minus zoomen.',\n noTiles: 'Keine Kachelquelle eingerichtet – die Karte zeigt nur Punkte und Flächen ohne Hintergrund.',\n attribution: 'Kartendaten: {text}',\n fit: 'Alles zeigen',\n reference: 'Bezugspunkt',\n referenceHelp: 'Auf die Karte klicken, Koordinaten eingeben oder einen Punkt übernehmen.',\n lat: 'Breite (°)',\n lon: 'Länge (°)',\n apply: 'Übernehmen',\n fromPoint: 'Punkt übernehmen',\n choose: 'Bitte wählen',\n errorlat: 'Breite muss eine Zahl zwischen −90 und 90 sein (Komma oder Punkt).',\n errorlon: 'Länge muss eine Zahl zwischen −180 und 180 sein (Komma oder Punkt).',\n utm: 'UTM',\n utmValue: 'Zone {zone}{hemisphere}, E {east} m, N {north} m',\n utmEpsg: 'EPSG:{epsg}',\n utmNote: 'Standardzone aus der Länge; keine Datumstransformation.',\n ellipsoid: 'Ellipsoid',\n utmInput: 'UTM-Koordinaten eingeben',\n utmInputHelp: 'Rechts-/Hochwert mit Zone und Halbkugel; umgerechnet mit dem gewählten Ellipsoid, ohne Datumstransformation.',\n utmZone: 'Zone',\n utmHemisphere: 'Halbkugel',\n hemisphereNorth: 'Nord',\n hemisphereSouth: 'Süd',\n utmEast: 'Ostwert (m)',\n utmNorth: 'Nordwert (m)',\n utmerrorzone: 'Zone muss eine ganze Zahl von 1 bis 60 sein.',\n utmerroreast: 'Ostwert muss eine Zahl über 0 und unter 1000000 m sein (Komma oder Punkt, ohne Tausendertrennzeichen).',\n utmerrornorth: 'Nordwert muss eine Zahl von 0 bis 10000000 m sein (Komma oder Punkt, ohne Tausendertrennzeichen).',\n geocode: 'Adresse suchen',\n geocodeHelp: 'Die Adresse wird an den Geocoder des Servers gesendet.',\n geocodeRun: 'Suchen',\n geocodeNone: 'Keine Treffer.',\n radius: 'Umkreissuche',\n radiusMetres: 'Radius (m)',\n earthModel: 'Erdmodell',\n recommended: '{label} (empfohlen)',\n radiusRun: 'Suchen',\n radiusSummary: '{hits} von {checked} Punkten im Umkreis von {radius}',\n colName: 'Punkt',\n colDistance: 'Entfernung',\n locate: 'Punkt in Fläche',\n area: 'Fläche',\n boundaryInside: 'Randpunkte zählen als innen',\n boundaryHelp: 'Empfehlung (D2): Rand zählt als innen, damit ein möglicher Bezug eher gemeldet als übersehen wird.',\n tolerance: 'Randtoleranz (m)',\n locateRun: 'Prüfen',\n positioninnen: 'innen',\n positionaussen: 'außen',\n positionrand: 'auf dem Rand',\n contains: 'Ergebnis: in der Fläche',\n notContains: 'Ergebnis: nicht in der Fläche',\n boundaryCase: 'Randfall: Der Punkt liegt {how} auf dem Rand; nach der gewählten Randregel zählt er als {rule}.',\n boundaryExact: 'exakt',\n boundaryTolerance: 'innerhalb der Toleranz von {tolerance}',\n ruleInside: 'innen',\n ruleOutside: 'außen',\n distance: 'Abstand zum Rand: {distance}',\n notes: 'Hinweise zur Geometrie',\n simplify: 'Vereinfachung (Douglas-Peucker)',\n unit: 'Einheit',\n unitmeter: 'Meter',\n unitgrad: 'Grad',\n simplifyTolerance: 'Toleranz: {value}',\n simplifyVertices: 'Stützpunkte der Fläche: {count}',\n simplifyRun: 'Vereinfachen',\n simplifyResult: '{before} → {after} Stützpunkte',\n simplifyDropped: '{count} Ring(e) entfallen',\n simplifyGone: 'Bei dieser Toleranz bleibt keine Fläche übrig.',\n gpkg: 'GeoPackage laden',\n gpkgFile: 'Datei (.gpkg)',\n gpkgSource: 'Quelle des Servers',\n gpkgLoad: 'Laden',\n gpkgResult: '{count} Flächen aus Tabelle „{table}“ (srs_id {srs})',\n gpkgConverted: 'aus UTM umgerechnet',\n gpkgTruncated: 'Gekürzt: Die Datei enthält mehr Flächen als erlaubt.',\n gpkgErrors: '{count} Geometrie(n) nicht lesbar',\n needReference: 'Zuerst einen Bezugspunkt setzen.',\n needArea: 'Zuerst eine Fläche wählen.',\n needModel: 'Erdmodell wählen.',\n },\n en: {\n title: 'Map',\n reference: 'Reference point',\n utmInput: 'Enter UTM coordinates',\n radius: 'Radius search',\n locate: 'Point in area',\n simplify: 'Simplification (Douglas-Peucker)',\n gpkg: 'Load GeoPackage',\n fit: 'Show all',\n },\n})\n\nexport type GeoMessageKey = keyof typeof geoMessages.de\n","import { intlFormatNumber as formatNumber } from '@auditcore/common'\nimport type { Locale } from '../i18n'\nimport type { GeoMessageKey } from './messages'\nimport type { AreaGeometry, GeoArea, GeoPackageResult, GeoPoint, LatLon } from './types'\n\n/** Stufen des Toleranzreglers der Vereinfachung (Meter bzw. Grad). */\nexport const TOLERANCE_STEPS: Readonly<Record<'meter' | 'grad', readonly number[]>> = {\n meter: [0, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000],\n grad: [0, 0.00001, 0.00005, 0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05, 0.1],\n}\n\n/**\n * Dezimalgrad aus Texteingabe; Komma und Punkt sind als Dezimaltrenner\n * erlaubt, Tausendertrennzeichen nicht. Ungültiges ergibt `null`.\n */\nexport function parseDegrees(text: string): number | null {\n const trimmed = text.trim().replace(',', '.')\n if (!/^[+-]?\\d{1,3}(\\.\\d+)?$/.test(trimmed)) return null\n const value = Number(trimmed)\n return Number.isFinite(value) ? value : null\n}\n\nexport type CoordinateError = 'lat' | 'lon' | null\n\n/** Punkt aus zwei Texteingaben mit Wertebereichsprüfung. */\nexport function parseLatLon(lat: string, lon: string): { point: LatLon | null; error: CoordinateError } {\n const la = parseDegrees(lat)\n if (la === null || la < -90 || la > 90) return { point: null, error: 'lat' }\n const lo = parseDegrees(lon)\n if (lo === null || lo < -180 || lo > 180) return { point: null, error: 'lon' }\n return { point: { lat: la, lon: lo }, error: null }\n}\n\n/** Meter aus Texteingabe (Komma oder Punkt, keine Tausendertrennung); Ungültiges ergibt `null`. */\nexport function parseMetres(text: string): number | null {\n const trimmed = text.trim().replace(',', '.')\n if (!/^[+-]?\\d+(\\.\\d+)?$/.test(trimmed)) return null\n const value = Number(trimmed)\n return Number.isFinite(value) ? value : null\n}\n\nexport type UtmInputError = 'zone' | 'east' | 'north' | null\n\nexport interface UtmInput {\n zone: number\n ost: number\n nord: number\n}\n\n/** UTM-Eingabe mit Wertebereichsprüfung: Zone 1–60, Ostwert 0–1 000 000 m, Nordwert 0–10 000 000 m. */\nexport function parseUtm(zone: string, east: string, north: string): { value: UtmInput | null; error: UtmInputError } {\n const number = /^\\s*\\d{1,2}\\s*$/.test(zone) ? Number(zone) : NaN\n if (!(number >= 1 && number <= 60)) return { value: null, error: 'zone' }\n const ost = parseMetres(east)\n if (ost === null || ost <= 0 || ost >= 1_000_000) return { value: null, error: 'east' }\n const nord = parseMetres(north)\n if (nord === null || nord < 0 || nord > 10_000_000) return { value: null, error: 'north' }\n return { value: { zone: number, ost, nord }, error: null }\n}\n\n/** Text der Fehlermeldung einer UTM-Eingabe. */\nexport function utmErrorKey(error: Exclude<UtmInputError, null>): GeoMessageKey {\n return `utmerror${error}`\n}\n\n/** Entfernung sprachabhängig: unter 1 km in Metern, sonst in Kilometern mit zwei Stellen. */\nexport function formatDistance(metres: number, locale: Locale): string {\n if (metres < 1000) return `${formatNumber(Math.round(metres), locale)} m`\n return `${formatNumber(metres / 1000, locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} km`\n}\n\n/** Grad mit sechs Nachkommastellen (≈ 0,1 m). */\nexport function formatDegrees(value: number, locale: Locale): string {\n return formatNumber(value, locale, { minimumFractionDigits: 6, maximumFractionDigits: 6 })\n}\n\n/** Rechts-/Hochwert in Metern mit zwei Nachkommastellen, ohne Tausendertrennung. */\nexport function formatMetres(value: number, locale: Locale): string {\n return formatNumber(value, locale, { minimumFractionDigits: 2, maximumFractionDigits: 2, useGrouping: false })\n}\n\n/** Anzahl der Stützpunkte einer Fläche (Schlusspunkte mitgezählt). */\nexport function vertexCount(geometry: AreaGeometry): number {\n const polygons = geometry.type === 'Polygon' ? [geometry.coordinates] : geometry.coordinates\n return polygons.reduce((sum, rings) => sum + rings.reduce((inner, ring) => inner + ring.length, 0), 0)\n}\n\n/** Flächen aus einer GeoPackage-Antwort; Kennungen erhalten die Herkunft als Präfix. */\nexport function areasFromGeoPackage(result: GeoPackageResult, origin: string): GeoArea[] {\n return result.flaechen.map((area) => ({\n id: `${origin}:${area.id}`,\n label: area.bezeichnung,\n geometry: area.geometrie,\n notes: area.hinweise,\n }))\n}\n\n/** Bezeichnung für Listen: Name, sonst Kennung. */\nexport function displayName(entry: GeoPoint | GeoArea): string {\n return entry.label?.trim() ? entry.label : entry.id\n}\n","import { RestError, requestJson, type RestOptions } from '@auditcore/common'\nimport type { GeoPackageResult, GeoPort } from './types'\n\nexport interface GeoRestOptions extends RestOptions {\n /**\n * Adresssuche über `POST /geocode` anbieten. Standard `false`: ohne\n * ausdrückliche Freigabe sendet die Oberfläche keine Adressen, auch wenn\n * der Server einen Geocoder angeschlossen hat.\n */\n geocoding?: boolean\n}\n\nfunction query(table?: string): string {\n return table ? `?tabelle=${encodeURIComponent(table)}` : ''\n}\n\nasync function uploadError(response: Response): Promise<RestError> {\n const data = (await response.json().catch(() => ({}))) as { error?: { code?: string; message?: string } }\n return new RestError(data.error?.message ?? `HTTP ${response.status}`, response.status, data.error?.code ?? 'http_error')\n}\n\n/** `POST /gpkg`: die Datei ist der Anfragekörper (kein JSON, kein Multipart). */\nasync function upload(options: RestOptions, file: Blob, table?: string): Promise<GeoPackageResult> {\n const fetchImpl = options.fetch ?? ((input, init) => globalThis.fetch(input, init))\n const response = await fetchImpl(`${options.baseUrl.replace(/\\/$/, '')}/gpkg${query(table)}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/geopackage+sqlite3', Accept: 'application/json', ...options.headers },\n body: file,\n })\n if (!response.ok) throw await uploadError(response)\n return (await response.json()) as GeoPackageResult\n}\n\n/** Port auf den REST-Vertrag von `auditcore_geo.web` (Starlette oder FastAPI). */\nexport function createGeoRestPort(options: GeoRestOptions): GeoPort {\n const port: GeoPort = {\n catalogue: () => requestJson(options, '/profile'),\n radius: (request) => requestJson(options, '/umkreis', request),\n locate: (request) => requestJson(options, '/lage', request),\n utm: (request) => requestJson(options, '/utm', request),\n fromUtm: (request) => requestJson(options, '/utm/geographisch', request),\n simplify: (request) => requestJson(options, '/vereinfachung', request),\n loadGeoPackage: (file, table) => upload(options, file, table),\n loadSource: (name, table) => requestJson(options, `/gpkg/quellen/${encodeURIComponent(name)}${query(table)}`),\n }\n if (options.geocoding) port.geocode = (text) => requestJson(options, '/geocode', { anfrage: text })\n return port\n}\n","/**\n * Kartenansicht auf Leaflet (BSD-2-Clause). Leaflet wird erst beim Anlegen\n * einer Karte geladen (dynamischer Import), damit Anwendungen ohne Karte es\n * nicht laden. Farben kommen über CSS-Klassen aus den `--fa-*`-Token.\n */\nimport type { AreaGeometry, GeoArea, GeoPoint, LatLon, TileSource } from './types'\n\nexport interface MapLayers {\n points: readonly GeoPoint[]\n areas: readonly GeoArea[]\n reference: LatLon | null\n radiusMetres: number | null\n hits: ReadonlySet<string>\n selectedArea: string | null\n simplified: AreaGeometry | null\n}\n\nexport interface MapViewOptions {\n center: LatLon\n zoom: number\n tiles: TileSource | null\n /** Klick auf die Karte: neuer Bezugspunkt. */\n onPick: (point: LatLon) => void\n /** Beschriftung eines Punktes bzw. einer Fläche für Tooltips. */\n label: (entry: GeoPoint | GeoArea) => string\n}\n\nexport interface MapView {\n update(layers: MapLayers): void\n setTiles(tiles: TileSource | null): void\n /** Ausschnitt auf alle Punkte, Flächen und den Umkreis setzen. */\n fit(): void\n destroy(): void\n}\n\ntype Leaflet = typeof import('leaflet')\n\n/** Leaflet setzt Tooltips und Namensnennung als HTML; Daten gehen deshalb nur als Text hinein. */\nexport function escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (char) => `&#${char.charCodeAt(0)};`)\n}\n\nfunction textElement(text: string): HTMLElement {\n const span = document.createElement('span')\n span.textContent = text\n return span\n}\n\nfunction tileLayer(L: Leaflet, tiles: TileSource | null): import('leaflet').TileLayer | null {\n if (!tiles?.url) return null\n return L.tileLayer(tiles.url, {\n attribution: escapeHtml(tiles.attribution),\n maxZoom: tiles.maxZoom ?? 19,\n subdomains: tiles.subdomains ?? 'abc',\n })\n}\n\nfunction drawAreas(L: Leaflet, group: import('leaflet').LayerGroup, layers: MapLayers, options: MapViewOptions): void {\n for (const area of layers.areas) {\n const selected = area.id === layers.selectedArea\n L.geoJSON(area.geometry, { style: () => ({ className: `fa-geo__area${selected ? ' fa-geo__area--selected' : ''}` }) })\n .bindTooltip(textElement(options.label(area)))\n .addTo(group)\n }\n if (layers.simplified) {\n L.geoJSON(layers.simplified, { style: () => ({ className: 'fa-geo__simplified' }), interactive: false }).addTo(group)\n }\n}\n\nfunction drawPoints(L: Leaflet, group: import('leaflet').LayerGroup, layers: MapLayers, options: MapViewOptions): void {\n for (const point of layers.points) {\n const hit = layers.hits.has(point.id)\n L.circleMarker([point.lat, point.lon], { radius: hit ? 7 : 5, className: `fa-geo__point${hit ? ' fa-geo__point--hit' : ''}` })\n .bindTooltip(textElement(options.label(point)))\n .addTo(group)\n }\n const reference = layers.reference\n if (!reference) return\n if (layers.radiusMetres) {\n L.circle([reference.lat, reference.lon], { radius: layers.radiusMetres, className: 'fa-geo__radius', interactive: false }).addTo(group)\n }\n L.circleMarker([reference.lat, reference.lon], { radius: 8, className: 'fa-geo__reference', interactive: false }).addTo(group)\n}\n\n/** Legt die Leaflet-Karte im Element an. */\nexport async function createLeafletView(element: HTMLElement, options: MapViewOptions): Promise<MapView> {\n const L = await import('leaflet')\n const map = L.map(element, { center: [options.center.lat, options.center.lon], zoom: options.zoom, keyboard: true, zoomControl: true })\n map.attributionControl.setPrefix('<a href=\"https://leafletjs.com\">Leaflet</a>')\n let tiles = tileLayer(L, options.tiles)\n tiles?.addTo(map)\n const group = L.featureGroup().addTo(map)\n map.on('click', (event: import('leaflet').LeafletMouseEvent) => options.onPick({ lat: event.latlng.lat, lon: L.Util.wrapNum(event.latlng.lng, [-180, 180], true) }))\n return {\n update(layers) {\n group.clearLayers()\n drawAreas(L, group, layers, options)\n drawPoints(L, group, layers, options)\n },\n setTiles(next) {\n tiles?.remove()\n tiles = tileLayer(L, next)\n tiles?.addTo(map)\n },\n fit() {\n const bounds = group.getBounds()\n if (bounds.isValid()) map.fitBounds(bounds, { padding: [24, 24], maxZoom: 15 })\n },\n destroy() {\n map.remove()\n },\n }\n}\n","// Zustandsautomat der Geo-Karte (Vue und React): Katalog, Bezugspunkt mit UTM\n// und Adresssuche, Umkreis, Punkt in Fläche, Vereinfachung, GeoPackage.\n// Jede Berechnung läuft über den Port (auditcore_geo.web).\n\nimport { createRunner, createStore, type Store } from '../store'\nimport { areasFromGeoPackage, parseLatLon, parseUtm, TOLERANCE_STEPS, type CoordinateError, type UtmInputError } from './model'\nimport type { MapLayers } from './mapView'\nimport type {\n GeoArea,\n GeoCatalogue,\n GeocodeResult,\n GeoPackageResult,\n GeoPoint,\n GeoPort,\n LatLon,\n LocateResult,\n RadiusResult,\n SimplifyResult,\n SimplifyUnit,\n UtmResult,\n} from './types'\n\nexport type GeoBusy = 'load' | 'radius' | 'locate' | 'utm' | 'simplify' | 'gpkg' | 'geocode'\nexport type GeoHint = 'needReference' | 'needArea' | 'needModel' | null\n\nexport interface GeoMapCallbacks {\n radius?: (result: RadiusResult) => void\n located?: (result: LocateResult) => void\n areasLoaded?: (areas: readonly GeoArea[], result: GeoPackageResult) => void\n reference?: (point: LatLon | null) => void\n failed?: (message: string) => void\n}\n\nexport interface GeoData {\n busy: GeoBusy | null\n failure: string\n error: string | null\n notice: string\n hint: GeoHint\n catalogue: GeoCatalogue | null\n earthModel: string | null\n radiusMetres: number\n radiusResult: RadiusResult | null\n boundaryInside: boolean\n toleranceMetres: number\n locateResult: LocateResult | null\n loadedAreas: readonly GeoArea[]\n areaId: string | null\n simplifyUnit: SimplifyUnit\n simplifyStep: number\n simplifyResult: SimplifyResult | null\n gpkgResult: GeoPackageResult | null\n ellipsoid: string\n reference: LatLon | null\n latText: string\n lonText: string\n coordinateError: CoordinateError\n utm: UtmResult | null\n /** Eingabefelder der UTM-Rückrechnung (`POST /utm/geographisch`). */\n zoneText: string\n eastText: string\n northText: string\n northern: boolean\n utmError: UtmInputError\n geocodeResult: GeocodeResult | null\n}\n\n/** Eingaben der Komponente (Props). */\nexport interface GeoInputs {\n port: GeoPort | null\n points: readonly GeoPoint[]\n areas: readonly GeoArea[]\n}\n\nexport interface GeoSelection {\n areas: readonly GeoArea[]\n area: GeoArea | null\n simplifyTolerance: number\n hitIds: ReadonlySet<string>\n canGeocode: boolean\n /** Port bietet die Rückrechnung aus UTM an. */\n canFromUtm: boolean\n layers: MapLayers\n}\n\nfunction layersOf(state: GeoData, inputs: GeoInputs, areas: readonly GeoArea[], hits: ReadonlySet<string>): MapLayers {\n return {\n points: inputs.points,\n areas,\n reference: state.reference,\n radiusMetres: state.radiusResult ? state.radiusResult.radius_m : null,\n hits,\n selectedArea: state.areaId,\n simplified: state.simplifyResult?.geometrie ?? null,\n }\n}\n\nfunction geocodingAvailable(state: GeoData, inputs: GeoInputs): boolean {\n return Boolean(inputs.port?.geocode) && state.catalogue?.geocoder.aktiv === true\n}\n\nexport function selectGeo(state: GeoData, inputs: GeoInputs): GeoSelection {\n const areas = [...inputs.areas, ...state.loadedAreas]\n const hitIds = new Set(state.radiusResult?.treffer.map((hit) => hit.id) ?? [])\n return {\n areas,\n area: areas.find((entry) => entry.id === state.areaId) ?? null,\n simplifyTolerance: TOLERANCE_STEPS[state.simplifyUnit][state.simplifyStep] ?? 0,\n hitIds,\n canGeocode: geocodingAvailable(state, inputs),\n canFromUtm: Boolean(inputs.port?.fromUtm),\n layers: layersOf(state, inputs, areas, hitIds),\n }\n}\n\n/** Einfache Eingabefelder, die die Oberfläche direkt setzen darf. */\nexport type GeoField =\n | 'radiusMetres' | 'earthModel' | 'boundaryInside' | 'toleranceMetres' | 'simplifyStep' | 'ellipsoid' | 'latText' | 'lonText'\n | 'zoneText' | 'eastText' | 'northText' | 'northern'\n\nconst INITIAL: GeoData = {\n busy: null, failure: '', error: null, notice: '', hint: null, catalogue: null, earthModel: null, radiusMetres: 5000,\n radiusResult: null, boundaryInside: true, toleranceMetres: 0, locateResult: null, loadedAreas: [], areaId: null,\n simplifyUnit: 'meter', simplifyStep: 4, simplifyResult: null, gpkgResult: null, ellipsoid: 'GRS80', reference: null,\n latText: '', lonText: '', coordinateError: null, utm: null, zoneText: '', eastText: '', northText: '', northern: true, utmError: null,\n geocodeResult: null,\n}\n\nfunction rounded(value: number, digits = 6): string {\n const factor = 10 ** digits\n return String(Math.round(value * factor) / factor)\n}\n\n/** Eingabefelder der UTM-Rückrechnung aus dem berechneten Rechts-/Hochwert. */\nfunction utmTexts(result: UtmResult): Partial<GeoData> {\n return { zoneText: String(result.zone), eastText: rounded(result.ost, 2), northText: rounded(result.nord, 2), northern: result.nordhalbkugel, utmError: null }\n}\n\nfunction missing(what: string): Promise<never> {\n return Promise.reject(new Error(`${what} nicht angeboten.`))\n}\n\ntype Run = <T>(kind: GeoBusy, task: (port: GeoPort) => Promise<T>) => Promise<T | null>\n\n/** Voraussetzungen einer Berechnung; fehlt etwas, steht der Hinweis im Zustand. */\nfunction prepare(store: Store<GeoData>, area: GeoArea | null, needsArea: boolean): { point: LatLon; model: string } | null {\n const { reference: point, earthModel: model } = store.get()\n const hint: GeoHint = !point ? 'needReference' : !model ? 'needModel' : needsArea && !area ? 'needArea' : null\n store.set({ hint })\n return point && model && !hint ? { point, model } : null\n}\n\nfunction referenceActions(store: Store<GeoData>, run: Run, inputs: () => GeoInputs, callbacks: GeoMapCallbacks) {\n async function refreshUtm(): Promise<void> {\n const { reference: point, ellipsoid } = store.get()\n if (!point) return\n const result = await run('utm', (active) => active.utm({ punkt: point, ellipsoid }))\n if (result) store.set({ utm: result, ...utmTexts(result) })\n }\n\n async function setReference(point: LatLon | null): Promise<void> {\n store.set({\n reference: point, coordinateError: null, latText: point ? rounded(point.lat) : '', lonText: point ? rounded(point.lon) : '',\n utm: null, radiusResult: null, locateResult: null, hint: null,\n })\n callbacks.reference?.(point)\n await refreshUtm()\n }\n\n async function applyTexts(): Promise<void> {\n const parsed = parseLatLon(store.get().latText, store.get().lonText)\n store.set({ coordinateError: parsed.error })\n if (parsed.point) await setReference(parsed.point)\n }\n\n async function geocode(query: string): Promise<void> {\n const text = query.trim()\n if (!selectGeo(store.get(), inputs()).canGeocode || !text) return\n const result = await run('geocode', (active) => active.geocode?.(text) ?? missing('Adresssuche'))\n if (result) store.set({ geocodeResult: result })\n }\n\n return { refreshUtm, setReference, applyTexts, geocode }\n}\n\nfunction utmActions(store: Store<GeoData>, run: Run, setReference: (point: LatLon | null) => Promise<void>) {\n /** Bezugspunkt aus Zone, Halbkugel, Ost- und Nordwert (Rückrechnung über den Port). */\n async function applyUtm(): Promise<void> {\n const { zoneText, eastText, northText, northern, ellipsoid } = store.get()\n const parsed = parseUtm(zoneText, eastText, northText)\n store.set({ utmError: parsed.error })\n const input = parsed.value\n if (!input) return\n const request = { ...input, nordhalbkugel: northern, ellipsoid }\n const result = await run('utm', (active) => active.fromUtm?.(request) ?? missing('UTM-Rückrechnung'))\n if (result) await setReference(result.punkt)\n }\n\n return { applyUtm }\n}\n\nfunction areaActions(store: Store<GeoData>, run: Run, inputs: () => GeoInputs, callbacks: GeoMapCallbacks) {\n const area = (): GeoArea | null => selectGeo(store.get(), inputs()).area\n\n async function simplifyArea(): Promise<void> {\n const target = area()\n store.set({ hint: target ? null : 'needArea' })\n if (!target) return\n const { simplifyUnit: einheit } = store.get()\n const toleranz = selectGeo(store.get(), inputs()).simplifyTolerance\n const result = await run('simplify', (active) => active.simplify({ flaeche: target.geometry, toleranz, einheit }))\n if (result) store.set({ simplifyResult: result })\n }\n\n function accept(result: GeoPackageResult, origin: string): void {\n const added = areasFromGeoPackage(result, origin)\n store.set((state) => ({\n gpkgResult: result,\n loadedAreas: [...state.loadedAreas.filter((entry) => !entry.id.startsWith(`${origin}:`)), ...added],\n }))\n if (!store.get().areaId && added[0]) selectArea(added[0].id)\n callbacks.areasLoaded?.(added, result)\n }\n\n function selectArea(id: string | null): void {\n if (id === store.get().areaId) return\n store.set({ areaId: id, simplifyResult: null, locateResult: null })\n }\n\n function setSimplifyUnit(unit: SimplifyUnit): void {\n store.set((state) => ({ simplifyUnit: unit, simplifyStep: Math.min(state.simplifyStep, TOLERANCE_STEPS[unit].length - 1), simplifyResult: null }))\n }\n\n async function loadFile(file: Blob): Promise<void> {\n const result = await run('gpkg', (active) => active.loadGeoPackage?.(file) ?? missing('GeoPackage-Upload'))\n if (result) accept(result, 'datei')\n }\n\n async function loadSource(name: string): Promise<void> {\n const result = await run('gpkg', (active) => active.loadSource?.(name) ?? missing('Serverquelle'))\n if (result) accept(result, name)\n }\n\n return { simplifyArea, selectArea, setSimplifyUnit, loadFile, loadSource }\n}\n\nfunction calculations(store: Store<GeoData>, run: Run, inputs: () => GeoInputs, callbacks: GeoMapCallbacks) {\n async function searchRadius(): Promise<void> {\n const given = prepare(store, null, false)\n if (!given) return\n const punkte = inputs().points.map(({ id, lat, lon }) => ({ id, lat, lon }))\n const request = { zentrum: given.point, punkte, radius_m: store.get().radiusMetres, erdmodell: given.model }\n const result = await run('radius', (active) => active.radius(request))\n store.set({ radiusResult: result })\n if (result) callbacks.radius?.(result)\n }\n\n async function checkLocation(): Promise<void> {\n const target = selectGeo(store.get(), inputs()).area\n const given = prepare(store, target, true)\n if (!given || !target) return\n const { boundaryInside, toleranceMetres } = store.get()\n const request = { punkt: given.point, flaeche: target.geometry, erdmodell: given.model, rand_gilt_als_innen: boundaryInside, rand_toleranz_m: toleranceMetres }\n const result = await run('locate', (active) => active.locate(request))\n store.set({ locateResult: result })\n if (result) callbacks.located?.(result)\n }\n\n async function load(): Promise<void> {\n const result = await run('load', (active) => active.catalogue())\n if (!result) return\n const ellipsoid = result.ellipsoide.includes('GRS80') ? 'GRS80' : (result.ellipsoide[0] ?? 'GRS80')\n store.set({ catalogue: result, earthModel: result.empfohlenes_erdmodell, boundaryInside: result.rand_gilt_als_innen_empfohlen, ellipsoid })\n }\n\n return { load, searchRadius, checkLocation }\n}\n\nexport interface GeoControllerOptions extends GeoMapCallbacks {\n inputs: () => GeoInputs\n}\n\nexport function createGeoController(options: GeoControllerOptions) {\n const store = createStore<GeoData>(INITIAL)\n const toError = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n const runner = createRunner<GeoPort, string, GeoData>(store, () => options.inputs().port, toError, options.failed)\n const run: Run = async (kind, task) => {\n store.set({ failure: '' })\n const result = await runner(kind, task)\n const error = store.get().error\n if (error) store.set({ failure: error, error: null })\n return result\n }\n const references = referenceActions(store, run, options.inputs, options)\n return {\n store,\n /** Einfaches Eingabefeld setzen (Radius, Erdmodell, Rand, Toleranz, Stufe, Ellipsoid, Texte). */\n setField: <K extends GeoField>(key: K, value: GeoData[K]) => store.set({ [key]: value } as Partial<GeoData>),\n ...calculations(store, run, options.inputs, options),\n ...references,\n ...utmActions(store, run, references.setReference),\n ...areaActions(store, run, options.inputs, options),\n }\n}\n\nexport type GeoController = ReturnType<typeof createGeoController>\n","import { defineMessages } from '../i18n'\n\n/** Sichtbare Texte der Risiko-Komponenten (Deutsch vollständig, Englisch vorbereitet). */\nexport const riskMessages = defineMessages({\n de: {\n title: 'Risiko-Merkmale',\n profile: 'Profil',\n version: 'Version',\n fingerprint: 'Fingerabdruck',\n status: 'Status',\n statusApproved: 'freigegeben',\n statusLegacy: 'charakterisiertes Altverhalten',\n statusCandidate: 'Kandidat – fachliche Entscheidung erforderlich',\n statusHintLegacy: 'Profil reproduziert eine Quellanwendung; Schwellen sind nicht fachlich freigegeben.',\n statusHintCandidate: 'Profil ist nicht freigegeben; Ergebnisse nur zur Prüfung der Entscheidung verwenden.',\n stateHit: 'Treffer',\n stateUndetermined: 'unbestimmt',\n stateClear: 'kein Merkmal',\n stateSkipped: 'übersprungen',\n stateAbsent: 'nicht ausgewertet',\n stateCell: '{code}: {state}',\n summaryTitle: 'Verteilung je Merkmal',\n summaryCaption: 'Verteilung der Merkmale über {count} Datensätze',\n colCode: 'Code',\n colLabel: 'Merkmal',\n colHits: 'Treffer',\n colShare: 'Anteil',\n colUndetermined: 'unbestimmt',\n colVolume: 'Volumen',\n colRecord: 'Datensatz',\n colFlags: 'Merkmale',\n totalsRecords: '{count} Datensätze',\n totalsHits: '{count} mit Treffer',\n totalsUndetermined: '{count} mit unbestimmtem Merkmal',\n totalsSkipped: '{count} Regeln übersprungen',\n skippedTitle: 'Übersprungene Regeln',\n skippedHint: 'Diese Regeln liefen nicht; ihre Merkmale sind für keinen Datensatz entschieden.',\n missingColumns: 'Fehlende Spalten: {columns}',\n datasetTitle: 'Befunde über alle Datensätze',\n reasonCount: '{reason} ({count})',\n filterTitle: 'Filter',\n filterCode: 'Merkmal',\n filterCodeAll: 'alle Merkmale',\n filterState: 'Zustand',\n filterAffected: 'Treffer oder unbestimmt',\n filterAll: 'alle Datensätze',\n filterQuery: 'Suche (Datensatz, Code, Begründung)',\n filterResult: '{shown} von {total} Datensätzen',\n tableCaption: 'Merkmale je Datensatz',\n noRecords: 'Keine Datensätze für diesen Filter.',\n detailTitle: 'Datensatz {record}',\n detailEmpty: 'Datensatz wählen, um Begründung, Eingabewerte und Schwellen zu sehen.',\n detailNone: 'Keine Treffer und keine unbestimmten Merkmale.',\n reason: 'Begründung',\n inputs: 'Verwendete Eingabefelder',\n field: 'Feld',\n value: 'Wert',\n emptyValue: 'leer',\n parameters: 'Schwellen und Parameter',\n evidence: 'Belegwerte',\n origin: 'Fundstelle in der Quelle',\n note: 'Hinweis',\n severity: 'Schwere',\n assessment: 'Bewertung laut Profil',\n profileInfo: 'Profil und Eingabefelder',\n rulesTitle: 'Regeln',\n fieldsTitle: 'Eingabefelder',\n colMeaning: 'Bedeutung',\n colRequirement: 'Pflicht/optional',\n colMissing: 'Folge bei fehlender Spalte / leerem Wert',\n colWhenMissing: 'Spalte fehlt',\n required: 'Pflicht',\n valueRequired: 'Pflicht, auch der Wert',\n optional: 'optional',\n missingError: 'Abbruch',\n missingSkip: 'übersprungen',\n missingAllFalse: 'kein Merkmal',\n missingUndetermined: 'unbestimmt',\n undocumented: 'Bedeutung laut Quelle nicht dokumentiert',\n openDecisions: 'Offene Entscheidungen',\n source: 'Quelle',\n close: 'Schließen',\n },\n en: {\n title: 'Risk flags',\n stateHit: 'hit',\n stateUndetermined: 'undetermined',\n stateClear: 'no flag',\n stateSkipped: 'skipped',\n summaryTitle: 'Distribution per flag',\n filterTitle: 'Filter',\n reason: 'Reason',\n inputs: 'Input fields used',\n parameters: 'Thresholds and parameters',\n emptyValue: 'empty',\n },\n})\n\nexport type RiskMessageKey = keyof typeof riskMessages.de\n","/**\n * Framework-freie View-Logik der Risiko-Merkmale: Zustand je Datensatz und\n * Regel, Verteilung je Code, Filter und Einträge für die Detailkarten.\n */\nimport type { DatasetFinding, Evaluation, FlagHit, JsonObject, JsonValue, RecordView, RuleView } from './types'\n\n/** Zustand einer Regel für einen Datensatz. */\nexport type FlagState = 'hit' | 'clear' | 'undetermined' | 'skipped' | 'absent'\nexport const FLAG_STATES: readonly FlagState[] = ['hit', 'undetermined', 'clear', 'skipped', 'absent']\n\nexport function flagState(record: RecordView, code: string, skipped: Readonly<Record<string, string>>): FlagState {\n if (code in skipped) return 'skipped'\n const flag = record.flags[code]\n if (flag === true) return 'hit'\n if (flag === false) return 'clear'\n if (flag === null) return 'undetermined'\n return 'absent'\n}\n\n/** Regeln der Auswertung; ohne `rules` aus den Codes der Datensätze abgeleitet. */\nexport function evaluationRules(evaluation: Evaluation): RuleView[] {\n if (evaluation.rules && evaluation.rules.length > 0) return evaluation.rules\n const codes = new Set<string>()\n for (const record of evaluation.records) for (const code of Object.keys(record.flags)) codes.add(code)\n for (const code of Object.keys(evaluation.skipped)) codes.add(code)\n return [...codes].map((code) => ({\n code, label: code, kind: '', scope: 'record', severity: null, interpretation: 'indicator', note: null,\n requires: [], when_missing_columns: 'error', inputs: [], parameters: {}, origin: {},\n }))\n}\n\nexport function recordRules(evaluation: Evaluation): RuleView[] {\n return evaluationRules(evaluation).filter((rule) => rule.scope !== 'dataset')\n}\n\nexport interface RiskDistributionRow {\n code: string\n label: string\n hit: number\n clear: number\n undetermined: number\n total: number\n /** Anteil der Treffer an allen Datensätzen (0–1). */\n share: number\n skipped: string | null\n /** Begründung → Anzahl der unbestimmten Datensätze. */\n reasons: Record<string, number>\n /** Volumen laut Zusammenfassung des Profils, falls vorhanden. */\n volume: number | null\n}\n\nfunction summaryVolume(summary: readonly JsonObject[], code: string): number | null {\n const entry = summary.find((item) => item.code === code)\n const volume = entry?.volumen\n return typeof volume === 'number' ? volume : null\n}\n\nfunction countStates(evaluation: Evaluation, code: string): Pick<RiskDistributionRow, 'hit' | 'clear' | 'undetermined' | 'reasons'> {\n const counts = { hit: 0, clear: 0, undetermined: 0, reasons: {} as Record<string, number> }\n for (const record of evaluation.records) {\n const state = flagState(record, code, evaluation.skipped)\n if (state === 'hit') counts.hit += 1\n else if (state === 'clear') counts.clear += 1\n else if (state === 'undetermined') {\n counts.undetermined += 1\n const reason = record.undetermined[code] ?? ''\n counts.reasons[reason] = (counts.reasons[reason] ?? 0) + 1\n }\n }\n return counts\n}\n\n/** Verteilung je Regel in Profilreihenfolge (nur Datensatzregeln). */\nexport function distribution(evaluation: Evaluation): RiskDistributionRow[] {\n const total = evaluation.records.length\n return recordRules(evaluation).map((rule) => {\n const counts = countStates(evaluation, rule.code)\n return {\n code: rule.code,\n label: rule.label,\n ...counts,\n total,\n share: total > 0 ? counts.hit / total : 0,\n skipped: evaluation.skipped[rule.code] ?? null,\n volume: summaryVolume(evaluation.summary, rule.code),\n }\n })\n}\n\nexport interface Totals {\n records: number\n withHits: number\n withUndetermined: number\n skippedRules: number\n}\n\nexport function totals(evaluation: Evaluation): Totals {\n return {\n records: evaluation.records.length,\n withHits: evaluation.records.filter((record) => record.codes.length > 0).length,\n withUndetermined: evaluation.records.filter((record) => Object.keys(record.undetermined).length > 0).length,\n skippedRules: Object.keys(evaluation.skipped).length,\n }\n}\n\nexport function triggeredDataset(evaluation: Evaluation): DatasetFinding[] {\n return evaluation.dataset.filter((finding) => finding.triggered)\n}\n\n/** Filter: `affected` = Treffer oder unbestimmt; `all` = jeder Datensatz. */\nexport type StateFilter = 'affected' | 'hit' | 'undetermined' | 'clear' | 'all'\n\nexport interface RiskFilter {\n code: string | null\n state: StateFilter\n query: string\n}\n\nexport const DEFAULT_FILTER: RiskFilter = { code: null, state: 'affected', query: '' }\n\nfunction matchesState(states: readonly FlagState[], wanted: StateFilter): boolean {\n if (wanted === 'all') return true\n if (wanted === 'affected') return states.some((state) => state === 'hit' || state === 'undetermined')\n if (wanted === 'clear') return states.every((state) => state !== 'hit' && state !== 'undetermined')\n return states.includes(wanted)\n}\n\nexport function recordLabel(record: RecordView): string {\n const key = record.key\n return key === null || key === undefined || key === '' ? `#${record.index + 1}` : String(key)\n}\n\nfunction matchesQuery(record: RecordView, query: string): boolean {\n const needle = query.trim().toLocaleLowerCase('de')\n if (!needle) return true\n const haystack = [recordLabel(record), ...record.codes, ...record.hits.map((hit) => hit.reason)]\n return haystack.some((text) => text.toLocaleLowerCase('de').includes(needle))\n}\n\nexport function filterRecords(evaluation: Evaluation, filter: RiskFilter): RecordView[] {\n const codes = filter.code ? [filter.code] : recordRules(evaluation).map((rule) => rule.code)\n return evaluation.records.filter((record) => {\n const states = codes.map((code) => flagState(record, code, evaluation.skipped))\n return matchesState(states, filter.state) && matchesQuery(record, filter.query)\n })\n}\n\n/** Ein Eintrag der Detailansicht: Treffer oder unbestimmtes Merkmal eines Datensatzes. */\nexport interface FlagEntry {\n code: string\n label: string\n state: 'hit' | 'undetermined'\n reason: string\n severity: string | null\n note: string | null\n inputs: JsonObject\n parameters: JsonObject\n evidence: JsonObject\n origin: JsonObject\n messages: Record<string, string> | null\n}\n\nfunction hitEntry(hit: FlagHit, rule: RuleView | undefined, inputs: JsonObject): FlagEntry {\n return {\n code: hit.code, label: hit.label, state: 'hit', reason: hit.reason, severity: hit.severity, note: hit.note,\n inputs: hit.inputs ?? inputs, parameters: rule?.parameters ?? {}, evidence: hit.evidence, origin: hit.origin,\n messages: hit.messages,\n }\n}\n\n/** Angaben der Regel für einen Eintrag; ohne Regel (unbekannter Code) neutrale Werte. */\nfunction ruleFacts(code: string, rule: RuleView | undefined): Pick<FlagEntry, 'label' | 'severity' | 'note' | 'parameters' | 'origin'> {\n if (!rule) return { label: code, severity: null, note: null, parameters: {}, origin: {} }\n return { label: rule.label ?? code, severity: rule.severity ?? null, note: rule.note ?? null, parameters: rule.parameters ?? {}, origin: rule.origin ?? {} }\n}\n\nfunction undeterminedEntry(code: string, reason: string, rule: RuleView | undefined, inputs: JsonObject): FlagEntry {\n return { code, state: 'undetermined', reason, inputs, evidence: {}, messages: null, ...ruleFacts(code, rule) }\n}\n\n/** Treffer und unbestimmte Merkmale eines Datensatzes in Profilreihenfolge. */\nexport function recordEntries(record: RecordView, rules: readonly RuleView[]): FlagEntry[] {\n const byCode = new Map(rules.map((rule) => [rule.code, rule]))\n const order = new Map(rules.map((rule, index) => [rule.code, index]))\n const entries = [\n ...record.hits.map((hit) => hitEntry(hit, byCode.get(hit.code), record.inputs?.[hit.code] ?? {})),\n ...Object.entries(record.undetermined).map(([code, reason]) =>\n undeterminedEntry(code, reason, byCode.get(code), record.inputs?.[code] ?? {})),\n ]\n return entries.sort((a, b) => (order.get(a.code) ?? 0) - (order.get(b.code) ?? 0))\n}\n\n/** Objekt als Liste `[Schlüssel, Wert]` in Einfügereihenfolge (für deklarative Tabellen). */\nexport function pairs(value: JsonObject | null | undefined): Array<[string, JsonValue]> {\n return value ? Object.entries(value) : []\n}\n","/** Anzeigeformate und Beschriftungen der Risiko-Merkmale (framework-frei). */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent } from '@auditcore/common'\nimport type { Locale } from '../i18n'\nimport type { JsonValue } from './types'\nimport type { FlagState } from './state'\n\n/** Farbton wie `FaBadge` (`tone`). */\nexport type Tone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger'\n\n/** Wert eines Eingabefelds: leer ausdrücklich, Zahlen im Sprachformat. */\nconst BOOLEAN_TEXT: Readonly<Record<Locale, readonly [string, string]>> = { de: ['ja', 'nein'], en: ['yes', 'no'] }\n\nfunction formatBoolean(value: boolean, locale: Locale): string {\n const [yes, no] = BOOLEAN_TEXT[locale]\n return value ? yes : no\n}\n\nexport function formatValue(value: JsonValue | undefined, locale: Locale, empty: string): string {\n if (value === null || value === undefined || value === '') return empty\n if (typeof value === 'number') return formatNumber(value, locale, { maximumFractionDigits: 4 })\n if (typeof value === 'boolean') return formatBoolean(value, locale)\n if (Array.isArray(value)) return value.map((item) => formatValue(item, locale, empty)).join('; ')\n if (typeof value === 'object') return JSON.stringify(value)\n return value\n}\n\nexport function formatShare(share: number, locale: Locale): string {\n return formatPercent(share, locale, 1)\n}\n\nexport function formatAmount(value: number | null, locale: Locale): string {\n return value === null ? '' : formatNumber(value, locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })\n}\n\nconst SEVERITY_TONES: Readonly<Record<string, Tone>> = {\n CRITICAL: 'danger',\n HIGH: 'danger',\n MEDIUM: 'warning',\n LOW: 'accent',\n INFO: 'neutral',\n}\n\nexport function severityTone(severity: string | null): Tone {\n return severity ? (SEVERITY_TONES[severity] ?? 'neutral') : 'neutral'\n}\n\n/** Symbol je Zustand: Farbe ist nie der einzige Träger der Bedeutung. */\nexport const STATE_ICONS: Readonly<Record<FlagState, string>> = {\n hit: '!',\n undetermined: '?',\n clear: '–',\n skipped: '⤼',\n absent: '·',\n}\n\nexport function stateTone(state: FlagState): Tone {\n if (state === 'hit') return 'danger'\n if (state === 'undetermined') return 'warning'\n return 'neutral'\n}\n\n/** Bekannte Parameter der Regelarten; unbekannte behalten ihren Schlüssel. */\nconst PARAMETER_LABELS: Readonly<Record<string, { de: string; en: string }>> = {\n multiple: { de: 'glattes Vielfaches von', en: 'round multiple of' },\n amount_gt: { de: 'Betrag größer als', en: 'amount greater than' },\n 'thresholds.static': { de: 'Wertgrenzen', en: 'value limits' },\n 'lower.proximity': { de: 'Nähe unter der Schwelle (Anteil)', en: 'proximity below threshold (share)' },\n threshold: { de: 'Schwelle', en: 'threshold' },\n value: { de: 'Vergleichswert', en: 'comparison value' },\n ratio_gt: { de: 'Quote größer als', en: 'ratio greater than' },\n rate_gt: { de: 'Quote größer als (%)', en: 'rate greater than (%)' },\n total_min: { de: 'Mindestanzahl', en: 'minimum count' },\n min_length: { de: 'Mindestlänge', en: 'minimum length' },\n 'group.cases_gt': { de: 'Gruppe: Vorhaben mehr als', en: 'group: cases more than' },\n 'group.sum_gt': { de: 'Gruppe: Summe größer als', en: 'group: sum greater than' },\n 'pair.count_gt': { de: 'Paar: Belege mehr als', en: 'pair: records more than' },\n 'pair.sum_gt': { de: 'Paar: Summe größer als', en: 'pair: sum greater than' },\n share_gte: { de: 'Anteil mindestens', en: 'share at least' },\n}\n\nexport function parameterLabel(key: string, locale: Locale): string {\n const label = PARAMETER_LABELS[key]\n return label ? label[locale] : key\n}\n","/** Zuordnung fachlicher Zustände zu Textschlüsseln (framework-frei). */\nimport type { RiskMessageKey } from './messages'\nimport type { FlagState, StateFilter } from './state'\n\nexport const STATE_KEYS: Readonly<Record<FlagState, RiskMessageKey>> = {\n hit: 'stateHit',\n undetermined: 'stateUndetermined',\n clear: 'stateClear',\n skipped: 'stateSkipped',\n absent: 'stateAbsent',\n}\n\nexport const STATE_FILTER_KEYS: Readonly<Record<StateFilter, RiskMessageKey>> = {\n affected: 'filterAffected',\n hit: 'stateHit',\n undetermined: 'stateUndetermined',\n clear: 'stateClear',\n all: 'filterAll',\n}\n\nconst STATUS_KEYS: Readonly<Record<string, RiskMessageKey>> = {\n APPROVED: 'statusApproved',\n LEGACY_CHARACTERIZED: 'statusLegacy',\n CANDIDATE_HUMAN_DECISION_REQUIRED: 'statusCandidate',\n}\n\nconst STATUS_HINTS: Readonly<Record<string, RiskMessageKey>> = {\n LEGACY_CHARACTERIZED: 'statusHintLegacy',\n CANDIDATE_HUMAN_DECISION_REQUIRED: 'statusHintCandidate',\n}\n\nexport function statusKey(status: string): RiskMessageKey | null {\n return STATUS_KEYS[status] ?? null\n}\n\n/** Hinweis für nicht freigegebene Profile, sonst `null`. */\nexport function statusHintKey(status: string): RiskMessageKey | null {\n return STATUS_HINTS[status] ?? null\n}\n\nconst REQUIREMENT_KEYS: Readonly<Record<string, RiskMessageKey>> = {\n required: 'required',\n value_required: 'valueRequired',\n optional: 'optional',\n}\n\nexport function requirementKey(requirement: string): RiskMessageKey {\n return REQUIREMENT_KEYS[requirement] ?? 'optional'\n}\n\nconst WHEN_MISSING_KEYS: Readonly<Record<string, RiskMessageKey>> = {\n error: 'missingError',\n skip: 'missingSkip',\n all_false: 'missingAllFalse',\n undetermined: 'missingUndetermined',\n}\n\nexport function whenMissingKey(mode: string): RiskMessageKey {\n return WHEN_MISSING_KEYS[mode] ?? 'missingError'\n}\n","/**\n * Port der Risiko-Komponenten zu `auditcore_risk.web` (docs/ui/risk-rest.md).\n * Komponenten erhalten den Port als Prop und rufen nie selbst `fetch` auf;\n * `createRiskRestPort` ist die mitgelieferte REST-Umsetzung.\n */\nimport { requestJson, type RestOptions } from '@auditcore/common'\nimport type { Evaluation, JsonObject, ProfileDetail, ProfileReference } from './types'\n\nexport interface EvaluateRequest {\n profile: { id: string; version: string }\n records: readonly JsonObject[]\n columns?: readonly string[]\n reference_date?: string\n record_key?: string\n flatten?: boolean\n points?: Readonly<Record<string, number>>\n}\n\nexport interface ProfileSummary extends ProfileReference {\n kind: string\n legal_status: string\n rule_count: number\n field_count: number\n open_decision_count: number\n}\n\nexport interface ColumnCheck {\n profile: ProfileReference\n columns: string[]\n complete: boolean\n aborts: boolean\n rules: Array<{ code: string; label: string; missing: string[]; when_missing_columns: string }>\n}\n\nexport interface RiskPort {\n profiles(): Promise<ProfileSummary[]>\n profile(id: string, version: string): Promise<ProfileDetail>\n checkColumns(id: string, version: string, columns: readonly string[]): Promise<ColumnCheck>\n evaluate(request: EvaluateRequest): Promise<Evaluation>\n}\n\nfunction profilePath(id: string, version: string): string {\n return `/profiles/${encodeURIComponent(id)}/${encodeURIComponent(version)}`\n}\n\n/** REST-Umsetzung des Ports, z. B. `createRiskRestPort({ baseUrl: '/api/risk' })`. */\nexport function createRiskRestPort(options: RestOptions): RiskPort {\n return {\n profiles: async () => (await requestJson<{ profiles: ProfileSummary[] }>(options, '/profiles')).profiles,\n profile: (id, version) => requestJson<ProfileDetail>(options, profilePath(id, version)),\n checkColumns: (id, version, columns) =>\n requestJson<ColumnCheck>(options, `${profilePath(id, version)}/check-columns`, { columns }),\n evaluate: (request) => requestJson<Evaluation>(options, '/evaluate', request),\n }\n}\n","// Zustandsautomat von <flowaudit-risk-flags> (Vue und React): Filter,\n// Datensatzauswahl und nachgeladene Profilbeschreibung; alles Übrige sind\n// reine Selektoren über der Auswertung.\n\nimport type { TableColumn, TableRow } from '@auditcore/common'\nimport type { Translate } from '../i18n'\nimport { createStore } from '../store'\nimport type { RiskMessageKey } from './messages'\nimport type { RiskPort } from './port'\nimport { statusHintKey, statusKey } from './labels'\nimport {\n DEFAULT_FILTER,\n distribution,\n filterRecords,\n flagState,\n recordEntries,\n recordLabel,\n recordRules,\n totals,\n triggeredDataset,\n type FlagEntry,\n type RiskDistributionRow,\n type RiskFilter,\n type Totals,\n} from './state'\nimport type { DatasetFinding, Evaluation, ProfileDetail, ProfileReference, RecordView, RuleView } from './types'\n\nexport type RiskTranslate = Translate<RiskMessageKey>\n\n/** Eingaben der Gesamtansicht (Props). */\nexport interface RiskInputs {\n evaluation?: Evaluation | null\n profile?: ProfileDetail | null\n port?: RiskPort | null\n}\n\nexport interface RiskData {\n filter: RiskFilter\n selectedIndex: number | null\n /** Übergebene oder über den Port nachgeladene Profilbeschreibung. */\n profile: ProfileDetail | null\n profileError: string\n}\n\n/** Alles, was die Gesamtansicht aus Stand und Auswertung anzeigt (reine Funktion). */\nexport interface RiskSelection {\n rules: RuleView[]\n codes: string[]\n rows: RiskDistributionRow[]\n totals: Totals\n dataset: DatasetFinding[]\n records: RecordView[]\n tableColumns: TableColumn[]\n tableRows: TableRow[]\n selected: RecordView | null\n entries: FlagEntry[]\n}\n\nexport const EMPTY_EVALUATION: Evaluation = {\n library: '', profile: { id: '', version: '', fingerprint: '', status: '' }, records: [], dataset: [], skipped: {}, summary: [],\n}\n\nexport function riskTableColumns(rules: readonly RuleView[], recordText: string): TableColumn[] {\n return [\n { key: 'record', label: recordText, sortable: true },\n ...rules.map((rule) => ({ key: rule.code, label: rule.code, sortable: true, align: 'center' as const })),\n ]\n}\n\nexport function riskTableRows(evaluation: Evaluation, records: readonly RecordView[], rules: readonly RuleView[]): TableRow[] {\n return records.map((record) => {\n const row: Record<string, unknown> = { id: record.index, record: recordLabel(record) }\n for (const rule of rules) row[rule.code] = flagState(record, rule.code, evaluation.skipped)\n return row\n })\n}\n\nexport function selectRisk(state: Pick<RiskData, 'filter' | 'selectedIndex'>, given: Evaluation | null | undefined, recordText: string): RiskSelection {\n const evaluation = given ?? EMPTY_EVALUATION\n const rules = recordRules(evaluation)\n const records = filterRecords(evaluation, state.filter)\n const selected = evaluation.records.find((record) => record.index === state.selectedIndex) ?? null\n return {\n rules,\n codes: rules.map((rule) => rule.code),\n rows: distribution(evaluation),\n totals: totals(evaluation),\n dataset: triggeredDataset(evaluation),\n records,\n tableColumns: riskTableColumns(rules, recordText),\n tableRows: riskTableRows(evaluation, records, rules),\n selected,\n entries: selected ? recordEntries(selected, rules) : [],\n }\n}\n\n/** Sichtbarer Profilstatus („freigegeben“ …) oder der Rohwert. */\nexport function profileStatusText(profile: ProfileReference | null | undefined, t: RiskTranslate): string {\n const key = profile ? statusKey(profile.status) : null\n return key ? t(key) : (profile?.status ?? '')\n}\n\n/** Warnhinweis für nicht freigegebene Profile, sonst leer. */\nexport function profileHintText(profile: ProfileReference | null | undefined, t: RiskTranslate): string {\n const key = profile ? statusHintKey(profile.status) : null\n return key ? t(key) : ''\n}\n\nfunction errorText(failure: unknown): string {\n return failure instanceof Error ? failure.message : String(failure)\n}\n\nexport function createRiskController() {\n const store = createStore<RiskData>({ filter: { ...DEFAULT_FILTER }, selectedIndex: null, profile: null, profileError: '' })\n\n /**\n * Profilbeschreibung: die übergebene, sonst über den Port nachgeladen\n * (Profil und Version der Auswertung, nie ein Standardprofil). Ein Ergebnis\n * zählt nur, wenn die aktuelle Auswertung noch denselben Fingerabdruck hat.\n */\n async function loadProfile(inputs: RiskInputs, latest: () => RiskInputs): Promise<void> {\n const reference = inputs.evaluation?.profile\n store.set({ profileError: '', profile: inputs.profile ?? null })\n if (inputs.profile || !inputs.port || !reference?.id) return\n try {\n const loaded = await inputs.port.profile(reference.id, reference.version)\n if (latest().evaluation?.profile.fingerprint === reference.fingerprint) store.set({ profile: loaded })\n } catch (failure) {\n store.set({ profileError: errorText(failure) })\n }\n }\n\n return {\n store,\n loadProfile,\n setFilter: (filter: RiskFilter) => store.set({ filter }),\n /** Klick auf einen Code der Verteilung: nach diesem Merkmal filtern (Treffer oder unbestimmt). */\n selectCode: (code: string) => store.set((state) => ({ filter: { ...state.filter, code, state: 'affected' } })),\n /** Datensatz wählen; erneuter Klick hebt die Auswahl auf. Liefert die neue Auswahl. */\n toggleRecord(index: number): number | null {\n const next = store.get().selectedIndex === index ? null : index\n store.set({ selectedIndex: next })\n return next\n },\n select: (index: number | null) => store.set({ selectedIndex: index }),\n /** Neue Auswertung: Auswahl aufheben. */\n resetSelection: () => store.set({ selectedIndex: null }),\n }\n}\n\nexport type RiskController = ReturnType<typeof createRiskController>\n","import { defineMessages, type Translate } from '../i18n'\n\n/** Texte der Screening-Trefferprüfung (Sanktionslisten, PEP). */\nexport const screeningMessages = defineMessages({\n de: {\n title: 'Screening-Trefferprüfung',\n notice: 'Ein Treffer ist ein Prüfhinweis, keine Feststellung.',\n noPort: 'Kein Port übergeben: Eigenschaft „port“ setzen (z. B. createScreeningRestPort).',\n networkError: 'Verbindung fehlgeschlagen: {message}',\n selectRun: 'Prüflauf auswählen oder neu anlegen.',\n sources: 'Quellenstand',\n sourcesOfRun: 'Quellenstand zum Zeitpunkt des Prüflaufs',\n newRun: 'Neuer Prüflauf',\n runs: 'Prüfläufe',\n run: 'Prüflauf',\n runDated: 'Prüflauf {date}',\n hits: 'Treffer',\n comparison: 'Vergleich',\n breakdown: 'Score-Aufschlüsselung',\n decision: 'Entscheidung',\n secondReview: 'Zweitprüfung (Vier-Augen-Prinzip)',\n log: 'Protokoll',\n filters: 'Filter',\n reason: 'Begründung (Pflicht)',\n fourEyes: 'Zweitprüfung durch eine andere Person anfordern',\n fourEyesPolicy: 'Für diese Entscheidung ist die Zweitprüfung vorgeschrieben.',\n approve: 'Zustimmen',\n reject: 'Ablehnen',\n approved: 'zugestimmt',\n rejected: 'abgelehnt',\n input: 'Eingabe',\n listEntry: 'Listeneintrag',\n attribute: 'Merkmal',\n matchColumn: 'Abgleich',\n inconsistent: 'Die Aufschlüsselung lässt sich nicht vollständig nachrechnen. Maßgeblich ist der Ergebniswert der Bibliothek.',\n noSelection: 'Treffer auswählen, um ihn zu vergleichen und zu entscheiden.',\n final: 'Die Entscheidung ist abgeschlossen.',\n saveDecision: 'Entscheidung speichern',\n secondReviewHint: 'Die Zweitprüfung nimmt eine andere Person vor als die entscheidende.',\n lastDecision: 'Zuletzt: {outcome} durch {actor} am {date}',\n fourEyesMarker: '(Vier-Augen-Prinzip)',\n fourEyesMarkerPolicy: '(Vier-Augen-Prinzip, vorgeschrieben)',\n secondReviewDone: 'Zweitprüfung: {result} durch {actor} am {date}',\n nextOpen: 'Nächster offener Treffer',\n hints: 'Hinweise: {hints}',\n all: 'alle',\n filterStatus: 'Prüfstatus',\n filterList: 'Liste',\n filterSubject: 'Geprüfter Name',\n filterConfidence: 'Ähnlichkeitsstufe',\n filterMinScore: 'Mindestscore',\n filterText: 'Suche im Eintrag',\n born: 'geb. {date}',\n countryOf: 'Land {country}',\n normalized: 'Vergleichsform „{query}“',\n queriedLists: 'Abgefragte Listen',\n findingSearched: '{list}: {count} Treffer, Stand {date}',\n findingNotSearched: '{list}: nicht abgefragt',\n noHitsFiltered: 'Keine Treffer im aktuellen Filter.',\n noHits: 'Keine Treffer.',\n viaAlias: 'über Alias „{name}“',\n dobConflict: 'Geburtsjahr weicht ab',\n countryConflict: 'Land weicht ab',\n truncated: 'Es gibt weitere Treffer ({total} insgesamt); Mindestwert erhöhen oder Limit anpassen.',\n limitations: 'Grenzen des Abgleichs',\n logEmpty: 'Keine Einträge.',\n logSecondReview: '{result} (Vorschlag: {outcome})',\n logFourEyes: ', Zweitprüfung angefordert',\n logSubjects: '{count} Namen geprüft',\n profileLine: 'Profil {id} {version}',\n namesHits: '{names} Namen, {hits} Treffer',\n incompleteRun: 'Für {count} Namen wurden nicht alle Listen abgefragt. Ein Ergebnis ohne Treffer belegt dort keine Unbedenklichkeit.',\n kind: 'Prüfart',\n profile: 'Profil',\n recommended: '(empfohlen)',\n lists: 'Listen',\n noStock: 'kein Bestand',\n noStockRun: 'kein Bestand – wird als „nicht abgefragt“ geführt',\n noStockHint: 'Ohne Bestand wird die Liste nicht abgefragt.',\n subjects: 'Namen (je Zeile: Name; Geburtsdatum; Land; Bezug)',\n subjectsPlaceholder: 'Erika Beispiel; 1970-01-31; de; Auftragnehmer Los 1',\n minScore: 'Mindestwert ({min}–{max})',\n caseReference: 'Vorgangsbezug (optional)',\n startRun: 'Prüflauf starten',\n noRuns: 'Noch keine Prüfläufe.',\n runSummary: '{kind} · {names} Namen · {hits} Treffer · {date} · {actor}',\n complete: 'abgeschlossen',\n openCount: '{count} offen',\n incompleteCount: '{count} unvollständig',\n method: 'Verfahren {method}, Skala {min}–{max}',\n level: 'Stufe: {label}',\n minScoreBadge: 'Mindestwert {value}',\n classFrom: '{label} ab {value}',\n checkedAt: 'geprüft {date}',\n noSources: 'Keine Listen eingerichtet.',\n asOf: 'Stand {date}',\n unknown: 'unbekannt',\n entries: '{count} Einträge',\n columnList: 'Liste',\n columnEntries: 'Einträge',\n columnAsOf: 'Stand',\n via: '{kind} · {issuer} · über {provider}',\n dataLicence: 'Datenlizenz: {status}',\n ageUnknown: 'Alter unbekannt',\n ageToday: 'jünger als ein Tag',\n ageOne: 'vor 1 Tag',\n ageDays: 'vor {days} Tagen',\n asOfUnknown: 'Stand unbekannt',\n rowName: 'Name',\n rowMatched: 'Getroffene Schreibweise',\n rowAliases: 'Aliasse',\n rowBirth: 'Geburtsdatum',\n rowCountry: 'Staatsangehörigkeit / Land',\n rowAddress: 'Adresse',\n rowIdentifiers: 'Kennungen',\n rowProgram: 'Programm / Rechtsakt / Funktion',\n rowList: 'Liste',\n rowAsOf: 'Stand der Liste',\n stateMatch: 'stimmt überein',\n stateConflict: 'widerspricht',\n stateNotCompared: 'nicht verglichen',\n errorOutcome: 'Bitte eine Entscheidung wählen.',\n errorReason: 'Eine Begründung ist Pflicht.',\n errorReasonLength: 'Die Begründung ist länger als 4000 Zeichen.',\n errorLine: 'Zeile {line}: Name mit mindestens 3 Zeichen angeben.',\n errorNoSubject: 'Mindestens einen Namen angeben.',\n errorProfile: 'Bitte ein Profil wählen.',\n errorLists: 'Mindestens eine Liste auswählen.',\n status_open: 'offen',\n status_pending_second_review: 'wartet auf Zweitprüfung',\n status_confirmed: 'bestätigt',\n status_dismissed: 'verworfen',\n status_deferred: 'zurückgestellt',\n action_confirmed: 'Treffer bestätigen',\n action_dismissed: 'Treffer verwerfen',\n action_deferred: 'Zurückstellen',\n hint_confirmed: 'Identität mit dem Listeneintrag ist belegt.',\n hint_dismissed: 'Keine Identität mit dem Listeneintrag (Falschtreffer).',\n hint_deferred: 'Klärung offen, später erneut entscheiden.',\n subject_HITS: 'Treffer zur Prüfung',\n subject_NO_HITS: 'keine Treffer in den abgefragten Listen',\n subject_INCOMPLETE: 'keine Treffer, aber nicht alle Listen abgefragt',\n subject_NOT_SEARCHED: 'nicht abgefragt – kein Listenbestand',\n fresh_current: 'aktuell',\n fresh_stale: 'veraltet',\n fresh_unknown: 'Stand unbekannt',\n fresh_not_judged: 'nicht bewertet',\n class_exact: 'exakt',\n class_high: 'hoch',\n class_medium: 'mittel',\n class_low: 'niedrig',\n class_fuzzy: 'unscharf',\n kind_sanctions: 'Sanktionslisten',\n kind_pep: 'Politisch exponierte Personen (PEP)',\n indicator_token_subset: 'Namensteile nur teilweise enthalten',\n indicator_alias_match: 'Treffer über Alias',\n indicator_date_of_birth_not_compared: 'Geburtsdatum nicht verglichen',\n indicator_country_not_compared: 'Land nicht verglichen',\n indicator_below_min_score_after_adjustment: 'nach Abgleich unter dem Mindestwert',\n },\n en: {\n title: 'Screening hit review',\n notice: 'A hit is an indication to review, not a finding.',\n noPort: 'No port given: set the property “port” (e.g. createScreeningRestPort).',\n networkError: 'Connection failed: {message}',\n selectRun: 'Select or create a screening run.',\n sources: 'Source status',\n sourcesOfRun: 'Source status at the time of the run',\n newRun: 'New screening run',\n runs: 'Screening runs',\n run: 'Screening run',\n runDated: 'Screening run {date}',\n hits: 'Hits',\n comparison: 'Comparison',\n breakdown: 'Score breakdown',\n decision: 'Decision',\n secondReview: 'Second review (four-eyes principle)',\n log: 'Log',\n filters: 'Filters',\n reason: 'Reason (required)',\n fourEyes: 'Request a second review by another person',\n fourEyesPolicy: 'A second review is mandatory for this decision.',\n approve: 'Approve',\n reject: 'Reject',\n approved: 'approved',\n rejected: 'rejected',\n input: 'Input',\n listEntry: 'List entry',\n attribute: 'Attribute',\n matchColumn: 'Match',\n noSelection: 'Select a hit to compare and decide.',\n final: 'The decision is final.',\n saveDecision: 'Save decision',\n nextOpen: 'Next open hit',\n all: 'all',\n noHits: 'No hits.',\n logEmpty: 'No entries.',\n startRun: 'Start run',\n noRuns: 'No runs yet.',\n status_open: 'open',\n status_pending_second_review: 'awaiting second review',\n status_confirmed: 'confirmed',\n status_dismissed: 'dismissed',\n status_deferred: 'deferred',\n action_confirmed: 'Confirm hit',\n action_dismissed: 'Dismiss hit',\n action_deferred: 'Defer',\n kind_sanctions: 'Sanctions lists',\n kind_pep: 'Politically exposed persons (PEP)',\n errorOutcome: 'Please choose a decision.',\n errorReason: 'A reason is required.',\n },\n})\n\nexport type ScreeningKey = keyof typeof screeningMessages.de\nexport type ScreeningTranslate = Translate<ScreeningKey>\n\n/** Beschriftung eines Codes aus dem Vertrag (Status, Stufe, Hinweis); unbekannte Codes bleiben stehen. */\nexport function codeLabel(t: ScreeningTranslate, prefix: string, code: string): string {\n const key = `${prefix}_${code}`\n return key in screeningMessages.de ? t(key as ScreeningKey) : code\n}\n","import { requestJson, type RestOptions } from '@auditcore/common'\nimport type { RunQuery, ScreeningPort } from './types'\n\nconst segment = encodeURIComponent\n\nfunction withQuery(path: string, query: RunQuery = {}): string {\n const params = new URLSearchParams(Object.entries(query).filter(([, value]) => value !== undefined && value !== ''))\n const text = params.toString()\n return text ? `${path}?${text}` : path\n}\n\n/** Port auf den REST-Vertrag `screening_review/1` von `auditcore_registry_sources.web`. */\nexport function createScreeningRestPort(options: RestOptions): ScreeningPort {\n const hit = (runId: string, hitId: string): string => `/runs/${segment(runId)}/hits/${segment(hitId)}`\n return {\n settings: () => requestJson(options, '/settings'),\n sources: () => requestJson(options, '/sources'),\n runs: () => requestJson(options, '/runs'),\n createRun: (request) => requestJson(options, '/runs', request),\n run: (runId, query) => requestJson(options, withQuery(`/runs/${segment(runId)}`, query)),\n log: (runId) => requestJson(options, `/runs/${segment(runId)}/log`),\n decide: (runId, hitId, decision) => requestJson(options, `${hit(runId, hitId)}/decision`, decision),\n secondReview: (runId, hitId, review) => requestJson(options, `${hit(runId, hitId)}/second-review`, review),\n }\n}\n","// Typen des REST-Vertrags auditcore_registry_sources.screening_review/1\n// (Server: auditcore_registry_sources/web/_types.py, Doku: docs/ui/screening-rest.md).\n\nexport const CONTRACT = 'auditcore_registry_sources.screening_review/1'\n\nexport type ScreeningKind = 'sanctions' | 'pep'\nexport type Outcome = 'confirmed' | 'dismissed' | 'deferred'\nexport type ReviewStatus = 'open' | 'pending_second_review' | Outcome\nexport type SubjectStatus = 'HITS' | 'NO_HITS' | 'INCOMPLETE' | 'NOT_SEARCHED'\nexport type FreshnessStatus = 'current' | 'stale' | 'unknown' | 'not_judged'\n\nexport interface ActorView {\n id: string\n display_name: string\n}\n\nexport interface SubjectInput {\n subject_id: string\n name: string\n birth_date: string | null\n country: string | null\n schema: string | null\n reference: string | null\n}\n\nexport interface EntryView {\n entry_id: string\n schema: string\n name: string\n aliases: string[]\n aliases_total: number\n birth_date: string\n countries: string\n addresses: string\n identifiers: string\n sanctions: string\n program_ids: string\n first_seen: string\n last_seen: string\n dataset: string\n}\n\nexport interface BreakdownStep {\n step: 'normalization' | 'base' | 'adjustment' | 'clamp' | 'result'\n label: string\n value?: string\n detail?: string\n points?: number\n kind?: string\n}\n\nexport interface ScoreClass {\n class: string\n label: string\n from: number\n}\n\nexport interface Breakdown {\n method: string\n scale: { min: number; max: number }\n steps: BreakdownStep[]\n min_score: number\n classes: ScoreClass[]\n class: string\n class_label: string\n consistent: boolean\n}\n\nexport interface DecisionView {\n outcome: Outcome\n reason: string\n four_eyes: boolean\n four_eyes_source: 'policy' | 'requested' | null\n actor: ActorView\n at: string\n sequence: number\n}\n\nexport interface SecondReviewView {\n approve: boolean\n reason: string\n actor: ActorView\n at: string\n sequence: number\n}\n\nexport interface ReviewView {\n status: ReviewStatus\n status_label: string\n sequence: number\n decision: DecisionView | null\n second_review: SecondReviewView | null\n events: number\n}\n\nexport interface HitView {\n hit_id: string\n subject_id: string\n list_key: string\n list_name: string\n source_key: string | null\n entry: EntryView\n matched_name: string\n matched_field: 'name' | 'alias'\n raw_score: number\n score: number\n confidence: string\n dob_conflict: boolean\n country_conflict: boolean\n below_min_score: boolean\n indicators: string[]\n breakdown: Breakdown\n review: ReviewView\n}\n\nexport interface FindingView {\n list_key: string\n list_name: string\n source_key: string | null\n searched: boolean\n entry_count: number\n as_of: string | null\n retrieved_at: string | null\n hit_count: number\n note: string | null\n}\n\nexport interface SubjectView {\n subject_id: string\n input: SubjectInput\n status: SubjectStatus\n normalized_query: string\n min_score: number\n findings: FindingView[]\n hits: HitView[]\n hits_before_filter: number\n total_hits: number\n truncated: boolean\n notice: string\n limitations: string[]\n}\n\nexport interface FreshnessView {\n status: FreshnessStatus\n label: string\n age_days: number | null\n stale_after_days: number | null\n}\n\nexport interface ListInfo {\n key: string\n source_key: string | null\n name: string\n issuer: string\n url: string\n format: string\n provider: string\n licence_claimed_in_source: string | null\n data_licence: { status?: string; note?: string }\n}\n\nexport interface SourceView {\n list: ListInfo\n kind: ScreeningKind\n entry_count: number\n as_of: string | null\n retrieved_at: string | null\n content_sha256: string | null\n note: string | null\n searchable: boolean\n freshness: FreshnessView\n}\n\nexport interface ProfileView {\n id: string\n version: string\n fingerprint: string\n status: string\n kind: ScreeningKind\n legal_status: string\n default_min_score: number\n scale: { min: number; max: number }\n recommended: boolean\n}\n\nexport interface SettingsView {\n contract: string\n profiles: ProfileView[]\n four_eyes_outcomes: Outcome[]\n stale_after_days: number | null\n}\n\nexport interface SourcesView {\n contract: string\n checked_at: string\n sources: SourceView[]\n}\n\nexport interface RunSummary {\n run_id: string\n created_at: string\n created_by: ActorView\n kind: ScreeningKind\n case_reference: string | null\n profile: { id: string; version: string; fingerprint: string; status: string }\n subject_count: number\n subjects_with_hits: number\n subjects_incomplete: number\n hit_count: number\n review_counts: Record<ReviewStatus, number>\n review_complete: boolean\n last_sequence: number\n}\n\nexport interface RunRequestRecord {\n kind: ScreeningKind\n profile: RunSummary['profile']\n lists: string[]\n min_score: number | null\n limit: number\n case_reference: string | null\n subjects: SubjectInput[]\n}\n\nexport interface RunView extends RunSummary {\n contract: string\n request: RunRequestRecord\n sources: SourceView[]\n subjects: SubjectView[]\n}\n\nexport interface LogEntry {\n run_id: string\n sequence: number\n type: 'run_created' | 'decision_recorded' | 'second_review_recorded'\n type_label: string\n at: string\n actor: ActorView\n hit_id: string | null\n hit?: { subject_name: string; entry_name: string; list_name: string } | null\n data: Record<string, unknown>\n outcome_label?: string\n}\n\nexport interface LogView {\n contract: string\n run_id: string\n events: LogEntry[]\n}\n\nexport interface SubjectRequest {\n name: string\n birth_date?: string\n country?: string\n schema?: string\n reference?: string\n}\n\nexport interface RunRequest {\n kind: ScreeningKind\n profile: { id: string; version: string }\n subjects: SubjectRequest[]\n lists?: string[]\n min_score?: number\n limit?: number\n case_reference?: string\n}\n\nexport interface DecisionRequest {\n outcome: Outcome\n reason: string\n four_eyes: boolean\n expected_sequence?: number\n}\n\nexport interface SecondReviewRequest {\n approve: boolean\n reason: string\n expected_sequence?: number\n}\n\nexport interface ApiErrorBody {\n error: { code: string; message: string; details: Record<string, unknown> }\n}\n\nexport type RunQuery = Partial<Record<'status' | 'list' | 'subject' | 'confidence' | 'min_score', string>>\n\n/**\n * Port der Screening-Trefferprüfung. Die Komponente ruft nie selbst `fetch`\n * auf; `createScreeningRestPort` ist die mitgelieferte REST-Umsetzung.\n */\nexport interface ScreeningPort {\n settings: () => Promise<SettingsView>\n sources: () => Promise<SourcesView>\n runs: () => Promise<{ contract: string; runs: RunSummary[] }>\n createRun: (request: RunRequest) => Promise<RunView>\n run: (runId: string, query?: RunQuery) => Promise<RunView>\n log: (runId: string) => Promise<LogView>\n decide: (runId: string, hitId: string, decision: DecisionRequest) => Promise<HitView>\n secondReview: (runId: string, hitId: string, review: SecondReviewRequest) => Promise<HitView>\n}\n","// Framework-freie View-Logik der Screening-Trefferprüfung: Filter, Formatierung,\n// Vergleichszeilen, Aufschlüsselung, Entscheidungsregeln. Keine Vue-Abhängigkeit.\n\nimport { intlFormatNumber as formatNumber } from '@auditcore/common'\nimport type { Locale, MessageParams } from '../i18n'\nimport { codeLabel, type ScreeningKey, type ScreeningTranslate } from './messages'\nimport type {\n Breakdown,\n FindingView,\n FreshnessStatus,\n HitView,\n Outcome,\n ReviewStatus,\n ReviewView,\n RunView,\n SettingsView,\n SubjectRequest,\n SubjectView,\n} from './types'\n\nexport interface HitFilter {\n statuses: ReviewStatus[]\n lists: string[]\n subjects: string[]\n confidences: string[]\n minScore: number | null\n text: string\n}\n\nexport function emptyFilter(): HitFilter {\n return { statuses: [], lists: [], subjects: [], confidences: [], minScore: null, text: '' }\n}\n\nfunction matchesText(hit: HitView, text: string): boolean {\n if (!text) return true\n const needle = text.toLocaleLowerCase('de')\n const haystack = [hit.entry.name, hit.matched_name, ...hit.entry.aliases, hit.list_name]\n return haystack.some((value) => value.toLocaleLowerCase('de').includes(needle))\n}\n\nexport function acceptsHit(hit: HitView, filter: HitFilter): boolean {\n const checks: [string[], string][] = [\n [filter.statuses, hit.review.status],\n [filter.lists, hit.list_key],\n [filter.subjects, hit.subject_id],\n [filter.confidences, hit.confidence],\n ]\n if (checks.some(([allowed, value]) => allowed.length > 0 && !allowed.includes(value))) return false\n if (filter.minScore !== null && hit.score < filter.minScore) return false\n return matchesText(hit, filter.text.trim())\n}\n\n/** Subjects with only the hits passing the filter; subjects themselves stay visible. */\nexport function filterSubjects(subjects: SubjectView[], filter: HitFilter): SubjectView[] {\n return subjects.map((subject) => ({\n ...subject,\n hits: subject.hits.filter((hit) => acceptsHit(hit, filter)),\n }))\n}\n\nexport interface FilterOptions {\n lists: { key: string; name: string }[]\n subjects: { id: string; name: string }[]\n confidences: string[]\n}\n\nexport function filterOptions(run: RunView): FilterOptions {\n const lists = new Map<string, string>()\n const confidences = new Set<string>()\n for (const subject of run.subjects) {\n for (const finding of subject.findings) lists.set(finding.list_key, finding.list_name)\n for (const hit of subject.hits) confidences.add(hit.confidence)\n }\n return {\n lists: [...lists].map(([key, name]) => ({ key, name })),\n subjects: run.subjects.map((s) => ({ id: s.subject_id, name: s.input.name })),\n confidences: [...confidences],\n }\n}\n\nconst decimals = (scale: { max: number }): number => (scale.max <= 1 ? 2 : 1)\n\nexport function formatScore(value: number, scale: { max: number }, locale: Locale = 'de'): string {\n const digits = decimals(scale)\n return formatNumber(value, locale, { minimumFractionDigits: digits, maximumFractionDigits: digits })\n}\n\nexport function formatPoints(value: number, scale: { max: number }, locale: Locale = 'de'): string {\n const text = formatScore(Math.abs(value), scale, locale)\n if (value > 0) return `+${text}`\n return value < 0 ? `−${text}` : text\n}\n\nexport function scorePercent(value: number, scale: { min: number; max: number }): number {\n const span = scale.max - scale.min\n if (span <= 0) return 0\n return Math.max(0, Math.min(100, ((value - scale.min) / span) * 100))\n}\n\nexport type Tone = 'plus' | 'minus' | 'neutral' | 'result'\n\nexport interface BreakdownRow {\n label: string\n value: string\n points: string\n tone: Tone\n}\n\nfunction stepTone(step: Breakdown['steps'][number]): Tone {\n if (step.step === 'result') return 'result'\n if (step.points === undefined || step.step === 'base') return 'neutral'\n if (step.points > 0) return 'plus'\n return step.points < 0 ? 'minus' : 'neutral'\n}\n\nexport function breakdownRows(breakdown: Breakdown, locale: Locale = 'de'): BreakdownRow[] {\n return breakdown.steps.map((step) => {\n const isDelta = step.step === 'adjustment' || step.step === 'clamp'\n const points =\n step.points === undefined\n ? ''\n : isDelta\n ? formatPoints(step.points, breakdown.scale, locale)\n : formatScore(step.points, breakdown.scale, locale)\n const value = step.value !== undefined ? `„${step.value}“` : ''\n return { label: step.label, value: [value, step.detail ?? ''].filter(Boolean).join(' · '), points, tone: stepTone(step) }\n })\n}\n\nconst DATE = /^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2}))?/\n\nexport function formatDate(value: string | null | undefined): string {\n if (!value) return '–'\n const match = DATE.exec(value)\n if (!match) return value\n const [, year, month, day, hour, minute] = match\n const date = `${day}.${month}.${year}`\n return hour !== undefined && minute !== undefined ? `${date}, ${hour}:${minute}` : date\n}\n\nexport function freshnessTone(status: FreshnessStatus): 'ok' | 'warn' | 'muted' {\n if (status === 'current') return 'ok'\n return status === 'not_judged' ? 'muted' : 'warn'\n}\n\nexport function formatAge(days: number | null, t: ScreeningTranslate): string {\n if (days === null) return t('ageUnknown')\n if (days < 1) return t('ageToday')\n const rounded = Math.round(days)\n return rounded === 1 ? t('ageOne') : t('ageDays', { days: rounded })\n}\n\nexport type MatchState = 'match' | 'conflict' | 'not_compared' | 'info'\n\nexport interface ComparisonRow {\n label: string\n input: string\n entry: string\n state: MatchState\n}\n\nfunction compareState(hit: HitView, conflict: boolean, notCompared: string): MatchState {\n if (hit.indicators.includes(notCompared)) return 'not_compared'\n return conflict ? 'conflict' : 'match'\n}\n\nconst orDash = (value: string | null | undefined): string => (value && value.trim() ? value : '–')\n\nexport function comparisonRows(subject: SubjectView, hit: HitView, t: ScreeningTranslate): ComparisonRow[] {\n const entry = hit.entry\n const finding = subject.findings.find((f) => f.list_key === hit.list_key)\n const aliases = entry.aliases.length ? entry.aliases.join('; ') : '–'\n const more = entry.aliases_total > entry.aliases.length ? ` (+${entry.aliases_total - entry.aliases.length})` : ''\n return [\n { label: t('rowName'), input: subject.input.name, entry: entry.name, state: 'info' },\n { label: t('rowMatched'), input: subject.normalized_query, entry: hit.matched_name, state: 'info' },\n { label: t('rowAliases'), input: '–', entry: aliases + more, state: 'info' },\n {\n label: t('rowBirth'),\n input: orDash(subject.input.birth_date),\n entry: orDash(entry.birth_date),\n state: compareState(hit, hit.dob_conflict, 'date_of_birth_not_compared'),\n },\n {\n label: t('rowCountry'),\n input: orDash(subject.input.country),\n entry: orDash(entry.countries),\n state: compareState(hit, hit.country_conflict, 'country_not_compared'),\n },\n { label: t('rowAddress'), input: '–', entry: orDash(entry.addresses), state: 'info' },\n { label: t('rowIdentifiers'), input: '–', entry: orDash(entry.identifiers), state: 'info' },\n { label: t('rowProgram'), input: '–', entry: orDash(entry.sanctions), state: 'info' },\n { label: t('rowList'), input: '–', entry: `${hit.list_name} (${entry.entry_id})`, state: 'info' },\n { label: t('rowAsOf'), input: '–', entry: findingState(finding, t), state: 'info' },\n ]\n}\n\nfunction findingState(finding: FindingView | undefined, t: ScreeningTranslate): string {\n if (!finding) return '–'\n return finding.as_of ? formatDate(finding.as_of) : t('asOfUnknown')\n}\n\nexport function indicatorLabels(hit: HitView, t: ScreeningTranslate): string[] {\n return hit.indicators.map((code) => codeLabel(t, 'indicator', code))\n}\n\nexport function requiresFourEyes(outcome: Outcome, settings: SettingsView | null): boolean {\n return settings !== null && settings.four_eyes_outcomes.includes(outcome)\n}\n\nexport const canDecide = (review: ReviewView): boolean => review.status === 'open' || review.status === 'deferred'\nexport const awaitsSecondReview = (review: ReviewView): boolean => review.status === 'pending_second_review'\n\nexport interface DecisionForm {\n outcome: Outcome | null\n reason: string\n fourEyes: boolean\n}\n\n/** Meldung als Katalogschlüssel mit Platzhaltern; die Komponente übersetzt sie. */\nexport interface ViewMessage {\n key: ScreeningKey\n params?: MessageParams\n}\n\nexport function validateDecision(form: DecisionForm): ViewMessage[] {\n const errors: ViewMessage[] = []\n if (form.outcome === null) errors.push({ key: 'errorOutcome' })\n if (!form.reason.trim()) errors.push({ key: 'errorReason' })\n if (form.reason.length > 4000) errors.push({ key: 'errorReasonLength' })\n return errors\n}\n\n/** The next hit still needing work after ``currentId`` (open, deferred or pending). */\nexport function nextOpenHit(subjects: SubjectView[], currentId: string | null): string | null {\n const hits = subjects.flatMap((s) => s.hits)\n const start = currentId === null ? 0 : hits.findIndex((h) => h.hit_id === currentId) + 1\n const ordered = [...hits.slice(start), ...hits.slice(0, start)]\n const next = ordered.find((h) => h.hit_id !== currentId && h.review.status !== 'confirmed' && h.review.status !== 'dismissed')\n return next ? next.hit_id : null\n}\n\nexport function findHit(run: RunView | null, hitId: string | null): { subject: SubjectView; hit: HitView } | null {\n if (!run || !hitId) return null\n for (const subject of run.subjects) {\n const hit = subject.hits.find((h) => h.hit_id === hitId)\n if (hit) return { subject, hit }\n }\n return null\n}\n\n/** One subject per line: ``Name; Geburtsdatum; Land; Bezug`` (only the name is required). */\nexport function parseSubjects(text: string): { subjects: SubjectRequest[]; errors: ViewMessage[] } {\n const subjects: SubjectRequest[] = []\n const errors: ViewMessage[] = []\n text.split(/\\r?\\n/).forEach((line, index) => {\n if (!line.trim()) return\n const [name = '', birthDate = '', country = '', reference = ''] = line.split(';').map((p) => p.trim())\n if (name.length < 3) {\n errors.push({ key: 'errorLine', params: { line: index + 1 } })\n return\n }\n const subject: SubjectRequest = { name }\n if (birthDate) subject.birth_date = birthDate\n if (country) subject.country = country\n if (reference) subject.reference = reference\n subjects.push(subject)\n })\n if (!subjects.length && !errors.length) errors.push({ key: 'errorNoSubject' })\n return { subjects, errors }\n}\n\n/** Replace one hit (after a decision) without reloading the whole run. */\nexport function replaceHit(run: RunView, updated: HitView): RunView {\n return {\n ...run,\n subjects: run.subjects.map((subject) => ({\n ...subject,\n hits: subject.hits.map((hit) => (hit.hit_id === updated.hit_id ? updated : hit)),\n })),\n }\n}\n","// Zustandsautomat der Screening-Trefferprüfung (<flowaudit-screening-review>,\n// Vue und React): Laden über den ScreeningPort, Prüfläufe, Filter, Auswahl,\n// Entscheidung und Zweitprüfung. Reine Selektoren liefern die Anzeige.\n\nimport { RestError } from '@auditcore/common'\nimport { createStore, type Store } from '../store'\nimport type {\n HitView,\n LogView,\n Outcome,\n RunRequest,\n RunSummary,\n RunView,\n ScreeningPort,\n SettingsView,\n SourcesView,\n SubjectView,\n} from './types'\nimport { emptyFilter, filterSubjects, findHit, nextOpenHit, replaceHit, type HitFilter } from './view'\n\n/** Fehler einer Portanfrage: Meldung des Servers bzw. `network_error` mit Status 0. */\nexport interface ScreeningError {\n code: string\n message: string\n status: number\n}\n\nexport interface ReviewEvents {\n onRunCreated?: (run: RunView) => void\n onDecided?: (payload: { runId: string; hitId: string; status: string }) => void\n onError?: (error: ScreeningError) => void\n /** Meldung für Fehler ohne Serverantwort (Netz, Programmfehler). */\n networkMessage?: (message: string) => string\n}\n\nexport interface ScreeningData {\n settings: SettingsView | null\n sources: SourcesView | null\n runs: RunSummary[]\n run: RunView | null\n log: LogView | null\n selectedHitId: string | null\n filter: HitFilter\n busy: boolean\n error: ScreeningError | null\n}\n\nexport interface ScreeningSelection {\n visibleSubjects: SubjectView[]\n selected: { subject: SubjectView; hit: HitView } | null\n}\n\nexport function selectScreening(state: ScreeningData): ScreeningSelection {\n return {\n visibleSubjects: state.run ? filterSubjects(state.run.subjects, state.filter) : [],\n selected: findHit(state.run, state.selectedHitId),\n }\n}\n\nexport function asScreeningError(error: unknown, events: ReviewEvents): ScreeningError {\n if (error instanceof RestError) return { code: error.code, message: error.message, status: error.status }\n const raw = error instanceof Error ? error.message : String(error)\n return { code: 'network_error', message: events.networkMessage?.(raw) ?? raw, status: 0 }\n}\n\n/** Leitet jede Anfrage an den aktuell gesetzten Port weiter (Web Components setzen ihn erst nach dem Einhängen). */\nfunction delegate(port: () => ScreeningPort | null | undefined): ScreeningPort {\n const active = (): ScreeningPort => {\n const current = port()\n if (!current) throw new Error('no_port')\n return current\n }\n return {\n settings: () => active().settings(),\n sources: () => active().sources(),\n runs: () => active().runs(),\n createRun: (request) => active().createRun(request),\n run: (runId, query) => active().run(runId, query),\n log: (runId) => active().log(runId),\n decide: (runId, hitId, decision) => active().decide(runId, hitId, decision),\n secondReview: (runId, hitId, review) => active().secondReview(runId, hitId, review),\n }\n}\n\ntype Guard = <T>(action: () => Promise<T>) => Promise<T | null>\n\ninterface Context {\n client: ScreeningPort\n events: () => ReviewEvents\n store: Store<ScreeningData>\n guard: Guard\n}\n\nfunction loadActions({ client, events, store, guard }: Context) {\n async function load(): Promise<void> {\n await guard(async () => {\n const [settings, sources, list] = await Promise.all([client.settings(), client.sources(), client.runs()])\n store.set({ settings, sources, runs: list.runs })\n })\n }\n\n async function openRun(runId: string): Promise<void> {\n await guard(async () => {\n const [run, log] = await Promise.all([client.run(runId), client.log(runId)])\n store.set({ run, log, selectedHitId: nextOpenHit(run.subjects, null) })\n })\n }\n\n async function createRun(request: RunRequest): Promise<boolean> {\n const created = await guard(() => client.createRun(request))\n if (!created) return false\n store.set({ run: created, selectedHitId: nextOpenHit(created.subjects, null) })\n store.set({ log: await client.log(created.run_id).catch(() => null) })\n store.set({ runs: (await client.runs().catch(() => ({ runs: store.get().runs }))).runs })\n events().onRunCreated?.(created)\n return true\n }\n\n return { load, openRun, createRun }\n}\n\nfunction decisionActions({ client, events, store, guard }: Context) {\n async function refresh(runId: string, hitId: string, status: string): Promise<void> {\n const [run, log, list] = await Promise.all([client.run(runId), client.log(runId), client.runs()])\n store.set({ run, log, runs: list.runs })\n events().onDecided?.({ runId, hitId, status })\n }\n\n /** Sendet eine Aktion zum ausgewählten Treffer mit der gelesenen Sequenz und aktualisiert danach Lauf und Protokoll. */\n async function submit(send: (run: RunView, hit: HitView) => Promise<HitView>): Promise<boolean> {\n const current = selectScreening(store.get()).selected\n const view = store.get().run\n if (!current || !view) return false\n const hit = await guard(() => send(view, current.hit))\n if (!hit) return false\n store.set({ run: replaceHit(view, hit) })\n await guard(() => refresh(view.run_id, hit.hit_id, hit.review.status))\n return true\n }\n\n const decide = (outcome: Outcome, reason: string, fourEyes: boolean): Promise<boolean> =>\n submit((run, hit) =>\n client.decide(run.run_id, hit.hit_id, { outcome, reason, four_eyes: fourEyes, expected_sequence: hit.review.sequence }),\n )\n\n const secondReview = (approve: boolean, reason: string): Promise<boolean> =>\n submit((run, hit) => client.secondReview(run.run_id, hit.hit_id, { approve, reason, expected_sequence: hit.review.sequence }))\n\n return { decide, secondReview }\n}\n\nconst INITIAL: ScreeningData = {\n settings: null,\n sources: null,\n runs: [],\n run: null,\n log: null,\n selectedHitId: null,\n filter: emptyFilter(),\n busy: false,\n error: null,\n}\n\nexport function createScreeningController(port: () => ScreeningPort | null | undefined, events: () => ReviewEvents = () => ({})) {\n const store = createStore<ScreeningData>({ ...INITIAL, filter: emptyFilter() })\n\n const guard: Guard = async (action) => {\n store.set({ busy: true, error: null })\n try {\n return await action()\n } catch (caught) {\n const failure = asScreeningError(caught, events())\n store.set({ error: failure })\n events().onError?.(failure)\n return null\n } finally {\n store.set({ busy: false })\n }\n }\n\n const context: Context = { client: delegate(port), events, store, guard }\n return {\n store,\n ...loadActions(context),\n ...decisionActions(context),\n select: (hitId: string | null) => store.set({ selectedHitId: hitId }),\n setFilter: (filter: HitFilter) => store.set({ filter: { ...filter } }),\n selectNext(): void {\n const { run, selectedHitId } = store.get()\n if (run) store.set({ selectedHitId: nextOpenHit(run.subjects, selectedHitId) })\n },\n }\n}\n\nexport type ScreeningController = ReturnType<typeof createScreeningController>\n","// Formularlogik „Neuer Prüflauf“ (Vue und React): Vorbelegung je Prüfart und\n// Aufbau der Anfrage mit Prüfung der Eingaben.\n\nimport type { ProfileView, RunRequest, ScreeningKind, SettingsView, SourceView } from './types'\nimport { parseSubjects, type ViewMessage } from './view'\n\nexport const SCREENING_KINDS: readonly ScreeningKind[] = ['sanctions', 'pep']\n\nexport interface RunForm {\n kind: ScreeningKind\n profileKey: string\n lists: string[]\n subjectsText: string\n minScore: number | null\n caseReference: string\n}\n\nexport const profileKeyOf = (profile: Pick<ProfileView, 'id' | 'version'>): string => `${profile.id}@${profile.version}`\n\nexport function kindProfiles(settings: SettingsView, kind: ScreeningKind): ProfileView[] {\n return settings.profiles.filter((profile) => profile.kind === kind)\n}\n\nexport function kindSources(sources: readonly SourceView[], kind: ScreeningKind): SourceView[] {\n return sources.filter((source) => source.kind === kind)\n}\n\nexport function selectedProfile(settings: SettingsView, form: Pick<RunForm, 'kind' | 'profileKey'>): ProfileView | undefined {\n return kindProfiles(settings, form.kind).find((profile) => profileKeyOf(profile) === form.profileKey)\n}\n\n/** Vorbelegung bei Wechsel der Prüfart oder neuen Einstellungen: empfohlenes Profil, alle Listen, Standard-Mindestwert. */\nexport function runFormDefaults(settings: SettingsView, sources: readonly SourceView[], kind: ScreeningKind): Pick<RunForm, 'profileKey' | 'lists' | 'minScore'> {\n const profiles = kindProfiles(settings, kind)\n const preferred = profiles.find((profile) => profile.recommended) ?? profiles[0]\n return {\n profileKey: preferred ? profileKeyOf(preferred) : '',\n lists: kindSources(sources, kind).map((source) => source.list.key),\n minScore: preferred ? preferred.default_min_score : null,\n }\n}\n\n/** Anfrage aus dem Formular; bei Fehlern `request: null` und die Meldungen als Katalogschlüssel. */\nexport function buildRunRequest(settings: SettingsView, form: RunForm): { request: RunRequest | null; errors: ViewMessage[] } {\n const parsed = parseSubjects(form.subjectsText)\n const profile = selectedProfile(settings, form)\n const errors = [...parsed.errors]\n if (!profile) errors.push({ key: 'errorProfile' })\n if (!form.lists.length) errors.push({ key: 'errorLists' })\n if (errors.length || !profile) return { request: null, errors }\n const request: RunRequest = { kind: form.kind, profile: { id: profile.id, version: profile.version }, subjects: parsed.subjects, lists: form.lists }\n if (form.minScore !== null) request.min_score = form.minScore\n if (form.caseReference.trim()) request.case_reference = form.caseReference.trim()\n return { request, errors }\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte des Datei-Imports (Stichprobe, Benford). */\nexport const tabularMessages = defineMessages({\n de: {\n file: 'Datei (CSV, TSV oder Text)',\n header: 'Erste Zeile enthält Spaltennamen',\n valueColumn: 'Wertspalte',\n idColumn: 'Kennungsspalte',\n stratumColumn: 'Schichtspalte',\n none: '– keine –',\n decimal: 'Dezimaltrennzeichen',\n decimalComma: 'Komma (1.234,56)',\n decimalDot: 'Punkt (1,234.56)',\n column: 'Spalte',\n apply: 'Übernehmen',\n summary: '{file}: {rows} Zeilen, Trennzeichen „{delimiter}“',\n rejected: '{count} Zeilen nicht lesbar (Zeilen {lines}) – nicht übernommen.',\n tab: 'Tabulator',\n },\n en: {\n file: 'File (CSV, TSV or text)',\n header: 'First row contains column names',\n valueColumn: 'Value column',\n apply: 'Apply',\n },\n})\n\nexport type TabularMessageKey = keyof typeof tabularMessages.de\n","// Zustandsautomat des Datei-Imports (Stichprobe, Benford) für Vue und React:\n// Datei lesen, Spalten zuordnen, Vorschau der übernommenen Werte.\n\nimport {\n columnCells,\n detectDecimal,\n guessNumberColumn,\n numberColumn,\n parseTable,\n type DecimalSeparator,\n type ParsedTable,\n} from '@auditcore/common'\nimport { createStore } from '../store'\n\n/** Übernommene Spalten einer Datei. */\nexport interface ImportedColumns {\n filename: string\n values: (number | null)[]\n /** Kennungen und Schichten der übernommenen Zeilen (gleiche Länge wie `values`). */\n ids: string[] | null\n strata: string[] | null\n rejected: number[]\n}\n\nexport interface TableImportData {\n filename: string\n text: string\n table: ParsedTable | null\n hasHeader: boolean\n valueColumn: number\n idColumn: number | null\n stratumColumn: number | null\n decimal: DecimalSeparator\n}\n\nconst INITIAL: TableImportData = {\n filename: '', text: '', table: null, hasHeader: true, valueColumn: 0, idColumn: null, stratumColumn: null, decimal: ',',\n}\n\n/** Vorschau der übernommenen Werte (reine Funktion). */\nexport function importPreview(state: TableImportData): ImportedColumns | null {\n const current = state.table\n if (!current) return null\n const parsed = numberColumn(current, state.valueColumn, state.decimal)\n const rejected = new Set(parsed.rejected)\n const kept = current.rows.filter((_, index) => !rejected.has(index + 1))\n const pick = (column: number | null): string[] | null => (column === null ? null : kept.map((row) => row[column] ?? ''))\n return { filename: state.filename, values: parsed.values, ids: pick(state.idColumn), strata: pick(state.stratumColumn), rejected: parsed.rejected }\n}\n\n/** Anzeige des Trennzeichens („Tabulator“ für `\\t`). */\nexport function importDelimiterText(table: ParsedTable | null, tab: string): string {\n return table?.delimiter === '\\t' ? tab : (table?.delimiter ?? '')\n}\n\n/** Die ersten zehn unlesbaren Zeilen als Liste. */\nexport function importRejectedLines(preview: ImportedColumns | null): string {\n return (preview?.rejected ?? []).slice(0, 10).join(', ')\n}\n\n/** Optionale Spalte aus einem Auswahlwert (`''` = keine). */\nexport function importOptionalColumn(value: string): number | null {\n return value === '' ? null : Number(value)\n}\n\nexport function createTableImportController() {\n const store = createStore<TableImportData>({ ...INITIAL })\n\n /** Nach Umschalten von `hasHeader` neu einlesen. */\n function reparse(): void {\n const state = store.get()\n const table = parseTable(state.text, state.hasHeader)\n const valueColumn = guessNumberColumn(table)\n store.set({ table, valueColumn, decimal: detectDecimal(columnCells(table, valueColumn), table.delimiter) })\n }\n\n function load(filename: string, text: string): void {\n store.set({ filename, text, idColumn: null, stratumColumn: null })\n reparse()\n }\n\n return {\n store,\n load,\n reparse,\n read: async (file: File) => load(file.name, await file.text()),\n setHasHeader: (hasHeader: boolean) => store.set({ hasHeader }),\n setValueColumn: (valueColumn: number) => store.set({ valueColumn }),\n setIdColumn: (idColumn: number | null) => store.set({ idColumn }),\n setStratumColumn: (stratumColumn: number | null) => store.set({ stratumColumn }),\n setDecimal: (decimal: DecimalSeparator) => store.set({ decimal }),\n }\n}\n\nexport type TableImportController = ReturnType<typeof createTableImportController>\n","import { defineMessages } from '../i18n'\n\n/** Texte des Stichprobenrechners. */\nexport const samplingMessages = defineMessages({\n de: {\n title: 'Stichprobe',\n loading: 'Methodenprofile werden geladen …',\n method: 'Methode',\n methodHint: 'Nur benannte Methodenprofile der Bibliothek auswahlbereit.',\n statusRECOMMENDED: 'Empfohlen',\n statusSUPERSEDED: 'Abgelöst',\n statusLEGACY_CHARACTERIZED: 'Charakterisiert',\n formula: 'Formel',\n source: 'Quelle',\n parameters: 'Parameter',\n confidence: 'Konfidenzniveau',\n confidenceOption: '{level} (Faktor {factor})',\n choose: 'Bitte wählen',\n fromPopulation: 'Aus Grundgesamtheit übernehmen',\n calculate: 'Stichprobenumfang berechnen',\n errorRequired: 'Pflichtangabe',\n errorInvalid: 'Keine gültige Zahl',\n errorRange: 'Zulässig: {range}',\n rangeBetween: '{min} bis {max}',\n rangeFrom: 'ab {min}',\n rangeTo: 'bis {max}',\n result: 'Stichprobenumfang',\n resultSummary: 'n = {size}',\n interval: 'Stichprobenintervall J = {interval}',\n derivation: 'Herleitung',\n step: 'Schritt',\n stepFormula: 'Formel',\n stepValue: 'Wert',\n population: 'Grundgesamtheit',\n populationCount: '{count} Elemente, Summe {sum}',\n populationEmpty: 'Keine Grundgesamtheit übergeben. Datei laden oder Elemente als Eigenschaft „items“ setzen.',\n strataCount: '{count} Schichten',\n selection: 'Auswahl',\n sampleSize: 'Stichprobenumfang für die Auswahl',\n variant: 'Auswahlvariante',\n allocation: 'Aufteilung auf Schichten',\n seed: 'Seed',\n seedHint: 'Leer lassen: Der Server erzeugt einen Seed und zeigt ihn an.',\n draw: 'Stichprobe ziehen',\n redraw: 'Neu ziehen mit neuem Seed',\n seedUsed: 'Seed {seed}',\n seedGenerated: 'vom Server erzeugt',\n seedGiven: 'vorgegeben',\n reproducible: 'Mit diesem Seed und derselben Grundgesamtheit (SHA-256 {hash}) ergibt sich dieselbe Auswahl.',\n selectedSummary: '{selected} von {population} Elementen ausgewählt',\n allocationTable: 'Allokation je Schicht',\n stratum: 'Schicht',\n stratumPopulation: 'Umfang N_h',\n stratumSample: 'Stichprobe n_h',\n stratumInterval: 'Intervall',\n stratumStart: 'Start',\n noStratum: 'ohne Schicht',\n excludedNegative: 'Negative Werte (nicht in der Auswahlbasis): {ids}',\n excludedZero: 'Null- oder fehlende Werte (nicht in der Auswahlbasis): {ids}',\n colOrder: 'Nr.',\n colPosition: 'Position',\n colId: 'Kennung',\n colValue: 'Wert',\n colStratum: 'Schicht',\n colHits: 'Treffer',\n exportCsv: 'Auswahl als CSV',\n exportJson: 'Auswahl als JSON',\n selectionErrornoItems: 'Keine Grundgesamtheit vorhanden.',\n selectionErrorsampleSize: 'Stichprobenumfang als ganze Zahl ≥ 0 angeben.',\n selectionErrorseed: 'Seed als ganze Zahl ≥ 0 angeben (höchstens 2^53 − 1).',\n selectionErrorvariant: 'Auswahlvariante wählen.',\n selectionErrorallocation: 'Aufteilung auf Schichten wählen.',\n selectionErrorpartialStrata: 'Nur ein Teil der Elemente hat eine Schicht; entweder alle oder keine schichten.',\n failed: 'Anfrage abgelehnt: {message}',\n },\n en: {\n title: 'Sample',\n method: 'Method',\n parameters: 'Parameters',\n confidence: 'Confidence level',\n calculate: 'Calculate sample size',\n result: 'Sample size',\n derivation: 'Derivation',\n population: 'Population',\n selection: 'Selection',\n draw: 'Draw sample',\n exportCsv: 'Selection as CSV',\n exportJson: 'Selection as JSON',\n },\n})\n\nexport type SamplingMessageKey = keyof typeof samplingMessages.de\n","/**\n * Framework-freie Ansichtslogik des Stichprobenrechners: Eingaben prüfen,\n * Anfragen bilden, Vorschläge aus der Grundgesamtheit, Schichten zählen.\n * Kein Vue, kein DOM – direkt testbar.\n */\nimport { detectDecimal, parseNumber } from '@auditcore/common'\nimport type {\n AllocationMethod,\n MethodProfile,\n ParameterSpec,\n PopulationItem,\n SelectionRequest,\n SelectionVariant,\n SizeRequest,\n} from './types'\n\nexport type FieldErrorCode = 'required' | 'invalid' | 'range'\n\nexport interface FieldError {\n code: FieldErrorCode\n min?: number\n max?: number\n}\n\nexport type SizeValidation =\n | { ok: true; request: SizeRequest }\n | { ok: false; errors: Readonly<Record<string, FieldError>> }\n\n/** Anteile werden in Prozent eingegeben und angezeigt. */\nexport function isPercent(spec: ParameterSpec): boolean {\n return spec.unit === 'Anteil' && spec.type !== 'choice'\n}\n\n/** Eingabetext (deutsch oder englisch notiert) → Zahl; leer → null, unlesbar → undefined. */\nexport function parseInput(text: string): number | null | undefined {\n return parseNumber(text, detectDecimal([text.trim()], ';'))\n}\n\nfunction lowerBound(spec: ParameterSpec): number | undefined {\n return spec.minimum ?? spec.exclusive_minimum\n}\n\nfunction upperBound(spec: ParameterSpec): number | undefined {\n return spec.maximum ?? spec.exclusive_maximum\n}\n\nfunction inRange(spec: ParameterSpec, value: number): boolean {\n if (spec.minimum !== undefined && value < spec.minimum) return false\n if (spec.exclusive_minimum !== undefined && value <= spec.exclusive_minimum) return false\n if (spec.maximum !== undefined && value > spec.maximum) return false\n return !(spec.exclusive_maximum !== undefined && value >= spec.exclusive_maximum)\n}\n\n/** Prüft ein Eingabefeld und liefert den Vertragswert (Prozent → Anteil). */\nexport function fieldValue(spec: ParameterSpec, text: string): { value: number } | { error: FieldError } {\n const parsed = parseInput(text)\n if (parsed === null) return { error: { code: 'required' } }\n if (parsed === undefined) return { error: { code: 'invalid' } }\n const value = isPercent(spec) ? parsed / 100 : parsed\n if (spec.type === 'integer' && !Number.isInteger(value)) return { error: { code: 'invalid' } }\n if (!inRange(spec, value)) {\n const scale = isPercent(spec) ? 100 : 1\n const min = lowerBound(spec)\n const max = upperBound(spec)\n return {\n error: {\n code: 'range',\n ...(min === undefined ? {} : { min: min * scale }),\n ...(max === undefined ? {} : { max: max * scale }),\n },\n }\n }\n return { value }\n}\n\n/** Anfrage für `POST /size`; jedes Feld ist Pflicht, nichts wird still ergänzt. */\nexport function buildSizeRequest(\n profile: MethodProfile,\n texts: Readonly<Record<string, string>>,\n confidence: number | null,\n): SizeValidation {\n const errors: Record<string, FieldError> = {}\n const request: Record<string, number | string> = { method: profile.id }\n for (const spec of profile.parameters) {\n if (spec.type === 'choice') continue\n const result = fieldValue(spec, texts[spec.key] ?? '')\n if ('error' in result) errors[spec.key] = result.error\n else request[spec.key] = result.value\n }\n if (confidence === null) errors.confidence_level = { code: 'required' }\n else request.confidence_level = confidence\n if (Object.keys(errors).length > 0) return { ok: false, errors }\n return { ok: true, request: request as SizeRequest }\n}\n\n/** Vorschlagswerte aus der Grundgesamtheit (Summe positiver Werte bzw. Anzahl). */\nexport function populationSuggestions(items: readonly PopulationItem[]): Readonly<Record<string, number>> {\n const positive = items.reduce((sum, item) => (item.value !== null && item.value > 0 ? sum + item.value : sum), 0)\n return { population_value: Math.round(positive * 100) / 100, population_size: items.length }\n}\n\n/** Startwerte der Textfelder: vorgeschlagene Werte der Profile, sonst leer. */\nexport function initialTexts(profile: MethodProfile, formatter: (value: number) => string): Record<string, string> {\n const texts: Record<string, string> = {}\n for (const spec of profile.parameters) {\n if (spec.suggested === undefined) continue\n texts[spec.key] = formatter(isPercent(spec) ? spec.suggested * 100 : spec.suggested)\n }\n return texts\n}\n\nexport interface StratumCount {\n stratum: string\n population: number\n}\n\n/** Schichten in Reihenfolge ihres ersten Auftretens; leer, wenn kein Element geschichtet ist. */\nexport function strataOf(items: readonly PopulationItem[]): StratumCount[] {\n const counts = new Map<string, number>()\n for (const item of items) {\n if (item.stratum === undefined || item.stratum === '') continue\n counts.set(item.stratum, (counts.get(item.stratum) ?? 0) + 1)\n }\n return [...counts].map(([stratum, population]) => ({ stratum, population }))\n}\n\n/** Teilweise geschichtete Grundgesamtheit (der Server lehnt sie ab). */\nexport function hasPartialStrata(items: readonly PopulationItem[]): boolean {\n const stratified = items.filter((item) => item.stratum !== undefined && item.stratum !== '').length\n return stratified > 0 && stratified < items.length\n}\n\nexport interface SelectionInput {\n profile: MethodProfile\n items: readonly PopulationItem[]\n sampleSize: string\n seed: string\n variant: SelectionVariant | null\n allocation: AllocationMethod | null\n}\n\nexport type SelectionValidation =\n | { ok: true; request: SelectionRequest }\n | { ok: false; error: 'noItems' | 'sampleSize' | 'seed' | 'variant' | 'allocation' | 'partialStrata' }\n\nfunction optionalSeed(text: string): number | null | undefined {\n const trimmed = text.trim()\n if (trimmed === '') return null\n if (!/^\\d{1,19}$/.test(trimmed)) return undefined\n const seed = Number(trimmed)\n return Number.isSafeInteger(seed) ? seed : undefined\n}\n\ntype SelectionFailure = Extract<SelectionValidation, { ok: false }>['error']\n\nfunction sampleSizeOf(text: string): number | null {\n const size = parseInput(text)\n return typeof size === 'number' && Number.isInteger(size) && size >= 0 ? size : null\n}\n\nfunction selectionProblem(input: SelectionInput): SelectionFailure | null {\n if (input.items.length === 0) return 'noItems'\n if (sampleSizeOf(input.sampleSize) === null) return 'sampleSize'\n if (optionalSeed(input.seed) === undefined) return 'seed'\n if (input.profile.kind === 'mus' && input.variant === null) return 'variant'\n if (hasPartialStrata(input.items)) return 'partialStrata'\n if (strataOf(input.items).length > 0 && input.allocation === null) return 'allocation'\n return null\n}\n\n/** Anfrage für `POST /selection`; ein leerer Seed überlässt dem Server die Erzeugung. */\nexport function buildSelectionRequest(input: SelectionInput): SelectionValidation {\n const problem = selectionProblem(input)\n if (problem !== null) return { ok: false, error: problem }\n const seed = optionalSeed(input.seed)\n const mus = input.profile.kind === 'mus'\n const stratified = strataOf(input.items).length > 0\n const request: SelectionRequest = {\n method: input.profile.kind,\n items: input.items,\n sample_size: sampleSizeOf(input.sampleSize) ?? 0,\n ...(mus && input.variant ? { variant: input.variant } : {}),\n ...(typeof seed === 'number' ? { seed } : {}),\n ...(stratified && input.allocation ? { allocation: input.allocation } : {}),\n }\n return { ok: true, request }\n}\n\n/** Übernommene Dateispalten → Elemente der Grundgesamtheit (Kennung sonst laufende Nummer). */\nexport function itemsFromImport(columns: {\n values: readonly (number | null)[]\n ids: readonly string[] | null\n strata: readonly string[] | null\n}): PopulationItem[] {\n return columns.values.map((value, index) => {\n const item: PopulationItem = { id: columns.ids?.[index] || String(index + 1), value }\n const stratum = columns.strata?.[index]\n return stratum ? { ...item, stratum } : item\n })\n}\n\n/** Summe der positiven Werte (Auswahlbasis der Variante „portal“). */\nexport function positiveSum(items: readonly PopulationItem[]): number {\n return items.reduce((sum, item) => (item.value !== null && item.value > 0 ? sum + item.value : sum), 0)\n}\n","import { requestFile, requestJson, type RestOptions } from '@auditcore/common'\nimport type { SamplingPort } from './types'\n\n/** Port auf den REST-Vertrag von `auditcore_sampling.web` (Starlette oder FastAPI). */\nexport function createSamplingRestPort(options: RestOptions): SamplingPort {\n return {\n profiles: () => requestJson(options, '/profiles'),\n size: (request) => requestJson(options, '/size', request),\n allocation: (request) => requestJson(options, '/allocation', request),\n selection: (request) => requestJson(options, '/selection', request),\n exportSelection: (request, format) =>\n requestFile(options, '/selection/export', { ...request, format }, `stichprobe-seed-${request.seed}.${format}`),\n }\n}\n","// Zustandsautomat von <flowaudit-sampling> (Vue und React): Methodenwahl,\n// Parameter, Stichprobenumfang, Grundgesamtheit, Auswahl mit Seed, Export.\n// Die Fachlogik liegt im Port; hier werden nur Eingaben geprüft, Anfragen\n// gebildet und Ergebnisse gehalten.\n\nimport type { DownloadFile } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState } from '../store'\nimport {\n buildSelectionRequest,\n buildSizeRequest,\n initialTexts,\n populationSuggestions,\n strataOf,\n type FieldError,\n type SelectionValidation,\n} from './model'\nimport type {\n AllocationMethod,\n ExportFormat,\n MethodProfile,\n PopulationItem,\n SamplingCatalogue,\n SamplingPort,\n SelectionRequest,\n SelectionResult,\n SelectionVariant,\n SizeResult,\n} from './types'\n\nexport type SamplingBusy = 'load' | 'size' | 'selection' | 'export'\nexport type SelectionError = Extract<SelectionValidation, { ok: false }>['error']\n\nexport interface SamplingCallbacks {\n sizeCalculated?: (result: SizeResult) => void\n selectionDrawn?: (result: SelectionResult) => void\n failed?: (message: string) => void\n}\n\n/** Stand des Stichprobenrechners; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface SamplingData extends RequestState<string> {\n catalogue: SamplingCatalogue | null\n methodId: string\n texts: Record<string, string>\n confidence: number | null\n fieldErrors: Readonly<Record<string, FieldError>>\n size: SizeResult | null\n /** Importierte Grundgesamtheit; `null` = Eigenschaft `items`. */\n imported: readonly PopulationItem[] | null\n sampleSize: string\n seed: string\n variant: SelectionVariant | null\n allocation: AllocationMethod | null\n selection: SelectionResult | null\n lastRequest: (SelectionRequest & { seed: number }) | null\n selectionError: SelectionError | null\n}\n\nexport interface SamplingSource {\n port: () => SamplingPort | null | undefined\n items: () => readonly PopulationItem[]\n /** Zahl → Text im Sprachformat (Startwerte und Vorschläge der Felder). */\n format: (value: number) => string\n callbacks?: () => SamplingCallbacks\n}\n\nexport const INITIAL_SAMPLING: SamplingData = {\n ...IDLE, catalogue: null, methodId: '', texts: {}, confidence: null, fieldErrors: {}, size: null, imported: null,\n sampleSize: '', seed: '', variant: null, allocation: null, selection: null, lastRequest: null, selectionError: null,\n}\n\nexport function samplingProfile(state: SamplingData): MethodProfile | null {\n return state.catalogue?.methods.find((method) => method.id === state.methodId) ?? null\n}\n\nexport function samplingPopulation(state: SamplingData, items: readonly PopulationItem[]): readonly PopulationItem[] {\n return state.imported ?? items\n}\n\nexport function isStratifiedPopulation(population: readonly PopulationItem[]): boolean {\n return strataOf(population).length > 0\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nfunction createActions(source: SamplingSource, store: ReturnType<typeof createStore<SamplingData>>) {\n const run = createRunner<SamplingPort, string, SamplingData>(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n\n async function calculate(): Promise<void> {\n const state = store.get()\n const profile = samplingProfile(state)\n if (!profile) return\n const checked = buildSizeRequest(profile, state.texts, state.confidence)\n store.set({ fieldErrors: checked.ok ? {} : checked.errors })\n if (!checked.ok) return\n const result = await run('size', (port) => port.size(checked.request))\n if (!result) return\n store.set({ size: result, sampleSize: String(result.sample_size) })\n source.callbacks?.().sizeCalculated?.(result)\n }\n\n async function draw(freshSeed = false): Promise<void> {\n const profile = samplingProfile(store.get())\n if (!profile) return\n if (freshSeed) store.set({ seed: '' })\n const state = store.get()\n const checked = buildSelectionRequest({\n profile, items: samplingPopulation(state, source.items()), sampleSize: state.sampleSize, seed: state.seed,\n variant: state.variant, allocation: state.allocation,\n })\n store.set({ selectionError: checked.ok ? null : checked.error })\n if (!checked.ok) return\n const result = await run('selection', (port) => port.selection(checked.request))\n if (!result) return\n store.set({ selection: result, lastRequest: { ...checked.request, seed: result.seed }, seed: String(result.seed) })\n source.callbacks?.().selectionDrawn?.(result)\n }\n\n return { run, calculate, draw }\n}\n\nexport function createSamplingController(source: SamplingSource) {\n const store = createStore<SamplingData>({ ...INITIAL_SAMPLING })\n const { run, calculate, draw } = createActions(source, store)\n\n function selectMethod(id: string): void {\n const profile = samplingProfile({ ...store.get(), methodId: id })\n store.set({\n methodId: id, texts: profile ? initialTexts(profile, source.format) : {}, confidence: null, fieldErrors: {},\n size: null, variant: profile?.default_variant ?? null, selection: null,\n })\n }\n\n async function load(): Promise<void> {\n const result = await run('load', (active) => active.profiles())\n if (!result) return\n store.set({ catalogue: result })\n selectMethod(result.recommended.mus)\n }\n\n function applySuggestions(): void {\n const state = store.get()\n const suggestions = populationSuggestions(samplingPopulation(state, source.items()))\n const texts = { ...state.texts }\n for (const spec of samplingProfile(state)?.parameters ?? []) {\n const value = suggestions[spec.key]\n if (value !== undefined) texts[spec.key] = source.format(value)\n }\n store.set({ texts })\n }\n\n async function exportSelection(format: ExportFormat): Promise<DownloadFile | null> {\n const request = store.get().lastRequest\n return request ? run('export', (port) => port.exportSelection(request, format)) : null\n }\n\n return {\n store,\n load,\n selectMethod,\n applySuggestions,\n calculate,\n draw,\n exportSelection,\n /** Importierte Grundgesamtheit übernehmen; `null` kehrt zur Eigenschaft `items` zurück. */\n usePopulation: (imported: readonly PopulationItem[] | null) => store.set({ imported, selection: null }),\n setTexts: (texts: Record<string, string>) => store.set({ texts }),\n setConfidence: (confidence: number | null) => store.set({ confidence }),\n setSampleSize: (sampleSize: string) => store.set({ sampleSize }),\n setSeed: (seed: string) => store.set({ seed }),\n setVariant: (variant: SelectionVariant | null) => store.set({ variant }),\n setAllocation: (allocation: AllocationMethod | null) => store.set({ allocation }),\n }\n}\n\nexport type SamplingController = ReturnType<typeof createSamplingController>\n","/**\n * Anzeige des Stichprobenrechners für Vue und React (reine Funktionen):\n * Einheiten, Fehlermeldungen der Felder, Methodengruppen, Tabellenspalten,\n * Zusammenfassungen. Texte kommen ausschließlich aus `samplingMessages`.\n */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent, type TableColumn, type TableRow } from '@auditcore/common'\nimport type { BadgeTone } from '../base/types'\nimport type { Locale, Translate } from '../i18n'\nimport type { SamplingMessageKey } from './messages'\nimport { isPercent, positiveSum, strataOf, type FieldError } from './model'\nimport type { ConfidenceLevel, MethodProfile, ParameterSpec, PopulationItem, SamplingCatalogue, SelectionResult, SizeResult } from './types'\nimport type { SelectionError } from './controller'\n\nexport type SamplingTranslate = Translate<SamplingMessageKey>\n\n/** Einheit hinter dem Eingabefeld (Prozent, Euro oder keine). */\nexport function parameterUnit(spec: ParameterSpec): string {\n if (isPercent(spec)) return '%'\n return spec.unit === 'EUR' ? '€' : ''\n}\n\nfunction rangeText(error: FieldError, t: SamplingTranslate, locale: Locale): string {\n const fmt = (value: number): string => formatNumber(value, locale, { maximumFractionDigits: 4 })\n if (error.min !== undefined && error.max !== undefined) return t('rangeBetween', { min: fmt(error.min), max: fmt(error.max) })\n if (error.min !== undefined) return t('rangeFrom', { min: fmt(error.min) })\n return t('rangeTo', { max: fmt(error.max ?? 0) })\n}\n\n/** Fehlermeldung eines Eingabefelds, leer ohne Fehler. */\nexport function samplingFieldError(error: FieldError | undefined, t: SamplingTranslate, locale: Locale): string {\n if (!error) return ''\n if (error.code === 'range') return t('errorRange', { range: rangeText(error, t, locale) })\n return error.code === 'required' ? t('errorRequired') : t('errorInvalid')\n}\n\nexport function selectionErrorKey(error: SelectionError): SamplingMessageKey {\n return `selectionError${error}`\n}\n\nexport function confidenceText(level: ConfidenceLevel, t: SamplingTranslate, locale: Locale): string {\n return t('confidenceOption', { level: formatPercent(level.level, locale, 0), factor: formatNumber(level.factor, locale, { maximumFractionDigits: 3 }) })\n}\n\nexport interface MethodGroup {\n kind: 'mus' | 'srs'\n label: string\n methods: MethodProfile[]\n}\n\nexport function methodGroups(catalogue: SamplingCatalogue): MethodGroup[] {\n return [\n { kind: 'mus', label: 'MUS', methods: catalogue.methods.filter((method) => method.kind === 'mus') },\n { kind: 'srs', label: 'SRS', methods: catalogue.methods.filter((method) => method.kind === 'srs') },\n ]\n}\n\nexport function methodTone(profile: MethodProfile | null): BadgeTone {\n const status = profile?.status\n return status === 'RECOMMENDED' ? 'success' : status === 'SUPERSEDED' ? 'warning' : 'neutral'\n}\n\nexport function methodStatusKey(profile: MethodProfile): SamplingMessageKey {\n return `status${profile.status}`\n}\n\n/** Zusammenfassung der Grundgesamtheit; leer, wenn keine Elemente vorliegen. */\nexport function populationText(items: readonly PopulationItem[], t: SamplingTranslate, locale: Locale): string {\n if (items.length === 0) return ''\n const summary = t('populationCount', { count: formatNumber(items.length, locale), sum: formatNumber(positiveSum(items), locale, { maximumFractionDigits: 2 }) })\n const strata = strataOf(items).length\n return strata ? `${summary} · ${t('strataCount', { count: strata })}` : summary\n}\n\nconst numberFormat = (locale: Locale) => (value: unknown): string =>\n typeof value === 'number' ? formatNumber(value, locale, { maximumFractionDigits: 4 }) : ''\nconst amountFormat = (locale: Locale) => (value: unknown): string =>\n typeof value === 'number' ? formatNumber(value, locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : ''\nconst plain = (value: unknown): string => (value === null || value === undefined ? '' : String(value))\n\nexport function derivationColumns(t: SamplingTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'label', label: t('step') },\n { key: 'formula', label: t('stepFormula') },\n { key: 'value', label: t('stepValue'), align: 'end', format: numberFormat(locale) },\n ]\n}\n\nexport function derivationRows(result: SizeResult): TableRow[] {\n return result.derivation.map((step, index) => ({ id: index, ...step }))\n}\n\nexport function sizeTexts(result: SizeResult, t: SamplingTranslate, locale: Locale): { size: string; interval: string } {\n return {\n size: t('resultSummary', { size: formatNumber(result.sample_size, locale) }),\n interval: result.kind === 'mus' ? t('interval', { interval: formatNumber(result.interval, locale, { maximumFractionDigits: 2 }) }) : '',\n }\n}\n\nexport function selectionColumns(result: SelectionResult, t: SamplingTranslate, locale: Locale): TableColumn[] {\n const stratified = result.strata.some((stratum) => stratum.stratum !== null)\n return [\n { key: 'order', label: t('colOrder'), align: 'end', sortable: true },\n { key: 'position', label: t('colPosition'), align: 'end', sortable: true },\n { key: 'id', label: t('colId'), sortable: true },\n { key: 'value', label: t('colValue'), align: 'end', sortable: true, format: amountFormat(locale) },\n ...(stratified ? [{ key: 'stratum', label: t('colStratum'), sortable: true, format: plain }] : []),\n ...(result.method === 'mus' ? [{ key: 'hits', label: t('colHits'), align: 'end' as const }] : []),\n ]\n}\n\nexport function strataColumns(result: SelectionResult, t: SamplingTranslate, locale: Locale): TableColumn[] {\n const amount = amountFormat(locale)\n return [\n { key: 'stratum', label: t('stratum'), format: (value) => (value === null ? t('noStratum') : String(value)) },\n { key: 'population', label: t('stratumPopulation'), align: 'end' },\n { key: 'sample_size', label: t('stratumSample'), align: 'end' },\n ...(result.method === 'mus'\n ? [\n { key: 'interval', label: t('stratumInterval'), align: 'end' as const, format: amount },\n { key: 'start', label: t('stratumStart'), align: 'end' as const, format: amount },\n ]\n : []),\n ]\n}\n\nexport function strataRows(result: SelectionResult): TableRow[] {\n return result.strata.map((stratum, index) => ({ id: index, ...stratum }))\n}\n\nexport function selectionRows(result: SelectionResult): TableRow[] {\n return result.rows.map((row) => ({ ...row }))\n}\n\n/** Hinweise auf Elemente außerhalb der Auswahlbasis. */\nexport function excludedLines(result: SelectionResult, t: SamplingTranslate): string[] {\n return result.strata.flatMap((stratum) => [\n ...(stratum.excluded_negative?.length ? [t('excludedNegative', { ids: stratum.excluded_negative.join(', ') })] : []),\n ...(stratum.excluded_zero_or_missing?.length ? [t('excludedZero', { ids: stratum.excluded_zero_or_missing.join(', ') })] : []),\n ])\n}\n\nexport interface SelectionTexts {\n seed: string\n origin: string\n summary: string\n reproducible: string\n}\n\nexport function selectionTexts(result: SelectionResult, t: SamplingTranslate, locale: Locale): SelectionTexts {\n return {\n seed: t('seedUsed', { seed: result.seed }),\n origin: result.seed_generated ? t('seedGenerated') : t('seedGiven'),\n summary: t('selectedSummary', { selected: formatNumber(result.selected, locale), population: formatNumber(result.population, locale) }),\n reproducible: t('reproducible', { hash: result.items_sha256.slice(0, 12) }),\n }\n}\n\n/** Zahlformat der Eingabefelder (ohne Tausendertrennung, bis 6 Nachkommastellen). */\nexport function samplingInputNumber(locale: Locale): (value: number) => string {\n return (value) => formatNumber(value, locale, { maximumFractionDigits: 6, useGrouping: false })\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte der Benford-Analyse. */\nexport const benfordMessages = defineMessages({\n de: {\n title: 'Benford-Analyse',\n loading: 'Tests und Bewertungsprofile werden geladen …',\n data: 'Werte',\n valuesCount: '{count} Werte übernommen',\n valuesEmpty: 'Keine Werte übergeben. Datei laden oder Werte als Eigenschaft „values“ setzen.',\n test: 'Test',\n profile: 'Bewertungsprofil',\n shortValues: 'Werte mit nur einer signifikanten Ziffer',\n choose: 'Bitte wählen',\n analyse: 'Analysieren',\n errornoValues: 'Keine Werte vorhanden.',\n errortooMany: 'Zu viele Werte für eine Anfrage.',\n errortest: 'Test wählen.',\n errorprofile: 'Bewertungsprofil wählen.',\n errorshortValues: 'Regel für Werte mit nur einer signifikanten Ziffer wählen.',\n failed: 'Anfrage abgelehnt: {message}',\n notice: 'Die Bewertungsstufen beschreiben die Nähe der Verteilung zum Benford-Gesetz. Sie sind keine Feststellungen zu einzelnen Belegen.',\n analysed: 'Ausgewertet',\n excluded: 'Ausgeschlossen',\n excludedDetail: '{zero} null, {missing} fehlend, {short} kurz; {negative} negativ (Betrag)',\n mad: 'MAD',\n madBounds: 'Grenzen {bounds}',\n chi2: 'Chi²',\n chi2Detail: '{dof} FG, p {p}',\n chi2Exceeds: 'p < α = {alpha}',\n chi2Within: 'p ≥ α = {alpha}',\n zDigits: 'Ziffern mit |z| > {critical}',\n zNone: 'keine',\n chart: 'Verteilung',\n chartLabel: '{test}: beobachtete und erwartete Anteile, {count} Ziffern über dem kritischen z-Wert',\n legendObserved: 'Beobachtet',\n legendExpected: 'Erwartet (Benford)',\n legendExceeds: 'Beobachtet, |z| über kritischem Wert',\n barTitle: 'Ziffer {digit}: beobachtet {observed}, erwartet {expected}, z = {z}',\n axisDigit: 'Ziffer',\n axisShare: 'Anteil',\n table: 'Ziffern',\n colDigit: 'Ziffer',\n colCount: 'Anzahl',\n colObserved: 'Beobachtet',\n colExpected: 'Erwartet',\n colDeviation: 'Abweichung',\n colZ: 'z',\n colExceeds: '|z| > krit.',\n yes: 'ja',\n profileSource: 'Quelle des Profils',\n metricsLegend: 'Zusätzliche Kennzahlen',\n metricchi_square: 'Chi²-Test mit kritischen Werten',\n metricdigit_z: 'Auffällige Ziffern (z je Ziffer)',\n significance: 'Zusätzliche Kennzahlen',\n chiTest: 'Chi²-Test',\n chiTestDetail: '{dof} FG, p {p}',\n criticalValues: 'Kritische Werte: {values}',\n criticalValue: 'α = {alpha}: {value}',\n chiRejects: 'Bei α = {alpha} verworfen (p < α)',\n chiKeeps: 'Bei α = {alpha} nicht verworfen (p ≥ α)',\n chiNoLevel: 'Ohne Signifikanzniveau keine Entscheidung',\n digitZ: 'Auffällige Ziffern',\n digitZDetail: '|z| > {critical}, {correction}',\n withCorrection: 'mit Stetigkeitskorrektur',\n withoutCorrection: 'ohne Stetigkeitskorrektur',\n digitZNoLimit: 'Ohne kritischen z-Wert keine Markierung',\n digitZValues: 'Größtes |z|: Ziffer {digit} ({z})',\n },\n en: {\n title: 'Benford analysis',\n test: 'Test',\n profile: 'Assessment profile',\n analyse: 'Analyse',\n chart: 'Distribution',\n legendObserved: 'Observed',\n legendExpected: 'Expected (Benford)',\n metricsLegend: 'Additional measures',\n chiTest: 'Chi-square test',\n digitZ: 'Conspicuous digits',\n },\n})\n\nexport type BenfordMessageKey = keyof typeof benfordMessages.de\n","/**\n * Geometrie des Benford-Diagramms als reine Funktion (kein DOM, keine\n * Diagrammbibliothek): beobachtete Anteile als Balken, erwartete Anteile als\n * Linie mit Punkten, Überschreitungen des kritischen z-Werts markiert.\n */\nimport type { ConformityRow } from './types'\n\nexport interface ChartBox {\n width: number\n height: number\n top: number\n right: number\n bottom: number\n left: number\n}\n\nexport interface ChartBar {\n digit: number\n x: number\n y: number\n width: number\n height: number\n exceeds: boolean\n}\n\nexport interface ChartGeometry {\n box: ChartBox\n plot: { x: number; y: number; width: number; height: number }\n bars: ChartBar[]\n expected: { x: number; y: number }[]\n expectedPath: string\n yTicks: { y: number; value: number }[]\n /** Nachkommastellen der Prozentbeschriftung (0 für ganze Prozent, sonst 1). */\n tickDigits: number\n xLabels: { x: number; digit: number }[]\n}\n\nexport const DEFAULT_BOX: ChartBox = { width: 720, height: 300, top: 16, right: 16, bottom: 36, left: 52 }\n\n/** Obergrenze der y-Achse: nächstes Vielfaches des Tickabstands über dem Maximum. */\nexport function axisMaximum(maximum: number): { top: number; step: number } {\n const steps = [0.005, 0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5]\n const step = steps.find((candidate) => maximum / candidate <= 5) ?? 1\n const top = Math.max(step, Math.ceil((maximum * 1.05) / step) * step)\n return { top, step }\n}\n\nfunction labelEvery(count: number): number {\n return count > 20 ? 10 : 1\n}\n\nexport function chartGeometry(rows: readonly ConformityRow[], box: ChartBox = DEFAULT_BOX): ChartGeometry {\n const plot = {\n x: box.left,\n y: box.top,\n width: box.width - box.left - box.right,\n height: box.height - box.top - box.bottom,\n }\n const maximum = Math.max(0, ...rows.flatMap((row) => [row.observed_share, row.expected_share]))\n const axis = axisMaximum(maximum)\n const slot = rows.length > 0 ? plot.width / rows.length : 0\n const gap = Math.min(slot * 0.25, 8)\n const scaleY = (share: number): number => plot.y + plot.height - (share / axis.top) * plot.height\n const centre = (index: number): number => plot.x + slot * index + slot / 2\n const bars = rows.map((row, index) => {\n const y = scaleY(row.observed_share)\n return { digit: row.digit, x: plot.x + slot * index + gap / 2, y, width: slot - gap, height: plot.y + plot.height - y, exceeds: row.exceeds }\n })\n const expected = rows.map((row, index) => ({ x: centre(index), y: scaleY(row.expected_share) }))\n const expectedPath = expected.map((point, index) => `${index === 0 ? 'M' : 'L'}${point.x.toFixed(2)},${point.y.toFixed(2)}`).join(' ')\n const tickCount = Math.round(axis.top / axis.step)\n const yTicks = Array.from({ length: tickCount + 1 }, (_, index) => ({ value: index * axis.step, y: scaleY(index * axis.step) }))\n const every = labelEvery(rows.length)\n const xLabels = rows.flatMap((row, index) => (row.digit % every === 0 || every === 1 ? [{ x: centre(index), digit: row.digit }] : []))\n const tickDigits = Number.isInteger(Math.round(axis.step * 1000) / 10) ? 0 : 1\n return { box, plot, bars, expected, expectedPath, yTicks, xLabels, tickDigits }\n}\n","/** Framework-freie Ansichtslogik der Benford-Analyse. */\nimport type { AnalyseRequest, BenfordCatalogue, BenfordMetricId, BenfordMetricsRequest, BenfordTest, ShortValues } from './types'\n\nexport interface AnalyseInput {\n catalogue: BenfordCatalogue\n test: BenfordTest | null\n profile: string | null\n shortValues: ShortValues | null\n values: readonly (number | null)[]\n /** Angeforderte Kennzahlen (bereits ohne abgewählte). */\n metrics?: BenfordMetricsRequest | null\n}\n\nexport const BENFORD_METRIC_IDS: readonly BenfordMetricId[] = ['chi_square', 'digit_z']\n\n/** Vorgegebene Kennzahlen ohne die abgewählten; `null`, wenn keine übrig bleibt. */\nexport function activeMetrics(given: BenfordMetricsRequest | null | undefined, disabled: readonly BenfordMetricId[]): BenfordMetricsRequest | null {\n if (!given) return null\n const active: BenfordMetricsRequest = {}\n if (given.chi_square && !disabled.includes('chi_square')) active.chi_square = given.chi_square\n if (given.digit_z && !disabled.includes('digit_z')) active.digit_z = given.digit_z\n return active.chi_square || active.digit_z ? active : null\n}\n\n/** Kennungen der vorgegebenen Kennzahlen in fester Reihenfolge (für die Auswahl im Formular). */\nexport function offeredMetrics(given: BenfordMetricsRequest | null | undefined): BenfordMetricId[] {\n return BENFORD_METRIC_IDS.filter((id) => Boolean(given?.[id]))\n}\n\nexport type AnalyseError = 'noValues' | 'tooMany' | 'test' | 'profile' | 'shortValues'\n\nexport type AnalyseValidation = { ok: true; request: AnalyseRequest } | { ok: false; error: AnalyseError }\n\n/** Zweistellige Tests (erste zwei Ziffern, zweite Ziffer) verlangen eine Regel für kurze Werte. */\nexport function needsShortValues(catalogue: BenfordCatalogue, test: BenfordTest | null): boolean {\n return catalogue.tests.find((entry) => entry.id === test)?.digits === 2\n}\n\n/** Anfrage für `POST /analyze`; Test, Profil und ggf. Regel für kurze Werte sind Pflicht. */\nexport function buildAnalyseRequest(input: AnalyseInput): AnalyseValidation {\n if (input.values.length === 0) return { ok: false, error: 'noValues' }\n if (input.values.length > input.catalogue.limits.max_values) return { ok: false, error: 'tooMany' }\n if (input.test === null) return { ok: false, error: 'test' }\n if (input.profile === null) return { ok: false, error: 'profile' }\n const twoDigits = needsShortValues(input.catalogue, input.test)\n if (twoDigits && input.shortValues === null) return { ok: false, error: 'shortValues' }\n return {\n ok: true,\n request: {\n test: input.test,\n profile: input.profile,\n values: input.values,\n ...(twoDigits && input.shortValues ? { short_values: input.shortValues } : {}),\n ...(input.metrics ? { metrics: input.metrics } : {}),\n },\n }\n}\n\nexport type LevelTone = 'neutral' | 'success' | 'accent' | 'warning' | 'danger'\n\nconst TONES: readonly LevelTone[] = ['success', 'accent', 'warning', 'danger']\n\n/** Farbton der MAD-Stufe 0–3 (enge … keine Übereinstimmung). */\nexport function levelTone(level: number): LevelTone {\n return TONES[Math.min(Math.max(level, 0), TONES.length - 1)] ?? 'neutral'\n}\n\n/** Anzeige einer Ziffer: zweite Ziffer 0–9, sonst Zahl. */\nexport function digitLabel(digit: number): string {\n return String(digit)\n}\n","import { requestJson, type RestOptions } from '@auditcore/common'\nimport type { BenfordPort } from './types'\n\n/** Port auf den REST-Vertrag von `auditcore_statistics.web` (Starlette oder FastAPI). */\nexport function createBenfordRestPort(options: RestOptions): BenfordPort {\n return {\n profiles: () => requestJson(options, '/profiles'),\n analyse: (request) => requestJson(options, '/analyze', request),\n }\n}\n","// Zustandsautomat von <flowaudit-benford> (Vue und React): Tests und Profile\n// laden, Werte übernehmen, Analyse anstoßen. Berechnet wird ausschließlich\n// über den Port.\n\nimport { createRunner, createStore, IDLE, type RequestState } from '../store'\nimport { activeMetrics, buildAnalyseRequest, type AnalyseError } from './model'\nimport type { BenfordAnalysis, BenfordCatalogue, BenfordMetricId, BenfordMetricsRequest, BenfordPort, BenfordTest, ConformityProfile, ShortValues } from './types'\n\nexport type BenfordBusy = 'load' | 'analyse'\n\nexport interface BenfordCallbacks {\n analysed?: (result: BenfordAnalysis) => void\n failed?: (message: string) => void\n}\n\n/** Stand der Benford-Analyse; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface BenfordData extends RequestState<string> {\n catalogue: BenfordCatalogue | null\n /** Importierte Werte; `null` = Eigenschaft `values`. */\n imported: readonly (number | null)[] | null\n test: BenfordTest | null\n profileId: string | null\n shortValues: ShortValues | null\n result: BenfordAnalysis | null\n validation: AnalyseError | null\n /** Im Formular abgewählte Kennzahlen (Vorgabe: alle vorgegebenen aktiv). */\n disabledMetrics: readonly BenfordMetricId[]\n}\n\nexport interface BenfordSource {\n port: () => BenfordPort | null | undefined\n values: () => readonly (number | null)[]\n callbacks?: () => BenfordCallbacks\n /** Vorgegebene zusätzliche Kennzahlen (Eigenschaft `metrics`). */\n metrics?: () => BenfordMetricsRequest | null | undefined\n /** Nach dem Laden und bei neuen Werten sofort analysieren (Eigenschaft `autoAnalyse`). */\n autoAnalyse?: () => boolean | undefined\n}\n\nexport const INITIAL_BENFORD: BenfordData = {\n ...IDLE, catalogue: null, imported: null, test: 'first', profileId: null, shortValues: null, result: null, validation: null,\n disabledMetrics: [],\n}\n\nexport function benfordValues(state: BenfordData, given: readonly (number | null)[]): readonly (number | null)[] {\n return state.imported ?? given\n}\n\nexport function benfordProfile(state: BenfordData): ConformityProfile | null {\n return state.catalogue?.profiles.find((entry) => entry.id === state.profileId) ?? null\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nexport function createBenfordController(source: BenfordSource) {\n const store = createStore<BenfordData>({ ...INITIAL_BENFORD })\n const run = createRunner<BenfordPort, string, BenfordData>(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n\n const automatic = (): boolean => source.autoAnalyse?.() === true && benfordValues(store.get(), source.values()).length > 0\n\n async function load(): Promise<void> {\n const loaded = await run('load', (active) => active.profiles())\n if (!loaded) return\n store.set({ catalogue: loaded, profileId: loaded.profiles[0]?.id ?? null })\n if (automatic()) await analyse()\n }\n\n async function analyse(): Promise<void> {\n const state = store.get()\n if (!state.catalogue) return\n const checked = buildAnalyseRequest({\n catalogue: state.catalogue, test: state.test, profile: state.profileId, shortValues: state.shortValues,\n values: benfordValues(state, source.values()),\n metrics: activeMetrics(source.metrics?.(), state.disabledMetrics),\n })\n store.set({ validation: checked.ok ? null : checked.error })\n if (!checked.ok) return\n const analysed = await run('analyse', (active) => active.analyse(checked.request))\n if (!analysed) return\n store.set({ result: analysed })\n source.callbacks?.().analysed?.(analysed)\n }\n\n return {\n store,\n load,\n analyse,\n /** Importierte Werte übernehmen; `null` kehrt zur Eigenschaft `values` zurück. */\n useValues: (imported: readonly (number | null)[] | null) => store.set({ imported, result: null }),\n /** Neue Eigenschaft `values`: Import verwerfen, bei `autoAnalyse` erneut analysieren. */\n async valuesChanged(): Promise<void> {\n store.set({ imported: null, result: null })\n if (store.get().catalogue && automatic()) await analyse()\n },\n /** Vorgegebene Kennzahl für die nächste Analyse an- oder abwählen. */\n setMetric: (id: BenfordMetricId, on: boolean) =>\n store.set((state) => ({ disabledMetrics: on ? state.disabledMetrics.filter((entry) => entry !== id) : [...new Set([...state.disabledMetrics, id])] })),\n setTest: (test: BenfordTest | null) => store.set({ test }),\n setProfile: (profileId: string | null) => store.set({ profileId }),\n setShortValues: (shortValues: ShortValues | null) => store.set({ shortValues }),\n }\n}\n\nexport type BenfordController = ReturnType<typeof createBenfordController>\n","/**\n * Anzeige der Benford-Analyse für Vue und React (reine Funktionen): Kennzahlen,\n * Diagrammbeschriftungen und Spalten der Zifferntabelle. Texte ausschließlich\n * aus `benfordMessages`.\n */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent, type TableColumn, type TableRow } from '@auditcore/common'\nimport type { Locale, Translate } from '../i18n'\nimport type { BenfordMessageKey } from './messages'\nimport type { AnalyseError } from './model'\nimport type { BenfordAnalysis, BenfordMetricId, ChiSquareMetric, Conformity, ConformityProfile, DigitZMetric } from './types'\n\nexport type BenfordTranslate = Translate<BenfordMessageKey>\n\nexport function analyseErrorKey(error: AnalyseError): BenfordMessageKey {\n return `error${error}`\n}\n\nexport function benfordValuesText(count: number, t: BenfordTranslate, locale: Locale): string {\n return count ? t('valuesCount', { count: formatNumber(count, locale) }) : t('valuesEmpty')\n}\n\n/** Titel eines Balkens (Tooltip und Vorlesetext). */\nexport function benfordBarTitle(conformity: Conformity, index: number, t: BenfordTranslate, locale: Locale): string {\n const row = conformity.rows[index]\n if (!row) return ''\n return t('barTitle', {\n digit: row.digit,\n observed: formatPercent(row.observed_share, locale, 2),\n expected: formatPercent(row.expected_share, locale, 2),\n z: formatNumber(row.z, locale, { maximumFractionDigits: 2 }),\n })\n}\n\nexport function benfordChartTitle(conformity: Conformity, testLabel: string, t: BenfordTranslate): string {\n return t('chartLabel', { test: testLabel, count: conformity.exceeding_digits.length })\n}\n\nexport function benfordTickText(value: number, digits: number, locale: Locale): string {\n return formatPercent(value, locale, digits)\n}\n\nexport interface BenfordMetricTexts {\n analysed: string\n excluded: string\n excludedDetail: string\n mad: string\n madBounds: string\n chi2: string\n chi2Detail: string\n chi2Verdict: string\n zDigits: string\n exceeding: string\n}\n\nexport function benfordMetricTexts(analysis: BenfordAnalysis, profile: ConformityProfile | null, t: BenfordTranslate, locale: Locale): BenfordMetricTexts {\n const number = (value: number, digits = 4): string => formatNumber(value, locale, { maximumFractionDigits: digits })\n const { conformity, distribution } = analysis\n const excluded = distribution.excluded\n const bounds = (profile?.mad_bounds[conformity.test] ?? []).map((bound) => number(bound)).join(' / ')\n const p = conformity.p_value < 0.0001 ? `< ${number(0.0001)}` : `= ${number(conformity.p_value, 4)}`\n return {\n analysed: formatNumber(conformity.analysed, locale),\n excluded: formatNumber(excluded.zero + excluded.missing + excluded.short, locale),\n excludedDetail: t('excludedDetail', { zero: excluded.zero, missing: excluded.missing, short: excluded.short, negative: distribution.negative_absolute }),\n mad: number(conformity.mad, 5),\n madBounds: t('madBounds', { bounds }),\n chi2: number(conformity.chi2_statistic, 2),\n chi2Detail: t('chi2Detail', { dof: conformity.degrees_of_freedom, p }),\n chi2Verdict: t(conformity.chi2_exceeds ? 'chi2Exceeds' : 'chi2Within', { alpha: number(conformity.significance_level, 3) }),\n zDigits: t('zDigits', { critical: number(conformity.z_critical, 2) }),\n exceeding: conformity.exceeding_digits.length ? conformity.exceeding_digits.join(', ') : t('zNone'),\n }\n}\n\nexport function benfordDigitColumns(t: BenfordTranslate, locale: Locale): TableColumn[] {\n const share = (value: unknown): string => (typeof value === 'number' ? formatPercent(value, locale, 2) : '')\n const signedShare = (value: unknown): string => (typeof value === 'number' ? `${value > 0 ? '+' : ''}${formatPercent(value, locale, 2)}` : '')\n const decimal = (value: unknown): string =>\n typeof value === 'number' ? formatNumber(value, locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : ''\n return [\n { key: 'digit', label: t('colDigit'), align: 'end', sortable: true },\n { key: 'observed_count', label: t('colCount'), align: 'end', sortable: true },\n { key: 'observed_share', label: t('colObserved'), align: 'end', sortable: true, format: share },\n { key: 'expected_share', label: t('colExpected'), align: 'end', format: share },\n { key: 'deviation', label: t('colDeviation'), align: 'end', sortable: true, format: signedShare },\n { key: 'z', label: t('colZ'), align: 'end', sortable: true, format: decimal },\n { key: 'exceeds', label: t('colExceeds'), align: 'center', format: (value) => (value === true ? t('yes') : '') },\n ]\n}\n\nexport function benfordDigitRows(conformity: Conformity): TableRow[] {\n return conformity.rows.map((row) => ({ id: row.digit, ...row }))\n}\n\nexport function benfordMetricLabel(id: BenfordMetricId, t: BenfordTranslate): string {\n return t(`metric${id}`)\n}\n\nexport interface BenfordChiTexts {\n statistic: string\n detail: string\n critical: string\n verdict: string\n /** Farbton des Urteils: `warning` (verworfen), `success`, `neutral` (ohne Niveau). */\n tone: 'warning' | 'success' | 'neutral'\n}\n\nexport interface BenfordDigitZTexts {\n digits: string\n detail: string\n largest: string\n}\n\nfunction pText(p: number, number: (value: number, digits?: number) => string): string {\n return p < 0.0001 ? `< ${number(0.0001)}` : `= ${number(p, 4)}`\n}\n\n/** Texte der Kennzahl `chi_square` (kritische Werte je Niveau, Urteil nur mit Niveau). */\nexport function benfordChiTexts(metric: ChiSquareMetric, t: BenfordTranslate, locale: Locale): BenfordChiTexts {\n const number = (value: number, digits = 4): string => formatNumber(value, locale, { maximumFractionDigits: digits })\n const values = metric.critical_values.map((entry) => t('criticalValue', { alpha: number(entry.level, 3), value: number(entry.value, 3) })).join(' · ')\n const alpha = metric.significance_level === null ? '' : number(metric.significance_level, 3)\n const verdict = metric.rejects === null ? t('chiNoLevel') : t(metric.rejects ? 'chiRejects' : 'chiKeeps', { alpha })\n return {\n statistic: number(metric.chi2_statistic, 2),\n detail: t('chiTestDetail', { dof: metric.degrees_of_freedom, p: pText(metric.p_value, number) }),\n critical: t('criticalValues', { values }),\n verdict,\n tone: metric.rejects === null ? 'neutral' : metric.rejects ? 'warning' : 'success',\n }\n}\n\n/** Texte der Kennzahl `digit_z` („auffällige Ziffern“ nur mit kritischem z-Wert). */\nexport function benfordDigitZTexts(metric: DigitZMetric, t: BenfordTranslate, locale: Locale): BenfordDigitZTexts {\n const number = (value: number, digits: number): string => formatNumber(value, locale, { maximumFractionDigits: digits })\n const correction = t(metric.continuity_correction ? 'withCorrection' : 'withoutCorrection')\n const exceeding = metric.exceeding_digits\n const largest = metric.rows.reduce<DigitZMetric['rows'][number] | null>((top, row) => (top === null || row.z > top.z ? row : top), null)\n return {\n digits: exceeding === null ? t('digitZNoLimit') : exceeding.length ? exceeding.join(', ') : t('zNone'),\n detail: metric.z_critical === null ? correction : t('digitZDetail', { critical: number(metric.z_critical, 3), correction }),\n largest: largest ? t('digitZValues', { digit: largest.digit, z: number(largest.z, 2) }) : '',\n }\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte der Hochrechnung (TER) und der Restfehlerquote (RER). */\nexport const extrapolationMessages = defineMessages({\n de: {\n title: 'Hochrechnung und Fehlerquoten',\n loading: 'Methoden und Profile werden geladen …',\n failed: 'Anfrage abgelehnt: {message}',\n settings: 'Verfahren',\n method: 'Hochrechnungsmethode',\n choose: 'Bitte wählen',\n statistical: 'Statistische Verfahren',\n nonStatistical: 'Nicht-statistische Verfahren',\n methodSource: 'Quelle und Formel',\n confidence: 'Konfidenzniveau',\n factorProfile: 'Faktorprofil (z-Werte, Zuverlässigkeitsfaktoren)',\n sampleSize: 'Geplanter Stichprobenumfang n',\n sampleSizeHint: 'Nur für den konservativen Ansatz: Stichprobenintervall SI = BV / n.',\n materiality: 'Wesentlichkeitsschwelle',\n materialityHint: 'Höchstens 2 % der geltend gemachten Ausgaben.',\n strata: 'Schichten der Grundgesamtheit',\n strataHint: 'Ohne Schichtung eine Zeile. Buchwert und Anzahl einschließlich der vollständig geprüften Einheiten.',\n stratumName: 'Schicht',\n bookValue: 'Buchwert',\n populationSize: 'Anzahl Einheiten (N)',\n systemicDelimited: 'Abgegrenzte systemische Fehler',\n addStratum: 'Schicht hinzufügen',\n remove: 'Entfernen',\n removeRow: '{what} {row} entfernen',\n units: 'Geprüfte Einheiten der Stichprobe',\n unitsHint: 'Fehler = Buchwert − korrigierter Buchwert. Vollerhebung: Einheit der 100-%-Schicht (Hochwertschicht).',\n unitId: 'Kennung',\n stratum: 'Schicht',\n randomError: 'Zufälliger Fehler',\n systemicError: 'Systemischer Fehler',\n anomalousError: 'Anomaler Fehler',\n anomalousReason: 'Begründung (anomal)',\n anomalousCorrected: 'Anomal korrigiert',\n exhaustive: 'Vollerhebung',\n addUnit: 'Einheit hinzufügen',\n noUnits: 'Noch keine Einheiten erfasst.',\n cellLabel: '{field}, Zeile {row}',\n evaluate: 'Hochrechnen',\n issueRequired: 'Pflichtfeld.',\n issueInvalid: 'Keine gültige Zahl.',\n issueRange: 'Wert außerhalb des zulässigen Bereichs.',\n issueReason: 'Anomale Fehler nur mit Begründung.',\n issueStratum: 'Unbekannte Schicht.',\n issueDuplicate: 'Doppelt vergeben.',\n formIncomplete: 'Bitte die markierten Felder prüfen.',\n errormethod: 'Hochrechnungsmethode wählen.',\n errorconfidence: 'Konfidenzniveau wählen.',\n errorprofile: 'Faktorprofil wählen.',\n errorstrata: 'Mindestens eine Schicht erfassen.',\n errorunits: 'Mindestens eine geprüfte Einheit erfassen.',\n resultTitle: 'Gesamtfehlerquote (TER)',\n resultNotice: 'Die Bewertung gibt die Entscheidungsregeln des KOM-Leitfadens wieder; sie ersetzt nicht das fachliche Urteil der Prüfbehörde.',\n projected: 'Hochgerechneter zufälliger Fehler (EE)',\n systemic: 'Abgegrenzte systemische Fehler',\n anomalousUncorrected: 'Nicht korrigierte anomale Fehler',\n anomalousExcluded: 'Korrigierte anomale Fehler (nicht in der TER)',\n totalError: 'Gesamtfehler',\n ter: 'Gesamtfehlerquote (TER)',\n tolerable: 'Tolerierbarer Fehler (TE)',\n precision: 'Präzision (SE)',\n upperLimit: 'Fehlerobergrenze (ULE)',\n notDeterminable: 'nicht bestimmbar',\n correctedBookValue: 'Korrigierter Buchwert (CBV)',\n lowerLimit: 'Untergrenze (CBV − SE)',\n explanation: 'Erläuterung',\n warnings: 'Hinweise',\n derivation: 'Herleitung',\n colStep: 'Schritt',\n colFormula: 'Formel',\n colValue: 'Wert',\n colSource: 'Quelle',\n exportCsv: 'Als CSV exportieren',\n exportJson: 'Als JSON exportieren',\n fingerprint: 'Fingerabdruck der Eingabe',\n residualTitle: 'Restfehlerquote (RER) nach Finanzkorrekturen',\n residualNotice: 'Getrennt von der Gesamtfehlerquote: Die RER berücksichtigt die Finanzkorrekturen (Vorlage CPRE_23-0013-01 Annex 3).',\n auditPopulation: 'Prüfpopulation (A)',\n terRate: 'Gesamtfehlerquote (D)',\n ongoing: 'Beträge in laufender Bewertung (E1)',\n otherNegative: 'Sonstige negative Beträge (E2)',\n corrections: 'Finanzkorrekturen (H)',\n computeResidual: 'Restfehlerquote berechnen',\n rer: 'Restfehlerquote (RER)',\n rerExceeds: 'über der Wesentlichkeitsschwelle',\n rerWithin: 'höchstens Wesentlichkeitsschwelle',\n extrapolatedCorrection: 'Hochgerechnete Finanzkorrektur (L)',\n rateAfter: 'RER nach hochgerechneter Korrektur (M)',\n colRow: 'Zeile',\n colLabel: 'Bezeichnung',\n colAmount: 'Wert',\n notApplicable: 'entfällt',\n design: 'Aufbau der Stichprobe',\n designsingle: 'Ein Zeitraum',\n designperiods: 'Mehrere Zeiträume des Geschäftsjahres',\n designgroups: 'Gruppe von Programmen',\n designHint: 'Mehrere Zeiträume: Leitfaden 6.1.3, 6.2.3, 6.3.3, 6.3.4, 6.4.9 und 7.3; Gruppe von Programmen: 7.8.',\n systemAssessment: 'Bewertung des Verwaltungs- und Kontrollsystems',\n systemAssessmentHint: 'Für die Neuberechnung des Konfidenzniveaus bei nicht schlüssigem Ergebnis (Leitfaden 7.7; Tabelle 1 in 3.2.1).',\n systemNone: 'keine Angabe',\n populationUnits: 'Verschiedene Einheiten aller Zeiträume',\n populationUnitsHint: 'Nur nicht-statistisch, für die Abdeckungsprüfung (Leitfaden 6.4.9).',\n period: 'Zeitraum',\n group: 'Programm',\n groupOptional: 'Programm (optional)',\n errorperiods: 'Für diese Methode beschreibt der Leitfaden keine Stichprobe über mehrere Zeiträume.',\n subsample: 'Teilstichprobe',\n subsampleCreate: 'Teilstichprobe anlegen, Zeile {row}',\n subsampleOpen: 'Teilstichprobe bearbeiten, Zeile {row}',\n subsampleDrop: 'Teilstichprobe entfernen, Zeile {row}',\n fromSubsample: 'aus Teilstichprobe',\n subsampleTitle: 'Teilstichprobe der Einheit {unit}',\n subsampleHint: 'Fehler der Einheit aus einer Zufallsauswahl ihrer Belege, Zahlungsanträge oder Projektpartner (Leitfaden 7.6; ETC 6.5.3). Vollständig geprüfte Teileinheiten (z. B. Lead-Partner) als Vollerhebung markieren; Buchwert der Stichprobenschicht = Buchwert der Einheit − Vollerhebung.',\n estimator: 'Schätzer',\n estimatorratio: 'Verhältnisschätzung',\n estimatormean_per_unit: 'Mittelwertschätzung',\n estimatorpps: 'Wertproportional (MUS-Formel)',\n subPopulation: 'Anzahl Teileinheiten der Stichprobenschicht (N)',\n subItems: 'Geprüfte Teileinheiten',\n subItemId: 'Teileinheit',\n subStratum: 'Teilschicht',\n subStrata: 'Teilschichten (optional)',\n subStrataHint: 'Ohne Teilschichten: eine Stichprobenschicht und die Vollerhebung. Mit Teilschichten: Buchwert (und bei der Mittelwertschätzung die Anzahl) je Teilschicht; die Summe der Buchwerte ist der Buchwert der Einheit.',\n addSubStratum: 'Teilschicht hinzufügen',\n subsampleNestedTitle: 'Teilstichprobe der Teileinheit {item} (Einheit {unit}, dritte Stufe)',\n nestedCreate: 'Teilstichprobe der Teileinheit anlegen, Zeile {row}',\n nestedOpen: 'Teilstichprobe der Teileinheit bearbeiten, Zeile {row}',\n nestedDrop: 'Teilstichprobe der Teileinheit entfernen, Zeile {row}',\n backToUnit: 'Zurück zur Teilstichprobe der Einheit',\n addSubItem: 'Teileinheit hinzufügen',\n close: 'Schließen',\n detailsPeriods: 'Zeiträume',\n detailsGroups: 'Programme der Gruppe',\n detailsSubsamples: 'Teilstichproben',\n recalcTitle: 'Neuberechnung des Konfidenzniveaus (Leitfaden 7.7)',\n recalcLevel: 'Konfidenzniveau für ein schlüssiges Ergebnis',\n recalcCoefficient: 'Neuer z-Wert (z*)',\n recalcRequired: 'Nach Systembewertung verlangt',\n recalcSupports: 'Mit der Systembewertung vereinbar: kein wesentlicher Fehler ohne weitere Prüfungshandlungen.',\n recalcNotSupported: 'Nicht mit der Systembewertung vereinbar: weitere Prüfungshandlungen nach Abschn. 4.12.',\n recalcNoRequirement: 'Ohne Bewertung des Verwaltungs- und Kontrollsystems keine Aussage zur Vereinbarkeit.',\n colName: 'Bezeichnung',\n colBookValue: 'Buchwert',\n colProjected: 'Hochgerechneter Fehler',\n colPrecision: 'Präzision',\n colSampleSize: 'Stichprobe',\n colObservations: 'Beobachtungen',\n colTer: 'Gesamtfehlerquote',\n colUpper: 'Obergrenze',\n colConclusion: 'Ergebnis',\n colRate: 'Fehlerquote',\n colCoverage: 'Deckung',\n colItems: 'Teileinheiten',\n },\n en: {\n title: 'Projection and error rates',\n method: 'Projection method',\n confidence: 'Confidence level',\n evaluate: 'Project',\n resultTitle: 'Total error rate (TER)',\n residualTitle: 'Residual error rate (RER) after financial corrections',\n computeResidual: 'Compute residual error rate',\n design: 'Sample design',\n period: 'Period',\n subsample: 'Sub-sample',\n },\n})\n\nexport type ExtrapolationMessageKey = keyof typeof extrapolationMessages.de\n","/**\n * Formularteile für den Aufbau der Stichprobe (Leitfaden Kap. 6/7): mehrere\n * Zeiträume (7.3), Gruppen von Programmen (7.8), Teilstichproben je Einheit\n * (7.6, 6.5.3) und die Systembewertung für die Neuberechnung des\n * Konfidenzniveaus (7.7). Teilstichproben: `model-subsample.ts`.\n */\nimport type { ExtrapolationDesign, StratumInput } from './types'\n\nexport type DesignIssue = 'required' | 'invalid' | 'range' | 'reason' | 'stratum' | 'duplicate'\n\nexport interface DesignRule {\n required?: boolean\n positive?: boolean\n integer?: boolean\n max?: number\n}\n\n/** Sammelt Feldbefunde (von `model.ts` bereitgestellt). */\nexport interface IssueSink {\n take(key: string, text: string, rule?: DesignRule): number\n flag(key: string, issue: DesignIssue): void\n}\n\n/** Aufbau aus vorbelegten Schichten: Zeitraum oder Gruppe gesetzt? */\nexport function designOf(strata: readonly StratumInput[]): ExtrapolationDesign {\n if (strata.some((stratum) => stratum.period)) return 'periods'\n return strata.some((stratum) => stratum.group) ? 'groups' : 'single'\n}\n\nexport function stratumPart(stratum: StratumInput): string {\n return stratum.period ?? stratum.group ?? ''\n}\n\n\n/** Zeiträume in der Reihenfolge ihres ersten Auftretens. */\nexport function periodNames(parts: readonly string[]): string[] {\n return [...new Set(parts.map((part) => part.trim()).filter(Boolean))]\n}\n\n/** Ergänzungen der Anfrage je Aufbau (Zeitraumliste, Zahl der Einheiten, Systembewertung). */\nexport function designRequest(design: ExtrapolationDesign, parts: readonly string[], populationUnits: string, systemAssessment: string, out: IssueSink) {\n const units = design === 'periods' && populationUnits.trim() ? out.take('populationUnits', populationUnits, { positive: true, integer: true }) : undefined\n return {\n ...(design === 'periods' ? { periods: periodNames(parts).map((name) => ({ name })) } : {}),\n ...(units === undefined ? {} : { population_units: units }),\n ...(systemAssessment ? { system_assessment: Number(systemAssessment) } : {}),\n }\n}\n\n/** Schlüssel einer Schicht für die Zuordnung der Einheiten (je Zeitraum eindeutig). */\nexport function stratumKey(design: ExtrapolationDesign, part: string, name: string): string {\n return design === 'periods' ? `${part.trim()}\\u0000${name.trim()}` : name.trim()\n}\n","/**\n * Teilstichproben im Formular (Leitfaden 7.6, 6.4.10, 6.5.3): Fehler einer\n * Einheit aus einer Zufallsauswahl ihrer Belege, Zahlungsanträge oder\n * Projektpartner.\n *\n * Ohne eigene Teilschichten gilt die einfache Form: eine Stichprobenschicht\n * und vollständig geprüfte Teileinheiten (z. B. der Lead-Partner); der\n * Buchwert der Stichprobenschicht ist der Buchwert der Einheit abzüglich der\n * Vollerhebung. Mit Teilschichten werden Buchwert und Anzahl je Teilschicht\n * erfasst und jede Teileinheit einer Teilschicht zugeordnet. Eine Teileinheit\n * darf selbst eine Teilstichprobe haben (dreistufig, 6.5.3.2.2), tiefer nicht.\n */\nimport type { IssueSink } from './model-design'\nimport type { StratumInput, SubsampleEstimator, SubsampleInput, UnitInput } from './types'\n\nexport const SAMPLED_PART = 'Stichprobe'\nexport const EXHAUSTIVE_PART = 'Vollerhebung'\n/** Einheit (Stufe 1) → Teileinheit (Stufe 2) → Teileinheit (Stufe 3). */\nexport const MAX_SUBSAMPLE_DEPTH = 2\n\nexport interface SubStratumRow {\n key: string\n name: string\n bookValue: string\n populationSize: string\n}\n\nexport interface SubItemRow {\n key: string\n id: string\n /** Teilschicht (nur mit eigenen Teilschichten). */\n stratum: string\n bookValue: string\n random: string\n exhaustive: boolean\n /** Teilstichprobe der Teileinheit (dreistufig). */\n subsample: SubsampleRows | null\n}\n\nexport interface SubsampleRows {\n estimator: SubsampleEstimator\n /** Anzahl Teileinheiten der Stichprobenschicht (einfache Form, Mittelwertschätzung). */\n populationSize: string\n /** Eigene Teilschichten; leer = einfache Form. */\n strata: readonly SubStratumRow[]\n items: readonly SubItemRow[]\n}\n\nexport function emptySubItem(key: string, stratum = ''): SubItemRow {\n return { key, id: '', stratum, bookValue: '', random: '', exhaustive: false, subsample: null }\n}\n\nexport function emptySubStratum(key: string): SubStratumRow {\n return { key, name: '', bookValue: '', populationSize: '' }\n}\n\nexport function emptySubsample(): SubsampleRows {\n return { estimator: 'ratio', populationSize: '', strata: [], items: [] }\n}\n\ntype Format = (value: number) => string\n\nfunction isSimple(sub: SubsampleInput): boolean {\n return sub.strata.every((stratum) => stratum.name === SAMPLED_PART || stratum.name === EXHAUSTIVE_PART)\n}\n\n/** Formularzeilen einer vorbelegten Teilstichprobe (einfache Form oder mit Teilschichten). */\nexport function subsampleRows(sub: SubsampleInput | undefined, format: Format, prefix = 'i'): SubsampleRows | null {\n if (!sub) return null\n const simple = isSimple(sub)\n const sampled = sub.strata.find((stratum) => stratum.name === SAMPLED_PART)\n return {\n estimator: sub.estimator,\n populationSize: simple && sampled?.population_size !== undefined ? String(sampled.population_size) : '',\n strata: simple ? [] : sub.strata.map((stratum, index) => ({\n key: `${prefix}s${index + 1}`,\n name: stratum.name,\n bookValue: format(stratum.book_value),\n populationSize: stratum.population_size === undefined ? '' : String(stratum.population_size),\n })),\n items: sub.units.map((unit, index) => ({\n key: `${prefix}${index + 1}`,\n id: unit.id,\n stratum: simple ? '' : unit.stratum,\n bookValue: format(unit.book_value),\n random: unit.random_error ? format(unit.random_error) : '',\n exhaustive: unit.exhaustive ?? false,\n subsample: subsampleRows(unit.subsample, format, `${prefix}${index + 1}.`),\n })),\n }\n}\n\nfunction readItem(item: SubItemRow, at: string, simple: boolean, depth: number, out: IssueSink): UnitInput {\n const book = out.take(`${at}.bookValue`, item.bookValue, { required: true, positive: true })\n const stratum = simple ? (item.exhaustive ? EXHAUSTIVE_PART : SAMPLED_PART) : item.stratum.trim()\n const nested = item.subsample && depth < MAX_SUBSAMPLE_DEPTH ? item.subsample : null\n const unit: UnitInput = {\n id: item.id.trim(),\n stratum,\n book_value: book,\n ...(nested ? { subsample: readSubsample(nested, book, `${at}.subsample`, out, depth + 1) } : { random_error: out.take(`${at}.random`, item.random) }),\n }\n return item.exhaustive ? { ...unit, exhaustive: true } : unit\n}\n\nfunction readItems(rows: SubsampleRows, key: string, depth: number, out: IssueSink): UnitInput[] {\n const seen = new Set<string>()\n const names = new Set(rows.strata.map((stratum) => stratum.name.trim()))\n const simple = rows.strata.length === 0\n return rows.items.map((item, index) => {\n const at = `${key}.items.${index}`\n const id = item.id.trim()\n if (!id) out.flag(`${at}.id`, 'required')\n else if (seen.has(id)) out.flag(`${at}.id`, 'duplicate')\n seen.add(id)\n if (!simple && !names.has(item.stratum.trim())) out.flag(`${at}.stratum`, 'stratum')\n return readItem(item, at, simple, depth, out)\n })\n}\n\nfunction simpleStrata(rows: SubsampleRows, units: readonly UnitInput[], unitBook: number, key: string, out: IssueSink): StratumInput[] {\n const exhaustive = units.filter((unit) => unit.exhaustive).reduce((sum, unit) => sum + unit.book_value, 0)\n const sampled = unitBook - exhaustive\n if (sampled <= 0) out.flag(`${key}.items`, 'range')\n const size = rows.estimator === 'mean_per_unit' ? out.take(`${key}.populationSize`, rows.populationSize, { required: true, positive: true, integer: true }) : undefined\n const strata: StratumInput[] = [{ name: SAMPLED_PART, book_value: sampled, ...(size === undefined ? {} : { population_size: size }) }]\n if (exhaustive > 0) strata.unshift({ name: EXHAUSTIVE_PART, book_value: exhaustive })\n return strata\n}\n\nfunction ownStrata(rows: SubsampleRows, unitBook: number, key: string, out: IssueSink): StratumInput[] {\n const seen = new Set<string>()\n const strata = rows.strata.map((row, index) => {\n const at = `${key}.strata.${index}`\n const name = row.name.trim()\n if (!name) out.flag(`${at}.name`, 'required')\n else if (seen.has(name)) out.flag(`${at}.name`, 'duplicate')\n seen.add(name)\n const book = out.take(`${at}.bookValue`, row.bookValue, { required: true, positive: true })\n const needsSize = rows.estimator === 'mean_per_unit' || row.populationSize.trim() !== ''\n const size = needsSize ? out.take(`${at}.populationSize`, row.populationSize, { required: true, positive: true, integer: true }) : undefined\n return { name, book_value: book, ...(size === undefined ? {} : { population_size: size }) }\n })\n const total = strata.reduce((sum, stratum) => sum + stratum.book_value, 0)\n if (Math.abs(total - unitBook) > 0.005) out.flag(`${key}.strata`, 'range')\n return strata\n}\n\n/** Teilstichprobe für die Anfrage (`depth` 1 = Teilstichprobe der Einheit). */\nexport function readSubsample(rows: SubsampleRows, unitBook: number, key: string, out: IssueSink, depth = 1): SubsampleInput {\n const units = readItems(rows, key, depth, out)\n if (!units.some((unit) => !unit.exhaustive)) out.flag(`${key}.items`, 'required')\n const strata = rows.strata.length ? ownStrata(rows, unitBook, key, out) : simpleStrata(rows, units, unitBook, key, out)\n return { estimator: rows.estimator, strata, units }\n}\n","/**\n * Framework-freie Formularlogik der Hochrechnung: Zeilen als Text (so wie\n * eingegeben), Prüfung je Feld und Aufbau der Anfragen. Nichts wird still\n * ergänzt; leere Fehlerfelder zählen als 0.\n */\nimport { parseInput } from '../sampling/model'\nimport { designRequest, stratumKey, stratumPart } from './model-design'\nimport { readSubsample, subsampleRows, type SubsampleRows } from './model-subsample'\nimport type { EvaluationRequest, EvaluationResult, ExtrapolationCatalogue, ExtrapolationDesign, ExtrapolationMethod, ResidualRequest, StratumInput, UnitInput } from './types'\n\nexport interface StratumRow {\n key: string\n name: string\n bookValue: string\n populationSize: string\n systemic: string\n /** Zeitraum bzw. Programm (Aufbau `periods` bzw. `groups`). */\n part: string\n /** Programm bei mehreren Zeiträumen (optional, Leitfaden 6.3.4 und 7.8). */\n group: string\n}\n\nexport interface UnitRow {\n key: string\n id: string\n stratum: string\n bookValue: string\n random: string\n systemic: string\n anomalous: string\n reason: string\n corrected: boolean\n exhaustive: boolean\n period: string\n subsample: SubsampleRows | null\n}\n\nexport interface ExtrapolationForm {\n methodId: string\n confidence: number | null\n profileId: string | null\n sampleSize: string\n /** Wesentlichkeitsschwelle in Prozent. */\n materiality: string\n strata: readonly StratumRow[]\n units: readonly UnitRow[]\n design: ExtrapolationDesign\n /** Kategorie 1–4 der Systembewertung (Tabelle 1, Leitfaden 3.2.1) oder leer. */\n systemAssessment: string\n /** Verschiedene Einheiten aller Zeiträume (nicht-statistisch, 6.4.9). */\n populationUnits: string\n}\n\nexport type ExtrapolationIssue = 'required' | 'invalid' | 'range' | 'reason' | 'stratum' | 'duplicate'\nexport type ExtrapolationFormError = 'method' | 'confidence' | 'profile' | 'strata' | 'units' | 'periods'\nexport type ExtrapolationIssues = Readonly<Record<string, ExtrapolationIssue>>\n\nexport type EvaluationValidation =\n | { ok: true; request: EvaluationRequest }\n | { ok: false; error: ExtrapolationFormError | null; issues: ExtrapolationIssues }\n\nexport interface ResidualForm {\n auditPopulation: string\n /** Gesamtfehlerquote in Prozent. */\n terRate: string\n ongoing: string\n otherNegative: string\n corrections: string\n}\n\nexport type ResidualValidation = { ok: true; request: ResidualRequest } | { ok: false; issues: ExtrapolationIssues }\n\nexport const EMPTY_RESIDUAL: ResidualForm = { auditPopulation: '', terRate: '', ongoing: '', otherNegative: '', corrections: '' }\n\nexport function emptyStratum(key: string): StratumRow {\n return { key, name: '', bookValue: '', populationSize: '', systemic: '', part: '', group: '' }\n}\n\nexport function emptyUnit(key: string, stratum = '', period = ''): UnitRow {\n return { key, id: '', stratum, bookValue: '', random: '', systemic: '', anomalous: '', reason: '', corrected: false, exhaustive: false, period, subsample: null }\n}\n\ntype Format = (value: number) => string\n\nconst optional = (value: number | undefined, format: Format): string => (value === undefined || value === 0 ? '' : format(value))\n\nexport function stratumRows(strata: readonly StratumInput[], format: Format): StratumRow[] {\n return strata.map((stratum, index) => ({\n key: `s${index + 1}`,\n name: stratum.name,\n bookValue: format(stratum.book_value),\n populationSize: stratum.population_size === undefined ? '' : String(stratum.population_size),\n systemic: optional(stratum.systemic_error, format),\n part: stratumPart(stratum),\n group: stratum.period ? stratum.group ?? '' : '',\n }))\n}\n\nexport function unitRows(units: readonly UnitInput[], format: Format): UnitRow[] {\n return units.map((unit, index) => ({\n key: `u${index + 1}`,\n id: unit.id,\n stratum: unit.stratum,\n bookValue: format(unit.book_value),\n random: optional(unit.random_error, format),\n systemic: optional(unit.systemic_error, format),\n anomalous: optional(unit.anomalous_error, format),\n reason: unit.anomalous_reason ?? '',\n corrected: unit.anomalous_corrected ?? false,\n exhaustive: unit.exhaustive ?? false,\n period: unit.period ?? '',\n subsample: subsampleRows(unit.subsample, format),\n }))\n}\n\ninterface Rule {\n required?: boolean\n positive?: boolean\n integer?: boolean\n max?: number\n}\n\nfunction violates(value: number, rule: Rule): boolean {\n if (rule.integer && !Number.isInteger(value)) return true\n const low = rule.positive ? value <= 0 : value < 0\n return low || (rule.max !== undefined && value > rule.max)\n}\n\n/** Zahl eines Textfelds oder der Befund; leere, nicht verlangte Felder ergeben 0. */\nexport function readExtrapolationAmount(text: string, rule: Rule = {}): number | ExtrapolationIssue {\n const parsed = parseInput(text)\n if (parsed === null) return rule.required ? 'required' : 0\n if (parsed === undefined) return 'invalid'\n if (rule.integer && !Number.isInteger(parsed)) return 'invalid'\n return violates(parsed, rule) ? 'range' : parsed\n}\n\nclass Collector {\n readonly issues: Record<string, ExtrapolationIssue> = {}\n\n take(key: string, text: string, rule: Rule = {}): number {\n const value = readExtrapolationAmount(text, rule)\n if (typeof value === 'number') return value\n this.issues[key] = value\n return 0\n }\n\n flag(key: string, issue: ExtrapolationIssue): void {\n this.issues[key] = issue\n }\n}\n\nfunction withPart(design: ExtrapolationDesign, row: StratumRow, index: number, out: Collector): Partial<StratumInput> {\n if (design === 'single') return {}\n const part = row.part.trim()\n if (!part) out.flag(`strata.${index}.part`, 'required')\n if (design === 'groups') return { group: part }\n const group = row.group.trim()\n return group ? { period: part, group } : { period: part }\n}\n\nfunction readStrata(rows: readonly StratumRow[], method: ExtrapolationMethod, design: ExtrapolationDesign, out: Collector): StratumInput[] {\n const seen = new Set<string>()\n return rows.map((row, index) => {\n const name = row.name.trim()\n const key = stratumKey(design, row.part, name)\n if (!name) out.flag(`strata.${index}.name`, 'required')\n else if (seen.has(key)) out.flag(`strata.${index}.name`, 'duplicate')\n seen.add(key)\n const stratum: StratumInput = { name, book_value: out.take(`strata.${index}.bookValue`, row.bookValue, { required: true, positive: true }) }\n const systemic = out.take(`strata.${index}.systemic`, row.systemic)\n const size = row.populationSize.trim() || method.needs_population_size\n ? out.take(`strata.${index}.populationSize`, row.populationSize, { required: true, positive: true, integer: true })\n : undefined\n return { ...stratum, ...(size === undefined ? {} : { population_size: size }), ...(systemic ? { systemic_error: systemic } : {}), ...withPart(design, row, index, out) }\n })\n}\n\nfunction readUnit(row: UnitRow, index: number, names: ReadonlySet<string>, design: ExtrapolationDesign, out: Collector): UnitInput {\n const key = `units.${index}`\n if (!row.id.trim()) out.flag(`${key}.id`, 'required')\n if (!names.has(stratumKey(design, row.period, row.stratum))) out.flag(`${key}.stratum`, 'stratum')\n const anomalous = out.take(`${key}.anomalous`, row.anomalous)\n if (anomalous > 0 && !row.reason.trim()) out.flag(`${key}.reason`, 'reason')\n const book = out.take(`${key}.bookValue`, row.bookValue, { required: true, positive: true })\n const unit: UnitInput = {\n id: row.id.trim(),\n stratum: row.stratum.trim(),\n book_value: book,\n ...(row.subsample ? { subsample: readSubsample(row.subsample, book, `${key}.subsample`, out) } : { random_error: out.take(`${key}.random`, row.random) }),\n systemic_error: out.take(`${key}.systemic`, row.systemic),\n anomalous_error: anomalous,\n }\n const period = design === 'periods' ? { period: row.period.trim() } : {}\n return { ...unit, ...period, ...(anomalous > 0 ? { anomalous_reason: row.reason.trim(), anomalous_corrected: row.corrected } : {}), ...(row.exhaustive ? { exhaustive: true } : {}) }\n}\n\nfunction formError(catalogue: ExtrapolationCatalogue, form: ExtrapolationForm): ExtrapolationFormError | null {\n const method = catalogue.methods.find((entry) => entry.id === form.methodId)\n if (!method) return 'method'\n if (method.statistical && form.confidence === null) return 'confidence'\n if (method.statistical && form.profileId === null) return 'profile'\n if (form.design === 'periods' && method.periods === false) return 'periods'\n if (form.strata.length === 0) return 'strata'\n return form.units.length === 0 ? 'units' : null\n}\n\nfunction settings(method: ExtrapolationMethod, form: ExtrapolationForm, out: Collector): Partial<EvaluationRequest> {\n const materiality = out.take('materiality', form.materiality, { required: true, positive: true, max: 2 })\n const size = method.needs_sample_size ? out.take('sampleSize', form.sampleSize, { required: true, positive: true, integer: true }) : undefined\n return {\n materiality_rate: materiality / 100,\n ...(method.statistical && form.confidence !== null ? { confidence_level: form.confidence } : {}),\n ...(method.statistical && form.profileId !== null ? { factor_profile: form.profileId } : {}),\n ...(size === undefined ? {} : { sample_size: size }),\n }\n}\n\n/** Programme über mehrere Zeiträume: alle Schichten oder keine (Leitfaden 7.8). */\nfunction checkPeriodGroups(rows: readonly StratumRow[], out: Collector): void {\n if (!rows.some((row) => row.group.trim())) return\n rows.forEach((row, index) => {\n if (!row.group.trim()) out.flag(`strata.${index}.group`, 'required')\n })\n}\n\n/** Anfrage für `POST /evaluate`; bei Befunden die Feldschlüssel mit ihrem Fehler. */\nexport function buildEvaluationRequest(catalogue: ExtrapolationCatalogue, form: ExtrapolationForm): EvaluationValidation {\n const error = formError(catalogue, form)\n const method = catalogue.methods.find((entry) => entry.id === form.methodId)\n if (error || !method) return { ok: false, error, issues: {} }\n const out = new Collector()\n const strata = readStrata(form.strata, method, form.design, out)\n const names = new Set(form.strata.filter((row) => row.name.trim()).map((row) => stratumKey(form.design, row.part, row.name)))\n const units = form.units.map((row, index) => readUnit(row, index, names, form.design, out))\n const extra = designRequest(form.design, form.strata.map((row) => row.part), form.populationUnits, form.systemAssessment, out)\n if (form.design === 'periods') checkPeriodGroups(form.strata, out)\n const request = { method: method.id, ...settings(method, form, out), ...extra, strata, units } as EvaluationRequest\n return Object.keys(out.issues).length ? { ok: false, error: null, issues: out.issues } : { ok: true, request }\n}\n\n/** RER-Formular aus einer Auswertung: A = Buchwert, D = Gesamtfehlerquote (in Prozent). */\nexport function residualFormFrom(result: EvaluationResult, current: ResidualForm, format: (value: number) => string): ResidualForm {\n const ter = result.total_error_rate\n return { ...current, auditPopulation: format(ter.book_value), terRate: format(ter.rate * 100) }\n}\n\n/** Anfrage für `POST /residual`; die Gesamtfehlerquote wird in Prozent eingegeben. */\nexport function buildResidualRequest(form: ResidualForm, materialityRate: number): ResidualValidation {\n const out = new Collector()\n const request: ResidualRequest = {\n audit_population: out.take('auditPopulation', form.auditPopulation, { required: true, positive: true }),\n total_error_rate: out.take('terRate', form.terRate, { required: true, max: 100 }) / 100,\n ongoing_assessment: out.take('ongoing', form.ongoing),\n other_negative_amounts: out.take('otherNegative', form.otherNegative),\n financial_corrections: out.take('corrections', form.corrections),\n materiality_rate: materialityRate,\n }\n return Object.keys(out.issues).length ? { ok: false, issues: out.issues } : { ok: true, request }\n}\n\nexport function extrapolationMethodById(catalogue: ExtrapolationCatalogue | null, id: string): ExtrapolationMethod | null {\n return catalogue?.methods.find((method) => method.id === id) ?? null\n}\n\n/** Konfidenzniveaus, die die gewählte Methode mit Tabellenwerten erlaubt. */\nexport function confidenceChoices(catalogue: ExtrapolationCatalogue, method: ExtrapolationMethod | null): readonly number[] {\n return method?.id === 'mus.conservative' ? catalogue.confidence_levels['mus.conservative'] : catalogue.confidence_levels.z\n}\n","import { requestFile, requestJson, type RestOptions } from '@auditcore/common'\nimport type { ExtrapolationPort } from './types'\n\n/** Port auf den REST-Vertrag von `auditcore_extrapolation.web` (Starlette oder FastAPI). */\nexport function createExtrapolationRestPort(options: RestOptions): ExtrapolationPort {\n return {\n profiles: () => requestJson(options, '/profiles'),\n evaluate: (request) => requestJson(options, '/evaluate', request),\n residual: (request) => requestJson(options, '/residual', request),\n exportEvaluation: (request, format) =>\n requestFile(options, '/evaluate/export', { ...request, format }, `hochrechnung-${request.method}.${format}`),\n }\n}\n","// Bearbeitung der Teilstichprobe einer Einheit (Leitfaden 7.6, 6.5.3) im\n// Zustandsautomaten der Hochrechnung: anlegen, öffnen, Teilschichten und\n// Teileinheiten pflegen, Teilstichprobe einer Teileinheit (dreistufig).\nimport type { Store } from '../store'\nimport type { ExtrapolationData } from './controller'\nimport type { UnitRow } from './model'\nimport { emptySubItem, emptySubsample, emptySubStratum, type SubItemRow, type SubsampleRows, type SubStratumRow } from './model-subsample'\n\nfunction patchUnit(store: Store<ExtrapolationData>, index: number, patch: Partial<UnitRow>): void {\n store.set((state) => ({ form: { ...state.form, units: state.form.units.map((row, position) => (position === index ? { ...row, ...patch } : row)) } }))\n}\n\nfunction replaceAt<T>(rows: readonly T[], index: number, change: Partial<T>): T[] {\n return rows.map((row, position) => (position === index ? { ...row, ...change } : row))\n}\n\n/** Gerade bearbeitete Teilstichprobe: die der Einheit oder die einer ihrer Teileinheiten. */\nexport function openSubsample(state: ExtrapolationData): SubsampleRows | null {\n const unit = state.subsampleUnit === null ? null : state.form.units[state.subsampleUnit]?.subsample ?? null\n if (!unit || state.subsampleItem === null) return unit\n return unit.items[state.subsampleItem]?.subsample ?? null\n}\n\nexport function createSubsampleActions(store: Store<ExtrapolationData>, key: (prefix: string) => string) {\n const patch = (change: (rows: SubsampleRows) => Partial<SubsampleRows>): void => {\n const state = store.get()\n const index = state.subsampleUnit\n const unit = index === null ? null : state.form.units[index]?.subsample\n if (index === null || !unit) return\n if (state.subsampleItem === null) {\n patchUnit(store, index, { subsample: { ...unit, ...change(unit) } })\n return\n }\n const nested = unit.items[state.subsampleItem]?.subsample\n if (!nested) return\n patchUnit(store, index, { subsample: { ...unit, items: replaceAt(unit.items, state.subsampleItem, { subsample: { ...nested, ...change(nested) } }) } })\n }\n const fresh = (): SubsampleRows => ({ ...emptySubsample(), items: [emptySubItem(key('i'))] })\n return {\n /** Teilstichprobe anlegen und öffnen bzw. entfernen (der Fehler kommt dann wieder aus dem Feld). */\n toggleSubsample(index: number): void {\n const unit = store.get().form.units[index]\n if (!unit) return\n if (unit.subsample) {\n patchUnit(store, index, { subsample: null })\n store.set((state) => (state.subsampleUnit === index ? { subsampleUnit: null, subsampleItem: null } : {}))\n return\n }\n patchUnit(store, index, { subsample: fresh(), random: '' })\n store.set({ subsampleUnit: index, subsampleItem: null })\n },\n editSubsample: (index: number | null) => store.set({ subsampleUnit: index, subsampleItem: null }),\n /** Teilstichprobe einer Teileinheit anlegen bzw. entfernen (nur in der Teilstichprobe der Einheit). */\n toggleNestedSubsample(item: number): void {\n if (store.get().subsampleItem !== null) return\n const current = store.get()\n const unit = current.subsampleUnit === null ? null : current.form.units[current.subsampleUnit]?.subsample\n const row = unit?.items[item]\n if (!row) return\n patch((rows) => ({ items: replaceAt(rows.items, item, row.subsample ? { subsample: null } : { subsample: fresh(), random: '' }) }))\n if (!row.subsample) store.set({ subsampleItem: item })\n },\n editNestedSubsample: (item: number | null) => store.set({ subsampleItem: item }),\n updateSubsample: (change: Partial<Pick<SubsampleRows, 'estimator' | 'populationSize'>>) => patch(() => change),\n addSubStratum: () => patch((rows) => ({ strata: [...rows.strata, emptySubStratum(key('t'))] })),\n updateSubStratum: (index: number, change: Partial<SubStratumRow>) => patch((rows) => ({ strata: replaceAt(rows.strata, index, change) })),\n removeSubStratum: (index: number) => patch((rows) => ({ strata: rows.strata.filter((_, position) => position !== index) })),\n addSubItem: () => patch((rows) => ({ items: [...rows.items, emptySubItem(key('i'), rows.strata[0]?.name ?? '')] })),\n updateSubItem: (item: number, change: Partial<SubItemRow>) => patch((rows) => ({ items: replaceAt(rows.items, item, change) })),\n removeSubItem: (item: number) => patch((rows) => ({ items: rows.items.filter((_, position) => position !== item) })),\n }\n}\n","// Zustandsautomat von <flowaudit-extrapolation> (Vue und React): Methode,\n// Konfidenzniveau, Schichten und geprüfte Einheiten erfassen, hochrechnen\n// (TER), getrennt davon die Restfehlerquote (RER) berechnen und exportieren.\n// Gerechnet wird ausschließlich über den Port.\n\nimport type { DownloadFile } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport {\n buildEvaluationRequest,\n buildResidualRequest,\n confidenceChoices,\n EMPTY_RESIDUAL,\n emptyStratum,\n emptyUnit,\n extrapolationMethodById,\n residualFormFrom,\n stratumRows,\n unitRows,\n type ExtrapolationForm,\n type ExtrapolationFormError,\n type ExtrapolationIssues,\n type ResidualForm,\n type StratumRow,\n type UnitRow,\n} from './model'\nimport { createSubsampleActions } from './controller-subsample'\nimport { designOf } from './model-design'\nimport type {\n EvaluationRequest,\n EvaluationResult,\n ExtrapolationCatalogue,\n ExtrapolationExportFormat,\n ExtrapolationMethod,\n ExtrapolationPort,\n ResidualResult,\n StratumInput,\n UnitInput,\n} from './types'\n\nexport type ExtrapolationBusy = 'load' | 'evaluate' | 'residual' | 'export'\n\nexport interface ExtrapolationCallbacks {\n evaluated?: (result: EvaluationResult) => void\n residualComputed?: (result: ResidualResult) => void\n failed?: (message: string) => void\n}\n\n/** Stand der Hochrechnung; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface ExtrapolationData extends RequestState<string> {\n catalogue: ExtrapolationCatalogue | null\n form: ExtrapolationForm\n formError: ExtrapolationFormError | null\n issues: ExtrapolationIssues\n result: EvaluationResult | null\n lastRequest: EvaluationRequest | null\n residualForm: ResidualForm\n residualIssues: ExtrapolationIssues\n residual: ResidualResult | null\n /** Einheit, deren Teilstichprobe gerade bearbeitet wird. */\n subsampleUnit: number | null\n /** Teileinheit dieser Teilstichprobe, deren eigene Teilstichprobe bearbeitet wird (dreistufig). */\n subsampleItem: number | null\n}\n\nexport interface ExtrapolationSource {\n port: () => ExtrapolationPort | null | undefined\n strata: () => readonly StratumInput[]\n units: () => readonly UnitInput[]\n /** Zahl → Eingabetext im Sprachformat. */\n format: (value: number) => string\n callbacks?: () => ExtrapolationCallbacks\n}\n\nconst EMPTY_FORM: ExtrapolationForm = {\n methodId: '', confidence: null, profileId: null, sampleSize: '', materiality: '', strata: [], units: [], design: 'single', systemAssessment: '', populationUnits: '',\n}\n\nexport const INITIAL_EXTRAPOLATION: ExtrapolationData = {\n ...IDLE, catalogue: null, form: EMPTY_FORM, formError: null, issues: {}, result: null, lastRequest: null,\n residualForm: EMPTY_RESIDUAL, residualIssues: {}, residual: null, subsampleUnit: null, subsampleItem: null,\n}\n\nexport function extrapolationMethod(state: ExtrapolationData): ExtrapolationMethod | null {\n return extrapolationMethodById(state.catalogue, state.form.methodId)\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nfunction replaceAt<T>(rows: readonly T[], index: number, patch: Partial<T>): T[] {\n return rows.map((row, position) => (position === index ? { ...row, ...patch } : row))\n}\n\nfunction createRows(store: Store<ExtrapolationData>) {\n let counter = 0\n const key = (prefix: string): string => `${prefix}n${(counter += 1)}`\n const patchForm = (patch: Partial<ExtrapolationForm>): void => store.set((state) => ({ form: { ...state.form, ...patch } }))\n return {\n patchForm,\n addStratum: () => patchForm({ strata: [...store.get().form.strata, emptyStratum(key('s'))] }),\n updateStratum: (index: number, patch: Partial<StratumRow>) => patchForm({ strata: replaceAt(store.get().form.strata, index, patch) }),\n removeStratum: (index: number) => patchForm({ strata: store.get().form.strata.filter((_, position) => position !== index) }),\n addUnit: () => {\n const form = store.get().form\n patchForm({ units: [...form.units, emptyUnit(key('u'), form.strata[0]?.name ?? '', form.design === 'periods' ? form.strata[0]?.part ?? '' : '')] })\n },\n updateUnit: (index: number, patch: Partial<UnitRow>) => patchForm({ units: replaceAt(store.get().form.units, index, patch) }),\n removeUnit: (index: number) => {\n patchForm({ units: store.get().form.units.filter((_, position) => position !== index) })\n store.set({ subsampleUnit: null, subsampleItem: null })\n },\n ...createSubsampleActions(store, key),\n }\n}\n\ntype Run = ReturnType<typeof createRunner<ExtrapolationPort, string, ExtrapolationData>>\n\nfunction createRequests(source: ExtrapolationSource, store: Store<ExtrapolationData>, run: Run) {\n async function evaluate(): Promise<void> {\n const state = store.get()\n if (!state.catalogue) return\n const checked = buildEvaluationRequest(state.catalogue, state.form)\n store.set({ formError: checked.ok ? null : checked.error, issues: checked.ok ? {} : checked.issues })\n if (!checked.ok) return\n const result = await run('evaluate', (port) => port.evaluate(checked.request))\n if (!result) return\n store.set({ result, lastRequest: checked.request, residual: null, residualIssues: {}, residualForm: residualFormFrom(result, store.get().residualForm, source.format) })\n source.callbacks?.().evaluated?.(result)\n }\n\n async function computeResidual(): Promise<void> {\n const state = store.get()\n const checked = buildResidualRequest(state.residualForm, state.lastRequest?.materiality_rate ?? 0.02)\n store.set({ residualIssues: checked.ok ? {} : checked.issues })\n if (!checked.ok) return\n const result = await run('residual', (port) => port.residual(checked.request))\n if (!result) return\n store.set({ residual: result })\n source.callbacks?.().residualComputed?.(result)\n }\n\n async function exportEvaluation(format: ExtrapolationExportFormat): Promise<DownloadFile | null> {\n const request = store.get().lastRequest\n return request ? run('export', (port) => port.exportEvaluation(request, format)) : null\n }\n\n return { evaluate, computeResidual, exportEvaluation }\n}\n\nexport function createExtrapolationController(source: ExtrapolationSource) {\n const store = createStore<ExtrapolationData>({ ...INITIAL_EXTRAPOLATION })\n const run: Run = createRunner<ExtrapolationPort, string, ExtrapolationData>(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n const rows = createRows(store)\n\n /** Eigenschaften `strata`/`units` als bearbeitbare Zeilen übernehmen (verwirft das Ergebnis). */\n function applyInputs(): void {\n const strata = stratumRows(source.strata(), source.format)\n rows.patchForm({ strata: strata.length ? strata : [emptyStratum('s1')], units: unitRows(source.units(), source.format), design: designOf(source.strata()) })\n store.set({ result: null, residual: null, issues: {}, formError: null, subsampleUnit: null, subsampleItem: null })\n }\n\n async function load(): Promise<void> {\n const catalogue = await run('load', (port) => port.profiles())\n if (!catalogue) return\n store.set({ catalogue })\n rows.patchForm({ profileId: catalogue.recommended_profile, materiality: source.format(catalogue.materiality.default * 100) })\n applyInputs()\n }\n\n function selectMethod(methodId: string): void {\n const state = store.get()\n const method = extrapolationMethodById(state.catalogue, methodId)\n const keep = state.catalogue && state.form.confidence !== null && confidenceChoices(state.catalogue, method).includes(state.form.confidence)\n rows.patchForm({ methodId, confidence: keep ? state.form.confidence : null })\n store.set({ formError: null })\n }\n\n return {\n store,\n load,\n applyInputs,\n selectMethod,\n ...createRequests(source, store, run),\n ...rows,\n setConfidence: (confidence: number | null) => rows.patchForm({ confidence }),\n setProfile: (profileId: string | null) => rows.patchForm({ profileId }),\n setSampleSize: (sampleSize: string) => rows.patchForm({ sampleSize }),\n setMateriality: (materiality: string) => rows.patchForm({ materiality }),\n setDesign: (design: ExtrapolationForm['design']) => {\n rows.patchForm({ design })\n store.set({ formError: null })\n },\n setSystemAssessment: (systemAssessment: string) => rows.patchForm({ systemAssessment }),\n setPopulationUnits: (populationUnits: string) => rows.patchForm({ populationUnits }),\n setResidual: (patch: Partial<ResidualForm>) => store.set((state) => ({ residualForm: { ...state.residualForm, ...patch } })),\n }\n}\n\nexport type ExtrapolationController = ReturnType<typeof createExtrapolationController>\n","/**\n * Anzeige der Hochrechnung für Vue und React (reine Funktionen): Kennzahlen\n * der TER, Ergebnis-Ton, Herleitungstabelle und Zeilen der RER-Vorlage.\n * Texte ausschließlich aus `extrapolationMessages`.\n */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent, type TableColumn, type TableRow } from '@auditcore/common'\nimport type { BadgeTone } from '../base/types'\nimport type { Locale, Translate } from '../i18n'\nimport type { ExtrapolationMessageKey } from './messages'\nimport type { ExtrapolationFormError, ExtrapolationIssue } from './model'\nimport type { Conclusion, EvaluationResult, ExtrapolationCatalogue, ExtrapolationMethod, ResidualErrorRate } from './types'\n\nexport type ExtrapolationTranslate = Translate<ExtrapolationMessageKey>\n\nconst TONES: Readonly<Record<Conclusion, BadgeTone>> = { material: 'danger', not_material: 'success', inconclusive: 'warning' }\n\nexport function conclusionTone(conclusion: Conclusion): BadgeTone {\n return TONES[conclusion]\n}\n\nexport function conclusionLabel(catalogue: ExtrapolationCatalogue | null, conclusion: Conclusion): string {\n return catalogue?.conclusions.find((entry) => entry.id === conclusion)?.label ?? conclusion\n}\n\nexport function extrapolationAmount(value: number, locale: Locale): string {\n return `${formatNumber(value, locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} €`\n}\n\nexport function extrapolationRate(value: number, locale: Locale): string {\n return formatPercent(value, locale, 2)\n}\n\n/** Zahl als Eingabetext (ohne Tausendertrenner). */\nexport function extrapolationInputNumber(locale: Locale): (value: number) => string {\n return (value) => formatNumber(value, locale, { maximumFractionDigits: 6, useGrouping: false })\n}\n\nexport function extrapolationIssueKey(issue: ExtrapolationIssue): ExtrapolationMessageKey {\n const keys: Readonly<Record<ExtrapolationIssue, ExtrapolationMessageKey>> = {\n required: 'issueRequired', invalid: 'issueInvalid', range: 'issueRange', reason: 'issueReason', stratum: 'issueStratum', duplicate: 'issueDuplicate',\n }\n return keys[issue]\n}\n\nexport function extrapolationFormErrorKey(error: ExtrapolationFormError): ExtrapolationMessageKey {\n return `error${error}`\n}\n\nexport interface ExtrapolationMethodGroup {\n statistical: boolean\n label: string\n methods: readonly ExtrapolationMethod[]\n}\n\nexport function extrapolationMethodGroups(catalogue: ExtrapolationCatalogue, t: ExtrapolationTranslate): ExtrapolationMethodGroup[] {\n return [true, false].map((statistical) => ({\n statistical,\n label: t(statistical ? 'statistical' : 'nonStatistical'),\n methods: catalogue.methods.filter((method) => method.statistical === statistical),\n }))\n}\n\nexport function extrapolationConfidenceLabel(level: number, locale: Locale): string {\n return formatPercent(level, locale, 0)\n}\n\nexport interface ExtrapolationMetric {\n id: string\n label: string\n value: string\n detail?: string\n}\n\nfunction limitMetrics(result: EvaluationResult, t: ExtrapolationTranslate, locale: Locale): ExtrapolationMetric[] {\n const ter = result.total_error_rate\n if (ter.precision === null || ter.upper_limit === null) {\n return [{ id: 'precision', label: t('precision'), value: t('notDeterminable') }, { id: 'upper', label: t('upperLimit'), value: t('notDeterminable') }]\n }\n const metrics: ExtrapolationMetric[] = [\n { id: 'precision', label: t('precision'), value: extrapolationAmount(ter.precision, locale) },\n { id: 'upper', label: t('upperLimit'), value: extrapolationAmount(ter.upper_limit, locale), detail: extrapolationRate(ter.upper_limit_rate ?? 0, locale) },\n ]\n if (ter.difference) {\n metrics.push({ id: 'cbv', label: t('correctedBookValue'), value: extrapolationAmount(ter.difference.corrected_book_value, locale) })\n metrics.push({ id: 'lower', label: t('lowerLimit'), value: extrapolationAmount(ter.difference.lower_limit, locale) })\n }\n return metrics\n}\n\n/** Kennzahlen der Gesamtfehlerquote in fester Reihenfolge. */\nexport function terMetrics(result: EvaluationResult, t: ExtrapolationTranslate, locale: Locale): ExtrapolationMetric[] {\n const ter = result.total_error_rate\n const metrics: ExtrapolationMetric[] = [\n { id: 'projected', label: t('projected'), value: extrapolationAmount(ter.projected_random_error, locale) },\n { id: 'systemic', label: t('systemic'), value: extrapolationAmount(ter.systemic_errors, locale) },\n { id: 'anomalous', label: t('anomalousUncorrected'), value: extrapolationAmount(ter.anomalous_uncorrected, locale) },\n ]\n if (ter.anomalous_corrected_excluded > 0) {\n metrics.push({ id: 'excluded', label: t('anomalousExcluded'), value: extrapolationAmount(ter.anomalous_corrected_excluded, locale) })\n }\n metrics.push(\n { id: 'total', label: t('totalError'), value: extrapolationAmount(ter.total_error, locale) },\n { id: 'ter', label: t('ter'), value: extrapolationRate(ter.rate, locale) },\n { id: 'tolerable', label: t('tolerable'), value: extrapolationAmount(ter.tolerable_error, locale), detail: extrapolationRate(ter.materiality_rate, locale) },\n )\n return [...metrics, ...limitMetrics(result, t, locale)]\n}\n\nfunction stepValue(value: unknown, locale: Locale): string {\n if (typeof value !== 'number') return ''\n const digits = Math.abs(value) < 10 ? 6 : 2\n return formatNumber(value, locale, { maximumFractionDigits: digits })\n}\n\nexport function extrapolationStepColumns(t: ExtrapolationTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'label', label: t('colStep') },\n { key: 'formula', label: t('colFormula') },\n { key: 'value', label: t('colValue'), align: 'end', format: (value) => stepValue(value, locale) },\n { key: 'source', label: t('colSource') },\n ]\n}\n\nexport function extrapolationStepRows(result: EvaluationResult): TableRow[] {\n const steps = [...result.projection.steps, ...result.total_error_rate.steps]\n return steps.map((step, index) => ({ id: index + 1, ...step }))\n}\n\nexport function residualColumns(t: ExtrapolationTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'row', label: t('colRow') },\n { key: 'label', label: t('colLabel') },\n { key: 'value', label: t('colAmount'), align: 'end', format: (value) => (value === null ? t('notApplicable') : stepValue(value, locale)) },\n ]\n}\n\nexport function residualRows(residual: ResidualErrorRate): TableRow[] {\n return residual.rows.map((row) => ({ id: row.row, row: row.row, label: row.label, value: row.value }))\n}\n\n/** Kennzahlen der Restfehlerquote (K, L, M). */\nexport function residualMetrics(residual: ResidualErrorRate, t: ExtrapolationTranslate, locale: Locale): ExtrapolationMetric[] {\n const verdict = t(residual.exceeds_materiality ? 'rerExceeds' : 'rerWithin')\n const rate = residual.rate === null ? t('notApplicable') : extrapolationRate(residual.rate, locale)\n return [\n { id: 'rer', label: t('rer'), value: rate, detail: verdict },\n { id: 'correction', label: t('extrapolatedCorrection'), value: residual.extrapolated_correction === null ? t('notApplicable') : extrapolationAmount(residual.extrapolated_correction, locale) },\n { id: 'after', label: t('rateAfter'), value: residual.rate_after_correction === null ? t('notApplicable') : extrapolationRate(residual.rate_after_correction, locale) },\n ]\n}\n\nexport interface ExtrapolationField<K extends string> {\n key: K\n label: ExtrapolationMessageKey\n numeric: boolean\n}\n\nexport const STRATUM_FIELDS: readonly ExtrapolationField<'name' | 'bookValue' | 'populationSize' | 'systemic'>[] = [\n { key: 'name', label: 'stratumName', numeric: false },\n { key: 'bookValue', label: 'bookValue', numeric: true },\n { key: 'populationSize', label: 'populationSize', numeric: true },\n { key: 'systemic', label: 'systemicDelimited', numeric: true },\n]\n\nexport const UNIT_FIELDS: readonly ExtrapolationField<'id' | 'bookValue' | 'random' | 'systemic' | 'anomalous' | 'reason'>[] = [\n { key: 'id', label: 'unitId', numeric: false },\n { key: 'bookValue', label: 'bookValue', numeric: true },\n { key: 'random', label: 'randomError', numeric: true },\n { key: 'systemic', label: 'systemicError', numeric: true },\n { key: 'anomalous', label: 'anomalousError', numeric: true },\n { key: 'reason', label: 'anomalousReason', numeric: false },\n]\n\nexport const UNIT_FLAGS: readonly ExtrapolationField<'corrected' | 'exhaustive'>[] = [\n { key: 'corrected', label: 'anomalousCorrected', numeric: false },\n { key: 'exhaustive', label: 'exhaustive', numeric: false },\n]\n\nexport const RESIDUAL_FIELDS: readonly ExtrapolationField<'auditPopulation' | 'terRate' | 'ongoing' | 'otherNegative' | 'corrections'>[] = [\n { key: 'auditPopulation', label: 'auditPopulation', numeric: true },\n { key: 'terRate', label: 'terRate', numeric: true },\n { key: 'ongoing', label: 'ongoing', numeric: true },\n { key: 'otherNegative', label: 'otherNegative', numeric: true },\n { key: 'corrections', label: 'corrections', numeric: true },\n]\n\n/** Meldung eines Feldes (leer ohne Befund). */\nexport function extrapolationIssueText(issues: Readonly<Record<string, ExtrapolationIssue>>, key: string, t: ExtrapolationTranslate): string {\n const issue = issues[key]\n return issue ? t(extrapolationIssueKey(issue)) : ''\n}\n\n/** Sammelmeldung unter dem Formular: fehlende Auswahl oder markierte Felder. */\nexport function extrapolationFormMessage(formError: ExtrapolationFormError | null, issues: Readonly<Record<string, ExtrapolationIssue>>, t: ExtrapolationTranslate): string {\n if (formError) return t(extrapolationFormErrorKey(formError))\n return Object.keys(issues).length ? t('formIncomplete') : ''\n}\n\nexport function extrapolationCellLabel(t: ExtrapolationTranslate, field: ExtrapolationMessageKey, row: number): string {\n return t('cellLabel', { field: t(field), row })\n}\n","/**\n * Anzeige der Ergänzungen nach Leitfaden Kap. 6/7 (reine Funktionen für Vue und\n * React): Zeiträume, Programme einer Gruppe, Teilstichproben, Neuberechnung des\n * Konfidenzniveaus sowie Auswahllisten für Aufbau, Systembewertung und Schätzer.\n */\nimport type { TableColumn, TableRow } from '@auditcore/common'\nimport type { Locale } from '../i18n'\nimport { openSubsample } from './controller-subsample'\nimport type { ExtrapolationData } from './controller'\nimport { MAX_SUBSAMPLE_DEPTH, type SubItemRow, type SubStratumRow } from './model-subsample'\nimport { conclusionLabel, extrapolationAmount, extrapolationConfidenceLabel, extrapolationRate, type ExtrapolationField, type ExtrapolationMetric, type ExtrapolationTranslate } from './view'\nimport type { EvaluationResult, ExtrapolationCatalogue, ExtrapolationDesign, SubsampleEstimator } from './types'\n\nexport interface ExtrapolationChoice<T extends string> {\n id: T\n label: string\n}\n\nconst DESIGNS: readonly ExtrapolationDesign[] = ['single', 'periods', 'groups']\nconst ESTIMATORS: readonly SubsampleEstimator[] = ['ratio', 'mean_per_unit', 'pps']\n\nexport function extrapolationDesignChoices(catalogue: ExtrapolationCatalogue | null, t: ExtrapolationTranslate): ExtrapolationChoice<ExtrapolationDesign>[] {\n return DESIGNS.map((id) => ({ id, label: catalogue?.designs?.find((entry) => entry.id === id)?.label ?? t(`design${id}`) }))\n}\n\nexport function subsampleEstimatorChoices(t: ExtrapolationTranslate): ExtrapolationChoice<SubsampleEstimator>[] {\n return ESTIMATORS.map((id) => ({ id, label: t(`estimator${id}`) }))\n}\n\n/** Kategorien 1–4 der Systembewertung mit Konfidenzniveau (Tabelle 1, Leitfaden 3.2.1). */\nexport function systemAssessmentChoices(catalogue: ExtrapolationCatalogue | null, locale: Locale): ExtrapolationChoice<string>[] {\n return (catalogue?.system_assessment ?? []).map((entry) => ({\n id: String(entry.category),\n label: `${entry.category} – ${entry.label} (${extrapolationConfidenceLabel(entry.confidence_level, locale)})`,\n }))\n}\n\nexport const SUB_ITEM_FIELDS: readonly ExtrapolationField<'id' | 'bookValue' | 'random'>[] = [\n { key: 'id', label: 'subItemId', numeric: false },\n { key: 'bookValue', label: 'bookValue', numeric: true },\n { key: 'random', label: 'randomError', numeric: true },\n]\n\nexport const SUB_STRATUM_FIELDS: readonly ExtrapolationField<'name' | 'bookValue' | 'populationSize'>[] = [\n { key: 'name', label: 'subStratum', numeric: false },\n { key: 'bookValue', label: 'bookValue', numeric: true },\n { key: 'populationSize', label: 'populationSize', numeric: true },\n]\n\nexport type SubStratumFieldKey = keyof Pick<SubStratumRow, 'name' | 'bookValue' | 'populationSize'>\n\n/** Ansicht der gerade bearbeiteten Teilstichprobe: Zeilen, Überschrift, Feldpräfix, Stufe. */\nexport interface SubsampleEditorView {\n rows: NonNullable<ReturnType<typeof openSubsample>>\n title: string\n /** Präfix der Feldbefunde, z. B. `units.2.subsample`. */\n prefix: string\n nested: boolean\n /** Teileinheiten dürfen eine eigene Teilstichprobe haben (nur Stufe 2). */\n allowNested: boolean\n}\n\nexport function subsampleEditorView(state: ExtrapolationData, t: ExtrapolationTranslate): SubsampleEditorView | null {\n const rows = openSubsample(state)\n const index = state.subsampleUnit\n const unit = index === null ? null : state.form.units[index]\n if (!rows || index === null || !unit) return null\n const unitLabel = unit.id || String(index + 1)\n if (state.subsampleItem === null) {\n return { rows, title: t('subsampleTitle', { unit: unitLabel }), prefix: `units.${index}.subsample`, nested: false, allowNested: MAX_SUBSAMPLE_DEPTH > 1 }\n }\n const item = unit.subsample?.items[state.subsampleItem]\n const itemLabel = item?.id || String(state.subsampleItem + 1)\n return { rows, title: t('subsampleNestedTitle', { unit: unitLabel, item: itemLabel }), prefix: `units.${index}.subsample.items.${state.subsampleItem}.subsample`, nested: true, allowNested: false }\n}\n\nexport type SubItemFieldKey = keyof Pick<SubItemRow, 'id' | 'bookValue' | 'random'>\n\nconst amount = (locale: Locale) => (value: unknown): string => (typeof value === 'number' ? extrapolationAmount(value, locale) : '')\nconst rate = (locale: Locale) => (value: unknown): string => (typeof value === 'number' ? extrapolationRate(value, locale) : '')\n\nexport function periodColumns(t: ExtrapolationTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'name', label: t('period') },\n { key: 'book_value', label: t('colBookValue'), align: 'end', format: amount(locale) },\n { key: 'projected', label: t('colProjected'), align: 'end', format: amount(locale) },\n { key: 'precision', label: t('colPrecision'), align: 'end', format: (value) => (typeof value === 'number' ? extrapolationAmount(value, locale) : t('notDeterminable')) },\n { key: 'sample_size', label: t('colSampleSize'), align: 'end' },\n ]\n}\n\nexport function periodRows(result: EvaluationResult): TableRow[] {\n const periods = (result.projection.extra.periods ?? []) as readonly { name: string; book_value: number; projected_random_error: number; precision: number | null; sample_size: number }[]\n return periods.map((entry) => ({ id: entry.name, name: entry.name, book_value: entry.book_value, projected: entry.projected_random_error, precision: entry.precision, sample_size: entry.sample_size }))\n}\n\nexport function groupColumns(t: ExtrapolationTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'name', label: t('group') },\n { key: 'observations', label: t('colObservations'), align: 'end' },\n { key: 'projected', label: t('colProjected'), align: 'end', format: amount(locale) },\n { key: 'ter', label: t('colTer'), align: 'end', format: rate(locale) },\n { key: 'upper', label: t('colUpper'), align: 'end', format: (value) => (typeof value === 'number' ? extrapolationRate(value, locale) : t('notDeterminable')) },\n { key: 'conclusion', label: t('colConclusion') },\n ]\n}\n\nexport function groupRows(result: EvaluationResult, catalogue: ExtrapolationCatalogue | null): TableRow[] {\n return (result.groups ?? []).map((group) => ({\n id: group.name,\n name: group.name,\n observations: group.observations,\n projected: group.total_error_rate.projected_random_error,\n ter: group.total_error_rate.rate,\n upper: group.total_error_rate.upper_limit_rate,\n conclusion: conclusionLabel(catalogue, group.total_error_rate.conclusion),\n }))\n}\n\nexport function subsampleColumns(t: ExtrapolationTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'unit', label: t('unitId') },\n { key: 'estimator', label: t('estimator') },\n { key: 'book_value', label: t('colBookValue'), align: 'end', format: amount(locale) },\n { key: 'projected', label: t('colProjected'), align: 'end', format: amount(locale) },\n { key: 'rate', label: t('colRate'), align: 'end', format: rate(locale) },\n { key: 'coverage', label: t('colCoverage'), align: 'end', format: rate(locale) },\n { key: 'items', label: t('colItems'), align: 'end' },\n ]\n}\n\nexport function subsampleResultRows(result: EvaluationResult, t: ExtrapolationTranslate): TableRow[] {\n return (result.subsamples ?? []).map((entry, index) => ({\n id: `${entry.unit_id}-${index}`,\n unit: entry.unit_id,\n estimator: t(`estimator${entry.estimator}`),\n book_value: entry.book_value,\n projected: entry.projected_error,\n rate: entry.error_rate,\n coverage: entry.coverage,\n items: entry.sampled_items + entry.exhaustive_items,\n }))\n}\n\n/** Hinweise aus Gruppen und Teilstichproben (die der Hochrechnung stehen im Ergebnis). */\nexport function detailWarnings(result: EvaluationResult): string[] {\n return [...(result.groups ?? []).flatMap((group) => group.warnings), ...(result.subsamples ?? []).flatMap((entry) => entry.warnings)]\n}\n\nexport interface RecalculationView {\n metrics: ExtrapolationMetric[]\n verdict: string\n}\n\n/** Neuberechnung des Konfidenzniveaus; `null`, wenn nicht anwendbar (Ergebnis schlüssig usw.). */\nexport function recalculationView(result: EvaluationResult, t: ExtrapolationTranslate, locale: Locale): RecalculationView | null {\n const recalculation = result.confidence_recalculation\n if (!recalculation?.applicable || recalculation.confidence_level === null) return null\n const metrics: ExtrapolationMetric[] = [\n { id: 'recalc-level', label: t('recalcLevel'), value: extrapolationRate(recalculation.confidence_level, locale) },\n { id: 'recalc-z', label: t('recalcCoefficient'), value: (recalculation.recalculated_coefficient ?? 0).toLocaleString(locale, { maximumFractionDigits: 3 }) },\n ]\n if (recalculation.required_level !== null) {\n metrics.push({ id: 'recalc-required', label: t('recalcRequired'), value: extrapolationConfidenceLabel(recalculation.required_level, locale) })\n }\n const verdict = recalculation.supports_not_material === null ? t('recalcNoRequirement') : t(recalculation.supports_not_material ? 'recalcSupports' : 'recalcNotSupported')\n return { metrics, verdict }\n}\n\n/** Gibt es Ergänzungen anzuzeigen? */\nexport function hasExtrapolationDetails(result: EvaluationResult): boolean {\n return periodRows(result).length > 0 || (result.groups?.length ?? 0) > 0 || (result.subsamples?.length ?? 0) > 0 || result.confidence_recalculation?.applicable === true\n}\n","import { defineMessages, type Translate } from '../i18n'\n\n/**\n * Texte der Vergleichsverwaltung (`<flowaudit-comparisons>`): Hochladen,\n * gespeicherte Vergleiche, Import und Löschen. Begriffe wie in der Synopse.\n */\nexport const comparisonsMessages = defineMessages({\n de: {\n title: 'Dokumentvergleiche',\n workAid: 'Ein Vergleich ist eine Arbeitshilfe: Er stellt Unterschiede fest und trifft keine Prüfungsentscheidung.',\n formHeading: 'Neuer Vergleich',\n oldFile: 'Bisherige Fassung',\n newFile: 'Neue Fassung',\n oldFileArticleLaw: 'Stammgesetz (geltende Fassung)',\n newFileArticleLaw: 'Artikelgesetz mit Änderungsbefehlen',\n fileHint: 'DOCX, DOCM oder PDF, höchstens {size}',\n fileChosen: 'Ausgewählt: {name} ({size})',\n titleLabel: 'Titel (optional)',\n titlePlaceholder: 'Vergleich von ALT mit NEU',\n typeLabel: 'Vergleichsart',\n kind_standard: 'Standardvergleich',\n kind_article_law: 'Gesetzessynopse',\n modeLabel: 'Dokumentart',\n mode_auto: 'Automatisch erkennen',\n mode_checklist: 'Checkliste',\n mode_text: 'Fließtext',\n pdfHint: 'PDF-Dateien werden immer als Fließtext verglichen.',\n thresholdLabel: 'Ähnlichkeitsschwelle in Prozent (70–100)',\n optionsLegend: 'Einbeziehen',\n includeAnswers: 'Antworten',\n includeNotes: 'Bemerkungen und Hinweise',\n includeEditorial: 'Redaktionelle Änderungen',\n highlightWords: 'Wortweise hervorheben',\n sectionsLegend: 'Ausgabe enthält',\n section_changed: 'Geändert',\n section_removed: 'Entfallen',\n section_added: 'Neu',\n section_moved: 'Verschoben',\n section_unchanged: 'Unverändert',\n profileLabel: 'Vergleichsprofil',\n profileDefault: '{id} {version} (Vorgabe)',\n profileOption: '{id} {version}',\n submit: 'Vergleichen',\n reset: 'Zurücksetzen',\n problemsHeading: 'Bitte prüfen',\n problem_oldMissing: 'Die bisherige Fassung fehlt.',\n problem_newMissing: 'Die neue Fassung fehlt.',\n problem_type: '{name}: Bitte eine DOCX-, DOCM- oder PDF-Datei auswählen.',\n problem_size: '{name} ist größer als {size}.',\n problem_threshold: 'Die Ähnlichkeitsschwelle muss zwischen 70 und 100 liegen.',\n problem_sections: 'Mindestens einen Abschnitt für die Ausgabe wählen.',\n problem_title: 'Der Titel darf höchstens 255 Zeichen lang sein.',\n listHeading: 'Gespeicherte Vergleiche',\n searchLabel: 'Vergleiche durchsuchen',\n listCount: '{count} von {total} Vergleichen',\n empty: 'Noch keine Vergleiche gespeichert.',\n noMatches: 'Kein Vergleich passt zur Suche.',\n counts: '{changed} geändert · {removed} entfallen · {added} neu · {moved} verschoben',\n files: '{old} → {new}',\n open: 'Öffnen',\n openLabel: '„{title}“ öffnen',\n remove: 'Löschen',\n removeLabel: '„{title}“ löschen',\n confirmTitle: 'Vergleich löschen?',\n confirmText: '„{title}“ wird endgültig gelöscht. Bereits heruntergeladene Ausgaben bleiben erhalten.',\n cancel: 'Abbrechen',\n importLabel: 'Ergebnis importieren (JSON)',\n importInvalid: 'Die Datei enthält kein Vergleichsergebnis.',\n importUnreadable: 'Die Datei ist kein gültiges JSON.',\n importUnsupported: 'Der Port unterstützt keinen Import.',\n created: '„{title}“ wurde angelegt.',\n imported: '„{title}“ wurde importiert.',\n removed: '„{title}“ wurde gelöscht.',\n back: 'Zurück zur Übersicht',\n noPort: 'Kein Port übergeben – Vergleiche können nicht geladen werden.',\n networkError: 'Keine Verbindung zum Server ({message}).',\n busy_load: 'Vergleiche werden geladen …',\n busy_create: 'Vergleich läuft …',\n busy_import: 'Ergebnis wird importiert …',\n busy_remove: 'Vergleich wird gelöscht …',\n },\n en: {\n title: 'Document comparisons',\n workAid: 'A comparison is a work aid: it identifies differences and makes no audit decision.',\n formHeading: 'New comparison',\n oldFile: 'Previous version',\n newFile: 'New version',\n oldFileArticleLaw: 'Principal act (version in force)',\n newFileArticleLaw: 'Amending act with amendment instructions',\n fileHint: 'DOCX, DOCM or PDF, at most {size}',\n fileChosen: 'Selected: {name} ({size})',\n titleLabel: 'Title (optional)',\n titlePlaceholder: 'Comparison of OLD with NEW',\n typeLabel: 'Comparison type',\n kind_standard: 'Standard comparison',\n kind_article_law: 'Legislative synopsis',\n modeLabel: 'Document type',\n mode_auto: 'Detect automatically',\n mode_checklist: 'Checklist',\n mode_text: 'Running text',\n pdfHint: 'PDF files are always compared as running text.',\n thresholdLabel: 'Similarity threshold in percent (70–100)',\n optionsLegend: 'Include',\n includeAnswers: 'Answers',\n includeNotes: 'Comments and notes',\n includeEditorial: 'Editorial changes',\n highlightWords: 'Highlight words',\n sectionsLegend: 'Output contains',\n section_changed: 'Changed',\n section_removed: 'Removed',\n section_added: 'Added',\n section_moved: 'Moved',\n section_unchanged: 'Unchanged',\n profileLabel: 'Comparison profile',\n profileDefault: '{id} {version} (default)',\n submit: 'Compare',\n reset: 'Reset',\n problemsHeading: 'Please check',\n listHeading: 'Saved comparisons',\n searchLabel: 'Search comparisons',\n listCount: '{count} of {total} comparisons',\n empty: 'No comparisons saved yet.',\n noMatches: 'No comparison matches the search.',\n counts: '{changed} changed · {removed} removed · {added} added · {moved} moved',\n open: 'Open',\n openLabel: 'Open “{title}”',\n remove: 'Delete',\n removeLabel: 'Delete “{title}”',\n confirmTitle: 'Delete comparison?',\n cancel: 'Cancel',\n importLabel: 'Import result (JSON)',\n back: 'Back to overview',\n noPort: 'No port given – comparisons cannot be loaded.',\n },\n})\n\nexport type ComparisonsMessageKey = keyof typeof comparisonsMessages.de\nexport type ComparisonsTranslate = Translate<ComparisonsMessageKey>\n","/**\n * Formular „Neuer Vergleich“ als reine Daten: Vorgaben wie im REST-Vertrag\n * (`POST /comparisons`, docs/ui/synopsis-rest.md), Prüfung vor dem Hochladen\n * und Umsetzung in die Formularfelder des Servers. Der Server prüft erneut.\n */\nimport type { CompareFields } from '../synopsis/port'\nimport { ROW_STATUSES, type ComparisonProfile, type RowStatus } from '../synopsis/types'\nimport type { ComparisonsMessageKey } from './messages'\n\nexport type ComparisonKind = 'standard' | 'article_law'\nexport type ComparisonMode = 'auto' | 'checklist' | 'text'\nexport const COMPARISON_KINDS: readonly ComparisonKind[] = ['standard', 'article_law']\nexport const COMPARISON_MODES: readonly ComparisonMode[] = ['auto', 'checklist', 'text']\nexport const ACCEPTED_EXTENSIONS: readonly string[] = ['.docx', '.docm', '.pdf']\n/** Vorgabe des Servers (`ServiceSettings.max_upload_bytes`). */\nexport const DEFAULT_MAX_UPLOAD_BYTES = 20 * 1024 * 1024\nexport const MIN_THRESHOLD = 70\nexport const MAX_THRESHOLD = 100\nexport const MAX_TITLE = 255\n\n/** Datei aus einem Eingabefeld (im Browser `File`). */\nexport interface UploadFile extends Blob {\n readonly name: string\n}\n\nexport interface CompareForm {\n oldFile: UploadFile | null\n newFile: UploadFile | null\n title: string\n kind: ComparisonKind\n mode: ComparisonMode\n threshold: number\n includeAnswers: boolean\n includeNotes: boolean\n includeEditorial: boolean\n highlightWords: boolean\n sections: readonly RowStatus[]\n /** Leer: Standardprofil des Servers. */\n profile: string\n}\n\nexport const DEFAULT_FORM: CompareForm = {\n oldFile: null,\n newFile: null,\n title: '',\n kind: 'standard',\n mode: 'auto',\n threshold: 85,\n includeAnswers: true,\n includeNotes: true,\n includeEditorial: false,\n highlightWords: true,\n sections: ['changed', 'removed', 'added', 'moved'],\n profile: '',\n}\n\n/** Ein Befund der Formularprüfung: Textschlüssel und Platzhalter. */\nexport interface FormProblem {\n key: Extract<ComparisonsMessageKey, `problem_${string}`>\n field: 'oldFile' | 'newFile' | 'threshold' | 'sections' | 'title'\n params?: Readonly<Record<string, string>>\n}\n\n/** Größenangabe wie „20 MiB“ oder „512 KiB“. */\nexport function formatBytes(bytes: number, lang = 'de'): string {\n const format = (value: number): string => new Intl.NumberFormat(lang, { maximumFractionDigits: 1 }).format(value)\n if (bytes >= 1024 * 1024) return `${format(bytes / (1024 * 1024))} MiB`\n if (bytes >= 1024) return `${format(bytes / 1024)} KiB`\n return `${format(bytes)} B`\n}\n\nexport function hasAcceptedExtension(name: string): boolean {\n const lower = name.toLowerCase()\n return ACCEPTED_EXTENSIONS.some((extension) => lower.endsWith(extension))\n}\n\nfunction fileProblems(file: UploadFile | null, field: 'oldFile' | 'newFile', maxBytes: number, lang: string): FormProblem[] {\n if (!file) return [{ key: field === 'oldFile' ? 'problem_oldMissing' : 'problem_newMissing', field }]\n if (!hasAcceptedExtension(file.name)) return [{ key: 'problem_type', field, params: { name: file.name } }]\n if (file.size > maxBytes) return [{ key: 'problem_size', field, params: { name: file.name, size: formatBytes(maxBytes, lang) } }]\n return []\n}\n\nfunction optionProblems(form: CompareForm): FormProblem[] {\n const problems: FormProblem[] = []\n const threshold = form.threshold\n if (!Number.isInteger(threshold) || threshold < MIN_THRESHOLD || threshold > MAX_THRESHOLD) {\n problems.push({ key: 'problem_threshold', field: 'threshold' })\n }\n if (form.sections.length === 0) problems.push({ key: 'problem_sections', field: 'sections' })\n if (form.title.trim().length > MAX_TITLE) problems.push({ key: 'problem_title', field: 'title' })\n return problems\n}\n\n/** Alle Befunde in Formularreihenfolge; leer heißt: absendbar. */\nexport function formProblems(form: CompareForm, maxBytes = DEFAULT_MAX_UPLOAD_BYTES, lang = 'de'): FormProblem[] {\n return [\n ...fileProblems(form.oldFile, 'oldFile', maxBytes, lang),\n ...fileProblems(form.newFile, 'newFile', maxBytes, lang),\n ...optionProblems(form),\n ]\n}\n\n/** PDF-Dateien vergleicht der Server immer als Fließtext. */\nexport function involvesPdf(form: CompareForm): boolean {\n return [form.oldFile, form.newFile].some((file) => file?.name.toLowerCase().endsWith('.pdf'))\n}\n\n/** Formularfelder für `POST /comparisons`; Gesetzessynopse ohne die Optionen des Standardvergleichs. */\nexport function toCompareFields(form: CompareForm): CompareFields {\n const sections = ROW_STATUSES.filter((status) => form.sections.includes(status))\n const common: CompareFields = {\n comparison_type: form.kind,\n highlight_words: form.highlightWords,\n output_sections: sections,\n ...(form.title.trim() ? { title: form.title.trim() } : {}),\n ...(form.profile ? { profile: form.profile } : {}),\n }\n if (form.kind === 'article_law') return common\n return {\n ...common,\n mode: form.mode,\n threshold: form.threshold,\n include_answers: form.includeAnswers,\n include_notes: form.includeNotes,\n include_editorial: form.includeEditorial,\n }\n}\n\n/** Abschnitt ein- oder ausschalten; Reihenfolge wie `ROW_STATUSES`. */\nexport function toggleSection(sections: readonly RowStatus[], status: RowStatus, enabled: boolean): RowStatus[] {\n const next = new Set(sections)\n if (enabled) next.add(status)\n else next.delete(status)\n return ROW_STATUSES.filter((entry) => next.has(entry))\n}\n\n/** Standardprofil des Servers (`default: true`), sonst das erste. */\nexport function defaultProfile(profiles: readonly ComparisonProfile[]): ComparisonProfile | null {\n return profiles.find((profile) => profile.default) ?? profiles[0] ?? null\n}\n","/**\n * Import eines fertigen Vergleichsergebnisses (`POST /comparisons/import`):\n * akzeptiert die JSON-Ausgabe (`export?format=json`, ein `ComparisonResult`),\n * einen gespeicherten Vergleich (`{id, title, result}`) oder die\n * Anfrageform `{title?, result}`. Die fachliche Prüfung macht der Server.\n */\nimport type { ImportRequest } from '../synopsis/port'\nimport type { ComparisonResult } from '../synopsis/types'\n\nexport type ImportParse =\n | { ok: true; request: ImportRequest }\n | { ok: false; key: 'importUnreadable' | 'importInvalid' }\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** Kennzeichen eines `ComparisonResult.to_dict()`; Einzelheiten prüft `ComparisonResult.from_dict`. */\nexport function looksLikeResult(value: unknown): value is ComparisonResult {\n return (\n isRecord(value) &&\n Array.isArray(value.rows) &&\n typeof value.old_filename === 'string' &&\n typeof value.new_filename === 'string'\n )\n}\n\nfunction withTitle(result: ComparisonResult, title: unknown): ImportRequest {\n return typeof title === 'string' && title.trim() ? { title: title.trim(), result } : { result }\n}\n\nexport function parseImport(text: string): ImportParse {\n let data: unknown\n try {\n data = JSON.parse(text)\n } catch {\n return { ok: false, key: 'importUnreadable' }\n }\n if (looksLikeResult(data)) return { ok: true, request: { result: data } }\n if (isRecord(data) && looksLikeResult(data.result)) return { ok: true, request: withTitle(data.result, data.title) }\n return { ok: false, key: 'importInvalid' }\n}\n","/** Liste der gespeicherten Vergleiche (`GET /comparisons`) als reine View-Funktionen. */\nimport type { Comparison, ComparisonSummary } from '../synopsis/types'\nimport type { ComparisonsMessageKey, ComparisonsTranslate } from './messages'\n\nexport interface SummaryView {\n id: string\n title: string\n kind: string\n kindLabel: string\n files: string\n counts: string\n /** Summe der Änderungen (für Badges). */\n changes: number\n created: string\n createdIso: string\n}\n\nfunction kindLabel(kind: string, t: ComparisonsTranslate): string {\n const key = `kind_${kind}` as ComparisonsMessageKey\n return kind === 'standard' || kind === 'article_law' ? t(key) : kind\n}\n\n/** Datum und Uhrzeit in der Sprache der Oberfläche; ungültige Angaben bleiben stehen. */\nexport function formatDateTime(iso: string, lang: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso\n return new Intl.DateTimeFormat(lang, { dateStyle: 'medium', timeStyle: 'short' }).format(date)\n}\n\nexport function summaryView(summary: ComparisonSummary, t: ComparisonsTranslate, lang: string): SummaryView {\n const counts = summary.counts\n return {\n id: summary.id,\n title: summary.title,\n kind: summary.comparison_type,\n kindLabel: kindLabel(summary.comparison_type, t),\n files: t('files', { old: summary.old_filename, new: summary.new_filename }),\n counts: t('counts', { changed: counts.changed, removed: counts.removed, added: counts.added, moved: counts.moved }),\n changes: counts.changed + counts.removed + counts.added + counts.moved,\n created: formatDateTime(summary.created_at, lang),\n createdIso: summary.created_at,\n }\n}\n\n/** Suche in Titel und Dateinamen, ohne Groß-/Kleinschreibung; neueste zuerst wie der Server. */\nexport function filterSummaries(items: readonly ComparisonSummary[], query: string): ComparisonSummary[] {\n const needle = query.trim().toLowerCase()\n const sorted = [...items].sort((a, b) => b.created_at.localeCompare(a.created_at))\n if (!needle) return sorted\n return sorted.filter((item) => [item.title, item.old_filename, item.new_filename].some((text) => text.toLowerCase().includes(needle)))\n}\n\n/** Eintrag der Liste aus einem gespeicherten Vergleich (nach Anlegen oder Import). */\nexport function summaryOf(comparison: Comparison): ComparisonSummary {\n const result = comparison.result\n return {\n id: comparison.id,\n title: comparison.title,\n created_at: comparison.created_at,\n old_filename: result.old_filename,\n new_filename: result.new_filename,\n comparison_type: result.metadata?.comparison_type ?? 'standard',\n counts: { changed: result.changed_count, removed: result.removed_count, added: result.added_count, moved: result.moved_count ?? 0 },\n }\n}\n","// Zustandsautomat von <flowaudit-comparisons> (Vue und React): gespeicherte\n// Vergleiche laden, neuen Vergleich hochladen, Ergebnis importieren, löschen.\n\nimport { RestError } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport type { ImportRequest, SynopsisPort, SynopsisRestClient } from '../synopsis/port'\nimport type { Comparison, ComparisonProfile, ComparisonSummary, RowStatus } from '../synopsis/types'\nimport { DEFAULT_FORM, DEFAULT_MAX_UPLOAD_BYTES, formProblems, toCompareFields, toggleSection, type CompareForm } from './form'\nimport { parseImport } from './importing'\nimport { summaryOf } from './list'\nimport type { ComparisonsTranslate } from './messages'\n\n/**\n * Port zur Anwendung: {@link createSynopsisRestClient} erfüllt ihn vollständig.\n * `load`/`updateRows`/`exportUrl` braucht nur die eingebettete Synopse,\n * `importResult` nur der Import.\n */\nexport type ComparisonsPort = Pick<SynopsisRestClient, 'profiles' | 'list' | 'create' | 'remove'> &\n Partial<Pick<SynopsisRestClient, 'importResult' | 'load' | 'updateRows' | 'exportUrl'>>\n\n/** Der Port als Datenzugang der eingebetteten Synopse, wenn er Vergleiche laden kann. */\nexport function synopsisPortOf(port: ComparisonsPort | null | undefined): SynopsisPort | null {\n return port?.load ? (port as SynopsisPort) : null\n}\n\n/** Fehler einer Portanfrage: Meldung des Servers bzw. `network_error` mit Status 0. */\nexport interface ComparisonsError {\n code: string\n message: string\n status: number\n}\n\nexport type ComparisonsBusy = 'load' | 'create' | 'import' | 'remove'\n\nexport interface ComparisonsData extends RequestState<ComparisonsError> {\n profiles: ComparisonProfile[]\n items: ComparisonSummary[]\n loaded: boolean\n query: string\n form: CompareForm\n /** Nach dem ersten Absenden werden Befunde der Formularprüfung angezeigt. */\n submitted: boolean\n /** Geöffneter Vergleich (Synopse). */\n openId: string | null\n /** Vergleich, dessen Löschen bestätigt werden soll. */\n pendingRemove: string | null\n}\n\nexport interface ComparisonsHooks {\n onCreated?: (comparison: Comparison) => void\n onImported?: (comparison: Comparison) => void\n onRemoved?: (id: string) => void\n onError?: (error: ComparisonsError) => void\n}\n\nexport interface ComparisonsControllerOptions extends ComparisonsHooks {\n port: () => ComparisonsPort | null\n t: () => ComparisonsTranslate\n maxBytes?: () => number\n lang?: () => string\n}\n\nexport const INITIAL_COMPARISONS: ComparisonsData = {\n ...IDLE, profiles: [], items: [], loaded: false, query: '', form: DEFAULT_FORM, submitted: false, openId: null, pendingRemove: null,\n}\n\nexport function asComparisonsError(error: unknown, t: ComparisonsTranslate): ComparisonsError {\n if (error instanceof RestError) return { code: error.code, message: error.message, status: error.status }\n const raw = error instanceof Error ? error.message : String(error)\n return { code: 'network_error', message: t('networkError', { message: raw }), status: 0 }\n}\n\ntype Run = ReturnType<typeof createRunner<ComparisonsPort, ComparisonsError, ComparisonsData>>\n\nfunction titleOf(state: ComparisonsData, id: string): string {\n return state.items.find((item) => item.id === id)?.title ?? id\n}\n\n/** Neuer oder importierter Vergleich: oben in die Liste, Meldung für `aria-live`. */\nfunction added(store: Store<ComparisonsData>, comparison: Comparison, notice: string): void {\n store.set((state) => ({\n items: [summaryOf(comparison), ...state.items.filter((item) => item.id !== comparison.id)],\n notice,\n }))\n}\n\nfunction formActions(store: Store<ComparisonsData>) {\n const update = (patch: Partial<CompareForm>): void => store.set((state) => ({ form: { ...state.form, ...patch } }))\n return {\n updateForm: update,\n toggleSection: (status: RowStatus, enabled: boolean) => update({ sections: toggleSection(store.get().form.sections, status, enabled) }),\n resetForm: () => store.set({ form: DEFAULT_FORM, submitted: false }),\n }\n}\n\nfunction writeActions(store: Store<ComparisonsData>, run: Run, options: ComparisonsControllerOptions) {\n const maxBytes = (): number => options.maxBytes?.() ?? DEFAULT_MAX_UPLOAD_BYTES\n const lang = (): string => options.lang?.() ?? 'de'\n\n async function submit(): Promise<Comparison | null> {\n const form = store.get().form\n store.set({ submitted: true })\n const { oldFile, newFile } = form\n if (formProblems(form, maxBytes(), lang()).length > 0 || !oldFile || !newFile) return null\n const created = await run('create', (port) => port.create(oldFile, oldFile.name, newFile, newFile.name, toCompareFields(form)))\n if (!created) return null\n added(store, created, options.t()('created', { title: created.title }))\n store.set({ form: DEFAULT_FORM, submitted: false })\n options.onCreated?.(created)\n return created\n }\n\n async function importText(text: string): Promise<Comparison | null> {\n const parsed = parseImport(text)\n if (!parsed.ok) return fail(parsed.key)\n if (!options.port()?.importResult) return fail('importUnsupported')\n const request: ImportRequest = parsed.request\n const imported = await run('import', (port) => port.importResult?.(request) ?? Promise.reject(new Error('importResult')))\n if (!imported) return null\n added(store, imported, options.t()('imported', { title: imported.title }))\n options.onImported?.(imported)\n return imported\n }\n\n function fail(key: 'importUnreadable' | 'importInvalid' | 'importUnsupported'): null {\n const error: ComparisonsError = { code: 'invalid_import', message: options.t()(key), status: 0 }\n store.set({ error })\n options.onError?.(error)\n return null\n }\n\n async function confirmRemove(): Promise<boolean> {\n const id = store.get().pendingRemove\n if (!id) return false\n const title = titleOf(store.get(), id)\n const done = await run('remove', async (port) => {\n await port.remove(id)\n return true\n })\n store.set({ pendingRemove: null })\n if (!done) return false\n store.set((state) => ({\n items: state.items.filter((item) => item.id !== id),\n openId: state.openId === id ? null : state.openId,\n notice: options.t()('removed', { title }),\n }))\n options.onRemoved?.(id)\n return true\n }\n\n return { submit, importText, confirmRemove }\n}\n\nexport function createComparisonsController(options: ComparisonsControllerOptions) {\n const store = createStore<ComparisonsData>(INITIAL_COMPARISONS)\n const run = createRunner(store, options.port, (error) => asComparisonsError(error, options.t()), options.onError)\n\n async function load(): Promise<void> {\n const loaded = await run('load', async (port) => Promise.all([port.profiles(), port.list()]))\n if (loaded) store.set({ profiles: loaded[0], items: loaded[1], loaded: true })\n }\n\n return {\n store,\n load,\n ...formActions(store),\n ...writeActions(store, run, options),\n setQuery: (query: string) => store.set({ query }),\n open: (id: string | null) => store.set({ openId: id }),\n askRemove: (id: string) => store.set({ pendingRemove: id }),\n cancelRemove: () => store.set({ pendingRemove: null }),\n dismissError: () => store.set({ error: null }),\n }\n}\n\nexport type ComparisonsController = ReturnType<typeof createComparisonsController>\n","/** Abgeleitete Anzeige der Vergleichsverwaltung (reine Funktion, von Vue und React genutzt). */\nimport type { ComparisonsData } from './controller'\nimport { DEFAULT_MAX_UPLOAD_BYTES, defaultProfile, formatBytes, formProblems, involvesPdf, type FormProblem, type UploadFile } from './form'\nimport { filterSummaries, summaryView, type SummaryView } from './list'\nimport type { ComparisonsMessageKey, ComparisonsTranslate } from './messages'\n\nexport interface ProblemView {\n field: FormProblem['field']\n text: string\n}\n\nexport interface ProfileOption {\n /** Leer: Vorgabe des Servers. */\n value: string\n label: string\n}\n\nexport interface ComparisonsView {\n rows: SummaryView[]\n total: number\n countText: string\n /** Hinweis bei leerer Liste, sonst `null`. */\n emptyText: string | null\n problems: ProblemView[]\n profileOptions: ProfileOption[]\n sizeHint: string\n oldFileText: string\n newFileText: string\n oldFileLabel: string\n newFileLabel: string\n pdfHint: boolean\n busyText: string\n pendingTitle: string | null\n openTitle: string | null\n}\n\nexport interface ComparisonsViewOptions {\n lang: string\n maxBytes?: number\n}\n\nfunction fileText(file: UploadFile | null, t: ComparisonsTranslate, lang: string): string {\n return file ? t('fileChosen', { name: file.name, size: formatBytes(file.size, lang) }) : ''\n}\n\nfunction profileOptions(state: ComparisonsData, t: ComparisonsTranslate): ProfileOption[] {\n const fallback = defaultProfile(state.profiles)\n return state.profiles.map((profile) => ({\n value: profile.id === fallback?.id ? '' : profile.id,\n label: t(profile.id === fallback?.id ? 'profileDefault' : 'profileOption', { id: profile.id, version: profile.version }),\n }))\n}\n\nfunction emptyText(state: ComparisonsData, shown: number, t: ComparisonsTranslate): string | null {\n if (!state.loaded || shown > 0) return null\n return state.items.length === 0 ? t('empty') : t('noMatches')\n}\n\nfunction titleOf(state: ComparisonsData, id: string | null): string | null {\n if (id === null) return null\n return state.items.find((item) => item.id === id)?.title ?? id\n}\n\nfunction problems(state: ComparisonsData, t: ComparisonsTranslate, maxBytes: number, lang: string): ProblemView[] {\n if (!state.submitted) return []\n return formProblems(state.form, maxBytes, lang).map((problem) => ({ field: problem.field, text: t(problem.key, problem.params) }))\n}\n\nexport function comparisonsView(state: ComparisonsData, t: ComparisonsTranslate, options: ComparisonsViewOptions): ComparisonsView {\n const { lang } = options\n const maxBytes = options.maxBytes ?? DEFAULT_MAX_UPLOAD_BYTES\n const rows = filterSummaries(state.items, state.query).map((item) => summaryView(item, t, lang))\n const articleLaw = state.form.kind === 'article_law'\n return {\n rows,\n total: state.items.length,\n countText: t('listCount', { count: rows.length, total: state.items.length }),\n emptyText: emptyText(state, rows.length, t),\n problems: problems(state, t, maxBytes, lang),\n profileOptions: profileOptions(state, t),\n sizeHint: t('fileHint', { size: formatBytes(maxBytes, lang) }),\n oldFileText: fileText(state.form.oldFile, t, lang),\n newFileText: fileText(state.form.newFile, t, lang),\n oldFileLabel: t(articleLaw ? 'oldFileArticleLaw' : 'oldFile'),\n newFileLabel: t(articleLaw ? 'newFileArticleLaw' : 'newFile'),\n pdfHint: !articleLaw && involvesPdf(state.form),\n busyText: state.busy ? t(`busy_${state.busy}` as ComparisonsMessageKey) : '',\n pendingTitle: titleOf(state, state.pendingRemove),\n openTitle: titleOf(state, state.openId),\n }\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte des Tabellenexports (Berichtsexport nach Excel). */\nexport const reportingMessages = defineMessages({\n de: {\n title: 'Tabellenexport (Excel)',\n loading: 'Formatprofile werden geladen …',\n noPort: 'Kein Port übergeben: Vorschau und Export sind nicht verfügbar.',\n failed: 'Anfrage abgelehnt: {message}',\n data: 'Daten',\n tablesSummary: '{tables} Tabelle(n), {rows} Zeilen',\n noTables: 'Keine Tabellen übergeben. Die Anwendung setzt sie als Eigenschaft „tables“.',\n profile: 'Formatprofil',\n choose: 'Bitte wählen',\n profileSource: 'Herkunft des Profils',\n profileVersion: 'Version {version}, Status {status}',\n filename: 'Dateiname',\n preview: 'Vorschau',\n export: 'Als Excel exportieren',\n errornoTables: 'Keine Tabellen vorhanden.',\n errorprofile: 'Formatprofil wählen.',\n excelMissing: 'XLSX-Export auf dem Server nicht verfügbar (Extra „excel“ fehlt). Die Vorschau zeigt nur die Formate.',\n previewStale: 'Eingaben geändert – Vorschau neu anfordern.',\n workbook: 'Probelauf: {filename}, {size}',\n sheetHeading: 'Blatt „{name}“ – {rows} Zeilen',\n columns: 'Spaltenformate',\n colName: 'Spalte',\n colType: 'Typ',\n colFormat: 'Excel-Format',\n colSource: 'Herkunft',\n sourceprofile: 'Profil',\n sourceoverride: 'ausdrücklich',\n sample: 'Erste Zeilen',\n sampleMore: 'Vorschau zeigt {shown} von {rows} Zeilen.',\n exported: 'Exportiert: {filename}',\n notice: 'Texte werden als Text gespeichert, auch wenn sie mit „=“ beginnen; es entstehen keine Formeln, Makros oder Verknüpfungen.',\n },\n en: {\n title: 'Table export (Excel)',\n profile: 'Format profile',\n preview: 'Preview',\n export: 'Export as Excel',\n filename: 'File name',\n },\n})\n\nexport type ReportingMessageKey = keyof typeof reportingMessages.de\n","import { requestFile, requestJson, type RestOptions } from '@auditcore/common'\nimport type { ReportingPort } from './types'\n\n/** Port auf den REST-Vertrag `reporting_ui/1` von `auditcore_reporting.web` (Starlette oder FastAPI). */\nexport function createReportingRestPort(options: RestOptions): ReportingPort {\n return {\n profiles: () => requestJson(options, '/profiles'),\n preview: (request) => requestJson(options, '/preview', request),\n exportWorkbook: (request) => requestFile(options, '/export', request, request.filename ?? 'bericht.xlsx'),\n }\n}\n","// Zustandsautomat des Tabellenexports (Vue und React): Formatprofile laden,\n// Profil wählen, Vorschau und Export über den Port (reporting_ui/1).\n\nimport type { DownloadFile } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState } from '../store'\nimport type { FormatProfile, ReportingCatalogue, ReportingPort, ReportTableInput, WorkbookPreview, WorkbookRequest } from './types'\n\nexport type ReportingBusy = 'load' | 'preview' | 'export'\nexport type ReportingError = 'noTables' | 'profile'\n\nexport interface ReportingCallbacks {\n previewed?: (result: WorkbookPreview) => void\n exported?: (file: DownloadFile) => void\n failed?: (message: string) => void\n}\n\nexport interface ReportingData extends RequestState<string> {\n catalogue: ReportingCatalogue | null\n profileId: string | null\n filename: string\n preview: WorkbookPreview | null\n /** Vorschau passt nicht mehr zu Profil, Dateiname oder Tabellen. */\n stale: boolean\n validation: ReportingError | null\n exportedName: string | null\n}\n\nexport interface ReportingSource {\n port: () => ReportingPort | null | undefined\n tables: () => readonly ReportTableInput[]\n callbacks?: () => ReportingCallbacks\n}\n\nexport const INITIAL_REPORTING: ReportingData = {\n ...IDLE, catalogue: null, profileId: null, filename: '', preview: null, stale: false, validation: null, exportedName: null,\n}\n\nexport function reportingProfile(state: ReportingData): FormatProfile | null {\n return state.catalogue?.profiles.find((entry) => entry.id === state.profileId) ?? null\n}\n\n/** Anfrage aus Zustand und Tabellen oder der erste fehlende Punkt. */\nexport function buildWorkbookRequest(state: ReportingData, tables: readonly ReportTableInput[]): { ok: true; request: WorkbookRequest } | { ok: false; error: ReportingError } {\n if (!tables.length) return { ok: false, error: 'noTables' }\n if (!state.profileId) return { ok: false, error: 'profile' }\n const filename = state.filename.trim()\n return { ok: true, request: { profile: state.profileId, tables, ...(filename ? { filename } : {}) } }\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nexport function createReportingController(source: ReportingSource) {\n const store = createStore<ReportingData>({ ...INITIAL_REPORTING })\n const run = createRunner<ReportingPort, string, ReportingData>(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n\n function checked(): WorkbookRequest | null {\n const built = buildWorkbookRequest(store.get(), source.tables())\n store.set({ validation: built.ok ? null : built.error })\n return built.ok ? built.request : null\n }\n\n async function load(): Promise<void> {\n const loaded = await run('load', (active) => active.profiles())\n if (!loaded) return\n store.set({ catalogue: loaded, profileId: loaded.profiles[0]?.id ?? null })\n }\n\n async function preview(): Promise<void> {\n const request = checked()\n if (!request) return\n const result = await run('preview', (active) => active.preview(request))\n if (!result) return\n store.set({ preview: result, stale: false })\n source.callbacks?.().previewed?.(result)\n }\n\n async function exportWorkbook(): Promise<DownloadFile | null> {\n const request = checked()\n if (!request) return null\n const file = await run('export', (active) => active.exportWorkbook(request))\n if (!file) return null\n store.set({ exportedName: file.filename })\n source.callbacks?.().exported?.(file)\n return file\n }\n\n const changed = (patch: Partial<ReportingData>): void => store.set((state) => ({ ...patch, stale: state.preview !== null, exportedName: null }))\n\n return {\n store,\n load,\n preview,\n exportWorkbook,\n setProfile: (profileId: string | null) => changed({ profileId }),\n setFilename: (filename: string) => changed({ filename }),\n /** Tabellen der Anwendung haben sich geändert. */\n tablesChanged: () => changed({}),\n }\n}\n\nexport type ReportingController = ReturnType<typeof createReportingController>\n","// Anzeige des Tabellenexports (Vue und React): Texte, Zellen, Zusammenfassungen.\n\nimport { EMPTY_VALUE, formatBytes, intlFormatNumber } from '@auditcore/common'\nimport type { Locale, Translate } from '../i18n'\nimport type { ReportingMessageKey } from './messages'\nimport type { ReportCell, ReportTableInput, TablePreview, WorkbookPreview } from './types'\n\nexport type ReportingTranslate = Translate<ReportingMessageKey>\n\n/** Zelle der Vorschau: Werte wie gesendet (Zahlen sprachabhängig), leer als „—“. */\nexport function reportCellText(value: ReportCell, locale: Locale): string {\n if (value === null || value === '') return EMPTY_VALUE\n if (typeof value === 'number') return intlFormatNumber(value, locale, { maximumFractionDigits: 10 })\n return String(value)\n}\n\nexport function reportingTablesText(tables: readonly ReportTableInput[], t: ReportingTranslate, locale: Locale): string {\n if (!tables.length) return t('noTables')\n const rows = tables.reduce((sum, table) => sum + table.rows.length, 0)\n return t('tablesSummary', { tables: tables.length, rows: intlFormatNumber(rows, locale) })\n}\n\nexport function reportingWorkbookText(preview: WorkbookPreview, t: ReportingTranslate, locale: Locale): string {\n if (!preview.workbook) return t('excelMissing')\n return t('workbook', { filename: preview.workbook.filename, size: formatBytes(preview.workbook.bytes, { locale }) })\n}\n\nexport function reportingSheetHeading(table: TablePreview, t: ReportingTranslate, locale: Locale): string {\n return t('sheetHeading', { name: table.name, rows: intlFormatNumber(table.rows, locale) })\n}\n\n/** Hinweis, wenn die Vorschau nur einen Teil der Zeilen zeigt; sonst leer. */\nexport function reportingSampleNote(table: TablePreview, t: ReportingTranslate, locale: Locale): string {\n if (table.sample.length >= table.rows) return ''\n return t('sampleMore', { shown: table.sample.length, rows: intlFormatNumber(table.rows, locale) })\n}\n\nexport function reportingErrorKey(error: 'noTables' | 'profile'): ReportingMessageKey {\n return error === 'noTables' ? 'errornoTables' : 'errorprofile'\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte von „Kennung prüfen“. */\nexport const identifierMessages = defineMessages({\n de: {\n title: 'Kennung prüfen',\n loading: 'Kennungsarten und Prüfprofile werden geladen …',\n noPort: 'Kein Port übergeben: Prüfungen sind nicht verfügbar.',\n failed: 'Anfrage abgelehnt: {message}',\n single: 'Einzelprüfung',\n kind: 'Kennungsart',\n profile: 'Prüfprofil',\n recommended: '{label} (empfohlen)',\n legacy: '{label} (Altverhalten)',\n profileSource: 'Herkunft und Zweck des Profils',\n value: 'Wert',\n country: 'Land (optional)',\n countryHelp: 'Nur nötig, wenn die USt-IdNr. ohne Länderpräfix vorliegt, z. B. DE.',\n choose: 'Bitte wählen',\n check: 'Prüfen',\n result: 'Ergebnis',\n statusVALID: 'gültig',\n statusINVALID: 'ungültig',\n statusMISSING: 'fehlt',\n validText: 'Die Kennung erfüllt alle Prüfungen des Profils „{profile}“.',\n normalized: 'Normalform',\n reason: 'Grund',\n message: 'Begründung',\n countryFound: 'Land',\n details: 'Einzelheiten der Prüfung',\n yes: 'ja',\n no: 'nein',\n batch: 'Stapelprüfung aus Tabelle',\n batchHelp: 'CSV-, TSV- oder Textdatei laden und Spalten zuordnen; jede Zeile wird mit dem gewählten Profil geprüft.',\n file: 'Datei (CSV, TSV oder Text)',\n header: 'Erste Zeile enthält Spaltennamen',\n tableSummary: '{file}: {rows} Zeilen',\n valueColumn: 'Wertspalte',\n kindSource: 'Kennungsart',\n fromColumn: 'aus Spalte …',\n kindColumn: 'Spalte mit Kennungsart',\n refColumn: 'Bezugsspalte (z. B. Belegnummer)',\n countryColumn: 'Landspalte',\n none: '– keine –',\n batchRun: 'Alle prüfen',\n summary: '{total} Zeilen geprüft: {valid} gültig, {invalid} ungültig, {missing} ohne Wert, {notChecked} nicht prüfbar',\n colRef: 'Bezug',\n colKind: 'Art',\n colValue: 'Wert',\n colStatus: 'Ergebnis',\n colReason: 'Begründung',\n colNormalized: 'Normalform',\n notChecked: 'nicht prüfbar',\n onlyInvalid: 'Nur Auffälligkeiten zeigen',\n export: 'Ergebnis als CSV',\n lineRef: 'Zeile {line}',\n errorkind: 'Kennungsart wählen.',\n errorprofile: 'Prüfprofil wählen.',\n errornoTable: 'Zuerst eine Datei laden.',\n errornoRows: 'Die Tabelle enthält keine Zeilen.',\n errortooMany: 'Zu viele Zeilen für eine Anfrage.',\n errorkindColumn: 'Kennungsart für alle Zeilen oder eine Spalte mit Kennungsart wählen.',\n },\n en: {\n title: 'Check identifier',\n kind: 'Identifier type',\n profile: 'Check profile',\n value: 'Value',\n check: 'Check',\n result: 'Result',\n batch: 'Batch check from table',\n batchRun: 'Check all',\n },\n})\n\nexport type IdentifierMessageKey = keyof typeof identifierMessages.de\n","/** Framework-freie Anfrage- und Anzeigelogik von „Kennung prüfen“ (Vue und React). */\nimport { recordsToCsv, type ParsedTable } from '@auditcore/common'\nimport type { Translate } from '../i18n'\nimport type { IdentifierMessageKey } from './messages'\nimport type {\n IdentifierBatchAnswer,\n IdentifierBatchItem,\n IdentifierBatchRequest,\n IdentifierBatchRow,\n IdentifierCheckRequest,\n IdentifierDetailValue,\n IdentifierCatalogue,\n IdentifierKindInfo,\n IdentifierProfileInfo,\n IdentifierResult,\n IdentifierStatus,\n} from './types'\n\nexport type IdentifierTranslate = Translate<IdentifierMessageKey>\nexport type IdentifierError = 'kind' | 'profile' | 'noTable' | 'noRows' | 'tooMany' | 'kindColumn'\nexport type IdentifierValidation<R> = { ok: true; request: R } | { ok: false; error: IdentifierError }\n\nexport function findIdentifierProfile(catalogue: IdentifierCatalogue | null, id: string | null): IdentifierProfileInfo | null {\n return catalogue?.profiles.find((entry) => entry.id === id) ?? null\n}\n\n/** Kennungsarten, die das gewählte Profil prüft (ohne Profil: keine). */\nexport function identifierProfileKinds(catalogue: IdentifierCatalogue | null, profileId: string | null): IdentifierKindInfo[] {\n const profile = findIdentifierProfile(catalogue, profileId)\n return profile && catalogue ? catalogue.kinds.filter((kind) => profile.kinds.includes(kind.id)) : []\n}\n\n/** Anzeige eines Profils in der Auswahl: Empfehlung und Altverhalten sichtbar. */\nexport function identifierProfileLabel(catalogue: IdentifierCatalogue, profile: IdentifierProfileInfo, t: IdentifierTranslate): string {\n if (profile.id === catalogue.recommended_profile) return t('recommended', { label: profile.title })\n return profile.legacy ? t('legacy', { label: profile.title }) : profile.title\n}\n\nexport function kindNeedsCountry(catalogue: IdentifierCatalogue | null, kind: string | null): boolean {\n return catalogue?.kinds.find((entry) => entry.id === kind)?.country === true\n}\n\nfunction country(text: string | null | undefined): string | null {\n const trimmed = (text ?? '').trim().toUpperCase()\n return trimmed === '' ? null : trimmed\n}\n\nexport interface IdentifierCheckInput {\n catalogue: IdentifierCatalogue\n profile: string | null\n kind: string | null\n value: string\n country: string\n}\n\n/** Anfrage für `POST /check`; Profil und Kennungsart sind Pflicht, ein leerer Wert ergibt „fehlt“. */\nexport function buildIdentifierCheck(input: IdentifierCheckInput): IdentifierValidation<IdentifierCheckRequest> {\n if (!findIdentifierProfile(input.catalogue, input.profile)) return { ok: false, error: 'profile' }\n if (!input.kind || !identifierProfileKinds(input.catalogue, input.profile).some((kind) => kind.id === input.kind)) return { ok: false, error: 'kind' }\n const request: IdentifierCheckRequest = { kind: input.kind, value: input.value.trim() === '' ? null : input.value, profile: input.profile as string }\n const land = kindNeedsCountry(input.catalogue, input.kind) ? country(input.country) : null\n return { ok: true, request: land ? { ...request, country: land } : request }\n}\n\n/** Kennungsart aus einer Tabellenzelle: Kennung oder Bezeichnung des Katalogs, sonst unverändert (Server meldet sie). */\nexport function resolveIdentifierKind(catalogue: IdentifierCatalogue, cell: string): string {\n const text = cell.trim().toLowerCase()\n const found = catalogue.kinds.find((kind) => kind.id === text || kind.label.toLowerCase() === text)\n return found ? found.id : cell.trim()\n}\n\nexport interface IdentifierBatchMapping {\n table: ParsedTable | null\n hasHeader: boolean\n valueColumn: number\n refColumn: number | null\n /** Kennungsart für alle Zeilen; `null` = aus `kindColumn`. */\n kind: string | null\n kindColumn: number | null\n countryColumn: number | null\n}\n\nfunction batchItem(catalogue: IdentifierCatalogue, mapping: IdentifierBatchMapping, row: readonly string[], index: number): IdentifierBatchItem {\n const cell = (column: number | null): string => (column === null ? '' : (row[column] ?? ''))\n const value = cell(mapping.valueColumn)\n const line = index + (mapping.hasHeader ? 2 : 1)\n const kind = mapping.kind ?? resolveIdentifierKind(catalogue, cell(mapping.kindColumn))\n const item: IdentifierBatchItem = { ref: mapping.refColumn === null ? String(line) : cell(mapping.refColumn), kind, value: value.trim() === '' ? null : value }\n const land = mapping.countryColumn === null ? null : country(cell(mapping.countryColumn))\n return land ? { ...item, country: land } : item\n}\n\n/** Anfrage für `POST /check/batch` aus der geladenen Tabelle und der Spaltenzuordnung. */\nexport function buildIdentifierBatch(catalogue: IdentifierCatalogue, profile: string | null, mapping: IdentifierBatchMapping): IdentifierValidation<IdentifierBatchRequest> {\n if (!findIdentifierProfile(catalogue, profile)) return { ok: false, error: 'profile' }\n if (!mapping.table) return { ok: false, error: 'noTable' }\n if (mapping.table.rows.length === 0) return { ok: false, error: 'noRows' }\n if (mapping.table.rows.length > catalogue.limits.max_items) return { ok: false, error: 'tooMany' }\n if (mapping.kind === null && mapping.kindColumn === null) return { ok: false, error: 'kindColumn' }\n const items = mapping.table.rows.map((row, index) => batchItem(catalogue, mapping, row, index))\n return { ok: true, request: { profile: profile as string, items } }\n}\n\nexport function identifierErrorKey(error: IdentifierError): IdentifierMessageKey {\n return `error${error}`\n}\n\nexport type IdentifierTone = 'success' | 'danger' | 'warning' | 'neutral'\n\nconst TONES: Readonly<Record<IdentifierStatus, IdentifierTone>> = { VALID: 'success', INVALID: 'danger', MISSING: 'warning' }\n\nexport function identifierStatusTone(status: IdentifierStatus | null): IdentifierTone {\n return status ? TONES[status] : 'neutral'\n}\n\nexport function identifierStatusText(status: IdentifierStatus | null, t: IdentifierTranslate): string {\n return status ? t(`status${status}`) : t('notChecked')\n}\n\n/** Begründung eines Ergebnisses: Meldung der Bibliothek, bei „gültig“ der Satz zum Profil. */\nexport function identifierReasonText(result: IdentifierResult, profileTitle: string, t: IdentifierTranslate): string {\n if (result.message) return result.message\n return result.status === 'VALID' ? t('validText', { profile: profileTitle }) : (result.reason_label ?? '')\n}\n\nfunction detailValue(catalogue: IdentifierCatalogue, value: IdentifierDetailValue, t: IdentifierTranslate): string {\n if (value === null) return '—'\n if (typeof value === 'boolean') return t(value ? 'yes' : 'no')\n return catalogue.value_labels[String(value)] ?? String(value)\n}\n\n/** Einzelheiten (`details`) mit deutschen Bezeichnungen aus dem Katalog. */\nexport function identifierFacts(catalogue: IdentifierCatalogue, result: IdentifierResult, t: IdentifierTranslate): { key: string; label: string; value: string }[] {\n return Object.entries(result.details).map(([key, value]) => ({\n key,\n label: catalogue.detail_labels[key] ?? key,\n value: detailValue(catalogue, value, t),\n }))\n}\n\n/** Status einer Stapelzeile; `null` = nicht prüfbar. */\nexport function identifierRowStatus(row: IdentifierBatchRow): IdentifierStatus | null {\n return row.error === null ? row.status : null\n}\n\n/** Begründung einer Stapelzeile; gültige Zeilen nur mit eigener Meldung der Bibliothek (Tabelle bleibt knapp). */\nexport function identifierRowReason(row: IdentifierBatchRow): string {\n if (row.error !== null) return row.error.message\n return row.message || (row.status === 'VALID' ? '' : (row.reason_label ?? ''))\n}\n\nexport function identifierRowKind(catalogue: IdentifierCatalogue, row: IdentifierBatchRow, request: IdentifierBatchRequest | null): string {\n if (row.error === null) return row.kind_label\n const kind = request?.items[row.index]?.kind ?? ''\n return catalogue.kinds.find((entry) => entry.id === kind)?.label ?? kind\n}\n\nexport function identifierRowValue(row: IdentifierBatchRow, request: IdentifierBatchRequest | null): string {\n return row.error === null ? (row.raw ?? '') : (request?.items[row.index]?.value ?? '')\n}\n\n/** Zeilen der Ergebnistabelle; wahlweise nur ungültige, fehlende und nicht prüfbare. */\nexport function visibleIdentifierRows(answer: IdentifierBatchAnswer, onlyIssues: boolean): readonly IdentifierBatchRow[] {\n return onlyIssues ? answer.results.filter((row) => identifierRowStatus(row) !== 'VALID') : answer.results\n}\n\nexport function identifierBatchSummary(answer: IdentifierBatchAnswer, t: IdentifierTranslate): string {\n const { total, valid, invalid, missing, not_checked: notChecked } = answer.summary\n return t('summary', { total, valid, invalid, missing, notChecked })\n}\n\n/** Anzeigezeile der Stapelprüfung (Tabelle und CSV). */\nexport interface IdentifierBatchLine {\n key: number\n ref: string\n kind: string\n value: string\n status: string\n tone: IdentifierTone\n reason: string\n normalized: string\n}\n\nexport function identifierBatchLines(\n catalogue: IdentifierCatalogue,\n answer: IdentifierBatchAnswer,\n request: IdentifierBatchRequest | null,\n onlyIssues: boolean,\n t: IdentifierTranslate,\n): IdentifierBatchLine[] {\n return visibleIdentifierRows(answer, onlyIssues).map((row) => ({\n key: row.index,\n ref: row.ref,\n kind: identifierRowKind(catalogue, row, request),\n value: identifierRowValue(row, request),\n status: identifierStatusText(identifierRowStatus(row), t),\n tone: identifierStatusTone(identifierRowStatus(row)),\n reason: identifierRowReason(row),\n normalized: row.error === null ? (row.normalized ?? '') : '',\n }))\n}\n\n/** CSV (Excel-DE) der Stapelprüfung mit denselben Spalten wie die Tabelle (alle Zeilen). */\nexport function identifierBatchCsv(catalogue: IdentifierCatalogue, answer: IdentifierBatchAnswer, request: IdentifierBatchRequest | null, t: IdentifierTranslate): string {\n return recordsToCsv(identifierBatchLines(catalogue, answer, request, false, t), [\n { label: t('colRef'), value: 'ref' },\n { label: t('colKind'), value: 'kind' },\n { label: t('colValue'), value: 'value' },\n { label: t('colStatus'), value: 'status' },\n { label: t('colReason'), value: 'reason' },\n { label: t('colNormalized'), value: 'normalized' },\n ])\n}\n\nexport type IdentifierColumn = 'value' | 'kind' | 'ref' | 'country'\n\nexport interface IdentifierColumnField {\n id: IdentifierColumn\n label: IdentifierMessageKey\n value: number | null\n /** Text der leeren Auswahl: „keine“ bei optionalen Spalten, „Bitte wählen“ bei der Spalte mit Kennungsart. */\n placeholder: IdentifierMessageKey | null\n}\n\n/** Spaltenauswahl der Stapelprüfung; die Spalte mit Kennungsart nur ohne feste Art. */\nexport function identifierColumnFields(mapping: IdentifierBatchMapping): IdentifierColumnField[] {\n const field = (id: IdentifierColumn, label: IdentifierMessageKey, value: number | null, placeholder: IdentifierMessageKey | null): IdentifierColumnField => ({\n id, label, value, placeholder,\n })\n return [\n field('value', 'valueColumn', mapping.valueColumn, null),\n ...(mapping.kind === null ? [field('kind', 'kindColumn', mapping.kindColumn, 'choose')] : []),\n field('ref', 'refColumn', mapping.refColumn, 'none'),\n field('country', 'countryColumn', mapping.countryColumn, 'none'),\n ]\n}\n","import { requestJson, type RestOptions } from '@auditcore/common'\nimport type { IdentifiersPort } from './types'\n\n/** Port auf den REST-Vertrag `identifiers_ui/1` von `auditcore_identifiers.web` (Starlette oder FastAPI). */\nexport function createIdentifiersRestPort(options: RestOptions): IdentifiersPort {\n return {\n catalogue: () => requestJson(options, '/catalogue'),\n check: (request) => requestJson(options, '/check', request),\n checkBatch: (request) => requestJson(options, '/check/batch', request),\n }\n}\n","// Zustandsautomat von „Kennung prüfen“ (Vue und React): Katalog laden,\n// Einzelprüfung, Stapelprüfung aus einer Tabelle. Die Datei liest der\n// gemeinsame TableImport-Controller; geprüft wird ausschließlich über den Port.\n\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport { createTableImportController, type TableImportController, type TableImportData } from '../tabular'\nimport { buildIdentifierBatch, buildIdentifierCheck, identifierProfileKinds, type IdentifierBatchMapping, type IdentifierColumn, type IdentifierError } from './model'\nimport type { IdentifierBatchAnswer, IdentifierBatchRequest, IdentifierCatalogue, IdentifierResult, IdentifiersPort } from './types'\n\nexport type IdentifierBusy = 'load' | 'check' | 'batch'\n\nexport interface IdentifierCallbacks {\n checked?: (result: IdentifierResult) => void\n batchChecked?: (answer: IdentifierBatchAnswer) => void\n failed?: (message: string) => void\n}\n\nexport interface IdentifierData extends RequestState<string> {\n catalogue: IdentifierCatalogue | null\n profileId: string | null\n kind: string | null\n value: string\n country: string\n result: IdentifierResult | null\n validation: IdentifierError | null\n /** Kennungsart aller Tabellenzeilen; `null` = aus `kindColumn`. */\n batchKind: string | null\n kindColumn: number | null\n countryColumn: number | null\n batchRequest: IdentifierBatchRequest | null\n batch: IdentifierBatchAnswer | null\n batchValidation: IdentifierError | null\n onlyIssues: boolean\n}\n\nexport const INITIAL_IDENTIFIERS: IdentifierData = {\n ...IDLE, catalogue: null, profileId: null, kind: null, value: '', country: '', result: null, validation: null,\n batchKind: null, kindColumn: null, countryColumn: null, batchRequest: null, batch: null, batchValidation: null, onlyIssues: false,\n}\n\n/** Einfache Eingabefelder, die die Oberfläche direkt setzen darf. */\nexport type IdentifierField = 'value' | 'country' | 'kindColumn' | 'countryColumn' | 'onlyIssues'\n\nexport interface IdentifierSource {\n port: () => IdentifiersPort | null | undefined\n callbacks?: () => IdentifierCallbacks\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\n/** Zuordnung aus beiden Zuständen (Tabelle und Kennungsprüfung). */\nexport function identifierBatchMapping(state: IdentifierData, loaded: TableImportData): IdentifierBatchMapping {\n return {\n table: loaded.table, hasHeader: loaded.hasHeader, valueColumn: loaded.valueColumn, refColumn: loaded.idColumn,\n kind: state.batchKind, kindColumn: state.kindColumn, countryColumn: state.countryColumn,\n }\n}\n\nfunction keepKind(store: Store<IdentifierData>, kind: string | null, profileId: string | null): string | null {\n const offered = identifierProfileKinds(store.get().catalogue, profileId)\n return offered.some((entry) => entry.id === kind) ? kind : (offered[0]?.id ?? null)\n}\n\n/** Datei und Spaltenzuordnung der Stapelprüfung. */\nfunction tableActions(store: Store<IdentifierData>, table: TableImportController) {\n return {\n /** Spalte zuordnen; `null` = keine (nur optionale Spalten). */\n setColumn: (column: IdentifierColumn, index: number | null) => {\n if (column === 'value') table.setValueColumn(index ?? 0)\n else if (column === 'ref') table.setIdColumn(index)\n else store.set(column === 'kind' ? { kindColumn: index } : { countryColumn: index })\n },\n setHasHeader: (hasHeader: boolean) => {\n table.setHasHeader(hasHeader)\n table.reparse()\n },\n readFile: async (file: File) => {\n await table.read(file)\n store.set({ batch: null, batchRequest: null, batchValidation: null, kindColumn: null, countryColumn: null })\n },\n }\n}\n\nexport function createIdentifierController(source: IdentifierSource) {\n const store = createStore<IdentifierData>({ ...INITIAL_IDENTIFIERS })\n const table = createTableImportController()\n const callbacks = (): IdentifierCallbacks => source.callbacks?.() ?? {}\n const run = createRunner<IdentifiersPort, string, IdentifierData>(store, () => source.port() ?? null, errorText, (message) => callbacks().failed?.(message))\n\n async function load(): Promise<void> {\n const loaded = await run('load', (active) => active.catalogue())\n if (!loaded) return\n store.set({ catalogue: loaded, profileId: null })\n setProfile(loaded.recommended_profile)\n store.set((state) => ({ batchKind: state.kind }))\n }\n\n function setProfile(profileId: string | null): void {\n const { kind, batchKind } = store.get()\n store.set({ profileId, kind: keepKind(store, kind, profileId), batchKind: batchKind === null ? null : keepKind(store, batchKind, profileId), result: null, batch: null })\n }\n\n async function check(): Promise<void> {\n const state = store.get()\n if (!state.catalogue) return\n const checked = buildIdentifierCheck({ catalogue: state.catalogue, profile: state.profileId, kind: state.kind, value: state.value, country: state.country })\n store.set({ validation: checked.ok ? null : checked.error })\n if (!checked.ok) return\n const answer = await run('check', (active) => active.check(checked.request))\n if (!answer) return\n store.set({ result: answer.result })\n callbacks().checked?.(answer.result)\n }\n\n async function checkBatch(): Promise<void> {\n const state = store.get()\n if (!state.catalogue) return\n const checked = buildIdentifierBatch(state.catalogue, state.profileId, identifierBatchMapping(state, table.store.get()))\n store.set({ batchValidation: checked.ok ? null : checked.error })\n if (!checked.ok) return\n const answer = await run('batch', (active) => active.checkBatch(checked.request))\n if (!answer) return\n store.set({ batch: answer, batchRequest: checked.request })\n callbacks().batchChecked?.(answer)\n }\n\n return {\n store,\n /** Datei-Import (gemeinsamer TableImport-Controller aus `@auditcore/ui-core`). */\n table,\n load,\n check,\n checkBatch,\n setProfile,\n setKind: (kind: string | null) => store.set({ kind, result: null }),\n setBatchKind: (batchKind: string | null) => store.set({ batchKind }),\n setField: <K extends IdentifierField>(key: K, value: IdentifierData[K]) => store.set({ [key]: value } as Partial<IdentifierData>),\n ...tableActions(store, table),\n }\n}\n\nexport type IdentifierController = ReturnType<typeof createIdentifierController>\n","import { defineMessages } from '../i18n'\n\n/** Texte der Belegerkennung (`<flowaudit-extraction>`). */\nexport const extractionMessages = defineMessages({\n de: {\n title: 'Belegerkennung',\n loading: 'Profile und Engines werden geladen …',\n noPort: 'Kein Port übergeben: Die Belegerkennung ist nicht verfügbar.',\n failed: 'Anfrage abgelehnt: {message}',\n disabled: 'Die Belegerkennung ist nicht eingerichtet: Der Server hat keine OCR-Engine angeschlossen.',\n upload: 'Dokument hochladen',\n file: 'Datei',\n fileHelp: 'PDF oder Bild (PNG, JPEG, TIFF, WebP), höchstens {size}.',\n profile: 'Profil',\n recommended: '{label} (empfohlen)',\n unavailable: '{label} – Engine nicht angeschlossen',\n experimental: 'Erprobendes Profil: Donut-Werte gelten nur nach Plausibilitätsprüfung und Abgleich mit der Texterkennung.',\n retention: 'Das Dokument wird nur für diesen Lauf zwischengespeichert und danach gelöscht; der Server speichert kein Ergebnis.',\n run: 'Erkennen',\n errorneedFile: 'Bitte eine Datei auswählen.',\n errortooLarge: 'Die Datei ist größer als {size}.',\n errorprofile: 'Bitte ein verfügbares Profil wählen.',\n notice: 'Arbeitshilfe: Das Ergebnis ist ein Vorschlag der Texterkennung, keine Prüfungsentscheidung.',\n result: 'Ergebnis',\n statusok: 'Ohne Auffälligkeiten',\n statusreview_needed: 'Prüfung erforderlich',\n statusrejected: 'Abgelehnt',\n statusfailed: 'Fehlgeschlagen',\n statusOther: 'Status {status}',\n runError: 'Fehler {code}: {message}',\n retryable: 'Der Lauf kann wiederholt werden.',\n document: 'Dokument',\n documentValue: '{file} · {type} · {pages}',\n pages: '{count} Seite(n)',\n ocr: 'Texterkennung',\n ocrValue: '{engine}: mittlere Konfidenz {avg} (mindestens {min})',\n qualityok: 'ausreichend',\n qualityreview: 'prüfen',\n qualityrejected: 'unzureichend',\n fields: 'Erkannte Felder',\n colField: 'Feld',\n colValue: 'Wert',\n colConfidence: 'Konfidenz',\n colDecision: 'Übernahme',\n noValue: '–',\n noFields: 'Keine Felder erkannt.',\n confidenceHelp: 'Konfidenz je Feld liefert nur das Donut-Profil; sonst gilt die Konfidenz der Texterkennung.',\n decisionaccepted: 'übernommen',\n decisionrejected: 'verworfen (Plausibilität)',\n decisionunconfirmed: 'nicht bestätigt',\n decisiondisagreement: 'Abweichung zur Texterkennung',\n decisionnot_taken: 'nicht übernommen',\n proposal: 'Vorschlag: {value}',\n findings: 'Validierungsbefunde',\n findingsNone: 'Keine Auffälligkeiten.',\n passed: 'Bestandene Prüfungen ({count})',\n colRule: 'Prüfung',\n colSeverity: 'Gewicht',\n colOutcome: 'Ergebnis',\n colMessage: 'Meldung des Regelwerks',\n severityINFO: 'Hinweis',\n severityWARN: 'Warnung',\n severityCRITICAL: 'kritisch',\n outcomePASS: 'bestanden',\n outcomeFAIL: 'nicht bestanden',\n outcomeREVIEW: 'prüfen',\n flags: 'Kennzeichen',\n pagesText: 'Erkannter Text',\n pageLabel: 'Seite {page}',\n field_invoice_number: 'Rechnungsnummer',\n field_date: 'Rechnungsdatum',\n field_supply_date: 'Leistungsdatum',\n field_due_date: 'Fälligkeit',\n field_supplier_name: 'Lieferant',\n field_net_amount: 'Nettobetrag',\n field_vat_amount: 'Umsatzsteuer',\n field_total: 'Gesamtbetrag',\n field_iban: 'IBAN',\n field_bic: 'BIC',\n field_vat_id: 'USt-IdNr.',\n field_vat_rates: 'Steuersätze',\n rule_VAL_IBAN_CHECKSUM: 'IBAN-Prüfziffer',\n rule_VAL_VAT_ID_FORMAT: 'Aufbau der USt-IdNr.',\n rule_VAL_TOTAL_PLAUSIBILITY: 'Summe netto + Steuer = brutto',\n rule_VAL_OCR_CONFIDENCE: 'Lesequalität der Texterkennung',\n rule_VAL_FRAUD_DETECTION: 'Doppel- und Betrugsprüfung',\n rule_VAL_AMOUNT_FORMAT: 'Eindeutige Betragsformate',\n rule_VAL_DONUT_PLAUSIBILITY: 'Plausibilität der Donut-Werte',\n rule_VAL_DONUT_DISAGREEMENT: 'Abgleich Donut mit Texterkennung',\n },\n en: {\n title: 'Document extraction',\n upload: 'Upload document',\n file: 'File',\n profile: 'Profile',\n run: 'Extract',\n result: 'Result',\n fields: 'Extracted fields',\n findings: 'Validation findings',\n },\n})\n\nexport type ExtractionMessageKey = keyof typeof extractionMessages.de\n","import { RestError, type RestOptions } from '@auditcore/common'\nimport type { ExtractionCatalogue, ExtractionPort, ExtractionRun } from './types'\n\nasync function parse<T>(response: Response): Promise<T> {\n const data = (await response.json().catch(() => ({}))) as { error?: { code?: string; message?: string } }\n if (response.ok) return data as T\n throw new RestError(data.error?.message ?? `HTTP ${response.status}`, response.status, data.error?.code ?? 'http_error')\n}\n\n/** Port auf den REST-Vertrag `documents_extraction/1` von `auditcore_documents.web` (Starlette oder FastAPI). */\nexport function createExtractionRestPort(options: RestOptions): ExtractionPort {\n const base = options.baseUrl.replace(/\\/$/, '')\n const fetchImpl = options.fetch ?? ((input, init) => globalThis.fetch(input, init))\n const headers = { Accept: 'application/json', ...options.headers }\n return {\n catalogue: async () => parse<ExtractionCatalogue>(await fetchImpl(`${base}/profile`, { method: 'GET', headers })),\n async run(file, filename, profile) {\n const form = new FormData()\n form.append('file', file, filename)\n form.append('profile', profile)\n return parse<ExtractionRun>(await fetchImpl(`${base}/runs`, { method: 'POST', headers, body: form }))\n },\n }\n}\n","// Zustandsautomat von <flowaudit-extraction> (Vue und React): Katalog laden,\n// Datei und Profil wählen, Lauf anstoßen. Erkannt wird ausschließlich über den Port.\n\nimport { createRunner, createStore, IDLE, type RequestState } from '../store'\nimport type { ExtractionCatalogue, ExtractionPort, ExtractionRun } from './types'\n\nexport type ExtractionBusy = 'load' | 'run'\nexport type ExtractionValidation = 'needFile' | 'tooLarge' | 'profile' | null\n\nexport interface ExtractionCallbacks {\n completed?: (result: ExtractionRun) => void\n failed?: (message: string) => void\n}\n\nexport interface ExtractionData extends RequestState<string> {\n catalogue: ExtractionCatalogue | null\n profileId: string | null\n file: Blob | null\n filename: string\n result: ExtractionRun | null\n validation: ExtractionValidation\n}\n\nexport interface ExtractionSource {\n port: () => ExtractionPort | null | undefined\n callbacks?: () => ExtractionCallbacks\n}\n\nexport const INITIAL_EXTRACTION: ExtractionData = {\n ...IDLE, catalogue: null, profileId: null, file: null, filename: '', result: null, validation: null,\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\n/** Prüfung vor dem Senden (reine Funktion). */\nexport function extractionValidation(state: ExtractionData): ExtractionValidation {\n if (!state.file) return 'needFile'\n if (state.catalogue && state.file.size > state.catalogue.limits.max_upload_bytes) return 'tooLarge'\n const profile = state.catalogue?.profiles.find((entry) => entry.id === state.profileId)\n return profile?.available ? null : 'profile'\n}\n\nexport function createExtractionController(source: ExtractionSource) {\n const store = createStore<ExtractionData>({ ...INITIAL_EXTRACTION })\n const run = createRunner<ExtractionPort, string, ExtractionData>(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n\n async function load(): Promise<void> {\n const loaded = await run('load', (active) => active.catalogue())\n if (loaded) store.set({ catalogue: loaded, profileId: loaded.default_profile })\n }\n\n async function extract(): Promise<void> {\n const state = store.get()\n const validation = extractionValidation(state)\n store.set({ validation })\n if (validation || !state.file || !state.profileId) return\n const { file, filename, profileId } = state\n const result = await run('run', (active) => active.run(file, filename, profileId))\n if (!result) return\n store.set({ result })\n source.callbacks?.().completed?.(result)\n }\n\n return {\n store,\n load,\n extract,\n /** Datei wählen (`null` = Auswahl aufheben). */\n selectFile: (file: File | null) => store.set({ file, filename: file?.name ?? '', validation: null }),\n setProfile: (profileId: string | null) => store.set({ profileId, validation: null }),\n /** Vorhandenes Ergebnis anzeigen (Eigenschaft `result`). */\n showResult: (result: ExtractionRun | null) => store.set({ result }),\n }\n}\n\nexport type ExtractionController = ReturnType<typeof createExtractionController>\n","/**\n * Anzeige der Belegerkennung für Vue und React (reine Funktionen): Profile,\n * Feld- und Befundzeilen, Konfidenzen, Status. Texte nur aus `extractionMessages`.\n */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent } from '@auditcore/common'\nimport type { Locale, Translate } from '../i18n'\nimport { extractionMessages, type ExtractionMessageKey } from './messages'\nimport type { ExtractedField, ExtractionCatalogue, ExtractionProfile, ExtractionRun, ExtractionJson, ExtractionFinding } from './types'\n\nexport type ExtractionTranslate = Translate<ExtractionMessageKey>\nexport type ExtractionTone = 'success' | 'warning' | 'danger' | 'neutral'\n\nconst KNOWN = new Set<string>(Object.keys(extractionMessages.de))\n\nfunction known(key: string): ExtractionMessageKey | null {\n return KNOWN.has(key) ? (key as ExtractionMessageKey) : null\n}\n\n/** Dateigröße in MiB (bzw. KiB unter 1 MiB). */\nexport function extractionSizeText(bytes: number, locale: Locale): string {\n if (bytes < 1024 * 1024) return `${formatNumber(Math.ceil(bytes / 1024), locale)} KiB`\n return `${formatNumber(bytes / (1024 * 1024), locale, { maximumFractionDigits: 1 })} MiB`\n}\n\nexport function extractionProfileText(profile: ExtractionProfile, t: ExtractionTranslate): string {\n if (!profile.available) return t('unavailable', { label: profile.label })\n return profile.recommended ? t('recommended', { label: profile.label }) : profile.label\n}\n\nexport function extractionFieldLabel(name: string, t: ExtractionTranslate): string {\n const key = known(`field_${name}`)\n return key ? t(key) : name\n}\n\nexport function extractionRuleLabel(finding: ExtractionFinding, t: ExtractionTranslate): string {\n const key = known(`rule_${finding.rule_id}`)\n return key ? t(key) : finding.rule_name || finding.rule_id\n}\n\n/** Wert eines Feldes als Text (Zahlen sprachabhängig, Listen mit Komma). */\nexport function extractionValueText(value: ExtractionJson, locale: Locale): string {\n if (value === null || value === '') return ''\n if (typeof value === 'number') return formatNumber(value, locale, { maximumFractionDigits: 2 })\n if (typeof value === 'string' || typeof value === 'boolean') return String(value)\n return JSON.stringify(value)\n}\n\nexport function extractionConfidenceText(value: number | null, locale: Locale): string {\n return value === null ? '' : formatPercent(value, locale, 0)\n}\n\n/** Ton einer Feldkonfidenz gegen den Schwellwert des Profils. */\nexport function extractionConfidenceTone(value: number | null, threshold: number | null): ExtractionTone {\n if (value === null) return 'neutral'\n return threshold === null || value >= threshold ? 'success' : 'warning'\n}\n\nexport function extractionDecisionText(field: ExtractedField, t: ExtractionTranslate): string {\n if (!field.decision) return ''\n const key = known(`decision${field.decision}`)\n return key ? t(key) : field.decision\n}\n\nexport function extractionDecisionTone(field: ExtractedField): ExtractionTone {\n if (field.decision === 'accepted') return 'success'\n if (field.decision === 'rejected' || field.decision === 'disagreement') return 'danger'\n return field.decision ? 'warning' : 'neutral'\n}\n\nexport function extractionStatusText(result: ExtractionRun, t: ExtractionTranslate): string {\n const key = known(`status${result.run.status}`)\n return key ? t(key) : t('statusOther', { status: result.run.status })\n}\n\nexport function extractionStatusTone(result: ExtractionRun): ExtractionTone {\n const status = result.run.status\n if (status === 'ok') return 'success'\n return status === 'review_needed' ? 'warning' : 'danger'\n}\n\nexport function extractionDocumentText(result: ExtractionRun, t: ExtractionTranslate): string {\n const { filename, mime_type, page_count } = result.document\n const pages = page_count === null ? t('noValue') : t('pages', { count: page_count })\n return t('documentValue', { file: filename || t('noValue'), type: mime_type ?? t('noValue'), pages })\n}\n\nexport function extractionOcrText(result: ExtractionRun, t: ExtractionTranslate, locale: Locale): string {\n const ocr = result.ocr\n if (!ocr) return t('noValue')\n const avg = formatPercent(ocr.avg_confidence, locale, 0)\n return `${t('ocrValue', { engine: ocr.engine, avg, min: formatPercent(ocr.min_confidence, locale, 0) })} – ${t(`quality${ocr.quality}`)}`\n}\n\nconst OUTCOME_ORDER: Readonly<Record<string, number>> = { FAIL: 0, REVIEW: 1, PASS: 2 }\nconst SEVERITY_ORDER: Readonly<Record<string, number>> = { CRITICAL: 0, WARN: 1, INFO: 2 }\n\n/** Auffällige Befunde (nicht bestanden, prüfen) zuerst nach Gewicht; bestandene getrennt. */\nexport function splitExtractionFindings(findings: readonly ExtractionFinding[]): { open: ExtractionFinding[]; passed: ExtractionFinding[] } {\n const rank = (entry: ExtractionFinding): number => (OUTCOME_ORDER[entry.outcome] ?? 3) * 10 + (SEVERITY_ORDER[entry.severity] ?? 3)\n const sorted = [...findings].sort((a, b) => rank(a) - rank(b))\n return { open: sorted.filter((entry) => entry.outcome !== 'PASS'), passed: sorted.filter((entry) => entry.outcome === 'PASS') }\n}\n\nexport function extractionOutcomeTone(finding: ExtractionFinding): ExtractionTone {\n if (finding.outcome === 'PASS') return 'success'\n return finding.outcome === 'FAIL' && finding.severity === 'CRITICAL' ? 'danger' : 'warning'\n}\n\n/** Schwellwert der Feldkonfidenz des gelaufenen Profils (nur Donut). */\nexport function extractionFieldThreshold(catalogue: ExtractionCatalogue | null, result: ExtractionRun): number | null {\n return catalogue?.profiles.find((entry) => entry.id === result.profile.id)?.min_field_confidence ?? null\n}\n\n/** Dateiauswahl der Oberfläche (`accept`) aus den zulässigen Typen. */\nexport function extractionAccept(catalogue: ExtractionCatalogue | null): string {\n const types = catalogue?.accepted_types ?? []\n return [...types, ...(types.includes('application/pdf') ? ['.pdf'] : [])].join(',')\n}\n\n/** Donut-Vorschlag, wenn er nicht übernommen wurde (sonst leer). */\nexport function extractionProposalText(field: ExtractedField, t: ExtractionTranslate, locale: Locale): string {\n if (!field.decision || field.decision === 'accepted' || field.proposal === null) return ''\n const text = extractionValueText(field.proposal, locale)\n return text ? t('proposal', { value: text }) : ''\n}\n\n/** Meldung zur Prüfung vor dem Senden. */\nexport function extractionValidationText(validation: 'needFile' | 'tooLarge' | 'profile', catalogue: ExtractionCatalogue | null, t: ExtractionTranslate, locale: Locale): string {\n if (validation !== 'tooLarge') return t(`error${validation}`)\n return t('errortooLarge', { size: extractionSizeText(catalogue?.limits.max_upload_bytes ?? 0, locale) })\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte der Kanban-Komponenten; Englisch vorbereitet. */\nexport const kanbanMessages = defineMessages({\n de: {\n board: 'Kanban-Board',\n loading: 'Board wird geladen …',\n readOnly: 'Nur Lesezugriff',\n sharedBy: 'Geteilt von {name}',\n renameHint: 'Zum Umbenennen klicken',\n renameLabel: 'Board-Titel',\n progress: '{done} von {total} erledigt',\n search: 'Suchen',\n searchPlaceholder: 'Titel, Beschreibung, Tags …',\n priorityFilter: 'Priorität',\n allPriorities: 'Alle Prioritäten',\n dueFilter: 'Fälligkeit',\n allDue: 'Alle Fristen',\n resetFilter: 'Filter zurücksetzen',\n filteredHint: 'Filter aktiv – Verschieben ist nur ohne Filter möglich',\n fullscreen: 'Vollbild (F)',\n share: 'Board teilen',\n settings: 'Board-Einstellungen',\n addCard: 'Aufgabe hinzufügen',\n addCardIn: 'Aufgabe in {column} hinzufügen',\n newCardTitle: 'Neue Aufgabe',\n emptyColumn: 'Keine Karten',\n wipLimit: 'WIP-Limit {count} von {limit}',\n cardCount: '{count} Karten',\n priority_hoch: 'Hoch',\n priority_mittel: 'Mittel',\n priority_niedrig: 'Niedrig',\n due_none: 'ohne Frist',\n due_overdue: 'überfällig',\n due_due_soon: 'bald fällig',\n due_later: 'später fällig',\n dueOn: 'Fällig am {date}',\n markDone: 'Als erledigt markieren',\n markOpen: 'Wieder öffnen',\n moreTags: '+{count}',\n checklistProgress: 'Checkliste {done}/{total}',\n attachments: '{count} Anhänge',\n links: '{count} Verknüpfungen',\n ageNew: 'neu',\n ageHours: '{count} Std.',\n ageDays: '{count} T.',\n ageWeeks: '{count} Wo.',\n ageMonths: '{count} Mon.',\n cardRole: 'Karte',\n moveInstructions: 'Leertaste nimmt die Karte auf; Pfeiltasten verschieben, Leertaste legt ab, Escape bricht ab. Strg+Pfeiltasten verschieben direkt. Enter öffnet die Details.',\n grabbed: '„{title}“ aufgenommen. Spalte {column}, Position {position} von {count}.',\n movedTo: '„{title}“: Spalte {column}, Position {position} von {count}.',\n dropped: '„{title}“ abgelegt in {column}, Position {position}.',\n cancelled: 'Verschieben von „{title}“ abgebrochen.',\n moveDenied: 'Nicht erlaubt: {reason}',\n wipWarning: 'Hinweis: WIP-Limit der Spalte {column} ist erreicht.',\n saved: 'Gespeichert.',\n errorPrefix: 'Fehler: {message}',\n retry: 'Erneut laden',\n },\n en: {\n board: 'Kanban board',\n loading: 'Loading board …',\n readOnly: 'Read-only access',\n sharedBy: 'Shared by {name}',\n renameHint: 'Click to rename',\n renameLabel: 'Board title',\n progress: '{done} of {total} done',\n search: 'Search',\n searchPlaceholder: 'Title, description, tags …',\n priorityFilter: 'Priority',\n allPriorities: 'All priorities',\n dueFilter: 'Due',\n allDue: 'All deadlines',\n resetFilter: 'Reset filters',\n filteredHint: 'Filter active – moving is only possible without filters',\n fullscreen: 'Full screen (F)',\n share: 'Share board',\n settings: 'Board settings',\n addCard: 'Add task',\n addCardIn: 'Add task to {column}',\n newCardTitle: 'New task',\n emptyColumn: 'No cards',\n wipLimit: 'WIP limit {count} of {limit}',\n cardCount: '{count} cards',\n priority_hoch: 'High',\n priority_mittel: 'Medium',\n priority_niedrig: 'Low',\n due_none: 'no deadline',\n due_overdue: 'overdue',\n due_due_soon: 'due soon',\n due_later: 'due later',\n dueOn: 'Due on {date}',\n markDone: 'Mark as done',\n markOpen: 'Reopen',\n moreTags: '+{count}',\n checklistProgress: 'Checklist {done}/{total}',\n attachments: '{count} attachments',\n links: '{count} links',\n ageNew: 'new',\n ageHours: '{count} h',\n ageDays: '{count} d',\n ageWeeks: '{count} wk',\n ageMonths: '{count} mo',\n cardRole: 'Card',\n moveInstructions: 'Space picks the card up; arrow keys move it, space drops, Escape cancels. Ctrl+arrow keys move directly. Enter opens the details.',\n grabbed: 'Picked up “{title}”. Column {column}, position {position} of {count}.',\n movedTo: '“{title}”: column {column}, position {position} of {count}.',\n dropped: 'Dropped “{title}” in {column}, position {position}.',\n cancelled: 'Moving “{title}” cancelled.',\n moveDenied: 'Not allowed: {reason}',\n wipWarning: 'Note: WIP limit of column {column} reached.',\n saved: 'Saved.',\n errorPrefix: 'Error: {message}',\n retry: 'Reload',\n },\n})\n\n/** Texte von Detailansicht, Einstellungen, Teilen und Boardliste. */\nexport const kanbanDialogMessages = defineMessages({\n de: {\n detailTitle: 'Aufgabe',\n close: 'Schließen',\n title: 'Titel',\n badge: 'Kennung',\n badgePlaceholder: 'VP-01',\n column: 'Spalte',\n priority: 'Priorität',\n due: 'Fälligkeitsdatum',\n clearDue: 'Datum entfernen',\n description: 'Beschreibung',\n descriptionPlaceholder: 'Beschreibung hinzufügen …',\n tags: 'Tags',\n tagPlaceholder: 'Neuer Tag + Enter',\n removeTag: 'Tag {tag} entfernen',\n assignees: 'Zuständig',\n checklist: 'Checkliste',\n checklistSummary: '{done}/{total} erledigt',\n checklistPlaceholder: '+ Neuer Eintrag + Enter',\n removeItem: 'Eintrag „{text}“ entfernen',\n appearance: 'Karten-Design',\n customColor: 'Eigene Farbe',\n clearColor: 'Farbe entfernen',\n image: 'Hintergrundbild',\n uploadImage: 'Bild wählen (höchstens 2 MB)',\n removeImage: 'Hintergrundbild entfernen',\n imageTooLarge: 'Das Bild ist größer als 2 MB.',\n links: 'Verknüpfungen',\n openLink: '{title} öffnen',\n attachments: 'Anhänge',\n noAttachments: 'Keine Anhänge',\n deleteCard: 'Aufgabe löschen',\n confirmDelete: 'Wirklich löschen?',\n created: 'Erstellt: {date}',\n updated: 'Aktualisiert: {date}',\n settingsTitle: 'Board-Einstellungen',\n settingsDescription: 'Spalten, Farben und WIP-Limits',\n columns: 'Spalten ({count}/{max})',\n addColumn: 'Spalte hinzufügen',\n newColumn: 'Neue Spalte',\n columnLabel: 'Name der Spalte',\n columnColor: 'Farbe der Spalte {label}',\n wipLimit: 'WIP-Limit',\n doneColumn: 'Erledigt-Spalte',\n moveUp: 'Nach oben',\n moveDown: 'Nach unten',\n removeColumn: 'Spalte {label} entfernen',\n removedHint: 'Karten entfernter Spalten wandern in die erste Spalte.',\n cancel: 'Abbrechen',\n save: 'Speichern',\n shareTitle: 'Board teilen',\n shareDescription: 'Lesen = nur ansehen. Bearbeiten = Aufgaben anlegen, ändern und verschieben.',\n searchUser: 'Person suchen',\n permission: 'Berechtigung',\n permission_read: 'Lesen',\n permission_edit: 'Bearbeiten',\n addShare: 'Freigeben',\n noShares: 'Noch keine Freigaben',\n revoke: 'Freigabe für {name} entfernen',\n confirmRevoke: 'Freigabe wirklich entfernen?',\n boardsTitle: 'Kanban-Boards',\n myBoards: 'Meine Boards',\n sharedBoards: 'Mit mir geteilt',\n noBoards: 'Noch keine Boards',\n newBoard: 'Neues Board',\n boardTitle: 'Titel des Boards',\n template: 'Vorlage',\n create: 'Anlegen',\n pin: 'Anheften',\n unpin: 'Lösen',\n deleteBoard: 'Board {title} löschen',\n confirmDeleteBoard: 'Board „{title}“ wirklich löschen?',\n tasksDone: '{done}/{total} Aufgaben',\n justNow: 'gerade eben',\n minutesAgo: 'vor {count} Min.',\n hoursAgo: 'vor {count} Std.',\n daysAgo: 'vor {count} Tagen',\n weeksAgo: 'vor {count} Wochen',\n role_owner: 'Eigentümer',\n role_edit: 'Bearbeiten',\n role_read: 'Lesen',\n },\n en: {\n detailTitle: 'Task',\n close: 'Close',\n title: 'Title',\n badge: 'Identifier',\n badgePlaceholder: 'VP-01',\n column: 'Column',\n priority: 'Priority',\n due: 'Due date',\n clearDue: 'Remove date',\n description: 'Description',\n descriptionPlaceholder: 'Add a description …',\n tags: 'Tags',\n tagPlaceholder: 'New tag + Enter',\n removeTag: 'Remove tag {tag}',\n assignees: 'Assignees',\n checklist: 'Checklist',\n checklistSummary: '{done}/{total} done',\n checklistPlaceholder: '+ New item + Enter',\n removeItem: 'Remove item “{text}”',\n appearance: 'Card design',\n customColor: 'Custom colour',\n clearColor: 'Remove colour',\n image: 'Background image',\n uploadImage: 'Choose image (max. 2 MB)',\n removeImage: 'Remove background image',\n imageTooLarge: 'The image is larger than 2 MB.',\n links: 'Links',\n openLink: 'Open {title}',\n attachments: 'Attachments',\n noAttachments: 'No attachments',\n deleteCard: 'Delete task',\n confirmDelete: 'Really delete?',\n created: 'Created: {date}',\n updated: 'Updated: {date}',\n settingsTitle: 'Board settings',\n settingsDescription: 'Columns, colours and WIP limits',\n columns: 'Columns ({count}/{max})',\n addColumn: 'Add column',\n newColumn: 'New column',\n columnLabel: 'Column name',\n columnColor: 'Colour of column {label}',\n wipLimit: 'WIP limit',\n doneColumn: 'Done column',\n moveUp: 'Move up',\n moveDown: 'Move down',\n removeColumn: 'Remove column {label}',\n removedHint: 'Cards of removed columns move to the first column.',\n cancel: 'Cancel',\n save: 'Save',\n shareTitle: 'Share board',\n shareDescription: 'Read = view only. Edit = create, change and move tasks.',\n searchUser: 'Search person',\n permission: 'Permission',\n permission_read: 'Read',\n permission_edit: 'Edit',\n addShare: 'Share',\n noShares: 'No shares yet',\n revoke: 'Remove share for {name}',\n confirmRevoke: 'Really remove the share?',\n boardsTitle: 'Kanban boards',\n myBoards: 'My boards',\n sharedBoards: 'Shared with me',\n noBoards: 'No boards yet',\n newBoard: 'New board',\n boardTitle: 'Board title',\n template: 'Template',\n create: 'Create',\n pin: 'Pin',\n unpin: 'Unpin',\n deleteBoard: 'Delete board {title}',\n confirmDeleteBoard: 'Really delete board “{title}”?',\n tasksDone: '{done}/{total} tasks',\n justNow: 'just now',\n minutesAgo: '{count} min ago',\n hoursAgo: '{count} h ago',\n daysAgo: '{count} days ago',\n weeksAgo: '{count} weeks ago',\n role_owner: 'Owner',\n role_edit: 'Edit',\n role_read: 'Read',\n },\n})\n\nexport type KanbanMessageKey = keyof typeof kanbanMessages.de\nexport type KanbanDialogMessageKey = keyof typeof kanbanDialogMessages.de\n","import { defineMessages, type Translate } from '../i18n'\n\n/** Texte der Datenbankansicht als Kanban (`<flowaudit-db-kanban>`). */\nexport const dbKanbanMessages = defineMessages({\n de: {\n title: 'Kanban-Ansicht',\n groupByLabel: 'Gruppieren nach',\n searchLabel: 'Einträge durchsuchen',\n noGroupable: 'Die Tabelle hat keine Auswahl-Eigenschaft, nach der gruppiert werden kann.',\n noGroupBy: 'Bitte eine Eigenschaft zum Gruppieren wählen.',\n noMatches: 'Kein Eintrag passt zur Suche.',\n withoutValue: 'Ohne Wert',\n columnCount: '{count} Einträge',\n columnCountOne: '1 Eintrag',\n columnEmpty: 'Keine Einträge',\n untitled: 'Ohne Titel',\n yes: 'Ja',\n no: 'Nein',\n addCard: 'Eintrag hinzufügen',\n addCardIn: 'Eintrag in „{label}“ hinzufügen',\n cardLabel: '{title} – {label}',\n moveHint: 'Mit Strg und Pfeil links/rechts in die Nachbarspalte verschieben.',\n moved: '„{title}“ nach „{label}“ verschoben.',\n added: 'Eintrag in „{label}“ angelegt.',\n readOnly: 'Nur Lesezugriff',\n noPort: 'Keine Datenquelle übergeben – bitte einen Port oder eine Tabelle setzen.',\n networkError: 'Keine Verbindung zur Datenquelle ({message}).',\n busy_load: 'Wird geladen …',\n busy_move: 'Änderung wird gespeichert …',\n busy_add: 'Eintrag wird angelegt …',\n },\n en: {\n title: 'Kanban view',\n groupByLabel: 'Group by',\n searchLabel: 'Search entries',\n noGroupable: 'The table has no select property to group by.',\n noGroupBy: 'Please choose a property to group by.',\n noMatches: 'No entry matches the search.',\n withoutValue: 'No value',\n columnCount: '{count} entries',\n columnCountOne: '1 entry',\n columnEmpty: 'No entries',\n untitled: 'Untitled',\n yes: 'Yes',\n no: 'No',\n addCard: 'Add entry',\n addCardIn: 'Add entry to “{label}”',\n moveHint: 'Use Ctrl and arrow left/right to move to the neighbouring column.',\n moved: '“{title}” moved to “{label}”.',\n added: 'Entry added to “{label}”.',\n readOnly: 'Read-only',\n noPort: 'No data source given – please set a port or a table.',\n networkError: 'No connection to the data source ({message}).',\n },\n})\n\nexport type DbKanbanMessageKey = keyof typeof dbKanbanMessages.de\nexport type DbKanbanTranslate = Translate<DbKanbanMessageKey>\n","/** Anzeige der Datenbankansicht: Spalten, Karten und Feldtexte (reine Funktionen). */\nimport { groupableProperties, groupRecords, matchesRecord, type RecordValue, type RecordProperty, type RecordRow, type RecordTable } from '@auditcore/kanban-core'\nimport type { DbKanbanData } from './controller'\nimport type { DbKanbanMessageKey, DbKanbanTranslate } from './messages'\n\nexport interface DbFieldView {\n id: string\n label: string\n text: string\n}\n\nexport interface DbCardView {\n id: string\n title: string\n fields: DbFieldView[]\n /** Spalte der Karte (`\"\"` = ohne Wert). */\n column: string\n}\n\nexport interface DbColumnView {\n value: string\n label: string\n countText: string\n cards: DbCardView[]\n}\n\nexport interface DbGroupOption {\n value: string\n label: string\n}\n\nexport interface DbKanbanView {\n groupOptions: DbGroupOption[]\n columns: DbColumnView[]\n /** Hinweis statt Spalten (keine Gruppierung möglich/gewählt), sonst `null`. */\n notice: string | null\n noMatches: boolean\n busyText: string\n}\n\n/** Anzeigetext eines Zellwerts; leere Werte ergeben `\"\"`. */\nexport function cellText(value: RecordValue | undefined, t: DbKanbanTranslate, lang: string): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'boolean') return value ? t('yes') : t('no')\n if (typeof value === 'number') return new Intl.NumberFormat(lang).format(value)\n if (Array.isArray(value)) return value.join(', ')\n return String(value)\n}\n\n/** Titel-Eigenschaft: die erste Texteigenschaft (wie die erste Spalte der Tabellenansicht). */\nexport function titleProperty(table: RecordTable): RecordProperty | undefined {\n return table.properties.find((property) => property.type === 'text')\n}\n\nexport function columnLabel(value: string, t: DbKanbanTranslate): string {\n return value === '' ? t('withoutValue') : value\n}\n\nfunction cardView(table: RecordTable, row: RecordRow, groupBy: string, column: string, context: { t: DbKanbanTranslate; lang: string }): DbCardView {\n const title = titleProperty(table)\n const fields = table.properties\n .filter((property) => property.id !== groupBy && property.id !== title?.id)\n .map((property) => ({ id: property.id, label: property.name, text: cellText(row.cells[property.id], context.t, context.lang) }))\n .filter((field) => field.text !== '')\n const titleText = title ? cellText(row.cells[title.id], context.t, context.lang) : ''\n return { id: row.id, title: titleText || context.t('untitled'), fields, column }\n}\n\nfunction columns(state: DbKanbanData, t: DbKanbanTranslate, lang: string): DbColumnView[] {\n const table = state.table\n if (!table) return []\n const rows = table.rows.filter((row) => matchesRecord(row, state.query))\n return groupRecords(table, state.groupBy, rows).map((group) => ({\n value: group.value,\n label: columnLabel(group.value, t),\n countText: group.rows.length === 1 ? t('columnCountOne') : t('columnCount', { count: group.rows.length }),\n cards: group.rows.map((row) => cardView(table, row, state.groupBy, group.value, { t, lang })),\n }))\n}\n\nfunction notice(state: DbKanbanData, groupOptions: readonly DbGroupOption[], t: DbKanbanTranslate): string | null {\n if (!state.table) return null\n if (groupOptions.length === 0) return t('noGroupable')\n return groupOptions.some((option) => option.value === state.groupBy) ? null : t('noGroupBy')\n}\n\nexport function dbKanbanView(state: DbKanbanData, t: DbKanbanTranslate, lang = 'de'): DbKanbanView {\n const groupOptions = state.table ? groupableProperties(state.table).map((property) => ({ value: property.id, label: property.name })) : []\n const shown = columns(state, t, lang)\n return {\n groupOptions,\n columns: shown,\n notice: notice(state, groupOptions, t),\n noMatches: shown.length > 0 && state.query.trim() !== '' && shown.every((column) => column.cards.length === 0),\n busyText: state.busy ? t(`busy_${state.busy}` as DbKanbanMessageKey) : '',\n }\n}\n","// Zustandsautomat der Datenbankansicht als Kanban (<flowaudit-db-kanban>, Vue und React):\n// Tabelle über einen RecordPort laden, nach einer Auswahl-Eigenschaft gruppieren,\n// Karten per Ziehen oder Tastatur verschieben (setzt den Zellwert), Einträge anlegen.\n\nimport { RestError } from '@auditcore/common'\nimport {\n dropValue,\n groupableProperties,\n groupOf,\n groupRecords,\n matchesRecord,\n neighbourGroup,\n withCell,\n withRow,\n type RecordPort,\n type RecordRow,\n type RecordTable,\n} from '@auditcore/kanban-core'\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport type { DbKanbanTranslate } from './messages'\nimport { cellText, columnLabel, titleProperty } from './view'\n\nexport interface DbKanbanError {\n code: string\n message: string\n status: number\n}\n\nexport type DbKanbanBusy = 'load' | 'move' | 'add'\n\nexport interface DbKanbanData extends RequestState<DbKanbanError> {\n table: RecordTable | null\n /** Eigenschaft, nach der gruppiert wird (`select`). */\n groupBy: string\n query: string\n /** Gezogene Karte (Maus) bzw. aufgenommene Karte (Tastatur). */\n dragging: string | null\n /** Spalte unter dem Mauszeiger beim Ziehen. */\n dropTarget: string | null\n}\n\n/** Verschiebung einer Karte: der gesetzte Zellwert (`null` = ohne Wert). */\nexport interface RecordMove {\n rowId: string\n propertyId: string\n value: string | null\n}\n\nexport interface DbKanbanHooks {\n onMoved?: (move: RecordMove) => void\n onAdded?: (row: RecordRow) => void\n onGroupBy?: (propertyId: string) => void\n onError?: (error: DbKanbanError) => void\n}\n\nexport interface DbKanbanControllerOptions extends DbKanbanHooks {\n port: () => RecordPort | null\n t: () => DbKanbanTranslate\n editable?: () => boolean\n lang?: () => string\n}\n\nexport const INITIAL_DB_KANBAN: DbKanbanData = { ...IDLE, table: null, groupBy: '', query: '', dragging: null, dropTarget: null }\n\nexport function asDbKanbanError(error: unknown, t: DbKanbanTranslate): DbKanbanError {\n if (error instanceof RestError) return { code: error.code, message: error.message, status: error.status }\n const raw = error instanceof Error ? error.message : String(error)\n return { code: 'network_error', message: t('networkError', { message: raw }), status: 0 }\n}\n\n/** Vorgabe: gewünschte Eigenschaft, falls gruppierbar, sonst die erste Auswahl-Eigenschaft. */\nexport function initialGroupBy(table: RecordTable, preferred: string | undefined): string {\n const options = groupableProperties(table).map((property) => property.id)\n return preferred && options.includes(preferred) ? preferred : (options[0] ?? '')\n}\n\ntype Run = ReturnType<typeof createRunner<RecordPort, DbKanbanError, DbKanbanData>>\n\nfunction titleOf(table: RecordTable, rowId: string, t: DbKanbanTranslate, lang: string): string {\n const title = titleProperty(table)\n const row = table.rows.find((entry) => entry.id === rowId)\n return (title && row ? cellText(row.cells[title.id], t, lang) : '') || t('untitled')\n}\n\nfunction moveActions(store: Store<DbKanbanData>, run: Run, options: DbKanbanControllerOptions) {\n const editable = (): boolean => options.editable?.() ?? true\n const lang = (): string => options.lang?.() ?? 'de'\n\n /** Datensatz, wenn er in `column` verschoben werden darf und dort noch nicht liegt. */\n function movable(rowId: string, column: string): RecordRow | null {\n const { table, groupBy } = store.get()\n const row = table?.rows.find((entry) => entry.id === rowId)\n if (!table || !row || !groupBy || !editable()) return null\n return groupOf(table, row, groupBy) === column ? null : row\n }\n\n function announce(table: RecordTable, rowId: string, column: string): void {\n const t = options.t()\n store.set({ notice: t('moved', { title: titleOf(table, rowId, t, lang()), label: columnLabel(column, t) }) })\n }\n\n /** Karte in eine Spalte legen: sofort anzeigen, bei Fehler zurücknehmen. */\n async function move(rowId: string, column: string): Promise<boolean> {\n const { table, groupBy } = store.get()\n const row = movable(rowId, column)\n store.set({ dragging: null, dropTarget: null })\n if (!table || !row) return false\n const value = dropValue(column)\n const patch = (cell: RecordRow['cells'][string] | null) => (state: DbKanbanData) => ({ table: state.table ? withCell(state.table, rowId, groupBy, cell) : null })\n store.set(patch(value))\n const outcome = await run('move', async (port) => ({ row: (await port.updateCell(rowId, groupBy, value)) ?? null }))\n if (!outcome) {\n store.set(patch(row.cells[groupBy] ?? null))\n return false\n }\n const saved = outcome.row\n if (saved) store.set((state) => ({ table: state.table ? withRow(state.table, saved) : null }))\n announce(table, rowId, column)\n options.onMoved?.({ rowId, propertyId: groupBy, value })\n return true\n }\n\n /** Tastatur: in die Nachbarspalte der sichtbaren Spalten. */\n async function moveBy(rowId: string, direction: 1 | -1): Promise<boolean> {\n const { table, groupBy, query } = store.get()\n const row = table?.rows.find((entry) => entry.id === rowId)\n if (!table || !row) return false\n const groups = groupRecords(table, groupBy, table.rows.filter((entry) => matchesRecord(entry, query)))\n const target = neighbourGroup(groups, groupOf(table, row, groupBy), direction)\n return target === null ? false : move(rowId, target)\n }\n\n async function addCard(column: string): Promise<RecordRow | null> {\n const { table, groupBy } = store.get()\n if (!table || !groupBy || !editable() || !options.port()?.addRow) return null\n const cells = { [groupBy]: dropValue(column) }\n const row = await run('add', (port) => port.addRow?.(cells) ?? Promise.reject(new Error('addRow')))\n if (!row) return null\n store.set((state) => ({ table: state.table ? withRow(state.table, row) : null, notice: options.t()('added', { label: columnLabel(column, options.t()) }) }))\n options.onAdded?.(row)\n return row\n }\n\n return { move, moveBy, addCard }\n}\n\nexport function createDbKanbanController(options: DbKanbanControllerOptions) {\n const store = createStore<DbKanbanData>(INITIAL_DB_KANBAN)\n const run = createRunner(store, options.port, (error) => asDbKanbanError(error, options.t()), options.onError)\n\n async function load(preferredGroupBy?: string): Promise<void> {\n const table = await run('load', (port) => port.load())\n if (table) store.set((state) => ({ table, groupBy: initialGroupBy(table, preferredGroupBy || state.groupBy) }))\n }\n\n function setGroupBy(propertyId: string): void {\n if (propertyId === store.get().groupBy) return\n store.set({ groupBy: propertyId })\n options.onGroupBy?.(propertyId)\n }\n\n return {\n store,\n load,\n setGroupBy,\n ...moveActions(store, run, options),\n setQuery: (query: string) => store.set({ query }),\n startDrag: (rowId: string | null) => store.set({ dragging: rowId, dropTarget: null }),\n setDropTarget: (column: string | null) => store.set({ dropTarget: column }),\n dismissError: () => store.set({ error: null }),\n }\n}\n\nexport type DbKanbanController = ReturnType<typeof createDbKanbanController>\n","import { defineMessages } from '../i18n'\n\n/** Texte der Bestandsprüfung: BatchChecks (Vue) und FlowauditBatchChecks (React); sichtbare Texte nur hier. */\nexport const batchchecksMessages = defineMessages({\n de: {\n title: 'Bestandsprüfung',\n loading: 'Prüfregeln werden geladen …',\n noPort: 'Kein Port übergeben: Die Bestandsprüfung ist nicht verfügbar.',\n failed: 'Anfrage abgelehnt: {message}',\n input: 'Bestand einlesen',\n file: 'Datei (CSV oder JSON)',\n fileHelp: 'Tabelle mit einer Zeile je Beleg (CSV, Semikolon, Tabulator oder Komma) oder JSON mit einer Liste von Belegen bzw. Ergebnissen der Belegerkennung; höchstens {max} Belege.',\n tableSummary: '{file}: {rows} Zeile(n)',\n jsonSummary: '{file}: {count} Beleg(e) aus JSON',\n header: 'Erste Zeile enthält Spaltennamen',\n decimal: 'Dezimaltrennzeichen',\n decimalComma: 'Komma (1.234,56)',\n decimalDot: 'Punkt (1,234.56)',\n columns: 'Spaltenzuordnung',\n none: '– keine –',\n totalVolume: 'Ausgewiesenes Gesamtvolumen in EUR (für C-08)',\n totalVolumeHelp: 'Leer lassen, wenn kein Gesamtvolumen vorliegt; der Summenabgleich entfällt dann.',\n supplementary: 'Ergänzungsprüfungen ERG-01 und ERG-02 (Nummernlücken, USt-IdNr.-Konsistenz)',\n run: 'Bestand prüfen',\n errornoData: 'Bitte zuerst eine Datei einlesen.',\n errornoRows: 'Die Datei enthält keine Belege.',\n errortooMany: 'Höchstens {max} Belege je Prüflauf.',\n errornoColumns: 'Bitte mindestens ein Feld einer Spalte zuordnen.',\n errorjson: 'Die JSON-Datei enthält keine Liste von Belegen.',\n errortotalVolume: 'Das Gesamtvolumen ist keine lesbare Zahl.',\n notice: 'Arbeitshilfe: Die Befunde sind Hinweise zur Nachprüfung, keine Prüfungsentscheidung. Der Server speichert nichts.',\n result: 'Ergebnis',\n summary: '{documents} Beleg(e) geprüft, {findings} Befund(e), {affected} Beleg(e) betroffen.',\n escalation: 'Eskalation (C-10)',\n levelinfo: 'Hinweis',\n levelwarning: 'Warnung',\n levelblocker: 'Blockade',\n blocked: 'Automatische Berichterstellung blockiert – manuelle Freigabe erforderlich: {reason}',\n rules: 'Prüfregeln',\n colCode: 'Regel',\n colTitle: 'Prüfung',\n colChecks: 'Was geprüft wird',\n colStatus: 'Ergebnis',\n statuspassed: 'ohne Befund',\n statusfindings: '{count} Befund(e), {documents} Beleg(e)',\n statusnot_checked: 'nicht geprüft',\n statusresult: 'Ergebnis des Laufs',\n supplement: 'Ergänzung',\n findings: 'Befunde',\n findingsNone: 'Keine Befunde.',\n filterRule: 'Befunde der Regel',\n allRules: 'alle Regeln',\n colId: 'Nr.',\n colLevel: 'Stufe',\n colMessage: 'Begründung',\n colAffected: 'Betroffene Belege',\n colBasis: 'Rechtsgrundlage',\n inventoryWide: 'Gesamtbestand',\n more: '… und {count} weitere',\n metrics: 'Kennzahlen (C-12)',\n metricMandatory: 'Pflichtangaben erfüllt',\n metricFormal: 'Formal korrekte Belege',\n metricErrors: 'Belege mit fehlenden Pflichtangaben',\n metricOcrAvg: 'Mittlere OCR-Konfidenz',\n metricOcrMin: 'Kleinste OCR-Konfidenz',\n noValue: '–',\n exportJson: 'Export JSON (C-11)',\n exportCsv: 'Export CSV',\n },\n en: {\n title: 'Inventory checks',\n loading: 'Loading rules …',\n noPort: 'No port given: inventory checks are not available.',\n failed: 'Request rejected: {message}',\n input: 'Read inventory',\n file: 'File (CSV or JSON)',\n fileHelp: 'Table with one row per document (CSV, semicolon, tab or comma) or JSON with a list of documents or extraction results; at most {max} documents.',\n tableSummary: '{file}: {rows} row(s)',\n jsonSummary: '{file}: {count} document(s) from JSON',\n header: 'First row contains column names',\n decimal: 'Decimal separator',\n decimalComma: 'Comma (1.234,56)',\n decimalDot: 'Dot (1,234.56)',\n columns: 'Column mapping',\n none: '– none –',\n totalVolume: 'Reported total volume in EUR (for C-08)',\n totalVolumeHelp: 'Leave empty if there is no reported total; the sum reconciliation is skipped.',\n supplementary: 'Supplementary checks ERG-01 and ERG-02 (number gaps, VAT ID consistency)',\n run: 'Check inventory',\n errornoData: 'Please read a file first.',\n errornoRows: 'The file contains no documents.',\n errortooMany: 'At most {max} documents per run.',\n errornoColumns: 'Please map at least one field to a column.',\n errorjson: 'The JSON file contains no list of documents.',\n errortotalVolume: 'The total volume is not a readable number.',\n notice: 'Working aid: findings are hints for review, not audit decisions. The server stores nothing.',\n result: 'Result',\n summary: '{documents} document(s) checked, {findings} finding(s), {affected} document(s) affected.',\n escalation: 'Escalation (C-10)',\n levelinfo: 'Info',\n levelwarning: 'Warning',\n levelblocker: 'Blocker',\n blocked: 'Automatic reporting blocked – manual release required: {reason}',\n rules: 'Rules',\n colCode: 'Rule',\n colTitle: 'Check',\n colChecks: 'What is checked',\n colStatus: 'Result',\n statuspassed: 'no finding',\n statusfindings: '{count} finding(s), {documents} document(s)',\n statusnot_checked: 'not checked',\n statusresult: 'run result',\n supplement: 'supplement',\n findings: 'Findings',\n findingsNone: 'No findings.',\n filterRule: 'Findings of rule',\n allRules: 'all rules',\n colId: 'No.',\n colLevel: 'Level',\n colMessage: 'Reason',\n colAffected: 'Affected documents',\n colBasis: 'Legal basis',\n inventoryWide: 'whole inventory',\n more: '… and {count} more',\n metrics: 'Metrics (C-12)',\n metricMandatory: 'Mandatory fields present',\n metricFormal: 'Formally correct documents',\n metricErrors: 'Documents with missing mandatory fields',\n metricOcrAvg: 'Average OCR confidence',\n metricOcrMin: 'Lowest OCR confidence',\n noValue: '–',\n exportJson: 'Export JSON (C-11)',\n exportCsv: 'Export CSV',\n },\n})\n\nexport type BatchchecksMessageKey = keyof typeof batchchecksMessages.de\n","import type { BatchchecksAnswer, BatchchecksCatalogue, BatchchecksPort } from './types'\n\n/**\n * Port mit festen Antworten (Demo ohne Server, Tests): Katalog und Antwort\n * wie vom Dienst; der Export liefert die Antwort als JSON-Datei.\n */\nexport function createBatchchecksMemoryPort(catalogue: BatchchecksCatalogue, answer: BatchchecksAnswer): BatchchecksPort {\n return {\n catalogue: async () => catalogue,\n run: async () => answer,\n exportRun: async (_request, format) => ({\n blob: new Blob([JSON.stringify(answer, null, 2)], { type: 'application/json' }),\n filename: `befunde-bestand.${format}`,\n mediaType: 'application/json',\n }),\n }\n}\n","import { requestFile, requestJson, type RestOptions } from '@auditcore/common'\nimport type { BatchchecksPort } from './types'\n\n/** Port auf den REST-Vertrag `documents_batch_checks/1` von `auditcore_documents.web` (Starlette oder FastAPI). */\nexport function createBatchchecksRestPort(options: RestOptions): BatchchecksPort {\n return {\n catalogue: () => requestJson(options, '/catalogue'),\n run: (request) => requestJson(options, '/runs', request),\n exportRun: (request, format) => requestFile(options, '/export', { ...request, format }, `befunde-bestand.${format}`),\n }\n}\n","/**\n * Eingabe der Bestandsprüfung (Vue und React, reine Funktionen): JSON-Datei\n * oder Tabelle, Spaltenzuordnung und Anfrage für `POST /runs`.\n */\nimport { detectDecimal, parseNumber, type DecimalSeparator, type ParsedTable } from '@auditcore/common'\nimport type { BatchchecksCatalogue, BatchchecksDocument, BatchchecksField, BatchchecksRequest } from './types'\n\nexport type BatchchecksError = 'noData' | 'noRows' | 'tooMany' | 'noColumns' | 'json' | 'totalVolume'\nexport type BatchchecksValidation = { ok: true; request: BatchchecksRequest } | { ok: false; error: BatchchecksError }\n/** Feld → Spalte der Tabelle (`null` = nicht zugeordnet). */\nexport type BatchchecksMapping = Readonly<Record<string, number | null>>\n\nconst normalize = (text: string): string => text.trim().toLowerCase()\n\n/** Spalten automatisch zuordnen: Spaltenname gleich Feldkennung oder einem Spaltennamen des Katalogs; jede Spalte höchstens einmal. */\nexport function batchchecksAutoMapping(fields: readonly BatchchecksField[], header: readonly string[]): Record<string, number | null> {\n const names = header.map(normalize)\n const used = new Set<number>()\n const mapping: Record<string, number | null> = {}\n for (const field of fields) {\n const index = names.findIndex((name, column) => !used.has(column) && (name === field.name || field.aliases.includes(name)))\n mapping[field.name] = index < 0 ? null : index\n if (index >= 0) used.add(index)\n }\n return mapping\n}\n\n/** Dezimaltrennzeichen aus den Zellen aller zugeordneten Zahlenspalten. */\nexport function batchchecksDecimal(table: ParsedTable, fields: readonly BatchchecksField[], mapping: BatchchecksMapping): DecimalSeparator {\n const columns = fields.filter((field) => field.numeric).map((field) => mapping[field.name]).filter((column) => column !== null && column !== undefined)\n const cells = table.rows.flatMap((row) => columns.map((column) => row[column] ?? '')).filter((cell) => /[.,]/.test(cell))\n return detectDecimal(cells, table.delimiter)\n}\n\n/** Dateiinhalt als JSON behandeln (Endung `.json` oder beginnt mit `[`/`{`). */\nexport function batchchecksLooksLikeJson(filename: string, text: string): boolean {\n return /\\.json$/i.test(filename) || /^\\s*[[{]/.test(text.replace(/^\\ufeff/, ''))\n}\n\nconst isRecord = (value: unknown): value is BatchchecksDocument => typeof value === 'object' && value !== null && !Array.isArray(value)\n\nfunction jsonItems(data: unknown): unknown[] | null {\n if (Array.isArray(data)) return data\n if (!isRecord(data)) return null\n if (Array.isArray(data.documents)) return data.documents as unknown[]\n return Array.isArray(data.fields) ? [data] : null\n}\n\n/**\n * Belege aus einer JSON-Datei: Liste, `{\"documents\": [...]}` oder ein\n * einzelner Lauf der Belegerkennung; `null`, wenn die Datei das nicht ist.\n */\nexport function batchchecksJsonDocuments(text: string): BatchchecksDocument[] | null {\n let data: unknown\n try {\n data = JSON.parse(text.replace(/^\\ufeff/, ''))\n } catch {\n return null\n }\n const items = jsonItems(data)\n return items && items.every(isRecord) ? (items as BatchchecksDocument[]) : null\n}\n\n/** Zelle als Wert: leer → `null`, Zahlenfelder als Zahl (Prozentangaben der OCR-Konfidenz als Anteil), Unlesbares unverändert. */\nexport function batchchecksCellValue(cell: string, field: BatchchecksField, decimal: DecimalSeparator): string | number | null {\n const text = cell.trim()\n if (text === '') return null\n if (!field.numeric) return text\n const percent = /%$/.test(text)\n const parsed = parseNumber(text.replace(/%$/, ''), decimal)\n if (parsed === null || parsed === undefined) return text\n return percent && field.name === 'ocr_confidence' ? parsed / 100 : parsed\n}\n\n/** Tabellenzeilen als Belege (nur zugeordnete Felder). */\nexport function batchchecksTableDocuments(table: ParsedTable, mapping: BatchchecksMapping, fields: readonly BatchchecksField[], decimal: DecimalSeparator): BatchchecksDocument[] {\n const mapped = fields.filter((field) => mapping[field.name] !== null && mapping[field.name] !== undefined)\n return table.rows.map((row) => Object.fromEntries(mapped.map((field) => [field.name, batchchecksCellValue(row[mapping[field.name] ?? -1] ?? '', field, decimal)])))\n}\n\nexport interface BatchchecksInput {\n catalogue: BatchchecksCatalogue\n table: ParsedTable | null\n json: readonly BatchchecksDocument[] | null\n mapping: BatchchecksMapping\n decimal: DecimalSeparator\n totalVolume: string\n supplementary: boolean\n}\n\nfunction totalVolume(text: string): number | null | undefined {\n return text.trim() === '' ? null : (parseNumber(text, ',') ?? undefined)\n}\n\nfunction documentsOf(input: BatchchecksInput): readonly BatchchecksDocument[] | BatchchecksError {\n if (input.json) return input.json\n if (!input.table || input.table.header.length === 0) return 'noData'\n const mapped = Object.entries(input.mapping).some(([name, column]) => name !== 'ref' && column !== null)\n return mapped ? batchchecksTableDocuments(input.table, input.mapping, input.catalogue.fields, input.decimal) : 'noColumns'\n}\n\n/** Anfrage für `POST /runs` aus Datei, Zuordnung und Optionen. */\nexport function buildBatchchecksRequest(input: BatchchecksInput): BatchchecksValidation {\n const documents = documentsOf(input)\n if (typeof documents === 'string') return { ok: false, error: documents }\n if (documents.length === 0) return { ok: false, error: 'noRows' }\n if (documents.length > input.catalogue.limits.max_documents) return { ok: false, error: 'tooMany' }\n const total = totalVolume(input.totalVolume)\n if (total === undefined) return { ok: false, error: 'totalVolume' }\n const options = total === null ? { supplementary: input.supplementary } : { supplementary: input.supplementary, total_volume: total }\n return { ok: true, request: { documents, options } }\n}\n","// Zustandsautomat von <flowaudit-batch-checks> (Vue und React): Katalog laden,\n// Bestand als CSV (gemeinsamer TableImport-Controller) oder JSON einlesen,\n// Spalten zuordnen, Prüflauf und Export ausschließlich über den Port.\n\nimport type { DecimalSeparator, DownloadFile } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport { createTableImportController, type TableImportController } from '../tabular'\nimport { batchchecksAutoMapping, batchchecksDecimal, batchchecksJsonDocuments, batchchecksLooksLikeJson, buildBatchchecksRequest, type BatchchecksError, type BatchchecksMapping } from './model'\nimport type { BatchchecksAnswer, BatchchecksCatalogue, BatchchecksDocument, BatchchecksExportFormat, BatchchecksPort, BatchchecksRequest } from './types'\n\nexport type BatchchecksBusy = 'load' | 'run' | 'export'\n\nexport interface BatchchecksCallbacks {\n completed?: (answer: BatchchecksAnswer) => void\n failed?: (message: string) => void\n}\n\n/** Stand; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface BatchchecksData extends RequestState<string> {\n catalogue: BatchchecksCatalogue | null\n /** Belege aus einer JSON-Datei (sonst gilt die Tabelle des TableImport-Controllers). */\n json: readonly BatchchecksDocument[] | null\n jsonName: string\n mapping: BatchchecksMapping\n totalVolume: string\n supplementary: boolean\n validation: BatchchecksError | null\n request: BatchchecksRequest | null\n answer: BatchchecksAnswer | null\n /** Regel, deren Befunde angezeigt werden (`null` = alle). */\n ruleFilter: string | null\n}\n\nexport interface BatchchecksSource {\n port: () => BatchchecksPort | null | undefined\n callbacks?: () => BatchchecksCallbacks\n}\n\nexport const INITIAL_BATCHCHECKS: BatchchecksData = {\n ...IDLE, catalogue: null, json: null, jsonName: '', mapping: {}, totalVolume: '', supplementary: true,\n validation: null, request: null, answer: null, ruleFilter: null,\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\n/** Datei lesen: JSON als Belegliste, sonst Tabelle mit automatischer Spaltenzuordnung. */\nfunction fileActions(store: Store<BatchchecksData>, table: TableImportController) {\n /** Spalten neu zuordnen; das Dezimaltrennzeichen aus allen zugeordneten Zahlenspalten ableiten. */\n const remap = (): void => {\n const loaded = table.store.get().table\n const fields = store.get().catalogue?.fields ?? []\n const mapping = batchchecksAutoMapping(fields, loaded?.header ?? [])\n store.set({ mapping })\n if (loaded) table.setDecimal(batchchecksDecimal(loaded, fields, mapping))\n }\n function loadText(filename: string, text: string): void {\n store.set({ answer: null, request: null, ruleFilter: null, validation: null })\n if (batchchecksLooksLikeJson(filename, text)) {\n const json = batchchecksJsonDocuments(text)\n table.load('', '')\n store.set({ json, jsonName: filename, mapping: {}, validation: json ? null : 'json' })\n return\n }\n store.set({ json: null, jsonName: '' })\n table.load(filename, text)\n remap()\n }\n return {\n /** Dateiinhalt übernehmen (Datei bereits gelesen, z. B. Beispielbestand). */\n loadText,\n readFile: async (file: File) => loadText(file.name, await file.text()),\n setHasHeader: (hasHeader: boolean) => {\n table.setHasHeader(hasHeader)\n table.reparse()\n remap()\n },\n setDecimal: (decimal: DecimalSeparator) => table.setDecimal(decimal),\n /** Feld einer Spalte zuordnen (`null` = keine). */\n setColumn: (field: string, column: number | null) => store.set((state) => ({ mapping: { ...state.mapping, [field]: column } })),\n }\n}\n\nexport function createBatchchecksController(source: BatchchecksSource) {\n const store = createStore<BatchchecksData>({ ...INITIAL_BATCHCHECKS })\n const table = createTableImportController()\n const callbacks = (): BatchchecksCallbacks => source.callbacks?.() ?? {}\n const run = createRunner<BatchchecksPort, string, BatchchecksData>(store, () => source.port() ?? null, errorText, (message) => callbacks().failed?.(message))\n\n async function load(): Promise<void> {\n const catalogue = await run('load', (port) => port.catalogue())\n if (catalogue) store.set({ catalogue, supplementary: catalogue.defaults.supplementary })\n }\n\n async function check(): Promise<void> {\n const state = store.get()\n if (!state.catalogue) return\n const loaded = table.store.get()\n const built = buildBatchchecksRequest({\n catalogue: state.catalogue, table: state.json ? null : loaded.table, json: state.json, mapping: state.mapping,\n decimal: loaded.decimal, totalVolume: state.totalVolume, supplementary: state.supplementary,\n })\n store.set({ validation: built.ok ? null : built.error })\n if (!built.ok) return\n const answer = await run('run', (port) => port.run(built.request))\n if (!answer) return\n store.set({ answer, request: built.request, ruleFilter: null })\n callbacks().completed?.(answer)\n }\n\n /** Export des letzten Laufs; die Datei bietet die Oberfläche zum Speichern an. */\n async function exportRun(format: BatchchecksExportFormat): Promise<DownloadFile | null> {\n const request = store.get().request\n return request ? run('export', (port) => port.exportRun(request, format)) : null\n }\n\n return {\n store,\n /** Tabellenimport (gemeinsamer TableImport-Controller aus `@auditcore/ui-core`). */\n table,\n load,\n check,\n exportRun,\n ...fileActions(store, table),\n setTotalVolume: (totalVolume: string) => store.set({ totalVolume }),\n setSupplementary: (supplementary: boolean) => store.set({ supplementary }),\n setRuleFilter: (ruleFilter: string | null) => store.set({ ruleFilter }),\n /** Vorhandenes Ergebnis anzeigen (Eigenschaft `result`). */\n showAnswer: (answer: BatchchecksAnswer | null) => store.set({ answer, ruleFilter: null }),\n }\n}\n\nexport type BatchchecksController = ReturnType<typeof createBatchchecksController>\n","/**\n * Anzeige der Bestandsprüfung für Vue und React (reine Funktionen): Zuordnung,\n * Regelübersicht, Befunde mit betroffenen Belegen, Kennzahlen. Texte nur aus\n * `batchchecksMessages`.\n */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent } from '@auditcore/common'\nimport type { Locale, Translate } from '../i18n'\nimport type { TableImportData } from '../tabular'\nimport type { BatchchecksData } from './controller'\nimport type { BatchchecksMessageKey } from './messages'\nimport type { BatchchecksAnswer, BatchchecksFinding, BatchchecksLevel, BatchchecksRuleResult } from './types'\n\nexport type BatchchecksTranslate = Translate<BatchchecksMessageKey>\nexport type BatchchecksTone = 'success' | 'warning' | 'danger' | 'neutral'\n\n/** Höchstzahl aufgezählter Belege je Befund. */\nexport const BATCHCHECKS_LISTED_DOCUMENTS = 10\n\nconst LEVEL_TONES: Readonly<Record<BatchchecksLevel, BatchchecksTone>> = { info: 'neutral', warning: 'warning', blocker: 'danger' }\n\nexport function batchchecksLevelText(level: BatchchecksLevel | null, t: BatchchecksTranslate): string {\n return level ? t(`level${level}`) : ''\n}\n\nexport function batchchecksLevelTone(level: BatchchecksLevel | null): BatchchecksTone {\n return level ? LEVEL_TONES[level] : 'success'\n}\n\n/** Eine Tabelle ist geladen (und keine JSON-Datei). */\nexport function batchchecksHasTable(state: BatchchecksData, table: TableImportData): boolean {\n return state.json === null && (table.table?.header.length ?? 0) > 0\n}\n\n/** Kurzbeschreibung der eingelesenen Datei. */\nexport function batchchecksSourceText(state: BatchchecksData, table: TableImportData, t: BatchchecksTranslate): string {\n if (state.json) return t('jsonSummary', { file: state.jsonName, count: state.json.length })\n return table.table ? t('tableSummary', { file: table.filename, rows: table.table.rows.length }) : ''\n}\n\nexport interface BatchchecksColumnField {\n name: string\n label: string\n value: number | null\n}\n\n/** Auswahlfelder der Spaltenzuordnung in der Reihenfolge des Katalogs. */\nexport function batchchecksColumnFields(state: BatchchecksData): BatchchecksColumnField[] {\n return (state.catalogue?.fields ?? []).map((field) => ({ name: field.name, label: field.label, value: state.mapping[field.name] ?? null }))\n}\n\nexport interface BatchchecksRuleRow {\n code: string\n title: string\n checks: string\n basis: string\n supplement: boolean\n status: string\n tone: BatchchecksTone\n note: string\n}\n\nfunction ruleStatus(rule: BatchchecksRuleResult, t: BatchchecksTranslate): string {\n if (rule.status === 'findings') return t('statusfindings', { count: rule.findings, documents: rule.documents })\n return t(`status${rule.status}`)\n}\n\nfunction ruleTone(rule: BatchchecksRuleResult): BatchchecksTone {\n if (rule.status === 'findings') return batchchecksLevelTone(rule.level)\n return rule.status === 'passed' ? 'success' : 'neutral'\n}\n\n/** Regelübersicht: alle Regeln mit Status, auch ohne Befund und nicht geprüfte. */\nexport function batchchecksRuleRows(answer: BatchchecksAnswer, t: BatchchecksTranslate): BatchchecksRuleRow[] {\n return answer.rules.map((rule) => ({\n code: rule.code,\n title: rule.title,\n checks: rule.checks,\n basis: rule.legal_basis,\n supplement: rule.code.startsWith('ERG-'),\n status: ruleStatus(rule, t),\n tone: ruleTone(rule),\n note: rule.note ?? '',\n }))\n}\n\n/** Regeln mit Befunden für die Filterauswahl. */\nexport function batchchecksFilterOptions(answer: BatchchecksAnswer): { code: string; label: string }[] {\n return answer.rules.filter((rule) => rule.findings > 0).map((rule) => ({ code: rule.code, label: `${rule.code} ${rule.title} (${rule.findings})` }))\n}\n\n/** Betroffene Belege als Kennungen (höchstens zehn, dann „… und n weitere“); ohne Belege „Gesamtbestand“. */\nexport function batchchecksAffectedText(finding: BatchchecksFinding, answer: BatchchecksAnswer, t: BatchchecksTranslate): string {\n if (!finding.documents.length) return t('inventoryWide')\n const refs = finding.documents.slice(0, BATCHCHECKS_LISTED_DOCUMENTS).map((index) => answer.documents[index]?.ref ?? String(index + 1))\n const rest = finding.documents.length - refs.length\n return rest > 0 ? `${refs.join(', ')} ${t('more', { count: rest })}` : refs.join(', ')\n}\n\nexport interface BatchchecksFindingRow {\n id: string\n rule: string\n level: string\n tone: BatchchecksTone\n message: string\n affected: string\n basis: string\n}\n\n/** Befunde (wahlweise einer Regel) mit Begründung und betroffenen Belegen. */\nexport function batchchecksFindingRows(answer: BatchchecksAnswer, ruleFilter: string | null, t: BatchchecksTranslate): BatchchecksFindingRow[] {\n return answer.findings\n .filter((finding) => ruleFilter === null || finding.rule === ruleFilter)\n .map((finding) => ({\n id: finding.id,\n rule: finding.rule,\n level: batchchecksLevelText(finding.level, t),\n tone: batchchecksLevelTone(finding.level),\n message: finding.message,\n affected: batchchecksAffectedText(finding, answer, t),\n basis: finding.rule_reference,\n }))\n}\n\nexport function batchchecksSummaryText(answer: BatchchecksAnswer, t: BatchchecksTranslate): string {\n const { documents, findings, documents_with_findings: affected } = answer.summary\n return t('summary', { documents, findings, affected })\n}\n\nconst percent = (value: number | null, locale: Locale, t: BatchchecksTranslate): string => (value === null ? t('noValue') : formatPercent(value, locale, 1))\n\n/** Kennzahlen der Extraktionsqualität (C-12). */\nexport function batchchecksMetricRows(answer: BatchchecksAnswer, t: BatchchecksTranslate, locale: Locale): { label: string; value: string }[] {\n const m = answer.metrics\n return [\n { label: t('metricMandatory'), value: percent(m.mandatory_fields_success_rate, locale, t) },\n { label: t('metricFormal'), value: percent(m.formal_correctness_rate, locale, t) },\n { label: t('metricErrors'), value: `${formatNumber(m.documents_with_errors, locale)} (${percent(m.documents_with_errors_rate, locale, t)})` },\n { label: t('metricOcrAvg'), value: percent(m.avg_ocr_confidence, locale, t) },\n { label: t('metricOcrMin'), value: percent(m.min_ocr_confidence, locale, t) },\n ]\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte von SampleSizePlanner (Vue) und FlowauditSampleSizePlanner (React); sichtbare Texte nur hier. */\nexport const samplesizeMessages = defineMessages({\n de: {\n title: 'Stichprobenumfang nach Leitfaden',\n loading: 'Methoden werden geladen …',\n calculating: 'Umfang wird berechnet …',\n failed: 'Anfrage abgelehnt: {message}',\n method: 'Verfahren',\n choose: 'Bitte wählen',\n optional: 'keine Angabe',\n calculate: 'Umfang berechnen',\n source: 'Formel und Fundstelle',\n factor_profile: 'Faktorprofil',\n confidence_level: 'Konfidenzniveau',\n book_value: 'Buchwert der Grundgesamtheit (BV, €)',\n anticipated_error_rate: 'Erwartete Fehlerquote (%)',\n materiality_rate: 'Wesentlichkeit (%)',\n population_size: 'Anzahl der Einheiten (N)',\n error_sd: 'Standardabweichung der Fehler (σ_e, €)',\n error_rate_sd: 'Standardabweichung der Fehlerquoten (σ_r)',\n finite_population_correction: 'Endlichkeitskorrektur (Fußnote 25)',\n rule: 'Regel',\n assurance_level: 'Bewertung der Systemprüfung',\n strata: 'Schichten',\n stratumName: 'Name',\n stratumPopulation: 'Einheiten (N_h)',\n stratumBookValue: 'Buchwert (BV_h, €)',\n stratumSd: 'Standardabweichung',\n stratumExhaustive: 'Vollerhebung',\n stratumRow: '{column}, Zeile {row}',\n addStratum: 'Schicht hinzufügen',\n removeStratum: 'Schicht {row} entfernen',\n required: 'Pflichtangabe',\n invalid: 'keine gültige Zahl',\n result: 'Ergebnis',\n sampleSize: 'Stichprobenumfang',\n rawSize: 'Wert der Formel (vor dem Aufrunden)',\n interval: 'Stichprobenintervall / Schwellenwert',\n allocation: 'Aufteilung',\n allocationSize: 'Umfang',\n allocationShare: 'Anteil',\n allocationCutOff: 'Schwellenwert',\n derivation: 'Herleitung',\n stepLabel: 'Schritt',\n stepFormula: 'Formel',\n stepValue: 'Wert',\n stepSource: 'Fundstelle',\n warnings: 'Hinweise',\n yes: 'ja',\n no: 'nein',\n },\n en: {\n title: 'Sample size according to the guidance',\n loading: 'Loading methods …',\n calculating: 'Calculating sample size …',\n failed: 'Request rejected: {message}',\n method: 'Method',\n choose: 'Please choose',\n calculate: 'Calculate sample size',\n result: 'Result',\n sampleSize: 'Sample size',\n },\n})\n\nexport type SamplesizeMessageKey = keyof typeof samplesizeMessages.de\n","import { requestJson, type RestOptions } from '@auditcore/common'\nimport type { SampleSizeCatalogue, SampleSizePlan, SamplesizePort } from './types'\n\n/** Port auf den REST-Vertrag `auditcore_sampling.guidance/1` (Starlette oder FastAPI). */\nexport function createSamplesizeRestPort(options: RestOptions): SamplesizePort {\n return {\n profiles: () => requestJson(options, '/guidance/profiles'),\n plan: (request) => requestJson(options, '/guidance/size', request),\n }\n}\n\n/**\n * Port im Arbeitsspeicher (Demo, Tests): feste Antworten je Methode; ohne\n * Antwort wird die Anfrage wie vom Backend abgelehnt.\n */\nexport function createSamplesizeMemoryPort(\n catalogue: SampleSizeCatalogue,\n plans: Readonly<Record<string, SampleSizePlan>> = {},\n): SamplesizePort {\n return {\n profiles: async () => catalogue,\n plan: async (request) => {\n const plan = plans[request.method]\n if (!plan) throw new Error(`Keine Antwort für '${request.method}' hinterlegt.`)\n return plan\n },\n }\n}\n","/**\n * Formular des Planers: Eingaben als Text, Umwandlung in die Anfrage des\n * Vertrags. Anteile werden in Prozent erfasst und als Wert zwischen 0 und 1\n * gesendet; gerechnet wird nur im Backend.\n */\nimport { parseDecimal } from '@auditcore/common'\nimport type { SampleSizeCatalogue, SampleSizeMethod, SampleSizeRequest, SampleSizeStratumRequest } from './types'\n\nexport interface StratumDraft {\n name: string\n populationSize: string\n bookValue: string\n sd: string\n exhaustive: boolean\n}\n\nexport interface SampleSizeForm {\n methodId: string\n values: Readonly<Record<string, string>>\n finiteCorrection: boolean\n strata: readonly StratumDraft[]\n}\n\n/** Feldschlüssel → Fehlerart (`required` oder `invalid`). */\nexport type SampleSizeIssues = Readonly<Record<string, 'required' | 'invalid'>>\n\nexport type StratumColumn = 'name' | 'populationSize' | 'bookValue' | 'sd' | 'exhaustive'\n\nexport const EMPTY_FORM: SampleSizeForm = { methodId: '', values: {}, finiteCorrection: false, strata: [] }\nexport const EMPTY_STRATUM: StratumDraft = { name: '', populationSize: '', bookValue: '', sd: '', exhaustive: false }\n\n/** Felder mit Auswahlliste; alle übrigen skalaren Felder sind Zahlen. */\nexport const CHOICE_FIELDS: readonly string[] = ['factor_profile', 'confidence_level', 'rule', 'assurance_level']\n/** In Prozent erfasste Anteile. */\nexport const PERCENT_FIELDS: readonly string[] = ['anticipated_error_rate', 'materiality_rate']\n/** Felder, die nicht als einzelnes Eingabefeld erscheinen. */\nconst SPECIAL_FIELDS: readonly string[] = ['strata', 'book_values', 'finite_population_correction']\nconst OPTIONAL_FIELDS: readonly string[] = ['assurance_level']\nconst INTEGER_FIELDS: readonly string[] = ['population_size']\n\nexport function methodById(catalogue: SampleSizeCatalogue | null, id: string): SampleSizeMethod | null {\n return catalogue?.methods.find((entry) => entry.id === id) ?? null\n}\n\n/** Einzelne Eingabefelder der Methode in der Reihenfolge des Katalogs. */\nexport function scalarFields(method: SampleSizeMethod | null): string[] {\n return method ? method.fields.filter((field) => !SPECIAL_FIELDS.includes(field)) : []\n}\n\nexport function hasStrata(method: SampleSizeMethod | null): boolean {\n return Boolean(method?.fields.includes('strata'))\n}\n\nexport function hasFiniteCorrection(method: SampleSizeMethod | null): boolean {\n return Boolean(method?.fields.includes('finite_population_correction'))\n}\n\n/** Spalten der Schichttabelle: MUS nach Buchwert, sonst nach Anzahl mit Vollerhebung. */\nexport function strataColumns(method: SampleSizeMethod | null): StratumColumn[] {\n if (method?.id === 'guidance.mus_stratified') return ['name', 'bookValue', 'sd']\n return ['name', 'populationSize', 'sd', 'exhaustive']\n}\n\n/** Anfangswerte bei Methodenwechsel: sichtbar vorbelegt ist nur die Wesentlichkeit von 2 %. */\nexport function formFor(method: SampleSizeMethod | null, catalogue: SampleSizeCatalogue | null): SampleSizeForm {\n if (!method) return EMPTY_FORM\n const values: Record<string, string> = {}\n if (method.fields.includes('materiality_rate') && catalogue) values.materiality_rate = String(catalogue.materiality_rate * 100)\n const strata = hasStrata(method) ? [EMPTY_STRATUM, EMPTY_STRATUM] : []\n return { methodId: method.id, values, finiteCorrection: false, strata }\n}\n\ntype Parsed = { value: number } | { issue: 'required' | 'invalid' } | null\n\nfunction parseField(field: string, text: string | undefined): Parsed {\n if (text === undefined || text.trim() === '') return OPTIONAL_FIELDS.includes(field) ? null : { issue: 'required' }\n const value = parseDecimal(text, { allowNegative: false })\n if (value === null || (INTEGER_FIELDS.includes(field) && !Number.isInteger(value))) return { issue: 'invalid' }\n // Prozent → Anteil ohne Gleitkommarest (1,8 % → 0.018, nicht 0.018000000000000002).\n return { value: PERCENT_FIELDS.includes(field) ? Number((value / 100).toPrecision(15)) : value }\n}\n\nfunction scalarValue(field: string, text: string | undefined): Parsed | { text: string } {\n if (field === 'confidence_level') return text ? { value: Number(text) } : { issue: 'required' }\n if (CHOICE_FIELDS.includes(field)) {\n if (text) return { text }\n return OPTIONAL_FIELDS.includes(field) ? null : { issue: 'required' }\n }\n return parseField(field, text)\n}\n\n/** Zahl als deutsche Eingabe (Komma, keine Gruppierung), wie sie `parseDecimal` wieder liest. */\nfunction germanText(value: number): string {\n return String(value).replace('.', ',')\n}\n\nfunction optionalNumber(text: string): number | undefined {\n const value = parseDecimal(text, { allowNegative: false })\n return value === null ? undefined : value\n}\n\nfunction stratumRequest(draft: StratumDraft): SampleSizeStratumRequest {\n const size = optionalNumber(draft.populationSize)\n const book = optionalNumber(draft.bookValue)\n const sd = optionalNumber(draft.sd)\n return {\n name: draft.name.trim(),\n exhaustive: draft.exhaustive,\n ...(size === undefined ? {} : { population_size: size }),\n ...(book === undefined ? {} : { book_value: book }),\n ...(sd === undefined ? {} : { sd }),\n }\n}\n\n/** Anfrage aus dem Formular oder die Felder mit fehlenden bzw. ungültigen Angaben. */\nexport function buildRequest(form: SampleSizeForm, method: SampleSizeMethod): { request: SampleSizeRequest } | { issues: SampleSizeIssues } {\n const request: SampleSizeRequest = { method: method.id }\n const issues: Record<string, 'required' | 'invalid'> = {}\n for (const field of scalarFields(method)) {\n const parsed = scalarValue(field, form.values[field])\n if (parsed === null) continue\n if ('issue' in parsed) issues[field] = parsed.issue\n else request[field] = 'text' in parsed ? parsed.text : parsed.value\n }\n if (hasFiniteCorrection(method)) request.finite_population_correction = form.finiteCorrection\n if (hasStrata(method)) request.strata = form.strata.filter((row) => row.name.trim() !== '').map(stratumRequest)\n return Object.keys(issues).length ? { issues } : { request }\n}\n\n/** Formular aus einer Anfrage (Vorbelegung über die Eigenschaft `request`). */\nexport function formFromRequest(request: SampleSizeRequest, catalogue: SampleSizeCatalogue | null): SampleSizeForm {\n const method = methodById(catalogue, request.method)\n const base = formFor(method, catalogue)\n const values: Record<string, string> = { ...base.values }\n for (const field of scalarFields(method)) {\n const raw = request[field]\n if (field === 'confidence_level' && typeof raw === 'number') values[field] = String(raw)\n else if (typeof raw === 'number') values[field] = germanText(PERCENT_FIELDS.includes(field) ? Math.round(raw * 1e10) / 1e8 : raw)\n else if (typeof raw === 'string') values[field] = raw\n }\n const strata = Array.isArray(request.strata)\n ? (request.strata as readonly SampleSizeStratumRequest[]).map((row) => ({\n name: row.name,\n populationSize: row.population_size === undefined ? '' : germanText(row.population_size),\n bookValue: row.book_value === undefined ? '' : germanText(row.book_value),\n sd: row.sd === undefined ? '' : germanText(row.sd),\n exhaustive: row.exhaustive,\n }))\n : base.strata\n return { methodId: base.methodId, values, finiteCorrection: request.finite_population_correction === true, strata }\n}\n","// Zustandsautomat von <flowaudit-sample-size-planner> (Vue und React): lädt den\n// Katalog über den Port, verwaltet das Formular und lässt den Umfang im\n// Backend berechnen. Vue bindet ihn mit useStore, React mit useStoreState.\n\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport { buildRequest, EMPTY_FORM, EMPTY_STRATUM, formFor, formFromRequest, methodById, type SampleSizeForm, type SampleSizeIssues, type StratumDraft } from './model'\nimport type { SampleSizeCatalogue, SampleSizePlan, SampleSizeRequest, SamplesizePort } from './types'\n\nexport type SamplesizeBusy = 'load' | 'plan'\n\nexport interface SamplesizeCallbacks {\n planned?: (plan: SampleSizePlan) => void\n failed?: (message: string) => void\n}\n\n/** Stand; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface SamplesizeData extends RequestState<string> {\n catalogue: SampleSizeCatalogue | null\n form: SampleSizeForm\n issues: SampleSizeIssues\n plan: SampleSizePlan | null\n}\n\nexport interface SamplesizeSource {\n port: () => SamplesizePort | null | undefined\n request?: () => SampleSizeRequest | null | undefined\n callbacks?: () => SamplesizeCallbacks\n}\n\nexport interface SamplesizeController {\n store: Store<SamplesizeData>\n load: () => Promise<void>\n selectMethod: (id: string) => void\n setValue: (field: string, text: string) => void\n setFiniteCorrection: (on: boolean) => void\n setStratum: (index: number, change: Partial<StratumDraft>) => void\n addStratum: () => void\n removeStratum: (index: number) => void\n calculate: () => Promise<void>\n}\n\nexport const INITIAL_SAMPLESIZE: SamplesizeData = { ...IDLE, catalogue: null, form: EMPTY_FORM, issues: {}, plan: null }\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nexport function createSamplesizeController(source: SamplesizeSource): SamplesizeController {\n const store = createStore<SamplesizeData>({ ...INITIAL_SAMPLESIZE })\n const run = createRunner(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n const edit = (form: Partial<SampleSizeForm>): void => store.set({ form: { ...store.get().form, ...form }, plan: null })\n const strata = (rows: readonly StratumDraft[]): void => edit({ strata: rows })\n return {\n store,\n async load() {\n const catalogue = await run('load', (port) => port.profiles())\n if (!catalogue) return\n const request = source.request?.()\n store.set({ catalogue, form: request ? formFromRequest(request, catalogue) : EMPTY_FORM, issues: {}, plan: null })\n },\n selectMethod(id) {\n const { catalogue } = store.get()\n store.set({ form: formFor(methodById(catalogue, id), catalogue), issues: {}, plan: null })\n },\n setValue(field, text) {\n edit({ values: { ...store.get().form.values, [field]: text } })\n },\n setFiniteCorrection(on) {\n edit({ finiteCorrection: on })\n },\n setStratum(index, change) {\n strata(store.get().form.strata.map((row, position) => (position === index ? { ...row, ...change } : row)))\n },\n addStratum() {\n strata([...store.get().form.strata, EMPTY_STRATUM])\n },\n removeStratum(index) {\n strata(store.get().form.strata.filter((_, position) => position !== index))\n },\n async calculate() {\n const { catalogue, form } = store.get()\n const method = methodById(catalogue, form.methodId)\n if (!method) return\n const built = buildRequest(form, method)\n if ('issues' in built) {\n store.set({ issues: built.issues, plan: null })\n return\n }\n store.set({ issues: {} })\n const plan = await run('plan', (port) => port.plan(built.request))\n if (!plan) return\n store.set({ plan })\n source.callbacks?.().planned?.(plan)\n },\n }\n}\n","import { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent } from '@auditcore/common'\nimport type { Locale, Translate } from '../i18n'\nimport type { SamplesizeData } from './controller'\nimport type { SamplesizeMessageKey } from './messages'\nimport { CHOICE_FIELDS, methodById, PERCENT_FIELDS, scalarFields, strataColumns, type StratumColumn } from './model'\nimport type { SampleSizeCatalogue, SampleSizeMethod, SampleSizePlan } from './types'\n\ntype T = Translate<SamplesizeMessageKey>\n\nexport interface SamplesizeOption {\n value: string\n label: string\n}\n\n/** Ein Eingabefeld, wie Vue und React es darstellen. */\nexport interface SamplesizeFieldView {\n key: string\n label: string\n kind: 'choice' | 'number'\n options: SamplesizeOption[]\n value: string\n issue: string | null\n inputMode: 'decimal' | 'numeric'\n}\n\nexport interface SamplesizeCell {\n key: string\n text: string\n}\n\nexport function samplesizeMethod(state: SamplesizeData): SampleSizeMethod | null {\n return methodById(state.catalogue, state.form.methodId)\n}\n\nfunction levels(catalogue: SampleSizeCatalogue, method: SampleSizeMethod, locale: Locale): SamplesizeOption[] {\n const table = method.confidence_table === 'reliability' ? catalogue.tables.reliability : catalogue.tables.z\n return [...table].sort((a, b) => a.level - b.level).map((row) => ({ value: String(row.level), label: formatPercent(row.level, locale) }))\n}\n\nfunction options(field: string, catalogue: SampleSizeCatalogue, method: SampleSizeMethod, locale: Locale, t: T): SamplesizeOption[] {\n const choices = (rows: readonly { id: string; label: string }[]) => rows.map((row) => ({ value: row.id, label: row.label }))\n if (field === 'confidence_level') return levels(catalogue, method, locale)\n if (field === 'factor_profile') return choices(catalogue.factor_profiles)\n if (field === 'rule') return choices(catalogue.nonstatistical_rules)\n return [{ value: '', label: t('optional') }, ...choices(catalogue.assurance_levels)]\n}\n\n/** Eingabefelder der gewählten Methode mit Beschriftung, Auswahl und Fehlermeldung. */\nexport function samplesizeFields(state: SamplesizeData, t: T, locale: Locale): SamplesizeFieldView[] {\n const method = samplesizeMethod(state)\n const catalogue = state.catalogue\n if (!method || !catalogue) return []\n return scalarFields(method).map((key) => {\n const choice = CHOICE_FIELDS.includes(key)\n const issue = state.issues[key]\n return {\n key,\n label: t(key as SamplesizeMessageKey),\n kind: choice ? 'choice' : 'number',\n options: choice ? options(key, catalogue, method, locale, t) : [],\n value: state.form.values[key] ?? '',\n issue: issue ? t(issue) : null,\n inputMode: key === 'population_size' ? 'numeric' : 'decimal',\n }\n })\n}\n\nconst COLUMN_LABELS: Record<StratumColumn, SamplesizeMessageKey> = {\n name: 'stratumName',\n populationSize: 'stratumPopulation',\n bookValue: 'stratumBookValue',\n sd: 'stratumSd',\n exhaustive: 'stratumExhaustive',\n}\n\nexport function samplesizeStrataColumns(state: SamplesizeData, t: T): { key: StratumColumn; label: string }[] {\n return strataColumns(samplesizeMethod(state)).map((key) => ({ key, label: t(COLUMN_LABELS[key]) }))\n}\n\n/** Zahl für die Anzeige: ganze Beträge gruppiert, kleine Werte mit bis zu sechs Stellen. */\nexport function samplesizeNumber(value: number, locale: Locale): string {\n return formatNumber(value, locale, { maximumFractionDigits: Math.abs(value) < 10 ? 6 : 2 })\n}\n\nexport function samplesizeSummary(plan: SampleSizePlan, t: T, locale: Locale): SamplesizeCell[] {\n const rows: SamplesizeCell[] = [\n { key: t('sampleSize'), text: formatNumber(plan.sample_size, locale) },\n { key: t('rawSize'), text: samplesizeNumber(plan.raw_size, locale) },\n ]\n if (plan.interval !== null) rows.push({ key: t('interval'), text: `${samplesizeNumber(plan.interval, locale)} €` })\n return rows\n}\n\nexport function samplesizeAllocation(plan: SampleSizePlan, t: T, locale: Locale): string[][] {\n return plan.strata.map((row) => [\n row.name,\n formatNumber(row.sample_size, locale),\n row.share === null ? '–' : formatPercent(row.share, locale, 1),\n row.cut_off === null ? '–' : `${samplesizeNumber(row.cut_off, locale)} €`,\n row.exhaustive ? t('yes') : t('no'),\n ])\n}\n\nexport function samplesizeDerivation(plan: SampleSizePlan, locale: Locale): string[][] {\n return plan.derivation.map((step) => [step.label, step.formula, samplesizeNumber(step.value, locale), step.source])\n}\n\n/** Anteile werden in Prozent erfasst (Beschriftung „(%)“). */\nexport const samplesizePercentFields = PERCENT_FIELDS\n","import { defineMessages } from '../i18n'\n\n/** Texte von AttributeSampling (Vue) und FlowauditAttributeSampling (React); sichtbare Texte nur hier. */\nexport const attributesMessages = defineMessages({\n de: {\n title: 'Merkmalsstichprobe (Systemprüfung)',\n loading: 'Profile werden geladen …',\n failed: 'Anfrage abgelehnt: {message}',\n notice: 'Test von Kontrollen nach Leitfaden 7.9; Discovery- und Stop-or-go-Stichprobe (7.9.6) mit exakter Binomialgrenze – der Leitfaden nennt dafür keine Formel.',\n approach: 'Verfahren',\n approachnormal: 'Merkmalsstichprobe (Normalapproximation)',\n approachdiscovery: 'Discovery-Stichprobe',\n approachstop_or_go: 'Stop-or-go-Stichprobe',\n deviations: 'Abweichungen in der Stichprobe',\n sampleSize: 'Geprüfte Elemente (n)',\n confidence: 'Konfidenzniveau',\n factorProfile: 'Faktorprofil (z-Wert)',\n tolerable: 'Tolerierbare Abweichungsquote (%)',\n critical: 'Kritische Abweichungsquote (%)',\n choose: 'Bitte wählen',\n evaluate: 'Auswerten',\n issueRequired: 'Pflichtfeld.',\n issueInvalid: 'Keine gültige Zahl.',\n issueRange: 'Wert außerhalb des zulässigen Bereichs.',\n formIncomplete: 'Bitte die markierten Felder prüfen.',\n resultTitle: 'Ergebnis',\n rate: 'Abweichungsquote (EDR)',\n precision: 'Präzision (SE)',\n upperLimit: 'Obere Abweichungsgrenze (ULD)',\n threshold: 'Schwelle',\n derivation: 'Herleitung',\n colStep: 'Schritt',\n colFormula: 'Formel',\n colValue: 'Wert',\n colSource: 'Quelle',\n conclusionsupported: 'Kriterium erfüllt: ULD höchstens tolerierbare Quote',\n conclusionnot_supported: 'Kriterium nicht erfüllt: ULD über der tolerierbaren Quote',\n conclusioncriterion_met: 'Keine Abweichung: Quote unter der kritischen Schwelle',\n conclusiondeviation_found: 'Kritische Abweichung gefunden – Einzelfall untersuchen',\n conclusionstop: 'Stopp: Quote unter der tolerierbaren Schwelle',\n conclusiongo: 'Weiter: Stichprobe erweitern',\n fingerprint: 'Fingerabdruck der Eingabe',\n },\n en: {\n title: 'Attribute sampling (system audit)',\n loading: 'Loading profiles …',\n failed: 'Request rejected: {message}',\n evaluate: 'Evaluate',\n },\n})\n\nexport type AttributesMessageKey = keyof typeof attributesMessages.de\n","import { requestJson, type RestOptions } from '@auditcore/common'\nimport type { AttributesPort } from './types'\n\n/** Port auf `auditcore_extrapolation.web` (`GET /profiles`, `POST /attributes`). */\nexport function createAttributesRestPort(options: RestOptions): AttributesPort {\n return {\n profiles: () => requestJson(options, '/profiles'),\n evaluate: (request) => requestJson(options, '/attributes', request),\n }\n}\n","/**\n * Formular und Anzeige der Merkmalsstichprobe (reine Funktionen für Vue und\n * React): Prüfung der Eingaben, Aufbau der Anfrage, Kennzahlen und Herleitung.\n */\nimport { intlFormatNumber as formatNumber, intlFormatPercent as formatPercent, type TableColumn, type TableRow } from '@auditcore/common'\nimport type { BadgeTone } from '../base/types'\nimport type { Locale, Translate } from '../i18n'\nimport { parseInput } from '../sampling/model'\nimport type { AttributesMessageKey } from './messages'\nimport type { AttributeApproach, AttributesCatalogue, AttributesConclusion, AttributesRequest, AttributesResult } from './types'\n\nexport type AttributesTranslate = Translate<AttributesMessageKey>\n\nexport interface AttributesForm {\n approach: AttributeApproach\n deviations: string\n sampleSize: string\n confidence: number | null\n profileId: string | null\n /** Tolerierbare bzw. kritische Quote in Prozent. */\n rate: string\n}\n\nexport type AttributesIssue = 'required' | 'invalid' | 'range'\nexport type AttributesIssues = Readonly<Record<string, AttributesIssue>>\nexport type AttributesValidation = { ok: true; request: AttributesRequest } | { ok: false; issues: AttributesIssues }\n\nexport const EMPTY_ATTRIBUTES_FORM: AttributesForm = { approach: 'normal', deviations: '', sampleSize: '', confidence: null, profileId: null, rate: '' }\n\nconst APPROACHES: readonly AttributeApproach[] = ['normal', 'discovery', 'stop_or_go']\n\nexport function attributesApproachChoices(t: AttributesTranslate): { id: AttributeApproach; label: string }[] {\n return APPROACHES.map((id) => ({ id, label: t(`approach${id}`) }))\n}\n\nfunction whole(text: string, minimum: number): number | AttributesIssue {\n const value = parseInput(text)\n if (value === null) return 'required'\n if (value === undefined || !Number.isInteger(value)) return 'invalid'\n return value < minimum ? 'range' : value\n}\n\nfunction percent(text: string): number | AttributesIssue {\n const value = parseInput(text)\n if (value === null) return 'required'\n if (value === undefined) return 'invalid'\n return value <= 0 || value >= 100 ? 'range' : value / 100\n}\n\nfunction selectionIssues(form: AttributesForm, issues: Record<string, AttributesIssue>): void {\n if (form.confidence === null) issues.confidence = 'required'\n if (form.approach === 'normal' && form.profileId === null) issues.profileId = 'required'\n}\n\n/** Anfrage für `POST /attributes`; bei Befunden die Feldschlüssel mit ihrem Fehler. */\nexport function buildAttributesRequest(form: AttributesForm): AttributesValidation {\n const issues: Record<string, AttributesIssue> = {}\n const take = (key: string, value: number | AttributesIssue): number => {\n if (typeof value === 'number') return value\n issues[key] = value\n return 0\n }\n const size = take('sampleSize', whole(form.sampleSize, 1))\n const deviations = take('deviations', whole(form.deviations, 0))\n if (!issues.sampleSize && !issues.deviations && deviations > size) issues.deviations = 'range'\n const rate = take('rate', percent(form.rate))\n selectionIssues(form, issues)\n if (Object.keys(issues).length || form.confidence === null) return { ok: false, issues }\n const request: AttributesRequest = { approach: form.approach, deviations, sample_size: size, confidence_level: form.confidence, tolerable_rate: rate }\n const profile = form.approach === 'normal' && form.profileId ? { factor_profile: form.profileId } : {}\n return { ok: true, request: { ...request, ...profile } }\n}\n\nexport function attributesConfidenceChoices(catalogue: AttributesCatalogue | null): readonly number[] {\n return catalogue?.confidence_levels.z ?? []\n}\n\nexport function attributesPercent(value: number, locale: Locale): string {\n return formatPercent(value, locale, 2)\n}\n\nexport function attributesIssueKey(issue: AttributesIssue): AttributesMessageKey {\n return issue === 'required' ? 'issueRequired' : issue === 'invalid' ? 'issueInvalid' : 'issueRange'\n}\n\nconst TONES: Readonly<Record<AttributesConclusion, BadgeTone>> = {\n supported: 'success', criterion_met: 'success', stop: 'success', not_supported: 'danger', deviation_found: 'danger', go: 'warning',\n}\n\nexport function attributesConclusionTone(conclusion: AttributesConclusion): BadgeTone {\n return TONES[conclusion]\n}\n\nexport interface AttributesMetric {\n id: string\n label: string\n value: string\n}\n\nexport function attributesMetrics(result: AttributesResult, t: AttributesTranslate, locale: Locale): AttributesMetric[] {\n const outcome = result.attributes\n const metrics: AttributesMetric[] = [{ id: 'rate', label: t('rate'), value: attributesPercent(outcome.rate, locale) }]\n if (outcome.precision !== undefined) metrics.push({ id: 'precision', label: t('precision'), value: attributesPercent(outcome.precision, locale) })\n metrics.push({ id: 'upper', label: t('upperLimit'), value: attributesPercent(outcome.upper_limit, locale) })\n const threshold = outcome.tolerable_rate ?? outcome.threshold\n if (threshold !== undefined) metrics.push({ id: 'threshold', label: t('threshold'), value: attributesPercent(threshold, locale) })\n return metrics\n}\n\nexport function attributesStepColumns(t: AttributesTranslate, locale: Locale): TableColumn[] {\n return [\n { key: 'label', label: t('colStep') },\n { key: 'formula', label: t('colFormula') },\n { key: 'value', label: t('colValue'), align: 'end', format: (value) => (typeof value === 'number' ? formatNumber(value, locale, { maximumFractionDigits: 6 }) : '') },\n { key: 'source', label: t('colSource') },\n ]\n}\n\nexport function attributesStepRows(result: AttributesResult): TableRow[] {\n return result.attributes.steps.map((step, index) => ({ id: index + 1, ...step }))\n}\n\nexport const ATTRIBUTE_FIELDS: readonly { key: 'deviations' | 'sampleSize' | 'rate'; numeric: true }[] = [\n { key: 'sampleSize', numeric: true },\n { key: 'deviations', numeric: true },\n { key: 'rate', numeric: true },\n]\n\nexport function attributesFieldLabel(key: 'deviations' | 'sampleSize' | 'rate', approach: AttributeApproach, t: AttributesTranslate): string {\n if (key === 'rate') return t(approach === 'discovery' ? 'critical' : 'tolerable')\n return t(key)\n}\n\nexport function attributesFormMessage(issues: AttributesIssues, t: AttributesTranslate): string {\n return Object.keys(issues).length ? t('formIncomplete') : ''\n}\n","// Zustandsautomat von <flowaudit-attribute-sampling> (Vue und React): lädt die\n// Profile, hält das Formular, wertet über den Port aus (Leitfaden 7.9).\n\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport type { AttributesCatalogue, AttributesPort, AttributesResult } from './types'\nimport { buildAttributesRequest, EMPTY_ATTRIBUTES_FORM, type AttributesForm, type AttributesIssues } from './view'\n\nexport interface AttributesCallbacks {\n evaluated?: (result: AttributesResult) => void\n failed?: (message: string) => void\n}\n\n/** Stand; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface AttributesData extends RequestState<string> {\n catalogue: AttributesCatalogue | null\n form: AttributesForm\n issues: AttributesIssues\n result: AttributesResult | null\n}\n\nexport interface AttributesSource {\n port: () => AttributesPort | null | undefined\n callbacks?: () => AttributesCallbacks\n}\n\nexport interface AttributesController {\n store: Store<AttributesData>\n load: () => Promise<void>\n update: (patch: Partial<AttributesForm>) => void\n evaluate: () => Promise<void>\n}\n\nexport const INITIAL_ATTRIBUTES: AttributesData = { ...IDLE, catalogue: null, form: EMPTY_ATTRIBUTES_FORM, issues: {}, result: null }\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nexport function createAttributesController(source: AttributesSource): AttributesController {\n const store = createStore<AttributesData>({ ...INITIAL_ATTRIBUTES })\n const run = createRunner(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n return {\n store,\n async load() {\n const catalogue = await run('load', (port) => port.profiles())\n if (catalogue) store.set((state) => ({ catalogue, form: { ...state.form, profileId: state.form.profileId ?? catalogue.recommended_profile } }))\n },\n update(patch) {\n store.set((state) => ({ form: { ...state.form, ...patch } }))\n },\n async evaluate() {\n const checked = buildAttributesRequest(store.get().form)\n store.set({ issues: checked.ok ? {} : checked.issues })\n if (!checked.ok) return\n const result = await run('evaluate', (port) => port.evaluate(checked.request))\n if (!result) return\n store.set({ result })\n source.callbacks?.().evaluated?.(result)\n },\n }\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte der Berichtsvorlagen (Vue `ReportTemplates`, React `FlowauditReportTemplates`); sichtbare Texte nur hier. */\nexport const reporttemplatesMessages = defineMessages({\n de: {\n title: 'Berichtsvorlagen',\n loading: 'Vorlagen werden geladen …',\n loadingDetail: 'Datenvertrag wird geladen …',\n noPort: 'Kein Port übergeben: Vorlagen sind nicht verfügbar.',\n empty: 'Keine Vorlagen vorhanden.',\n failed: 'Anfrage abgelehnt: {message}',\n template: 'Vorlage',\n choose: 'Bitte wählen',\n version: 'Version {version} · {status}',\n kindstructured: 'Strukturierte Vorlage (DOCX, PDF, HTML)',\n kinddocx: 'Word-Vorlage (DOCX)',\n contract: 'Datenvertrag',\n field: 'Feld',\n fieldType: 'Typ',\n fieldRequired: 'Pflicht',\n yes: 'ja',\n no: 'nein',\n textBlocks: 'Textbausteine',\n required: 'Pflichtbaustein',\n conditional: 'bedingt',\n legalBasis: 'Rechtsgrundlage: {basis}',\n data: 'Daten',\n dataGiven: 'Daten der Anwendung',\n dataSample: 'Beispieldaten der Vorlage (keine Daten übergeben)',\n format: 'Format',\n design: 'Gestaltung',\n filename: 'Dateiname',\n preview: 'Vorschau',\n render: 'Bericht erzeugen',\n formatMissing: 'Format „{format}“ auf dem Server nicht verfügbar.',\n valid: 'Daten erfüllen den Datenvertrag.',\n invalid: 'Daten erfüllen den Datenvertrag nicht ({count} Punkte):',\n usedBlocks: 'Verwendete Textbausteine: {blocks}',\n noBlocks: 'Keine Textbausteine verwendet.',\n previewFrame: 'Vorschau des Berichts',\n previewStale: 'Eingaben geändert – Vorschau neu anfordern.',\n rendered: 'Erzeugt: {filename}',\n notice: 'Die Daten werden nur eingesetzt, nie als Vorlage ausgewertet; die Ausgabe enthält keine Makros.',\n },\n en: {\n title: 'Report templates',\n loading: 'Loading templates …',\n empty: 'No templates.',\n failed: 'Request rejected: {message}',\n template: 'Template',\n preview: 'Preview',\n render: 'Create report',\n format: 'Format',\n design: 'Design',\n filename: 'File name',\n },\n})\n\nexport type ReporttemplatesMessageKey = keyof typeof reporttemplatesMessages.de\n","import { requestFile, requestJson, type RestOptions } from '@auditcore/common'\nimport type { ReporttemplatesPort } from './types'\n\n/** Port auf die Vorlagen-Endpunkte von `reporting_ui/1` (`auditcore_reporting.web`, Starlette oder FastAPI). */\nexport function createReportTemplatesRestPort(options: RestOptions): ReporttemplatesPort {\n const path = (id: string, suffix = ''): string => `/templates/${encodeURIComponent(id)}${suffix}`\n return {\n templates: () => requestJson(options, '/templates'),\n template: (id, version) => requestJson(options, path(id, version ? `?version=${encodeURIComponent(version)}` : '')),\n preview: (id, request) => requestJson(options, path(id, '/preview'), request),\n render: (id, request) => requestFile(options, path(id, '/render'), request, `${id}.${request.format}`),\n }\n}\n","// Zustandsautomat der Berichtsvorlagen (Vue und React): Vorlagen laden, Vorlage\n// wählen, Datenvertrag anzeigen, Vorschau und Bericht über den Port (reporting_ui/1).\n\nimport type { DownloadFile } from '@auditcore/common'\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport type {\n ReporttemplatesPort,\n TemplateCatalogue,\n TemplateData,\n TemplateDetail,\n TemplateFormat,\n TemplatePreview,\n TemplateRenderRequest,\n TemplateRequest,\n} from './types'\n\nexport interface ReporttemplatesCallbacks {\n selected?: (detail: TemplateDetail) => void\n previewed?: (result: TemplatePreview) => void\n rendered?: (file: DownloadFile) => void\n failed?: (message: string) => void\n}\n\n/** Stand; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface ReporttemplatesData extends RequestState<string> {\n catalogue: TemplateCatalogue | null\n templateId: string | null\n detail: TemplateDetail | null\n format: TemplateFormat | null\n designId: string | null\n filename: string\n preview: TemplatePreview | null\n /** Vorschau passt nicht mehr zu Vorlage, Gestaltung oder Daten. */\n stale: boolean\n renderedName: string | null\n}\n\nexport interface ReporttemplatesSource {\n port: () => ReporttemplatesPort | null | undefined\n /** Daten der Anwendung; ohne Daten gelten die Beispieldaten der Vorlage. */\n data?: () => TemplateData | null | undefined\n callbacks?: () => ReporttemplatesCallbacks\n}\n\nexport interface ReporttemplatesController {\n store: Store<ReporttemplatesData>\n load: () => Promise<void>\n select: (id: string | null) => Promise<void>\n preview: () => Promise<void>\n render: () => Promise<DownloadFile | null>\n setFormat: (format: TemplateFormat | null) => void\n setDesign: (designId: string | null) => void\n setFilename: (filename: string) => void\n /** Daten der Anwendung haben sich geändert. */\n dataChanged: () => void\n}\n\nexport const INITIAL_REPORTTEMPLATES: ReporttemplatesData = {\n ...IDLE, catalogue: null, templateId: null, detail: null, format: null, designId: null,\n filename: '', preview: null, stale: false, renderedName: null,\n}\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\n/** Daten für Vorschau und Bericht: die der Anwendung, sonst die Beispieldaten. */\nexport function reporttemplatesData(state: ReporttemplatesData, data: TemplateData | null | undefined): TemplateData | null {\n return data ?? state.detail?.sample ?? null\n}\n\n/** Anfrage aus Zustand und Daten oder `null`, solange keine Vorlage geladen ist. */\nexport function buildTemplateRequest(state: ReporttemplatesData, data: TemplateData | null | undefined): TemplateRequest | null {\n const values = reporttemplatesData(state, data)\n if (!state.detail || !values) return null\n return { data: values, version: state.detail.version, ...(state.designId ? { design: state.designId } : {}) }\n}\n\nfunction firstFormat(detail: TemplateDetail, catalogue: TemplateCatalogue | null): TemplateFormat | null {\n return detail.formats.find((format) => catalogue?.formats[format] !== false) ?? detail.formats[0] ?? null\n}\n\nexport function createReporttemplatesController(source: ReporttemplatesSource): ReporttemplatesController {\n const store = createStore<ReporttemplatesData>({ ...INITIAL_REPORTTEMPLATES })\n const run = createRunner(store, () => source.port() ?? null, errorText, (message) => source.callbacks?.().failed?.(message))\n const request = (): TemplateRequest | null => buildTemplateRequest(store.get(), source.data?.())\n const changed = (patch: Partial<ReporttemplatesData>): void =>\n store.set((state) => ({ ...patch, stale: state.preview !== null, renderedName: null }))\n\n async function select(id: string | null): Promise<void> {\n store.set({ templateId: id, detail: null, preview: null, stale: false, renderedName: null })\n if (!id) return\n const detail = await run('detail', (port) => port.template(id))\n if (!detail || store.get().templateId !== id) return\n store.set((state) => ({ detail, format: firstFormat(detail, state.catalogue) }))\n source.callbacks?.().selected?.(detail)\n }\n\n return {\n store,\n async load() {\n const catalogue = await run('load', (port) => port.templates())\n if (!catalogue) return\n store.set({ catalogue, designId: catalogue.designs[0]?.id ?? null })\n await select(catalogue.templates[0]?.id ?? null)\n },\n select,\n async preview() {\n const built = request()\n const id = store.get().templateId\n if (!built || !id) return\n const result = await run('preview', (port) => port.preview(id, built))\n if (!result) return\n store.set({ preview: result, stale: false })\n source.callbacks?.().previewed?.(result)\n },\n async render() {\n const built = request()\n const { templateId, format, filename, catalogue } = store.get()\n if (!built || !templateId || !format || catalogue?.formats[format] === false) return null\n const name = filename.trim()\n const body: TemplateRenderRequest = { ...built, format, ...(name ? { filename: name } : {}) }\n const file = await run('render', (port) => port.render(templateId, body))\n if (!file) return null\n store.set({ renderedName: file.filename })\n source.callbacks?.().rendered?.(file)\n return file\n },\n setFormat: (format) => store.set({ format, renderedName: null }),\n setDesign: (designId) => changed({ designId }),\n setFilename: (filename) => store.set({ filename, renderedName: null }),\n dataChanged: () => changed({}),\n }\n}\n","import type { ReporttemplatesData } from './controller'\nimport type { TemplateDetail, TemplateFormat, TemplateSchema } from './types'\n\n/** Zeile der Datenvertrags-Übersicht (oberste Ebene des Schemas). */\nexport interface SchemaFieldRow {\n name: string\n title: string\n type: string\n required: boolean\n}\n\nexport interface TextBlockRow {\n id: string\n title: string\n required: boolean\n conditional: boolean\n legalBasis: string\n}\n\nexport interface FormatOption {\n format: TemplateFormat\n available: boolean\n}\n\nfunction typeText(schema: TemplateSchema): string {\n const kind = Array.isArray(schema.type) ? schema.type.join(' | ') : (schema.type ?? '–')\n if (kind === 'array' && schema.items) return `Liste von ${typeText(schema.items)}`\n return schema.format ? `${kind} (${schema.format})` : String(kind)\n}\n\nexport function schemaFields(detail: TemplateDetail | null): SchemaFieldRow[] {\n const properties = detail?.schema.properties ?? {}\n const required = new Set(detail?.schema.required ?? [])\n return Object.entries(properties).map(([name, schema]) => ({\n name, title: schema.title ?? '', type: typeText(schema), required: required.has(name),\n }))\n}\n\nexport function textBlockRows(detail: TemplateDetail | null): TextBlockRow[] {\n return (detail?.text_blocks ?? []).map((block) => ({\n id: block.id,\n title: block.title || block.id,\n required: block.required,\n conditional: block.condition !== null && block.condition !== undefined,\n legalBasis: block.legal_basis,\n }))\n}\n\nexport function formatOptions(state: ReporttemplatesData): FormatOption[] {\n return (state.detail?.formats ?? []).map((format) => ({ format, available: state.catalogue?.formats[format] !== false }))\n}\n\n/** Bericht erzeugen ist möglich: Vorlage geladen, Format gewählt und auf dem Server verfügbar. */\nexport function reporttemplatesCanRender(state: ReporttemplatesData): boolean {\n const option = formatOptions(state).find((entry) => entry.format === state.format)\n return state.detail !== null && option?.available === true && state.busy === null\n}\n\n/** Hinweis „keine Vorlagen“ nur nach abgeschlossener, fehlerfreier Anfrage. */\nexport function reporttemplatesIsEmpty(state: ReporttemplatesData): boolean {\n return state.catalogue !== null && state.catalogue.templates.length === 0\n}\n","import { defineMessages } from '../i18n'\n\n/** Texte der Runner-Konsole (Vue `RunnerConsole`, React `FlowauditRunnerConsole`); sichtbare Texte nur hier. */\nexport const runnerMessages = defineMessages({\n de: {\n title: 'Runner-Konsole',\n loading: 'Daten werden geladen …',\n working: 'Wird ausgeführt …',\n failed: 'Anfrage abgelehnt: {message}',\n tabs: 'Bereiche',\n tabStatus: 'Status',\n tabEinstellungen: 'Einstellungen',\n tabWerkzeuge: 'Werkzeuge',\n tabPrioritaeten: 'Prioritäten',\n meta: '{rechner} · Profilversion {version}',\n syncAus: 'nur lokal verwaltet',\n syncZentral: 'Abgleich mit {sync}',\n nurLesen: 'Nur lesen: Änderungen sind nur direkt auf dem Rechner möglich.',\n refresh: 'Aktualisieren',\n ueberblick: 'Überblick',\n ziel: 'Ziel',\n sollQuelle: 'Soll-Quelle',\n profilVersion: 'Profilversion',\n aenderung: 'Letzte Änderung',\n aenderungWert: '{zeit} · {quelle}',\n aenderungKeine: 'noch keine',\n image: 'Runner-Image',\n netzsperre: 'Netzsperre',\n kontingent: 'GitHub-Kontingent',\n runnerVersion: 'Runner-Version',\n runnerVersionFrist: '{version}, aktualisieren bis {frist}',\n vorhanden: 'vorhanden',\n fehlt: 'fehlt',\n aktiv: 'aktiv',\n inaktiv: 'nicht aktiv',\n unbekannt: 'unbekannt',\n klassen: 'Runner-Klassen',\n keineKlassen: 'Keine Runner-Klassen im Profil.',\n spalteKlasse: 'Klasse',\n spalteSoll: 'Soll',\n spalteMax: 'Max.',\n spalteInstanzen: 'Instanzen',\n spalteRegistriert: 'Registriert',\n spalteBelegt: 'Belegt',\n spalteWarteschlange: 'Warteschlange',\n spalteGruende: 'Begründung',\n hardware: 'Hardware',\n hinweisUnbekannt: 'Unbekannte Runner registriert: {namen}',\n hinweisImage: 'Das Runner-Image fehlt.',\n hinweisNetzsperre: 'Die Netzsperre ist nicht aktiv.',\n abschnittAllgemein: 'Allgemein',\n abschnittRegelung: 'Regelung',\n abschnittThermik: 'Thermikquelle',\n abschnittNetz: 'Netz',\n abschnittKlasse: 'Klasse {name}',\n abschnittKarte: 'Grafikkarte {index}: {name}',\n fSollQuelle: 'Soll-Quelle',\n fSollDatei: 'Soll-Datei',\n fBackend: 'Backend',\n fImage: 'Runner-Image',\n fReserveCpus: 'Reserve für den Rechner: CPUs',\n fReserveSpeicher: 'Reserve für den Rechner: Speicher (GB)',\n fVorrang: 'Vorrang interaktiver Nutzung',\n fLeerlauf: 'Leerlauf bis zur vollen Leistung (Minuten)',\n fAnteil: 'Anteil der Runner bei Nutzung (0–1)',\n fSwap: 'Swap-Sperre ab (GB, 0 = aus)',\n fRam: 'Mindestens frei: RAM (GB)',\n fLast: 'Höchstlast je Kern',\n fTemperatur: 'Höchsttemperatur (°C)',\n fVon: 'Volle Leistung ab (Uhr, 0 = aus)',\n fBis: 'Volle Leistung bis (Uhr)',\n fHaltezeit: 'Haltezeit gegen Flattern (s)',\n fThermikAktiv: 'Thermikquelle nutzen',\n fThermikUrl: 'Adresse der Thermikquelle (URL)',\n fNetzAktiv: 'Eigenes Docker-Netz',\n fSperre: 'Netzsperre verlangen',\n kArt: 'Art',\n oCpu: 'CPU',\n oGpu: 'GPU (Grafikkarte)',\n klasseName: 'Name der Klasse',\n umbenennen: 'Umbenennen',\n neueKlasse: 'Neue Klasse',\n hinzufuegen: 'Klasse hinzufügen',\n klasseNameUngueltig: 'Klassenname: a–z, 0–9, Bindestrich, höchstens 31 Zeichen',\n klasseNameVergeben: 'Dieser Name ist bereits vergeben.',\n anmeldung: 'Anmeldung bei GitHub',\n kAktiv: 'Aktiv',\n kMin: 'Mindestanzahl',\n kMax: 'Höchstanzahl',\n kLeise: 'Höchstanzahl im Leisemodus (−1 = wie Höchstanzahl)',\n kCpus: 'CPUs je Runner',\n kSpeicher: 'Speicher je Runner (GB)',\n kVram: 'Grafikspeicher je Runner (MB)',\n kLabels: 'Labels (durch Komma getrennt)',\n gErlaubt: 'Für Runner erlaubt',\n gKlasse: 'Klasse',\n oStatisch: 'statisch (Profil)',\n oLokal: 'lokal (eingebauter Regler)',\n oDatei: 'Datei (externer Regler)',\n pruefen: 'Prüfen',\n anwenden: 'Anwenden',\n verwerfen: 'Verwerfen',\n ungespeichert: 'Nicht angewendete Änderungen',\n gueltig: 'gültig',\n ungueltig: 'fehlerhaft',\n probleme: 'Fehler im Profil',\n vorschau: 'Vorschau der Änderungen',\n keineAenderung: 'Keine Dateiänderungen.',\n schritte: 'Schritte beim Anwenden',\n rootBefehl: 'Einmal als root ausführen (zum Kopieren markieren):',\n angewendet: 'Profil angewendet (Version {version}).',\n nichtAngewendet: 'Nicht angewendet: {meldung}',\n konflikt: 'Konflikt, nichts angewendet. {meldung}',\n konfliktFeld: 'Feld',\n konfliktEntwurf: 'Ihr Entwurf',\n konfliktGespeichert: 'Gespeichert ({quelle})',\n gespeichertUebernehmen: 'Gespeicherten Stand übernehmen',\n entwurfAnwenden: 'Entwurf trotzdem anwenden',\n werkzeugProfil: 'Prüfprofil {name}',\n spalteWerkzeug: 'Werkzeug',\n spalteBereich: 'Bereich',\n spalteImage: 'Im Image',\n spalteAktiv: 'Aktiv',\n spalteZeitlimit: 'Zeitlimit (s)',\n spaltePrioritaet: 'Priorität',\n nichtInstalliert: 'nicht installiert',\n speichern: 'Speichern',\n gespeichert: 'Werkzeug-Einstellungen gespeichert.',\n keineWerkzeuge: 'Keine Werkzeuge im Katalog.',\n prioritaetenHinweis: 'Rang 1 hat Vorrang. Bei knapper Kapazität weichen verdrängbare Einträge von unten nach oben.',\n keinePrioritaeten: 'Keine Prioritäten festgelegt.',\n rang: 'Rang {rang}',\n hoch: 'Nach oben: {name}',\n runter: 'Nach unten: {name}',\n verdraengbar: 'Verdrängbar',\n mindestens: 'Mindestens',\n weichtZuerst: 'Bei Platzmangel weicht zuerst: {name}',\n keinerVerdraengbar: 'Kein Eintrag ist verdrängbar.',\n },\n en: {\n title: 'Runner console',\n loading: 'Loading …',\n working: 'Working …',\n failed: 'Request rejected: {message}',\n tabs: 'Sections',\n tabStatus: 'Status',\n tabEinstellungen: 'Settings',\n tabWerkzeuge: 'Tools',\n tabPrioritaeten: 'Priorities',\n meta: '{rechner} · profile version {version}',\n syncAus: 'managed locally only',\n syncZentral: 'synchronised with {sync}',\n nurLesen: 'Read only: changes are only possible on the machine itself.',\n refresh: 'Refresh',\n ueberblick: 'Overview',\n ziel: 'Target',\n sollQuelle: 'Target source',\n profilVersion: 'Profile version',\n aenderung: 'Last change',\n aenderungWert: '{zeit} · {quelle}',\n aenderungKeine: 'none yet',\n image: 'Runner image',\n netzsperre: 'Network lock',\n kontingent: 'GitHub quota',\n runnerVersion: 'Runner version',\n runnerVersionFrist: '{version}, update by {frist}',\n vorhanden: 'present',\n fehlt: 'missing',\n aktiv: 'active',\n inaktiv: 'not active',\n unbekannt: 'unknown',\n klassen: 'Runner classes',\n keineKlassen: 'No runner classes in the profile.',\n spalteKlasse: 'Class',\n spalteSoll: 'Target',\n spalteMax: 'Max.',\n spalteInstanzen: 'Instances',\n spalteRegistriert: 'Registered',\n spalteBelegt: 'Busy',\n spalteWarteschlange: 'Queue',\n spalteGruende: 'Reason',\n hardware: 'Hardware',\n hinweisUnbekannt: 'Unknown runners registered: {namen}',\n hinweisImage: 'The runner image is missing.',\n hinweisNetzsperre: 'The network lock is not active.',\n abschnittAllgemein: 'General',\n abschnittRegelung: 'Scaling',\n abschnittThermik: 'Thermal source',\n abschnittNetz: 'Network',\n abschnittKlasse: 'Class {name}',\n abschnittKarte: 'Graphics card {index}: {name}',\n fSollQuelle: 'Target source',\n fSollDatei: 'Target file',\n fBackend: 'Backend',\n fImage: 'Runner image',\n fReserveCpus: 'Reserve for the machine: CPUs',\n fReserveSpeicher: 'Reserve for the machine: memory (GB)',\n fVorrang: 'Priority for interactive use',\n fLeerlauf: 'Idle time until full power (minutes)',\n fAnteil: 'Share of runners while in use (0–1)',\n fSwap: 'Swap lock from (GB, 0 = off)',\n fRam: 'Minimum free RAM (GB)',\n fLast: 'Maximum load per core',\n fTemperatur: 'Maximum temperature (°C)',\n fVon: 'Full power from (hour, 0 = off)',\n fBis: 'Full power until (hour)',\n fHaltezeit: 'Hold time against flapping (s)',\n fThermikAktiv: 'Use thermal source',\n fThermikUrl: 'Thermal source address (URL)',\n fNetzAktiv: 'Dedicated Docker network',\n fSperre: 'Require network lock',\n kArt: 'Kind',\n oCpu: 'CPU',\n oGpu: 'GPU (graphics card)',\n klasseName: 'Class name',\n umbenennen: 'Rename',\n neueKlasse: 'New class',\n hinzufuegen: 'Add class',\n klasseNameUngueltig: 'Class name: a–z, 0–9, hyphen, at most 31 characters',\n klasseNameVergeben: 'This name is already taken.',\n anmeldung: 'GitHub sign-in',\n kAktiv: 'Active',\n kMin: 'Minimum',\n kMax: 'Maximum',\n kLeise: 'Maximum in quiet mode (−1 = same as maximum)',\n kCpus: 'CPUs per runner',\n kSpeicher: 'Memory per runner (GB)',\n kVram: 'GPU memory per runner (MB)',\n kLabels: 'Labels (comma separated)',\n gErlaubt: 'Allowed for runners',\n gKlasse: 'Class',\n oStatisch: 'static (profile)',\n oLokal: 'local (built-in regulator)',\n oDatei: 'file (external regulator)',\n pruefen: 'Check',\n anwenden: 'Apply',\n verwerfen: 'Discard',\n ungespeichert: 'Changes not yet applied',\n gueltig: 'valid',\n ungueltig: 'invalid',\n probleme: 'Errors in the profile',\n vorschau: 'Preview of changes',\n keineAenderung: 'No file changes.',\n schritte: 'Steps when applying',\n rootBefehl: 'Run once as root (select to copy):',\n angewendet: 'Profile applied (version {version}).',\n nichtAngewendet: 'Not applied: {meldung}',\n konflikt: 'Conflict, nothing applied. {meldung}',\n konfliktFeld: 'Field',\n konfliktEntwurf: 'Your draft',\n konfliktGespeichert: 'Saved ({quelle})',\n gespeichertUebernehmen: 'Take saved version',\n entwurfAnwenden: 'Apply draft anyway',\n werkzeugProfil: 'Check profile {name}',\n spalteWerkzeug: 'Tool',\n spalteBereich: 'Area',\n spalteImage: 'In image',\n spalteAktiv: 'Active',\n spalteZeitlimit: 'Time limit (s)',\n spaltePrioritaet: 'Priority',\n nichtInstalliert: 'not installed',\n speichern: 'Save',\n gespeichert: 'Tool settings saved.',\n keineWerkzeuge: 'No tools in the catalogue.',\n prioritaetenHinweis: 'Rank 1 wins. When capacity is short, preemptible entries give way from the bottom up.',\n keinePrioritaeten: 'No priorities defined.',\n rang: 'Rank {rang}',\n hoch: 'Move up: {name}',\n runter: 'Move down: {name}',\n verdraengbar: 'Preemptible',\n mindestens: 'Minimum',\n weichtZuerst: 'Gives way first: {name}',\n keinerVerdraengbar: 'No entry is preemptible.',\n },\n})\n\nexport type RunnerMessageKey = keyof typeof runnerMessages.de\n","import { RestError, requestJson, type FetchLike, type RestOptions } from '@auditcore/common'\nimport type { RunnerPort, RunnerProfil, RunnerProfilStand, RunnerPruefung, RunnerStatus, RunnerWerkzeuge, RunnerWerkzeugProfile } from './types'\n\n/** Kopfzeile, ohne die `auditcore-runner ui` schreibende Anfragen ablehnt. */\nexport const RUNNER_SCHREIB_KOPF = { 'X-Auditcore-Runner': '1' } as const\nexport const RUNNER_WERKZEUG_SCHEMA = 'auditcore-runner/werkzeuge/1'\n\n/** Port im Arbeitsspeicher (Demo, Tests); Konflikt, wenn `erwarteteVersion` nicht zur gespeicherten passt. */\nexport function createRunnerMemoryPort(start: {\n status: RunnerStatus\n profil: RunnerProfilStand\n werkzeuge?: RunnerWerkzeuge\n pruefen?: (profil: RunnerProfil) => RunnerPruefung\n}): RunnerPort {\n let stand = start.profil\n let werkzeuge = start.werkzeuge ?? { werkzeuge: [], profile: {} }\n const pruefen = start.pruefen ?? (() => ({ gueltig: true, probleme: [], aktive_version: versionOf(stand.profil), aenderungen: [], schritte: [], netzsperre_befehl: null }))\n return {\n status: async () => ({ ...start.status, profil_version: versionOf(stand.profil) }),\n profil: async () => stand,\n pruefen: async (profil) => pruefen(profil),\n async anwenden(profil, erwarteteVersion) {\n const aktuell = versionOf(stand.profil)\n const ergebnis = pruefen(profil)\n if (erwarteteVersion !== null && erwarteteVersion !== aktuell) {\n return { ...ergebnis, angewendet: false, konflikt: true, meldung: `Version ${aktuell}, erwartet ${erwarteteVersion}` }\n }\n if (!ergebnis.gueltig) return { ...ergebnis, angewendet: false, konflikt: false }\n stand = { ...stand, profil: { ...profil, version: aktuell + 1 } }\n return { ...ergebnis, angewendet: true, konflikt: false, version: aktuell + 1 }\n },\n werkzeuge: async () => werkzeuge,\n async werkzeugeSpeichern(profile) {\n werkzeuge = { ...werkzeuge, profile }\n },\n }\n}\n\n/** Die Runner-API meldet Fehler als `{\"fehler\": \"…\"}`; umgesetzt in die auditcore-Hülle `{error: {message}}`. */\nfunction fehlerHuelle(basis: FetchLike | undefined): FetchLike {\n const fetchImpl: FetchLike = basis ?? ((input, init) => globalThis.fetch(input, init))\n return async (input, init) => {\n const response = await fetchImpl(input, init)\n if (response.ok) return response\n const data: unknown = await response.clone().json().catch(() => null)\n const fehler = typeof data === 'object' && data !== null ? (data as { fehler?: unknown }).fehler : undefined\n if (typeof fehler !== 'string') return response\n return new Response(JSON.stringify({ error: { code: `http_${response.status}`, message: fehler } }), {\n status: response.status,\n headers: { 'Content-Type': 'application/json' },\n })\n }\n}\n\nfunction versionOf(profil: RunnerProfil): number {\n return typeof profil.version === 'number' ? profil.version : 0\n}\n\n/**\n * Port auf die JSON-API von `auditcore-runner ui` (Basis z. B. `/api`).\n * Schreibende Aufrufe senden `X-Auditcore-Runner: 1`; HTTP 409 beim Anwenden\n * wird zum Ergebnis mit `konflikt: true`.\n */\nexport function createRunnerRestPort(rest: RestOptions): RunnerPort {\n const options: RestOptions = { ...rest, fetch: fehlerHuelle(rest.fetch) }\n const schreiben: RestOptions = { ...options, headers: { ...options.headers, ...RUNNER_SCHREIB_KOPF } }\n return {\n status: () => requestJson<RunnerStatus>(options, '/status'),\n profil: () => requestJson<RunnerProfilStand>(options, '/profil'),\n pruefen: (profil) => requestJson<RunnerPruefung>(schreiben, '/profil/pruefen', { profil }),\n async anwenden(profil, erwarteteVersion) {\n try {\n return await requestJson<RunnerPruefung>(schreiben, '/profil/anwenden', { profil, erwartete_version: erwarteteVersion })\n } catch (error) {\n if (error instanceof RestError && error.status === 409) {\n return { gueltig: true, probleme: [], aktive_version: null, aenderungen: [], schritte: [], netzsperre_befehl: null, angewendet: false, konflikt: true, meldung: error.message }\n }\n throw error\n }\n },\n werkzeuge: () => requestJson<RunnerWerkzeuge>(options, '/werkzeuge'),\n async werkzeugeSpeichern(profile: RunnerWerkzeugProfile) {\n await requestJson<unknown>(schreiben, '/werkzeuge', { schema: RUNNER_WERKZEUG_SCHEMA, profile })\n },\n }\n}\n","// Reine Hilfen für den Profil-Entwurf: Werte lesen und unveränderlich setzen,\n// Unterschiede zweier Stände, Prioritäten verschieben. Keine Fachregeln –\n// gültig ist, was `POST /api/profil/pruefen` sagt.\n\nimport type { RunnerProfil } from './types'\n\nexport type RunnerPfad = readonly (string | number)[]\n\nexport interface RunnerPrioritaet {\n klasse: string\n rang: number\n verdraengbar: boolean\n min: number\n}\n\nexport interface RunnerUnterschied {\n pfad: string\n entwurf: string\n gespeichert: string\n}\n\n/** Felder, die das Backend beim Anwenden selbst setzt; für Unterschiede und „geändert“ ohne Belang. */\nconst VERWALTET = new Set(['version', 'aenderung'])\n\nfunction isObject(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport function runnerWert(profil: RunnerProfil | null | undefined, pfad: RunnerPfad): unknown {\n let current: unknown = profil\n for (const teil of pfad) {\n if (Array.isArray(current) && typeof teil === 'number') current = current[teil]\n else if (isObject(current) && typeof teil === 'string') current = current[teil]\n else return undefined\n }\n return current\n}\n\nfunction setzeIn(container: unknown, pfad: RunnerPfad, wert: unknown): unknown {\n if (pfad.length === 0) return wert\n const [kopf, ...rest] = pfad\n if (typeof kopf === 'number') {\n const liste = Array.isArray(container) ? [...(container as unknown[])] : []\n liste[kopf] = setzeIn(liste[kopf], rest, wert)\n return liste\n }\n const objekt = isObject(container) ? { ...container } : {}\n objekt[kopf as string] = setzeIn(objekt[kopf as string], rest, wert)\n return objekt\n}\n\n/** Neuer Entwurf mit geändertem Wert; der alte bleibt unverändert. */\nexport function runnerSetze(profil: RunnerProfil, pfad: RunnerPfad, wert: unknown): RunnerProfil {\n return setzeIn(profil, pfad, wert) as RunnerProfil\n}\n\nfunction flach(wert: unknown, prefix: string, ziel: Map<string, string>): void {\n if (isObject(wert)) {\n for (const [key, inner] of Object.entries(wert)) {\n if (!prefix && VERWALTET.has(key)) continue\n flach(inner, prefix ? `${prefix}.${key}` : key, ziel)\n }\n return\n }\n ziel.set(prefix, JSON.stringify(wert ?? null))\n}\n\n/** Feldweise Unterschiede (Pfad in Punktschreibweise), sortiert; ohne `version` und `aenderung`. */\nexport function runnerUnterschiede(entwurf: RunnerProfil, gespeichert: RunnerProfil): RunnerUnterschied[] {\n const a = new Map<string, string>()\n const b = new Map<string, string>()\n flach(entwurf, '', a)\n flach(gespeichert, '', b)\n const pfade = [...new Set([...a.keys(), ...b.keys()])].sort()\n return pfade\n .filter((pfad) => a.get(pfad) !== b.get(pfad))\n .map((pfad) => ({ pfad, entwurf: a.get(pfad) ?? '–', gespeichert: b.get(pfad) ?? '–' }))\n}\n\nexport function runnerGeaendert(entwurf: RunnerProfil | null, gespeichert: RunnerProfil | null): boolean {\n if (!entwurf || !gespeichert) return false\n return runnerUnterschiede(entwurf, gespeichert).length > 0\n}\n\nexport function runnerVersion(profil: RunnerProfil | null | undefined): number {\n const version = runnerWert(profil, ['version'])\n return typeof version === 'number' ? version : 0\n}\n\n/** Prioritäten des Entwurfs nach Rang (1 = höchster), fehlerhafte Einträge übersprungen. */\nexport function runnerPrioritaeten(profil: RunnerProfil | null | undefined): RunnerPrioritaet[] {\n const liste = runnerWert(profil, ['prioritaeten'])\n if (!Array.isArray(liste)) return []\n return liste\n .filter(isObject)\n .map((eintrag) => ({\n klasse: String(eintrag.klasse ?? ''),\n rang: typeof eintrag.rang === 'number' ? eintrag.rang : 0,\n verdraengbar: eintrag.verdraengbar !== false,\n min: typeof eintrag.min === 'number' ? eintrag.min : 0,\n }))\n .sort((x, y) => x.rang - y.rang || x.klasse.localeCompare(y.klasse))\n}\n\n/** Eintrag an Position `index` um eine Stelle verschieben; Ränge werden fortlaufend neu vergeben. */\nexport function runnerVerschiebe(profil: RunnerProfil, index: number, richtung: -1 | 1): RunnerProfil {\n const liste = runnerPrioritaeten(profil)\n const ziel = index + richtung\n if (index < 0 || ziel < 0 || ziel >= liste.length) return profil\n const neu = [...liste]\n ;[neu[index], neu[ziel]] = [neu[ziel] as RunnerPrioritaet, neu[index] as RunnerPrioritaet]\n return runnerSetze(profil, ['prioritaeten'], neu.map((eintrag, i) => ({ ...eintrag, rang: i + 1 })))\n}\n\n/** Eigenschaft eines Prioritätseintrags (Position in der sortierten Liste) ändern. */\nexport function runnerPrioritaetSetze(profil: RunnerProfil, index: number, aenderung: Partial<Pick<RunnerPrioritaet, 'verdraengbar' | 'min'>>): RunnerProfil {\n const liste = runnerPrioritaeten(profil)\n if (!liste[index]) return profil\n return runnerSetze(profil, ['prioritaeten'], liste.map((eintrag, i) => (i === index ? { ...eintrag, ...aenderung } : eintrag)))\n}\n\n/** Wer bei knapper Kapazität zuerst weicht: der verdrängbare Eintrag mit dem niedrigsten Rang (größte Zahl). */\nexport function runnerWeichtZuerst(liste: readonly RunnerPrioritaet[]): RunnerPrioritaet | null {\n return [...liste].reverse().find((eintrag) => eintrag.verdraengbar) ?? null\n}\n\n/** Klassenname wie im Backend (`auditcore_runner.profile.CLASS_NAME`). */\nexport const RUNNER_KLASSEN_NAME = /^[a-z0-9][a-z0-9-]{0,30}$/\nexport type RunnerKlassenArt = 'cpu' | 'gpu'\n\nexport function runnerKlassen(profil: RunnerProfil | null | undefined): string[] {\n const klassen = runnerWert(profil, ['klassen'])\n return isObject(klassen) ? Object.keys(klassen).sort() : []\n}\n\nexport function runnerKlassenArt(profil: RunnerProfil | null | undefined, name: string): RunnerKlassenArt {\n return runnerWert(profil, ['klassen', name, 'art']) === 'gpu' ? 'gpu' : 'cpu'\n}\n\n/** Fehlerart eines Klassennamens; `null` = gültig. `alt` ist der bisherige Name beim Umbenennen. */\nexport function runnerKlassenNameFehler(profil: RunnerProfil | null | undefined, name: string, alt?: string): 'ungueltig' | 'vergeben' | null {\n if (!RUNNER_KLASSEN_NAME.test(name)) return 'ungueltig'\n if (name !== alt && runnerKlassen(profil).includes(name)) return 'vergeben'\n return null\n}\n\n/** Neue Klasse der Art `cpu` mit neutralen Werten (höchstens eine Instanz). */\nexport function runnerKlasseHinzu(profil: RunnerProfil, name: string): RunnerProfil {\n if (runnerKlassenNameFehler(profil, name)) return profil\n return runnerSetze(profil, ['klassen', name], {\n art: 'cpu', aktiv: true, cpus: 2, speicher_gb: 4, min_instanzen: 0, max_instanzen: 1, leise_max: -1, vram_mb: 0,\n labels: ['self-hosted', 'linux', 'x64', name],\n })\n}\n\n/** Klasse umbenennen; Verweise in Karten, Prioritäten und das gleichnamige Label ziehen mit. */\nexport function runnerKlasseUmbenennen(profil: RunnerProfil, alt: string, neu: string): RunnerProfil {\n const klassen = runnerWert(profil, ['klassen'])\n if (alt === neu || !isObject(klassen) || !(alt in klassen) || runnerKlassenNameFehler(profil, neu, alt)) return profil\n const eintrag = klassen[alt]\n const labels = runnerWert(eintrag as RunnerProfil, ['labels'])\n const umbenannt = isObject(eintrag) && Array.isArray(labels) ? { ...eintrag, labels: labels.map((l) => (l === alt ? neu : l)) } : eintrag\n const neueKlassen = Object.fromEntries(Object.entries(klassen).map(([k, v]) => (k === alt ? [neu, umbenannt] : [k, v])))\n let ergebnis = runnerSetze(profil, ['klassen'], neueKlassen)\n for (const liste of ['gpus', 'prioritaeten'] as const) {\n const eintraege = runnerWert(ergebnis, [liste])\n if (Array.isArray(eintraege)) {\n ergebnis = runnerSetze(ergebnis, [liste], eintraege.map((e) => (isObject(e) && e.klasse === alt ? { ...e, klasse: neu } : e)))\n }\n }\n return ergebnis\n}\n","// Umsetzung von Formulareingaben in Profilwerte (gemeinsam für Controller und Ansicht).\n\nexport type RunnerFeldArt = 'zahl' | 'schalter' | 'auswahl' | 'text' | 'liste'\n\n/** Eingabe eines Feldes in den Profilwert umsetzen (Zahl, Liste, Schalter, Text). */\nexport function runnerEingabe(feldArt: RunnerFeldArt, roh: string | boolean): unknown {\n if (feldArt === 'schalter') return Boolean(roh)\n const text = String(roh)\n if (feldArt === 'zahl') {\n const zahlWert = Number(text.replace(',', '.'))\n return text.trim() !== '' && Number.isFinite(zahlWert) ? zahlWert : text\n }\n if (feldArt === 'liste') return text.split(',').map((teil) => teil.trim()).filter(Boolean)\n return text\n}\n\n/** Schlüssel des Rohtexts einer Werkzeug-Zahleneingabe. */\nexport function runnerWerkzeugFeldId(profil: string, werkzeug: string, feld: string): string {\n return `werkzeug:${profil}:${werkzeug}:${feld}`\n}\n","// Aktionen der Runner-Konsole, nach Bereich getrennt: Profil-Entwurf (Prüfen,\n// Anwenden, Konflikt, Prioritäten) und Werkzeug-Einstellungen.\n\nimport type { Store } from '../store'\nimport type { RunnerController, RunnerData } from './controller'\nimport { runnerEingabe, runnerWerkzeugFeldId } from './eingabe'\nimport { runnerKlasseHinzu, runnerKlassenNameFehler, runnerKlasseUmbenennen, runnerPrioritaetSetze, runnerSetze, runnerUnterschiede, runnerVerschiebe, runnerVersion } from './profil'\nimport type { RunnerPort, RunnerProfil, RunnerProfilStand, RunnerPruefung } from './types'\n\ntype Run = <T>(kind: string, task: (port: RunnerPort) => Promise<T>) => Promise<T | null>\n\nexport interface RunnerKontext {\n store: Store<RunnerData>\n run: Run\n applied: (version: number) => void\n}\n\ntype ProfilAktionen = Pick<RunnerController, 'setze' | 'eingabe' | 'verwerfen' | 'pruefen' | 'anwenden' | 'gespeichertUebernehmen' | 'entwurfTrotzdemAnwenden' | 'verschiebe' | 'prioritaet'>\ntype WerkzeugAktionen = Pick<RunnerController, 'werkzeug' | 'werkzeugZahl' | 'werkzeugeSpeichern'>\ntype KlassenAktionen = Pick<RunnerController, 'neueKlasseEingabe' | 'klasseHinzufuegen' | 'klassenNameEingabe' | 'klasseUmbenennen'>\n\nfunction uebernimmStand(store: Store<RunnerData>, stand: RunnerProfilStand): void {\n store.set({ stand, entwurf: stand.profil, pruefung: null, konflikt: null, eingaben: {}, klassenNamen: {}, neueKlasse: '' })\n}\n\n/** Entwurf ändern; eine alte Prüfung und Rückmeldung gelten danach nicht mehr. */\nfunction aendere(store: Store<RunnerData>, aenderung: (entwurf: RunnerProfil) => RunnerProfil): void {\n const entwurf = store.get().entwurf\n if (entwurf) store.set({ entwurf: aenderung(entwurf), pruefung: null, meldung: null })\n}\n\nasync function konfliktLaden({ store, run }: RunnerKontext, entwurf: RunnerProfil, ergebnis: RunnerPruefung): Promise<void> {\n const gespeichert = await run('anwenden', (port) => port.profil())\n if (!gespeichert) return\n store.set({ pruefung: null, konflikt: { gespeichert, meldung: ergebnis.meldung ?? '', unterschiede: runnerUnterschiede(entwurf, gespeichert.profil) } })\n}\n\nasync function nachAnwenden({ store, run, applied }: RunnerKontext, ergebnis: RunnerPruefung, version: number): Promise<void> {\n const neu = await run('load', (port) => Promise.all([port.status(), port.profil()]))\n if (neu) {\n uebernimmStand(store, neu[1])\n store.set({ status: neu[0] })\n }\n store.set({ pruefung: ergebnis, meldung: { key: 'angewendet', params: { version }, ton: 'success' } })\n applied(version)\n}\n\nasync function anwendenMit(kontext: RunnerKontext, erwartet: number): Promise<void> {\n const { store, run } = kontext\n const entwurf = store.get().entwurf\n if (!entwurf) return\n store.set({ meldung: null })\n const ergebnis = await run('anwenden', (port) => port.anwenden(entwurf, erwartet))\n if (!ergebnis) return\n if (ergebnis.konflikt) return konfliktLaden(kontext, entwurf, ergebnis)\n if (!ergebnis.angewendet) {\n store.set({ pruefung: ergebnis, meldung: { key: 'nichtAngewendet', params: { meldung: ergebnis.meldung ?? '' }, ton: 'warning' } })\n return\n }\n return nachAnwenden(kontext, ergebnis, ergebnis.version ?? erwartet + 1)\n}\n\nexport function profilAktionen(kontext: RunnerKontext): ProfilAktionen {\n const { store, run } = kontext\n return {\n setze: (pfad, wert) => aendere(store, (entwurf) => runnerSetze(entwurf, pfad, wert)),\n eingabe(pfad, art, roh) {\n if (typeof roh === 'string') store.set({ eingaben: { ...store.get().eingaben, [pfad.join('.')]: roh } })\n aendere(store, (entwurf) => {\n const neu = runnerSetze(entwurf, pfad, runnerEingabe(art, roh))\n // Art cpu hat keinen Grafikspeicher (Backend: vram_mb nur für Klassen der Art gpu).\n const istArt = pfad.length === 3 && pfad[0] === 'klassen' && pfad[2] === 'art'\n return istArt && roh === 'cpu' ? runnerSetze(neu, ['klassen', pfad[1] as string, 'vram_mb'], 0) : neu\n })\n },\n verwerfen() {\n const stand = store.get().stand\n if (stand) uebernimmStand(store, stand)\n store.set({ meldung: null })\n },\n async pruefen() {\n const entwurf = store.get().entwurf\n if (!entwurf) return\n store.set({ meldung: null })\n const pruefung = await run('pruefen', (port) => port.pruefen(entwurf))\n if (pruefung) store.set({ pruefung })\n },\n anwenden: () => anwendenMit(kontext, runnerVersion(store.get().stand?.profil)),\n gespeichertUebernehmen() {\n const konflikt = store.get().konflikt\n if (konflikt) uebernimmStand(store, konflikt.gespeichert)\n },\n async entwurfTrotzdemAnwenden() {\n const konflikt = store.get().konflikt\n if (!konflikt) return\n store.set({ stand: konflikt.gespeichert, konflikt: null })\n await anwendenMit(kontext, runnerVersion(konflikt.gespeichert.profil))\n },\n verschiebe: (index, richtung) => aendere(store, (entwurf) => runnerVerschiebe(entwurf, index, richtung)),\n prioritaet: (index, aenderung) => aendere(store, (entwurf) => runnerPrioritaetSetze(entwurf, index, aenderung)),\n }\n}\n\nexport function werkzeugAktionen({ store, run }: RunnerKontext): WerkzeugAktionen {\n return {\n werkzeug(profil, werkzeug, aenderung) {\n const alle = store.get().werkzeugEntwurf\n const bisher = alle?.[profil]?.[werkzeug]\n if (!alle || !bisher) return\n store.set({ werkzeugEntwurf: { ...alle, [profil]: { ...alle[profil], [werkzeug]: { ...bisher, ...aenderung } } }, meldung: null })\n },\n werkzeugZahl(profil, werkzeug, feld, roh) {\n const zahl = Number(roh)\n store.set({ eingaben: { ...store.get().eingaben, [runnerWerkzeugFeldId(profil, werkzeug, feld)]: roh } })\n if (roh.trim() !== '' && Number.isInteger(zahl) && zahl >= 0) this.werkzeug(profil, werkzeug, { [feld]: zahl })\n },\n async werkzeugeSpeichern() {\n const profile = store.get().werkzeugEntwurf\n if (!profile) return\n const ok = await run('werkzeuge', async (port) => {\n await port.werkzeugeSpeichern(profile)\n return true\n })\n if (!ok) return\n const werkzeuge = store.get().werkzeuge\n store.set({ werkzeuge: werkzeuge ? { ...werkzeuge, profile } : werkzeuge, meldung: { key: 'gespeichert', ton: 'success' } })\n },\n }\n}\n\nexport function klassenAktionen({ store }: RunnerKontext): KlassenAktionen {\n return {\n neueKlasseEingabe: (roh) => store.set({ neueKlasse: roh }),\n klasseHinzufuegen() {\n const { entwurf, neueKlasse } = store.get()\n const name = neueKlasse.trim()\n if (!entwurf || runnerKlassenNameFehler(entwurf, name)) return\n aendere(store, (profil) => runnerKlasseHinzu(profil, name))\n store.set({ neueKlasse: '' })\n },\n klassenNameEingabe: (alt, roh) => store.set({ klassenNamen: { ...store.get().klassenNamen, [alt]: roh } }),\n klasseUmbenennen(alt) {\n const { entwurf, klassenNamen } = store.get()\n const neu = (klassenNamen[alt] ?? alt).trim()\n if (!entwurf || neu === alt || runnerKlassenNameFehler(entwurf, neu, alt)) return\n const rest = Object.fromEntries(Object.entries(klassenNamen).filter(([k]) => k !== alt))\n aendere(store, (profil) => runnerKlasseUmbenennen(profil, alt, neu))\n store.set({ klassenNamen: rest })\n },\n }\n}\n","// Zustandsautomat von <flowaudit-runner-console> (Vue und React): lädt Status,\n// Profil und Werkzeuge über den Port, verwaltet den Profil-Entwurf mit Prüfen,\n// Anwenden und Konfliktauflösung sowie die Werkzeug-Einstellungen. Vue bindet\n// ihn mit useStore, React mit useStoreState.\n\nimport { createRunner, createStore, IDLE, type RequestState, type Store } from '../store'\nimport type { MessageParams } from '../i18n'\nimport type { RunnerMessageKey } from './messages'\nimport type { RunnerFeldArt } from './eingabe'\nimport { createRunnerRestPort } from './port'\nimport { klassenAktionen, profilAktionen, werkzeugAktionen, type RunnerKontext } from './aktionen'\nimport type { RunnerPfad, RunnerPrioritaet, RunnerUnterschied } from './profil'\nimport type {\n RunnerAnsicht,\n RunnerPort,\n RunnerProfil,\n RunnerProfilStand,\n RunnerPruefung,\n RunnerStatus,\n RunnerWerkzeugEinstellung,\n RunnerWerkzeuge,\n RunnerWerkzeugProfile,\n} from './types'\n\nexport interface RunnerCallbacks {\n applied?: (version: number) => void\n failed?: (message: string) => void\n}\n\nexport interface RunnerKonfliktStand {\n gespeichert: RunnerProfilStand\n meldung: string\n unterschiede: readonly RunnerUnterschied[]\n}\n\n/** Rückmeldung nach einer Aktion (übersetzt in der Ansicht). */\nexport interface RunnerMeldung {\n key: RunnerMessageKey\n params?: MessageParams\n ton: 'success' | 'warning'\n}\n\n/** Stand; `error` ist die Meldung der letzten abgelehnten Anfrage. */\nexport interface RunnerData extends RequestState<string> {\n ansicht: RunnerAnsicht\n status: RunnerStatus | null\n stand: RunnerProfilStand | null\n entwurf: RunnerProfil | null\n pruefung: RunnerPruefung | null\n konflikt: RunnerKonfliktStand | null\n werkzeuge: RunnerWerkzeuge | null\n werkzeugEntwurf: RunnerWerkzeugProfile | null\n meldung: RunnerMeldung | null\n /** Rohtext der Eingabefelder je Feld-ID, solange getippt wird (Zahlen, Listen). */\n eingaben: Readonly<Record<string, string>>\n /** Entwürfe der Klassennamen beim Umbenennen (bisheriger Name → Eingabe). */\n klassenNamen: Readonly<Record<string, string>>\n /** Eingabe „Neue Klasse“. */\n neueKlasse: string\n}\n\nexport interface RunnerSource {\n /** Fachlogik; hat Vorrang vor `api`. */\n port: () => RunnerPort | null | undefined\n /** Basis-URL der JSON-API (z. B. `/api`), wenn kein Port übergeben wird. */\n api?: () => string | null | undefined\n callbacks?: () => RunnerCallbacks\n}\n\nexport interface RunnerController {\n store: Store<RunnerData>\n load: () => Promise<void>\n zeige: (ansicht: RunnerAnsicht) => void\n setze: (pfad: RunnerPfad, wert: unknown) => void\n /** Eingabe eines Formularfelds: Rohtext merken, umgesetzten Wert in den Entwurf. */\n eingabe: (pfad: RunnerPfad, art: RunnerFeldArt, roh: string | boolean) => void\n verwerfen: () => void\n pruefen: () => Promise<void>\n anwenden: () => Promise<void>\n gespeichertUebernehmen: () => void\n entwurfTrotzdemAnwenden: () => Promise<void>\n verschiebe: (index: number, richtung: -1 | 1) => void\n prioritaet: (index: number, aenderung: Partial<Pick<RunnerPrioritaet, 'verdraengbar' | 'min'>>) => void\n werkzeug: (profil: string, werkzeug: string, aenderung: Partial<RunnerWerkzeugEinstellung>) => void\n /** Zahleneingabe (Zeitlimit, Priorität) eines Werkzeugs; ungültiger Rohtext bleibt nur sichtbar. */\n werkzeugZahl: (profil: string, werkzeug: string, feld: 'zeitlimit_s' | 'prioritaet', roh: string) => void\n werkzeugeSpeichern: () => Promise<void>\n neueKlasseEingabe: (roh: string) => void\n klasseHinzufuegen: () => void\n klassenNameEingabe: (alt: string, roh: string) => void\n klasseUmbenennen: (alt: string) => void\n}\n\nexport const INITIAL_RUNNER: RunnerData = {\n ...IDLE,\n ansicht: 'status',\n status: null,\n stand: null,\n entwurf: null,\n pruefung: null,\n konflikt: null,\n werkzeuge: null,\n werkzeugEntwurf: null,\n meldung: null,\n eingaben: {},\n klassenNamen: {},\n neueKlasse: '',\n}\n\nexport const RUNNER_ANSICHTEN: readonly RunnerAnsicht[] = ['status', 'einstellungen', 'werkzeuge', 'prioritaeten']\n\nconst errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))\n\nfunction resolvePort(source: RunnerSource): RunnerPort | null {\n const port = source.port()\n if (port) return port\n const api = source.api?.()\n return api ? createRunnerRestPort({ baseUrl: api }) : null\n}\n\nexport function createRunnerController(source: RunnerSource): RunnerController {\n const store = createStore<RunnerData>({ ...INITIAL_RUNNER })\n const run = createRunner(store, () => resolvePort(source), errorText, (message) => source.callbacks?.().failed?.(message))\n const kontext: RunnerKontext = { store, run, applied: (version) => source.callbacks?.().applied?.(version) }\n return {\n store,\n async load() {\n const daten = await run('load', (port) => Promise.all([port.status(), port.profil(), port.werkzeuge()]))\n if (!daten) return\n const [status, stand, werkzeuge] = daten\n store.set({ status, werkzeuge, werkzeugEntwurf: werkzeuge.profile, stand, entwurf: stand.profil, pruefung: null, konflikt: null, eingaben: {}, klassenNamen: {}, neueKlasse: '' })\n },\n zeige(ansicht) {\n store.set({ ansicht })\n },\n ...profilAktionen(kontext),\n ...werkzeugAktionen(kontext),\n ...klassenAktionen(kontext),\n }\n}\n","// Ansichtsmodelle der Runner-Konsole: alles, was Vue und React darstellen,\n// wird hier aus dem Zustand abgeleitet (gleiche Zeilen, gleiche Texte).\n\nimport type { Translate } from '../i18n'\nimport type { RunnerData } from './controller'\nimport { RUNNER_ANSICHTEN } from './controller'\nimport type { RunnerMessageKey } from './messages'\nimport type { RunnerFeldArt } from './eingabe'\nimport { runnerGeaendert, runnerKlassen, runnerKlassenArt, runnerKlassenNameFehler, runnerWert, type RunnerPfad } from './profil'\nimport type { RunnerAnsicht, RunnerDateiAenderung, RunnerProblem, RunnerProfil, RunnerStatus } from './types'\n\ntype T = Translate<RunnerMessageKey>\n\nconst TAB_KEYS: Readonly<Record<RunnerAnsicht, RunnerMessageKey>> = {\n status: 'tabStatus',\n einstellungen: 'tabEinstellungen',\n werkzeuge: 'tabWerkzeuge',\n prioritaeten: 'tabPrioritaeten',\n}\n\nexport interface RunnerTab {\n id: RunnerAnsicht\n label: string\n selected: boolean\n}\n\nexport function runnerTabs(state: RunnerData, t: T): RunnerTab[] {\n return RUNNER_ANSICHTEN.map((id) => ({ id, label: t(TAB_KEYS[id]), selected: state.ansicht === id }))\n}\n\n/** Nächster Reiter für Pfeiltasten (zyklisch). */\nexport function runnerNachbarTab(aktuell: RunnerAnsicht, richtung: -1 | 1): RunnerAnsicht {\n const index = RUNNER_ANSICHTEN.indexOf(aktuell)\n const next = (index + richtung + RUNNER_ANSICHTEN.length) % RUNNER_ANSICHTEN.length\n return RUNNER_ANSICHTEN[next] as RunnerAnsicht\n}\n\nexport function runnerNurLesen(state: RunnerData): boolean {\n return Boolean(state.status?.nur_lesen || state.stand?.nur_lesen)\n}\n\nexport function runnerIstGeaendert(state: RunnerData): boolean {\n return runnerGeaendert(state.entwurf, state.stand?.profil ?? null)\n}\n\nexport function runnerMeta(state: RunnerData, t: T): string {\n const status = state.status\n if (!status) return ''\n const sync = !status.sync || status.sync === 'aus' ? t('syncAus') : t('syncZentral', { sync: status.sync })\n return `${t('meta', { rechner: status.rechner, version: status.profil_version })} · ${sync}`\n}\n\nexport interface RunnerHinweis {\n ton: 'danger' | 'warning' | 'info'\n text: string\n}\n\nexport function runnerHinweise(state: RunnerData, t: T): RunnerHinweis[] {\n const status = state.status\n const hinweise: RunnerHinweis[] = []\n if (runnerNurLesen(state)) hinweise.push({ ton: 'info', text: t('nurLesen') })\n if (!status) return hinweise\n if (status.unbekannte_runner?.length) hinweise.push({ ton: 'danger', text: t('hinweisUnbekannt', { namen: status.unbekannte_runner.join(', ') }) })\n if (!status.image_vorhanden) hinweise.push({ ton: 'warning', text: t('hinweisImage') })\n if (status.netzsperre_aktiv === false) hinweise.push({ ton: 'warning', text: t('hinweisNetzsperre') })\n return hinweise\n}\n\nexport interface RunnerEintrag {\n label: string\n wert: string\n}\n\nfunction jaNein(wert: boolean | null | undefined, ja: string, nein: string, t: T): string {\n if (wert === null || wert === undefined) return t('unbekannt')\n return wert ? ja : nein\n}\n\nexport function runnerUeberblick(status: RunnerStatus | null, t: T): RunnerEintrag[] {\n if (!status) return []\n const aenderung = status.aenderung?.zeit ? t('aenderungWert', { zeit: status.aenderung.zeit, quelle: status.aenderung.quelle }) : t('aenderungKeine')\n const eintraege: RunnerEintrag[] = [\n { label: t('ziel'), wert: status.ziel || t('unbekannt') },\n { label: t('sollQuelle'), wert: status.soll_quelle },\n ...(status.auth_art ? [{ label: t('anmeldung'), wert: status.auth_art }] : []),\n { label: t('profilVersion'), wert: String(status.profil_version) },\n { label: t('aenderung'), wert: aenderung },\n { label: t('image'), wert: jaNein(status.image_vorhanden, t('vorhanden'), t('fehlt'), t) },\n { label: t('netzsperre'), wert: jaNein(status.netzsperre_aktiv, t('aktiv'), t('inaktiv'), t) },\n { label: t('kontingent'), wert: status.github_rest_kontingent === null ? t('unbekannt') : String(status.github_rest_kontingent) },\n ]\n if (status.runner_version) {\n eintraege.push({\n label: t('runnerVersion'),\n wert: status.runner_frist ? t('runnerVersionFrist', { version: status.runner_version, frist: status.runner_frist }) : status.runner_version,\n })\n }\n return eintraege\n}\n\nexport interface RunnerKlassenZeile {\n name: string\n aktiv: boolean\n soll: string\n max: string\n instanzen: string\n registriert: string\n belegt: string\n warteschlange: string\n gruende: string\n}\n\nconst zahl = (wert: number | null | undefined): string => (wert === null || wert === undefined ? '–' : String(wert))\n\nexport function runnerKlassenZeilen(status: RunnerStatus | null): RunnerKlassenZeile[] {\n if (!status) return []\n return Object.entries(status.klassen)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, klasse]) => ({\n name,\n aktiv: klasse.aktiv,\n soll: zahl(klasse.soll),\n max: zahl(klasse.max),\n instanzen: zahl(klasse.instanzen_aktiv),\n registriert: zahl(klasse.registriert),\n belegt: zahl(klasse.belegt),\n warteschlange: zahl(klasse.warteschlange),\n gruende: klasse.gruende.join('; '),\n }))\n}\n\nexport function runnerHatWarteschlange(status: RunnerStatus | null): boolean {\n return Boolean(status && Object.values(status.klassen).some((klasse) => typeof klasse.warteschlange === 'number'))\n}\n\nfunction kurz(wert: unknown): string {\n if (wert === null || wert === undefined) return '–'\n if (Array.isArray(wert)) {\n const namen = wert.map((eintrag) => (typeof eintrag === 'object' && eintrag !== null ? String((eintrag as Record<string, unknown>).name ?? '') : String(eintrag))).filter(Boolean)\n return namen.length ? namen.join(', ') : String(wert.length)\n }\n if (typeof wert === 'object') return JSON.stringify(wert)\n return String(wert)\n}\n\n/** Hardware-Angaben des Rechners als Liste (Schlüssel wie vom Backend geliefert). */\nexport function runnerHardware(hardware: Readonly<Record<string, unknown>> | null | undefined): RunnerEintrag[] {\n if (!hardware) return []\n return Object.entries(hardware)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([label, wert]) => ({ label, wert: kurz(wert) }))\n}\n\n// ---------------------------------------------------------------- Einstellungen\n\n\nexport interface RunnerOption {\n wert: string\n label: string\n}\n\nexport interface RunnerFeld {\n /** Pfad in Punktschreibweise; zugleich Zuordnung der Fehlermeldungen des Backends. */\n id: string\n pfad: RunnerPfad\n label: string\n art: RunnerFeldArt\n /** Anzeigewert für Eingabe- und Auswahlfelder. */\n wert: string\n /** Zustand eines Schalters. */\n an: boolean\n optionen: readonly RunnerOption[]\n schritt: string\n fehler: string\n}\n\n/** Umbenennen einer Klasse (nur Abschnitte vom Typ Klasse). */\nexport interface RunnerKlassenName {\n alt: string\n wert: string\n fehler: string\n geaendert: boolean\n}\n\nexport interface RunnerAbschnitt {\n id: string\n titel: string\n felder: RunnerFeld[]\n klasse?: RunnerKlassenName\n}\n\ninterface FeldDef {\n pfad: RunnerPfad\n key: RunnerMessageKey\n art: RunnerFeldArt\n schritt?: string\n optionen?: (t: T) => readonly RunnerOption[]\n}\n\nconst SOLL_QUELLEN = [['statisch', 'oStatisch'], ['lokal', 'oLokal'], ['datei', 'oDatei']] as const\nconst sollQuellen = (t: T): RunnerOption[] => SOLL_QUELLEN.map(([wert, key]) => ({ wert, label: t(key) }))\n\nconst ALLGEMEIN: readonly FeldDef[] = [\n { pfad: ['soll_quelle', 'art'], key: 'fSollQuelle', art: 'auswahl', optionen: sollQuellen },\n { pfad: ['soll_quelle', 'datei'], key: 'fSollDatei', art: 'text' },\n { pfad: ['backend'], key: 'fBackend', art: 'text' },\n { pfad: ['image'], key: 'fImage', art: 'text' },\n { pfad: ['reserve', 'cpus'], key: 'fReserveCpus', art: 'zahl' },\n { pfad: ['reserve', 'speicher_gb'], key: 'fReserveSpeicher', art: 'zahl' },\n]\n\nconst REGELUNG: readonly FeldDef[] = [\n { pfad: ['skalierung', 'vorrang_interaktiv'], key: 'fVorrang', art: 'schalter' },\n { pfad: ['skalierung', 'leerlauf_minuten'], key: 'fLeerlauf', art: 'zahl' },\n { pfad: ['skalierung', 'anteil_bei_nutzung'], key: 'fAnteil', art: 'zahl', schritt: '0.05' },\n { pfad: ['skalierung', 'swap_sperre_gb'], key: 'fSwap', art: 'zahl', schritt: '0.5' },\n { pfad: ['skalierung', 'ram_frei_min_gb'], key: 'fRam', art: 'zahl', schritt: '0.5' },\n { pfad: ['skalierung', 'last_je_kern_max'], key: 'fLast', art: 'zahl', schritt: '0.05' },\n { pfad: ['skalierung', 'temperatur_max_c'], key: 'fTemperatur', art: 'zahl' },\n { pfad: ['skalierung', 'volllast_von'], key: 'fVon', art: 'zahl' },\n { pfad: ['skalierung', 'volllast_bis'], key: 'fBis', art: 'zahl' },\n { pfad: ['skalierung', 'haltezeit_s'], key: 'fHaltezeit', art: 'zahl' },\n]\n\nconst THERMIK: readonly FeldDef[] = [\n { pfad: ['skalierung', 'thermik', 'aktiv'], key: 'fThermikAktiv', art: 'schalter' },\n { pfad: ['skalierung', 'thermik', 'url'], key: 'fThermikUrl', art: 'text' },\n]\n\nconst NETZ: readonly FeldDef[] = [\n { pfad: ['netz', 'aktiv'], key: 'fNetzAktiv', art: 'schalter' },\n { pfad: ['netz', 'sperre_pflicht'], key: 'fSperre', art: 'schalter' },\n]\n\nconst ARTEN = (t: T): RunnerOption[] => [{ wert: 'cpu', label: t('oCpu') }, { wert: 'gpu', label: t('oGpu') }]\n\nconst KLASSE: readonly (Omit<FeldDef, 'pfad'> & { feld: string })[] = [\n { feld: 'art', key: 'kArt', art: 'auswahl', optionen: ARTEN },\n { feld: 'aktiv', key: 'kAktiv', art: 'schalter' },\n { feld: 'min_instanzen', key: 'kMin', art: 'zahl' },\n { feld: 'max_instanzen', key: 'kMax', art: 'zahl' },\n { feld: 'leise_max', key: 'kLeise', art: 'zahl' },\n { feld: 'cpus', key: 'kCpus', art: 'zahl' },\n { feld: 'speicher_gb', key: 'kSpeicher', art: 'zahl' },\n { feld: 'vram_mb', key: 'kVram', art: 'zahl' },\n { feld: 'labels', key: 'kLabels', art: 'liste' },\n]\n\nfunction anzeige(wert: unknown, art: RunnerFeldArt): string {\n if (art === 'liste') return Array.isArray(wert) ? wert.map(String).join(', ') : ''\n if (wert === null || wert === undefined) return ''\n return String(wert)\n}\n\ninterface Kontext {\n t: T\n fehler: ReadonlyMap<string, string>\n eingaben: Readonly<Record<string, string>>\n}\n\nfunction feld(profil: RunnerProfil, def: FeldDef, { t, fehler, eingaben }: Kontext): RunnerFeld | null {\n const wert = runnerWert(profil, def.pfad)\n if (wert === undefined) return null\n const id = def.pfad.join('.')\n return {\n id,\n pfad: def.pfad,\n label: t(def.key),\n art: def.art,\n wert: eingaben[id] ?? anzeige(wert, def.art),\n an: wert === true,\n optionen: def.optionen?.(t) ?? [],\n schritt: def.schritt ?? '1',\n fehler: fehler.get(id) ?? '',\n }\n}\n\nfunction abschnitt(id: string, titel: string, profil: RunnerProfil, defs: readonly FeldDef[], kontext: Kontext): RunnerAbschnitt | null {\n const felder = defs.map((def) => feld(profil, def, kontext)).filter((entry): entry is RunnerFeld => entry !== null)\n return felder.length ? { id, titel, felder } : null\n}\n\n/** Feldpfad des Backends (`gpus[0].erlaubt`) in die Feld-ID der Ansicht (`gpus.0.erlaubt`). */\nexport function runnerFeldId(feld: string): string {\n return feld.replace(/\\[(\\d+)\\]/g, '.$1')\n}\n\n/** Meldungen des Backends: aus der letzten Prüfung, sonst aus dem geladenen Stand. */\nexport function runnerProbleme(state: RunnerData): readonly RunnerProblem[] {\n return state.pruefung?.probleme ?? state.stand?.probleme ?? []\n}\n\n/** Formularabschnitte aus dem Entwurf; nur Felder, die das Profil tatsächlich enthält. */\nfunction namensFehler(t: T, fehler: 'ungueltig' | 'vergeben' | null): string {\n if (fehler === 'ungueltig') return t('klasseNameUngueltig')\n return fehler === 'vergeben' ? t('klasseNameVergeben') : ''\n}\n\nfunction klassenAbschnitt(state: RunnerData, profil: RunnerProfil, name: string, kontext: Kontext): RunnerAbschnitt | null {\n const gpu = runnerKlassenArt(profil, name) === 'gpu'\n const defs = KLASSE.filter((def) => gpu || def.feld !== 'vram_mb').map(({ feld: schluessel, ...rest }) => ({ ...rest, pfad: ['klassen', name, schluessel] }))\n const eintrag = abschnitt(`klasse-${name}`, kontext.t('abschnittKlasse', { name }), profil, defs, kontext)\n if (!eintrag) return null\n const wert = state.klassenNamen[name] ?? name\n const fehler = wert === name ? '' : namensFehler(kontext.t, runnerKlassenNameFehler(profil, wert.trim(), name))\n return { ...eintrag, klasse: { alt: name, wert, fehler, geaendert: wert.trim() !== name && !fehler } }\n}\n\n/** Formularabschnitte aus dem Entwurf; nur Felder, die das Profil tatsächlich enthält. */\nexport function runnerAbschnitte(state: RunnerData, t: T): RunnerAbschnitt[] {\n const profil = state.entwurf\n if (!profil) return []\n const kontext: Kontext = { t, fehler: new Map(runnerProbleme(state).map((problem) => [runnerFeldId(problem.feld), problem.meldung])), eingaben: state.eingaben }\n const klassenNamen = runnerKlassen(profil)\n const gpuKlassen = klassenNamen.filter((name) => runnerKlassenArt(profil, name) === 'gpu')\n const result: (RunnerAbschnitt | null)[] = [\n abschnitt('allgemein', t('abschnittAllgemein'), profil, ALLGEMEIN, kontext),\n abschnitt('regelung', t('abschnittRegelung'), profil, REGELUNG, kontext),\n abschnitt('thermik', t('abschnittThermik'), profil, THERMIK, kontext),\n abschnitt('netz', t('abschnittNetz'), profil, NETZ, kontext),\n ...klassenNamen.map((name) => klassenAbschnitt(state, profil, name, kontext)),\n ]\n const gpus = runnerWert(profil, ['gpus'])\n // Kartenauswahl nur, wenn es eine Klasse der Art gpu gibt; angeboten werden nur diese.\n if (Array.isArray(gpus) && gpuKlassen.length) {\n const optionen = (): RunnerOption[] => gpuKlassen.map((klasse) => ({ wert: klasse, label: klasse }))\n gpus.forEach((karte, index) => {\n const name = typeof karte === 'object' && karte !== null ? String((karte as Record<string, unknown>).name ?? index) : String(index)\n result.push(\n abschnitt(`karte-${index}`, t('abschnittKarte', { index, name }), profil, [\n { pfad: ['gpus', index, 'erlaubt'], key: 'gErlaubt', art: 'schalter' },\n { pfad: ['gpus', index, 'klasse'], key: 'gKlasse', art: 'auswahl', optionen },\n ], kontext),\n )\n })\n }\n return result.filter((entry): entry is RunnerAbschnitt => entry !== null)\n}\n\nexport interface RunnerNeueKlasse {\n wert: string\n fehler: string\n moeglich: boolean\n}\n\n/** Eingabe „Neue Klasse“ mit Prüfung wie im Backend (Fehler erst nach einer Eingabe). */\nexport function runnerNeueKlasse(state: RunnerData, t: T): RunnerNeueKlasse {\n const name = state.neueKlasse.trim()\n const fehler = name ? namensFehler(t, runnerKlassenNameFehler(state.entwurf, name)) : ''\n return { wert: state.neueKlasse, fehler, moeglich: Boolean(name) && !fehler }\n}\n\nexport interface RunnerVorschau {\n gueltig: boolean\n aenderungen: readonly RunnerDateiAenderung[]\n schritte: readonly string[]\n rootBefehl: string\n}\n\nexport function runnerVorschau(state: RunnerData): RunnerVorschau | null {\n const pruefung = state.pruefung\n if (!pruefung) return null\n return { gueltig: pruefung.gueltig, aenderungen: pruefung.aenderungen, schritte: pruefung.schritte, rootBefehl: pruefung.netzsperre_befehl ?? '' }\n}\n","// Ansichtsmodelle der Bereiche „Werkzeuge“ und „Prioritäten“.\n\nimport type { Translate } from '../i18n'\nimport type { RunnerData } from './controller'\nimport { runnerWerkzeugFeldId } from './eingabe'\nimport type { RunnerMessageKey } from './messages'\nimport { runnerPrioritaeten, runnerWeichtZuerst, type RunnerPrioritaet } from './profil'\n\ntype T = Translate<RunnerMessageKey>\n\n// ---------------------------------------------------------------- Werkzeuge\n\nexport interface RunnerWerkzeugZeile {\n id: string\n werkzeug: string\n bereich: string\n imImage: string\n aktiv: boolean\n zeitlimit: string\n prioritaet: string\n}\n\nexport interface RunnerWerkzeugGruppe {\n profil: string\n titel: string\n zeilen: RunnerWerkzeugZeile[]\n}\n\nexport function runnerWerkzeugGruppen(state: RunnerData, t: T): RunnerWerkzeugGruppe[] {\n const katalog = new Map((state.werkzeuge?.werkzeuge ?? []).map((w) => [w.name, w]))\n const profile = state.werkzeugEntwurf ?? {}\n return Object.keys(profile)\n .sort()\n .map((profil) => ({\n profil,\n titel: t('werkzeugProfil', { name: profil }),\n zeilen: Object.entries(profile[profil] ?? {})\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([werkzeug, einstellung]) => ({\n id: `${profil}-${werkzeug}`,\n werkzeug,\n bereich: katalog.get(werkzeug)?.bereich ?? '',\n imImage: katalog.get(werkzeug)?.im_image || t('nichtInstalliert'),\n aktiv: einstellung.aktiv,\n zeitlimit: state.eingaben[runnerWerkzeugFeldId(profil, werkzeug, 'zeitlimit_s')] ?? String(einstellung.zeitlimit_s),\n prioritaet: state.eingaben[runnerWerkzeugFeldId(profil, werkzeug, 'prioritaet')] ?? String(einstellung.prioritaet),\n })),\n }))\n}\n\nexport function runnerWerkzeugeGeaendert(state: RunnerData): boolean {\n return JSON.stringify(state.werkzeugEntwurf) !== JSON.stringify(state.werkzeuge?.profile ?? null)\n}\n\n// ---------------------------------------------------------------- Prioritäten\n\nexport interface RunnerPrioritaetZeile extends RunnerPrioritaet {\n index: number\n rangText: string\n hoch: string\n runter: string\n ersteZeile: boolean\n letzteZeile: boolean\n}\n\nexport function runnerPrioritaetZeilen(state: RunnerData, t: T): RunnerPrioritaetZeile[] {\n const liste = runnerPrioritaeten(state.entwurf)\n return liste.map((eintrag, index) => ({\n ...eintrag,\n index,\n rangText: t('rang', { rang: eintrag.rang }),\n hoch: t('hoch', { name: eintrag.klasse }),\n runter: t('runter', { name: eintrag.klasse }),\n ersteZeile: index === 0,\n letzteZeile: index === liste.length - 1,\n }))\n}\n\nexport function runnerWeichtZuerstText(state: RunnerData, t: T): string {\n const liste = runnerPrioritaeten(state.entwurf)\n if (!liste.length) return ''\n const eintrag = runnerWeichtZuerst(liste)\n return eintrag ? t('weichtZuerst', { name: eintrag.klasse }) : t('keinerVerdraengbar')\n}\n","import { defineMessages } from '../i18n'\nexport const accountMessages = defineMessages({\n de: {\n crop: 'Quadratisch zuschneiden', zoom: 'Zoom', horizontal: 'Horizontaler Ausschnitt', vertical: 'Vertikaler Ausschnitt',\n title: 'Konto und Organisation', loading: 'Daten werden geladen …', empty: 'Keine Einträge vorhanden.',\n failed: 'Anfrage abgelehnt: {message}', choose: 'Wählen Sie einen Bereich aus.',\n save: 'Änderungen speichern', discard: 'Änderungen verwerfen', saved: 'Änderungen gespeichert.',\n dirty: 'Ungespeicherte Änderungen. Bitte speichern oder verwerfen, bevor Sie den Bereich wechseln.',\n readonly: 'Diese Angaben werden zentral verwaltet.', preview: 'Vorschau', camera: 'Webcam aktivieren',\n capture: 'Foto aufnehmen', stop: 'Kamera schließen', upload: 'Bild auswählen', remove: 'Bild entfernen',\n cameraFailed: 'Kamera nicht verfügbar. Bitte ein Bild auswählen.',\n },\n en: {\n crop: 'Crop square', zoom: 'Zoom', horizontal: 'Horizontal crop position', vertical: 'Vertical crop position',\n title: 'Account and organisation', loading: 'Loading data …', empty: 'No entries.',\n failed: 'Request rejected: {message}', choose: 'Choose a section.',\n save: 'Save changes', discard: 'Discard changes', saved: 'Changes saved.',\n dirty: 'Unsaved changes. Save or discard before switching sections.',\n readonly: 'These details are managed centrally.', preview: 'Preview', camera: 'Enable webcam',\n capture: 'Take photo', stop: 'Close camera', upload: 'Choose image', remove: 'Remove image',\n cameraFailed: 'Camera unavailable. Please choose an image.',\n },\n})\nexport type AccountMessageKey = keyof typeof accountMessages.de\n","import type { AccountDocument, AccountItem, AccountPort } from './types'\n\n/** Nur synthetische Demo/Testdaten; keine Autorisierungs- oder Persistenzschicht. */\nexport function createAccountMemoryPort(items: readonly AccountItem[], documents: readonly AccountDocument[] = []): AccountPort {\n const records = new Map(documents.map((document) => [document.id, structuredClone(document)]))\n const read = async (id: string): Promise<AccountDocument> => {\n const record = records.get(id)\n if (record) return structuredClone(record)\n const item = items.find((entry) => entry.id === id)\n if (!item) throw new Error('Eintrag nicht verfügbar.')\n return { id, title: item.label, description: '', kind: 'profile', revision: 0, fields: [], values: {}, editable: false }\n }\n return { list: async () => items, read,\n async save(id, revision, values) {\n const record = await read(id)\n if (!record.editable) throw new Error('Keine Schreibberechtigung.')\n if (record.revision !== revision) throw new Error('Die Daten wurden inzwischen geändert.')\n const allowed = record.fields.filter((f) => !f.readonly).map((f) => f.id)\n if (Object.keys(values).some((key) => !allowed.includes(key))) throw new Error('Feld nicht bearbeitbar.')\n const saved = { ...record, revision: revision + 1, values: { ...record.values, ...values } }\n records.set(id, saved)\n return structuredClone(saved)\n },\n }\n}\n\n/** Der injizierte Transport ergänzt Session, CSRF und Fehlerabbildung der Anwendung. */\nexport interface AccountTransport {\n request: <T>(method: 'GET' | 'POST', path: string, body?: unknown) => Promise<T>\n upload?: AccountPort['upload']\n imageUrl?: AccountPort['imageUrl']\n}\nexport function createAccountRestPort(transport: AccountTransport, base = '/api/account'): AccountPort {\n const path = (id: string) => `${base}/documents/${encodeURIComponent(id)}`\n return {\n list: () => transport.request('GET', `${base}/documents`),\n read: (id) => transport.request('GET', path(id)),\n save: (id, revision, values) => transport.request('POST', path(id), { revision, values }),\n upload: transport.upload, imageUrl: transport.imageUrl,\n }\n}\n","/** Opt-in Kamera, keine Aufnahme ohne Benutzeraktion, Tracks immer schließen. */\nexport function createAccountCamera() {\n let stream: MediaStream | null = null\n let generation = 0\n const stop = () => { generation++; stream?.getTracks().forEach((track) => track.stop()); stream = null }\n return {\n stop,\n async start(video: HTMLVideoElement) {\n stop()\n const current = generation\n const acquired = await navigator.mediaDevices.getUserMedia({ video: { facingMode: 'user' }, audio: false })\n if (generation !== current) { acquired.getTracks().forEach((track) => track.stop()); return }\n stream = acquired\n video.srcObject = stream\n try { await video.play() } catch (error) { stop(); throw error }\n },\n async capture(video: HTMLVideoElement): Promise<Blob> {\n if (!stream || !video.videoWidth) throw new Error('Kamera noch nicht bereit.')\n const canvas = document.createElement('canvas')\n const edge = Math.min(video.videoWidth, video.videoHeight)\n canvas.width = canvas.height = Math.min(edge, 1024)\n const context = canvas.getContext('2d')\n if (!context) throw new Error('Bildaufnahme nicht verfügbar.')\n context.drawImage(video, (video.videoWidth - edge) / 2, (video.videoHeight - edge) / 2, edge, edge, 0, 0, canvas.width, canvas.height)\n const blob = await new Promise<Blob>((resolve, reject) => canvas.toBlob((result) => result ? resolve(result) : reject(new Error('Bildaufnahme fehlgeschlagen.')), 'image/png'))\n stop()\n video.srcObject = null\n return blob\n },\n }\n}\n\n/** Quadratischer Zuschnitt: Position 0..1 und Zoom 1..4, Metadaten übernimmt der Server nicht. */\nexport async function cropAccountImage(file: Blob, zoom: number, x: number, y: number): Promise<Blob> {\n if (![zoom, x, y].every(Number.isFinite) || zoom < 1 || zoom > 4 || x < 0 || x > 1 || y < 0 || y > 1) throw new Error('Ungültiger Bildausschnitt.')\n const image = await createImageBitmap(file)\n try {\n const edge = Math.min(image.width, image.height) / zoom\n const canvas = document.createElement('canvas')\n canvas.width = canvas.height = Math.min(1024, Math.round(edge))\n const context = canvas.getContext('2d')\n if (!context) throw new Error('Bildbearbeitung nicht verfügbar.')\n context.drawImage(image, (image.width - edge) * x, (image.height - edge) * y, edge, edge, 0, 0, canvas.width, canvas.height)\n return await new Promise<Blob>((resolve, reject) => canvas.toBlob((blob) => blob ? resolve(blob) : reject(new Error('Zuschnitt fehlgeschlagen.')), 'image/png'))\n } finally { image.close() }\n}\n","import type { AccountDocument, AccountPort } from './types'\n/** Keine beliebigen CSS-Werte aus editierbaren Feldern einsetzen. */\nexport function accountPreviewStyle(values: Readonly<Record<string, string>>) {\n const color = (value: string | undefined, fallback: string) => /^#[0-9a-f]{6}$/i.test(value ?? '') ? value : fallback\n const fonts: Record<string, string> = { system: 'system-ui, sans-serif', sans: \"'DejaVu Sans', sans-serif\", serif: \"'DejaVu Serif', serif\" }\n return { backgroundColor: color(values.primary, '#164e63'), color: color(values.text_on_primary, '#ffffff'),\n fontFamily: fonts[values.body_font ?? ''] ?? fonts.system }\n}\nexport function accountImageUrl(port: AccountPort | null | undefined, id: string): string {\n const url = id ? port?.imageUrl?.(id) ?? '' : ''\n return /^(https?:\\/\\/|blob:|\\/(?!\\/))/.test(url) ? url : ''\n}\nexport function accountWelcomePreview(document: AccountDocument, values: Readonly<Record<string, string>>): string {\n if (document.kind !== 'welcome') return ''\n return `${values.heading ?? ''}\\n\\n${values.body ?? ''}`\n .replace(/{{\\s*display_name\\s*}}/g, 'Alex Beispiel')\n .replace(/{{\\s*tenant_name\\s*}}/g, 'Beispielorganisation')\n .replace(/{{\\s*contact_name\\s*}}/g, 'Organisationskontakt')\n}\n","import { createStore, IDLE, type RequestState } from '../store'\nimport type { AccountDocument, AccountItem, AccountPort } from './types'\n\nexport interface AccountCallbacks {\n selected?: (item: AccountItem) => void\n failed?: (message: string) => void\n}\nexport interface AccountData extends RequestState<string> {\n items: readonly AccountItem[]\n selectedId: string | null\n document: AccountDocument | null\n draft: Readonly<Record<string, string>>\n dirty: boolean\n images: Readonly<Record<string, string>>\n}\nexport interface AccountSource {\n port: () => AccountPort | null | undefined\n callbacks?: () => AccountCallbacks\n}\nexport const INITIAL_ACCOUNT: AccountData = {\n ...IDLE, items: [], selectedId: null, document: null, draft: {}, dirty: false, images: {},\n}\nconst errorText = (error: unknown) => error instanceof Error ? error.message : String(error)\n\nfunction requests(source: AccountSource, store: ReturnType<typeof createStore<AccountData>>) {\n let epoch = 0\n async function run(kind: string, task: (port: AccountPort, current: () => boolean) => Promise<void>) {\n const port = source.port()\n if (!port) return\n const ticket = ++epoch\n const current = () => ticket === epoch && source.port() === port\n store.set({ busy: kind, error: null, notice: '' })\n try { await task(port, current) }\n catch (error) {\n if (current()) {\n store.set({ error: errorText(error) })\n source.callbacks?.().failed?.(errorText(error))\n }\n } finally { if (current()) store.set({ busy: null }) }\n }\n return { run, invalidate: () => { epoch++ } }\n}\n\nexport function createAccountController(source: AccountSource) {\n const store = createStore<AccountData>({ ...INITIAL_ACCOUNT })\n const accept = (document: AccountDocument) => store.set({\n document, draft: { ...document.values }, selectedId: document.id, dirty: false, images: {},\n })\n const { run, invalidate } = requests(source, store)\n return {\n store,\n dispose() { invalidate(); store.set({ ...INITIAL_ACCOUNT }) },\n async load() {\n invalidate()\n store.set({ ...INITIAL_ACCOUNT })\n await run('load', async (port, current) => {\n const items = await port.list()\n if (current()) store.set({ items })\n })\n },\n async select(id: string) {\n const state = store.get()\n const item = state.items.find((entry) => entry.id === id)\n if (!item || state.dirty || state.busy) return\n await run('read', async (port, current) => {\n const document = await port.read(id)\n if (current()) { accept(document); source.callbacks?.().selected?.(item) }\n })\n },\n edit(id: string, value: string) {\n const state = store.get()\n const field = state.document?.fields.find((entry) => entry.id === id)\n if (!state.document?.editable || !field || field.readonly || state.busy) return\n store.set({ draft: { ...state.draft, [id]: value }, dirty: true, notice: '', images: { ...state.images, [id]: '' } })\n },\n discard() {\n const document = store.get().document\n if (document && !store.get().busy) accept(document)\n },\n async save() {\n const state = store.get()\n if (!state.document?.editable || state.busy || !state.dirty) return\n const document = state.document\n const values = Object.fromEntries(document.fields.filter((f) => !f.readonly).map((f) => [f.id, state.draft[f.id] ?? '']))\n await run('save', async (port, current) => {\n const saved = await port.save(document.id, document.revision, values)\n if (current()) { accept(saved); store.set({ notice: 'saved' }) }\n })\n },\n async upload(fieldId: string, file: Blob) {\n const state = store.get()\n const document = state.document\n const field = document?.fields.find((f) => f.id === fieldId)\n if (!document?.editable || field?.type !== 'image' || field.readonly || state.busy) return\n await run('upload', async (port, current) => {\n if (!port.upload) throw new Error('Bilder werden von diesem Anschluss nicht unterstützt.')\n const image = await port.upload(document.id, fieldId, file)\n if (current()) store.set({ draft: { ...store.get().draft, [fieldId]: image.id },\n images: { ...store.get().images, [fieldId]: image.url }, dirty: true })\n })\n },\n }\n}\nexport type AccountController = ReturnType<typeof createAccountController>\n","import type { AccountData } from './controller'\nimport type { AccountItem } from './types'\n\n/** Zeile der Liste, wie Vue und React sie darstellen. */\nexport interface AccountRow {\n id: string\n label: string\n selected: boolean\n}\n\nexport function accountRows(state: AccountData): AccountRow[] {\n return state.items.map((item) => ({ id: item.id, label: item.label, selected: item.id === state.selectedId }))\n}\n\nexport function accountSelection(state: AccountData): AccountItem | null {\n return state.items.find((item) => item.id === state.selectedId) ?? null\n}\n\n/** Hinweis „keine Einträge“ nur nach abgeschlossener, fehlerfreier Anfrage. */\nexport function accountIsEmpty(state: AccountData): boolean {\n return state.busy === null && state.error === null && state.items.length === 0\n}\n"],"mappings":"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"}
|