Document Type Management

Document Types

{{ docType.name }}

{{ docType.field_count }} fields

No document types found

Fields for {{ selectedDocType.name }}

{{ field.name }}

Type: {{ field.type }} {{ field.required ? '(Required)' : '' }}

No fields defined. Add fields above.

Select a document type to manage its fields

Create document type

Source documents

Add documents to identify their type, then review and extract the fields.

Step 1 of 3

{{ isDragging ? 'Drop to add documents' : 'Drag documents here' }}

PDF, JPEG, PNG or TIFF · Up to 50 MB per file

Choose files

Documents to read {{ selectedFiles.length }}

{{ file.name }}

{{ formatFileSize(file.size) }}

•

{{ getFileType(file.name) }}

{{ file.progress || 0 }}%

{{ captureFilesUnchanged() ? 'These documents are already read and their types confirmed. Continue without reading them again.' : (captureTypesConfirmed() ? 'The files changed, so the documents are read and classified again.' : 'Next, confirm each document type before extracting fields.') }}

Technical activity {{ captureRequests.length }} calls

Browser-to-server calls for this capture session. Credentials are excluded; file uploads show metadata only. Server-internal service calls are not included.

No requests recorded yet.

{{ entry.method }} {{ entry.path }}{{ entry.status }} · {{ entry.duration == null ? 'Running' : entry.duration + ' ms' }}

Started {{ entry.time }}

Request

{{ JSON.stringify(entry.request,null,2) }}

Response

{{ JSON.stringify(entry.response,null,2) }}
Processing updates
  1. {{ event.message }}

Processing cancelled here. Server work may continue; no returned results will be applied. Your documents remain available.

Smart Document Review & Matching

Review detected documents and verify required documents

{{ console.log('\n🔍========== LC CONTEXT CHECK ==========') }} {{ console.log('LC Context exists:', !!lcContext) }} {{ console.log('LC Context FULL DATA:', JSON.stringify(lcContext, null, 2)) }} {{ console.log('lcContext.formData:', lcContext ? lcContext.formData : 'N/A') }} {{ console.log('lcContext.documentsRequired:', lcContext ? lcContext.documentsRequired : 'N/A') }} {{ console.log('lcContext.requiredDocuments:', lcContext ? lcContext.requiredDocuments : 'N/A') }} {{ console.log('lcContext.formData?.documentsRequired:', lcContext?.formData?.documentsRequired) }}

Detected Documents

File name
Page Range
Document type
Category
Original/Copy
Stamps
Endorsements
Preview
{{ getDisplayFileName(doc) }}
{{ formatFileSize(doc.fileSize) }}
{{ doc.page_range }}
{{ doc.confidence }}%
{{ selectedDocTypes[doc.page_range] || doc.document_type }}
O: {{ getOriginalCount(doc) }} C: {{ getCopyCount(doc) }} N/A
{{ getStampsCount(doc) }}
{{ getEndorsementsCount(doc) }}
🟣 Stamps Detected
✍️ Endorsements Detected

Found Required Documents ({{ foundDocuments.length }})

{{ item.required ? item.required.name : 'Unknown Required Doc' }}

{{ item.grouped ? item.grouped.document_type : 'Unknown Match' }} • {{ item.grouped.page_range }} LLM Match

Missing Required Documents ({{ notFoundDocuments.length }})

{{ item.required.name }}

Not Detected {{ item.reason }} LLM suggested: {{ item.llmSuggestion }}
{{ groupedDocuments.length }} detected {{ requiredDocuments.length }} required {{ foundDocuments.length }} matched {{ notFoundDocuments.length }} missing

Extraction complete

Extraction results

Check the values and their source before populating your application.

{{ results.length }} document{{ results.length === 1 ? '' : 's' }} processed{{ totalFields }} extracted fields

{{ result.documentType }}

{{ result.fileName }} · {{ result.pageRange || 'Source document' }}

Extracted fieldValueSource
{{ (field && field.desc) || key }}{{ getReportFieldValue(field) ?? 'No value detected' }}

