Extraction_validate / services /experience_service.py
Monike123's picture
Deploy DocVerify FastAPI backend (EasyOCR + Gemini 3 Flash)
0e39d80
Raw
History Blame Contribute Delete
2.96 kB
import json
from config import ENABLE_REPLY_POLLING, ENABLE_SCRAPER, MOCK_REPLY
from ml_utils.validators.experience import is_free_email
from mailer.send_verification import send_verification_email
def _dedup(flags: list[str]) -> list[str]:
return list(dict.fromkeys(flags))
def _poll_reply(hr_email: str, flags: list[str], demo_mode: bool) -> dict:
"""Optional IMAP round-trip; only used when ENABLE_REPLY_POLLING is set."""
from mailer.check_reply import check_reply_status
reply = check_reply_status(hr_email)
if reply == "confirmed":
return {"verification_status": "System Verified", "flags": _dedup(flags), "demo_mode": demo_mode}
if reply == "denied":
flags.append("REPLY_DENIED")
return {"verification_status": "Red Flagged", "flags": _dedup(flags), "demo_mode": demo_mode}
flags.append("NO_REPLY")
return {"verification_status": "Pending Verification", "flags": _dedup(flags), "demo_mode": demo_mode}
def verify_experience(doc) -> dict:
fields = json.loads(doc.extracted_fields or "{}")
flags = json.loads(doc.flags or "[]")
hr_email = fields.get("hr_email")
company = fields.get("company_name")
demo_mode = False
if MOCK_REPLY in ("confirmed", "denied", "no_reply"):
status_map = {
"confirmed": "System Verified",
"denied": "Red Flagged",
"no_reply": "Pending Verification",
}
if MOCK_REPLY == "denied":
flags.append("REPLY_DENIED")
if MOCK_REPLY == "no_reply":
flags.append("NO_REPLY")
return {"verification_status": status_map[MOCK_REPLY], "flags": _dedup(flags), "demo_mode": True}
target_email = hr_email
if not target_email and company and ENABLE_SCRAPER:
from scrapers.company_scraper import find_company_email
target_email = find_company_email(company)
if not target_email:
flags.append("NO_EMAIL" if company else "NO_COMPANY")
return {"verification_status": "Red Flagged", "flags": _dedup(flags), "demo_mode": demo_mode}
if is_free_email(target_email):
flags.append("FREE_EMAIL")
return {"verification_status": "Red Flagged", "flags": _dedup(flags), "demo_mode": demo_mode}
sent, demo_mode = send_verification_email(
target_email,
fields.get("employee_name", "the applicant"),
company or "your organization",
)
if demo_mode:
flags.append("DEMO_MODE_EMAIL")
if not sent:
flags.append("EMAIL_BOUNCED")
return {"verification_status": "Manual Review Required", "flags": _dedup(flags), "demo_mode": demo_mode}
# Send-only (production default): the request was emailed; a human resolves it.
if ENABLE_REPLY_POLLING:
return _poll_reply(target_email, flags, demo_mode)
flags.append("EMAIL_SENT")
return {"verification_status": "Pending Verification", "flags": _dedup(flags), "demo_mode": demo_mode}