Add debug logs for Aadhaar extraction
All checks were successful
build-and-deploy / build-deploy (push) Successful in 33s

This commit is contained in:
androidlover5842
2026-01-31 15:41:37 +05:30
parent 8c2117d369
commit 92cc07186e

View File

@@ -23,10 +23,15 @@ class DocumentExtractionService(
private val bookingEvents: BookingEvents private val bookingEvents: BookingEvents
) { ) {
private val logger = LoggerFactory.getLogger(DocumentExtractionService::class.java) private val logger = LoggerFactory.getLogger(DocumentExtractionService::class.java)
private val aadhaarRegex = Regex("\\b\\d{4}\\s?\\d{4}\\s?\\d{4}\\b")
fun extractAndApply(localImageUrl: String, publicImageUrl: String, document: GuestDocument, propertyId: UUID): ExtractionResult { fun extractAndApply(localImageUrl: String, publicImageUrl: String, document: GuestDocument, propertyId: UUID): ExtractionResult {
val results = linkedMapOf<String, String>() val results = linkedMapOf<String, String>()
val ocrResult = paddleOcrClient.extract(document.storagePath) val ocrResult = paddleOcrClient.extract(document.storagePath)
if (ocrResult?.texts?.isNotEmpty() == true) {
val preview = ocrResult.texts.take(30).joinToString(" | ") { it.take(80) }
logger.debug("OCR texts preview docId={}: {}", document.id, preview)
}
if (ocrResult?.rejected == true) { if (ocrResult?.rejected == true) {
results["docType"] = "REJECTED" results["docType"] = "REJECTED"
results["rejectReason"] = "LOW_OCR_SCORE" results["rejectReason"] = "LOW_OCR_SCORE"
@@ -34,6 +39,19 @@ class DocumentExtractionService(
return ExtractionResult(results, false) return ExtractionResult(results, false)
} }
val ocrText = ocrResult?.texts?.takeIf { it.isNotEmpty() }?.joinToString("\n") val ocrText = ocrResult?.texts?.takeIf { it.isNotEmpty() }?.joinToString("\n")
if (!ocrText.isNullOrBlank()) {
val candidates = aadhaarRegex.findAll(ocrText).map { it.value }.toList()
if (candidates.isNotEmpty()) {
val normalized = candidates.map { it.replace(Regex("\\s+"), "") }
val valid = normalized.filter { isValidAadhaar(it) }.map { maskAadhaar(it) }
logger.debug(
"OCR Aadhaar candidates docId={} candidates={} valid={}",
document.id,
normalized.map { maskAadhaar(it) },
valid
)
}
}
val detections = listOf( val detections = listOf(
Detection( Detection(
detect = { detect = {
@@ -243,11 +261,14 @@ class DocumentExtractionService(
} }
normalizePinCode(results) normalizePinCode(results)
logIdNumber("before-normalize-id", document.id, results)
normalizeIdNumber(results) normalizeIdNumber(results)
logIdNumber("after-normalize-id-digits", document.id, results)
normalizeAddress(results) normalizeAddress(results)
applyBookingCityUpdates(document, results) applyBookingCityUpdates(document, results)
// Final Aadhaar checksum pass before doc type decision. // Final Aadhaar checksum pass before doc type decision.
markAadhaarIfValid(results) markAadhaarIfValid(results)
logIdNumber("after-aadhaar-checksum", document.id, results)
results["docType"] = computeDocType(results, handled) results["docType"] = computeDocType(results, handled)
applyGuestUpdates(document, propertyId, results) applyGuestUpdates(document, propertyId, results)
return ExtractionResult(results, handled) return ExtractionResult(results, handled)
@@ -508,6 +529,25 @@ private fun cleanedValue(value: String?): String? {
return trimmed return trimmed
} }
private fun maskAadhaar(value: String): String {
val digits = value.filter { it.isDigit() }
if (digits.length != 12) return value
return "XXXXXXXX" + digits.takeLast(4)
}
private fun logIdNumber(stage: String, documentId: UUID?, results: Map<String, String>) {
val raw = results[DocumentPrompts.ID_NUMBER.first]
val digits = normalizeDigits(cleanedValue(raw))
val masked = digits?.let { maskAadhaar(it) } ?: raw
LoggerFactory.getLogger(DocumentExtractionService::class.java).debug(
"ID number {} docId={} raw={} normalized={}",
stage,
documentId,
raw,
masked
)
}
private val standardPlateRegex = Regex("^[A-Z]{2}\\d{1,2}[A-Z]{1,3}\\d{3,4}$") private val standardPlateRegex = Regex("^[A-Z]{2}\\d{1,2}[A-Z]{1,3}\\d{3,4}$")
private val bhPlateRegex = Regex("^\\d{2}BH\\d{4}[A-Z]{1,2}$") private val bhPlateRegex = Regex("^\\d{2}BH\\d{4}[A-Z]{1,2}$")
private val pinCodeRegex = Regex("\\b\\d{6}\\b") private val pinCodeRegex = Regex("\\b\\d{6}\\b")