No fields were extracted for this document. Check its document type and the selected profile’s mappings.

Document details

Document type confidence: {{ result.complianceScore }}%. This describes classification, not extracted value accuracy.

Processing time: {{ result.processingTime }} seconds.

Additional tools & technical statistics

Total processing time: {{ totalTime }} seconds.

{{ result.documentType }}

{{ result.fileName }}

{{ result.pageRange }}

{{ result.fieldsExtracted }}
Fields
{{ result.complianceScore }}%
Score
{{ result.processingTime }}s
Time
O:{{ getOriginalCount(result) }} C:{{ getCopyCount(result) }}
Original / copy
{{ getStampsCount(result) }}
Stamps
{{ getEndorsementsCount(result) }}
Endorsements

Insights expanded - view full details

File name Pages Document Category Original / copy Stamps Endorsements Fields Confidence Time Actions

{{ result.fileName }}

{{ result.pageRange }} - {{ result.documentType }}
O: {{ getOriginalCount(result) }} C: {{ getCopyCount(result) }}
{{ getStampsCount(result) }} {{ getEndorsementsCount(result) }} {{ result.fieldsExtracted }} {{ normalizeConfidence(result.confidence) }}% {{ result.processingTime }}s

{{ result.documentType }}

{{ result.fileName }}

{{ result.pageRange }}

{{ result.fieldsExtracted }}
Fields
{{ result.complianceScore }}%
Compliance
{{ result.processingTime }}s
Time
O:{{ getOriginalCount(result) }} C:{{ getCopyCount(result) }}
Original / copy
{{ getStampsCount(result) }}
Stamps
{{ getEndorsementsCount(result) }}
Endorsements

Document Intelligence Dashboard
✓ Processed AI Enhanced

Image Quality Analysis
AI Enhanced Real-time
Quality Metrics
Brightness
{{ result._rawResult?.quality_analysis?.average_metrics?.brightness_score?.percentage || 85 }}%
Contrast
{{ result._rawResult?.quality_analysis?.average_metrics?.contrast_score?.percentage || 90 }}%
Sharpness
{{ result._rawResult?.quality_analysis?.average_metrics?.sharpness_score?.percentage || 95 }}%
Text Clarity
{{ result._rawResult?.quality_analysis?.average_metrics?.text_clarity?.percentage || 88 }}%
Overall Readability
{{ result._rawResult?.quality_analysis?.average_metrics?.overall_readability?.percentage || 92 }}%
{{ Math.round(((result._rawResult?.quality_analysis?.average_metrics?.brightness_score?.percentage || 85) + (result._rawResult?.quality_analysis?.average_metrics?.contrast_score?.percentage || 90) + (result._rawResult?.quality_analysis?.average_metrics?.sharpness_score?.percentage || 95) + (result._rawResult?.quality_analysis?.average_metrics?.text_clarity?.percentage || 88) + (result._rawResult?.quality_analysis?.average_metrics?.overall_readability?.percentage || 92)) / 5) }}%
Overall Quality
AI Assessment
{{ result._rawResult?.quality_analysis?.average_metrics?.brightness_score?.percentage || 85 }}%
Brightness
{{ result._rawResult?.quality_analysis?.average_metrics?.contrast_score?.percentage || 90 }}%
Contrast
{{ result._rawResult?.quality_analysis?.average_metrics?.sharpness_score?.percentage || 95 }}%
Sharpness
{{ result._rawResult?.quality_analysis?.average_metrics?.text_clarity?.percentage || 88 }}%
Text Clarity
{{ result._rawResult?.quality_analysis?.average_metrics?.overall_readability?.percentage || 92 }}%
Overall Readability
Processing Performance

Quality Check

{{ result.qualityTime || '0.0' }}s

{{ parseFloat(result.qualityTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.qualityTime || 0) * 3)) }}%

OCR Processing

{{ result.ocrTime || '0.0' }}s

{{ parseFloat(result.ocrTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.ocrTime || 0) * 2)) }}%

