File size: 2,907 Bytes
c586aa6
 
 
1ae8f9f
c8d472e
a4d0a87
 
 
c586aa6
281bbb2
c586aa6
 
 
 
a4d0a87
 
 
 
 
8875201
806c938
 
a4d0a87
 
 
 
806c938
a4d0a87
8875201
806c938
a4d0a87
 
 
 
 
 
 
 
 
8875201
a4d0a87
 
c586aa6
 
 
a4d0a87
 
c586aa6
a4d0a87
c586aa6
8875201
c586aa6
 
 
 
 
 
57d3fac
7fb29ae
 
c586aa6
 
8875201
c586aa6
 
8dcb382
8875201
8dcb382
7fb29ae
a4d0a87
c586aa6
a4d0a87
c586aa6
 
8875201
c586aa6
 
 
 
52f3a2e
8875201
 
 
c586aa6
8875201
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import os
import gradio as gr
from utils import extract_kyc_fields
from simple_salesforce import Salesforce

# ------------------------
# CONFIGURATION
# ------------------------
SF_USERNAME = os.getenv("SF_USERNAME", "[email protected]")
SF_PASSWORD = os.getenv("SF_PASSWORD", "Lic@2025@")
SF_TOKEN = os.getenv("SF_TOKEN", "AmmfRcd6IiYaRtSGntBnzNMQU")

# Limit Paddle threads to avoid container crashes
os.environ["OMP_NUM_THREADS"] = "1"

# ------------------------
# CONNECT TO SALESFORCE
# ------------------------
def connect_salesforce():
    """Connects to Salesforce (Production first, then Sandbox fallback)"""
    try:
        sf = Salesforce(
            username=SF_USERNAME,
            password=SF_PASSWORD,
            security_token=SF_TOKEN,
            domain="login"  # Production
        )
        print("✅ Connected to Salesforce (Production)")
        return {"status": "success", "env": "Production", "sf": sf}
    except Exception as e:
        print("❌ Production login failed:", e)
        try:
            sf = Salesforce(
                username=SF_USERNAME,
                password=SF_PASSWORD,
                security_token=SF_TOKEN,
                domain="test"  # Sandbox
            )
            print("✅ Connected to Salesforce (Sandbox)")
            return {"status": "success", "env": "Sandbox", "sf": sf}
        except Exception as e2:
            print("❌ Sandbox login failed:", e2)
            return {"status": "error", "message": "Salesforce login failed"}

sf_status = connect_salesforce()

# ------------------------
# PROCESS IMAGE FUNCTION
# ------------------------
def process_image(image_file):
    """Process uploaded KYC image and extract PAN/Aadhaar details"""
    if sf_status["status"] != "success":
        return {"salesforce_status": "error", "message": sf_status.get("message", "Login failed")}

    if image_file is None:
        return {"ocr_status": "error", "message": "No image uploaded"}

    try:
        # Pass the filepath string directly, no .name
        ocr_result = extract_kyc_fields(image_file)
        return {
            "salesforce_status": "connected",
            "sf_env": sf_status.get("env"),
            "ocr_result": ocr_result
        }
    except Exception as e:
        return {"ocr_status": "error", "message": f"OCR extraction failed: {str(e)}"}


# ------------------------
# GRADIO INTERFACE
# ------------------------
iface = gr.Interface(
    fn=process_image,
    inputs=gr.Image(type="filepath"),  # Use filepath for PaddleOCR
    outputs=gr.JSON(),
    title="AI KYC OCR & Salesforce Integration",
    description="Upload PAN or Aadhaar card images to extract text and verify Salesforce connection."
)

# ------------------------
# LAUNCH APP
# ------------------------
if __name__ == "__main__":
    # Launch Gradio server
    iface.launch(server_name="0.0.0.0", server_port=7860, debug=True)