AI Classification

{{ result.classificationTime || '0.0' }}s

{{ parseFloat(result.classificationTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.classificationTime || 0) * 2.5)) }}%

Entity Extraction

{{ result.llmTime || '0.0' }}s

{{ parseFloat(result.llmTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.llmTime || 0) * 2)) }}%

Compliance Check

{{ result.complianceTime || '0.0' }}s

{{ result.complianceTime && parseFloat(result.complianceTime) > 0 ? Math.round(Math.max(0, 100 - (parseFloat(result.complianceTime) * 4))) : 0 }}%
Processing Timeline

Upload & Quality Check

{{ result.qualityTime || '0.0' }}s

OCR Processing

{{ result.ocrTime || '0.0' }}s

AI Classification

{{ result.classificationTime || '0.0' }}s

Field Extraction

{{ result.llmTime || '0.0' }}s

Compliance Check

{{ result.complianceTime || '0.0' }}s

Document Profile

Document type

Classified with AI

{{ result.documentType }}

Confidence

AI Certainty Level

{{ normalizeConfidence(result.confidence) }}%

Fields Extracted

Data Points Found

{{ result.fieldsExtracted }}
{{ Math.round(((parseFloat(result.qualityTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.qualityTime || 0) * 3))) + (parseFloat(result.ocrTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.ocrTime || 0) * 2))) + (parseFloat(result.classificationTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.classificationTime || 0) * 2.5))) + (parseFloat(result.llmTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.llmTime || 0) * 2))) + (parseFloat(result.complianceTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.complianceTime || 0) * 4)))) / 5) }}%
Overall Performance Score
{{ Math.round(((parseFloat(result.qualityTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.qualityTime || 0) * 3))) + (parseFloat(result.ocrTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.ocrTime || 0) * 2))) + (parseFloat(result.classificationTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.classificationTime || 0) * 2.5))) + (parseFloat(result.llmTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.llmTime || 0) * 2))) + (parseFloat(result.complianceTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.complianceTime || 0) * 4)))) / 5) >= 90 ? 'Excellent' : Math.round(((parseFloat(result.qualityTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.qualityTime || 0) * 3))) + (parseFloat(result.ocrTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.ocrTime || 0) * 2))) + (parseFloat(result.classificationTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.classificationTime || 0) * 2.5))) + (parseFloat(result.llmTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.llmTime || 0) * 2))) + (parseFloat(result.complianceTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.complianceTime || 0) * 4)))) / 5) >= 80 ? 'Very Good' : Math.round(((parseFloat(result.qualityTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.qualityTime || 0) * 3))) + (parseFloat(result.ocrTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.ocrTime || 0) * 2))) + (parseFloat(result.classificationTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.classificationTime || 0) * 2.5))) + (parseFloat(result.llmTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.llmTime || 0) * 2))) + (parseFloat(result.complianceTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.complianceTime || 0) * 4)))) / 5) >= 70 ? 'Good' : Math.round(((parseFloat(result.qualityTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.qualityTime || 0) * 3))) + (parseFloat(result.ocrTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.ocrTime || 0) * 2))) + (parseFloat(result.classificationTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.classificationTime || 0) * 2.5))) + (parseFloat(result.llmTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.llmTime || 0) * 2))) + (parseFloat(result.complianceTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.complianceTime || 0) * 4)))) / 5) >= 60 ? 'Fair' : 'Needs Improvement' }}
Performance Analytics
{{ Math.round(((parseFloat(result.qualityTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.qualityTime || 0) * 3))) + (parseFloat(result.ocrTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.ocrTime || 0) * 2))) + (parseFloat(result.classificationTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.classificationTime || 0) * 2.5))) + (parseFloat(result.llmTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.llmTime || 0) * 2))) + (parseFloat(result.complianceTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.complianceTime || 0) * 4)))) / 5) }}%
Score

Processing Efficiency

Total Time {{ result.processingTime }}s
Fastest Stage {{ [ {name: 'Quality', time: parseFloat(result.qualityTime || 0)}, {name: 'OCR', time: parseFloat(result.ocrTime || 0)}, {name: 'Classification', time: parseFloat(result.classificationTime || 0)}, {name: 'Entity Extract', time: parseFloat(result.llmTime || 0)}, {name: 'Compliance', time: parseFloat(result.complianceTime || 0)} ].filter(s => s.time > 0).sort((a, b) => a.time - b.time)[0]?.name || 'N/A' }}
Data Quality {{ normalizeConfidence(result.confidence) >= 95 ? 'Excellent' : normalizeConfidence(result.confidence) >= 85 ? 'Very Good' : normalizeConfidence(result.confidence) >= 75 ? 'Good' : normalizeConfidence(result.confidence) >= 60 ? 'Fair' : 'Poor' }}
Overall Performance {{ Math.round(((parseFloat(result.qualityTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.qualityTime || 0) * 3))) + (parseFloat(result.ocrTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.ocrTime || 0) * 2))) + (parseFloat(result.classificationTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.classificationTime || 0) * 2.5))) + (parseFloat(result.llmTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.llmTime || 0) * 2))) + (parseFloat(result.complianceTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.complianceTime || 0) * 4)))) / 5) >= 90 ? 'Excellent' : Math.round(((parseFloat(result.qualityTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.qualityTime || 0) * 3))) + (parseFloat(result.ocrTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.ocrTime || 0) * 2))) + (parseFloat(result.classificationTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.classificationTime || 0) * 2.5))) + (parseFloat(result.llmTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.llmTime || 0) * 2))) + (parseFloat(result.complianceTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.complianceTime || 0) * 4)))) / 5) >= 80 ? 'Very Good' : Math.round(((parseFloat(result.qualityTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.qualityTime || 0) * 3))) + (parseFloat(result.ocrTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.ocrTime || 0) * 2))) + (parseFloat(result.classificationTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.classificationTime || 0) * 2.5))) + (parseFloat(result.llmTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.llmTime || 0) * 2))) + (parseFloat(result.complianceTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.complianceTime || 0) * 4)))) / 5) >= 70 ? 'Good' : Math.round(((parseFloat(result.qualityTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.qualityTime || 0) * 3))) + (parseFloat(result.ocrTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.ocrTime || 0) * 2))) + (parseFloat(result.classificationTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.classificationTime || 0) * 2.5))) + (parseFloat(result.llmTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.llmTime || 0) * 2))) + (parseFloat(result.complianceTime || 0) === 0 ? 0 : Math.max(0, 100 - (parseFloat(result.complianceTime || 0) * 4)))) / 5) >= 60 ? 'Fair' : 'Poor' }}
AI Recommendations

{{ (result._rawResult?.quality_analysis?.average_metrics?.brightness_score?.percentage || 85) >= 90 ? 'Document scan quality is excellent. Continue using current scanning settings for optimal results.' : (result._rawResult?.quality_analysis?.average_metrics?.brightness_score?.percentage || 85) >= 80 ? 'Good image quality detected. Consider adjusting brightness or contrast for enhanced accuracy.' : 'Image quality could be improved. Try rescanning with better lighting or higher resolution.' }}

{{ parseFloat(result.processingTime || 0) <= 3 ? 'Excellent processing speed achieved. Your system is well-optimized for document analysis.' : parseFloat(result.processingTime || 0) <= 8 ? 'Processing time is acceptable. Consider compressing images or upgrading hardware for faster results.' : 'Processing is slower than expected. Check image size, system resources, or network connectivity.' }}

{{ normalizeConfidence(result.confidence) >= 95 ? 'Outstanding classification accuracy! The AI has identified the document type with high confidence.' : normalizeConfidence(result.confidence) >= 85 ? 'Good classification results. The document structure and content are clearly recognized.' : normalizeConfidence(result.confidence) >= 75 ? 'Moderate classification confidence. Consider manual review to verify document type accuracy.' : 'Low classification confidence detected. Manual verification is strongly recommended before processing.' }}

Analytics Dashboard