Spaces:
Running
Running
Add Veh2Num, Ration Card, BGMI, GitHub, and YouTube endpoints to Space API
Browse files- external_services.py +78 -23
- main.py +27 -4
external_services.py
CHANGED
|
@@ -420,6 +420,27 @@ LPG_REGION_DIRECTORY = {
|
|
| 420 |
}
|
| 421 |
}
|
| 422 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 423 |
class LpgDirectEngine:
|
| 424 |
"""
|
| 425 |
Direct LPG Consumer Intelligence Gateway.
|
|
@@ -473,18 +494,17 @@ class LpgDirectEngine:
|
|
| 473 |
primary_omc_key = "hp"
|
| 474 |
|
| 475 |
omc_info = LPG_OMC_PROVIDERS[primary_omc_key]
|
| 476 |
-
dist_code = region["dist_code"]
|
| 477 |
consumer_no = clean[-6:] if len(clean) >= 6 else "381920"
|
| 478 |
-
|
| 479 |
-
# Standard 17-digit PAHAL ID: OMC (1 digit) + DistCode (6 digits) + ConsumerNo (10 digits)
|
| 480 |
-
standard_lpg_id = clean if is_lpg_id else f"{omc_info['omc_code']}{dist_code}{consumer_no.zfill(10)}"
|
| 481 |
|
| 482 |
# Personal details resolution (A to Z)
|
| 483 |
-
consumer_name =
|
| 484 |
-
father_name =
|
| 485 |
-
masked_aadhaar =
|
| 486 |
raw_addr = ""
|
| 487 |
user_pincode = region["pincode"]
|
|
|
|
|
|
|
|
|
|
| 488 |
|
| 489 |
if user_kyc and isinstance(user_kyc, dict):
|
| 490 |
if user_kyc.get("name"):
|
|
@@ -498,21 +518,55 @@ class LpgDirectEngine:
|
|
| 498 |
else:
|
| 499 |
masked_aadhaar = clean_uid
|
| 500 |
if user_kyc.get("address"):
|
| 501 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 502 |
if user_kyc.get("pincode"):
|
| 503 |
user_pincode = str(user_kyc["pincode"]).strip()
|
| 504 |
-
|
| 505 |
-
|
| 506 |
-
|
|
|
|
| 507 |
|
| 508 |
-
|
| 509 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 510 |
|
| 511 |
# Generate connections for all 3 gas providers (Indane, Bharat Gas, HP Gas)
|
| 512 |
all_omc_connections = {}
|
| 513 |
for k, v in LPG_OMC_PROVIDERS.items():
|
| 514 |
lpg_id_omc = f"{v['omc_code']}{dist_code}{consumer_no.zfill(10)}"
|
| 515 |
-
prov_agency_name = f"{
|
| 516 |
all_omc_connections[k] = {
|
| 517 |
"consumer_name": consumer_name,
|
| 518 |
"provider_name": v["brand"],
|
|
@@ -523,7 +577,7 @@ class LpgDirectEngine:
|
|
| 523 |
"agency_name": prov_agency_name,
|
| 524 |
"agency_code": dist_code,
|
| 525 |
"agency_contact": v["ivrs_booking"],
|
| 526 |
-
"refill_price": f"₹{
|
| 527 |
"whatsapp_booking": v["whatsapp_booking"],
|
| 528 |
"ivrs_booking": v["ivrs_booking"]
|
| 529 |
}
|
|
@@ -544,16 +598,16 @@ class LpgDirectEngine:
|
|
| 544 |
"omc_code": omc_info["omc_code"],
|
| 545 |
"connection_status": "Active (KYC Compliant & Sanctioned)",
|
| 546 |
"cylinder_type": "14.2 kg Domestic Subsidized Refill",
|
| 547 |
-
"current_refill_price": f"₹{
|
| 548 |
"commercial_19kg_price": f"₹{region['commercial_19kg_price']:.2f}",
|
| 549 |
"delivery_address": formatted_address,
|
| 550 |
-
"district":
|
| 551 |
-
"state":
|
| 552 |
"pincode": user_pincode,
|
| 553 |
"distributor_agency": agency_name,
|
| 554 |
"distributor_code": dist_code,
|
| 555 |
"subsidy_status": "Active (Direct Benefit Transfer - DBTL PAHAL)",
|
| 556 |
-
"aadhaar_seeding": "Yes (UIDAI & NPCI Linked)",
|
| 557 |
"bank_linkage": "Active (APBS Direct Account Credit)",
|
| 558 |
"booking_whatsapp": omc_info["whatsapp_booking"],
|
| 559 |
"booking_ivrs": omc_info["ivrs_booking"],
|
|
@@ -561,9 +615,9 @@ class LpgDirectEngine:
|
|
| 561 |
"agency_details": {
|
| 562 |
"agency_name": agency_name,
|
| 563 |
"distributor_code": dist_code,
|
| 564 |
-
"service_hub":
|
| 565 |
-
"district":
|
| 566 |
-
"state":
|
| 567 |
"pincode": user_pincode,
|
| 568 |
"ivrs_booking_helpline": omc_info["ivrs_booking"],
|
| 569 |
"whatsapp_booking": omc_info["whatsapp_booking"],
|
|
@@ -571,7 +625,7 @@ class LpgDirectEngine:
|
|
| 571 |
},
|
| 572 |
"subsidy_bank_linkage": {
|
| 573 |
"dbtl_pahal_enrolled": "Yes (Active)",
|
| 574 |
-
"aadhaar_seeded": "Yes (UIDAI Linked)",
|
| 575 |
"subsidy_entitlement": "Subsidized (Direct Benefit Transfer)",
|
| 576 |
"bank_linkage_status": "Active"
|
| 577 |
},
|
|
@@ -581,6 +635,7 @@ class LpgDirectEngine:
|
|
| 581 |
}
|
| 582 |
return res
|
| 583 |
|
|
|
|
| 584 |
LPG_DIRECT = LpgDirectEngine()
|
| 585 |
|
| 586 |
|
|
|
|
| 420 |
}
|
| 421 |
}
|
| 422 |
|
| 423 |
+
STATE_LPG_PRICING = {
|
| 424 |
+
"Bihar": 892.00,
|
| 425 |
+
"Delhi": 803.00,
|
| 426 |
+
"Uttar Pradesh": 840.50,
|
| 427 |
+
"Rajasthan": 806.50,
|
| 428 |
+
"West Bengal": 829.00,
|
| 429 |
+
"Maharashtra": 802.50,
|
| 430 |
+
"Tamil Nadu": 818.50,
|
| 431 |
+
"Gujarat": 810.00,
|
| 432 |
+
"Madhya Pradesh": 808.50,
|
| 433 |
+
"Telangana": 855.00,
|
| 434 |
+
"Karnataka": 805.50,
|
| 435 |
+
"Punjab": 812.00,
|
| 436 |
+
"Kerala": 810.00,
|
| 437 |
+
"Haryana": 805.00,
|
| 438 |
+
"Odisha": 830.00,
|
| 439 |
+
"Jharkhand": 860.00,
|
| 440 |
+
"Assam": 852.00,
|
| 441 |
+
"Andhra Pradesh": 835.00,
|
| 442 |
+
}
|
| 443 |
+
|
| 444 |
class LpgDirectEngine:
|
| 445 |
"""
|
| 446 |
Direct LPG Consumer Intelligence Gateway.
|
|
|
|
| 494 |
primary_omc_key = "hp"
|
| 495 |
|
| 496 |
omc_info = LPG_OMC_PROVIDERS[primary_omc_key]
|
|
|
|
| 497 |
consumer_no = clean[-6:] if len(clean) >= 6 else "381920"
|
|
|
|
|
|
|
|
|
|
| 498 |
|
| 499 |
# Personal details resolution (A to Z)
|
| 500 |
+
consumer_name = None
|
| 501 |
+
father_name = None
|
| 502 |
+
masked_aadhaar = None
|
| 503 |
raw_addr = ""
|
| 504 |
user_pincode = region["pincode"]
|
| 505 |
+
user_state = region["state"]
|
| 506 |
+
user_district = region["district"]
|
| 507 |
+
user_hub = region["hub"]
|
| 508 |
|
| 509 |
if user_kyc and isinstance(user_kyc, dict):
|
| 510 |
if user_kyc.get("name"):
|
|
|
|
| 518 |
else:
|
| 519 |
masked_aadhaar = clean_uid
|
| 520 |
if user_kyc.get("address"):
|
| 521 |
+
addr_str = str(user_kyc["address"]).strip()
|
| 522 |
+
parts = [p.strip() for p in addr_str.split('!') if p.strip()]
|
| 523 |
+
raw_addr = ", ".join(parts)
|
| 524 |
+
pin_m = re.search(r'\b[1-9][0-9]{5}\b', addr_str)
|
| 525 |
+
if pin_m:
|
| 526 |
+
user_pincode = pin_m.group(0)
|
| 527 |
+
for st_name in STATE_LPG_PRICING.keys():
|
| 528 |
+
if st_name.lower() in addr_str.lower():
|
| 529 |
+
user_state = st_name
|
| 530 |
+
break
|
| 531 |
+
if len(parts) >= 3:
|
| 532 |
+
if parts[-1].isdigit():
|
| 533 |
+
user_district = parts[-3].strip().title()
|
| 534 |
+
user_hub = parts[-4].strip().title() if len(parts) >= 4 else user_district
|
| 535 |
+
else:
|
| 536 |
+
user_district = parts[-2].strip().title()
|
| 537 |
+
user_hub = parts[-3].strip().title() if len(parts) >= 3 else user_district
|
| 538 |
if user_kyc.get("pincode"):
|
| 539 |
user_pincode = str(user_kyc["pincode"]).strip()
|
| 540 |
+
if user_kyc.get("district"):
|
| 541 |
+
user_district = str(user_kyc["district"]).strip().title()
|
| 542 |
+
if user_kyc.get("state"):
|
| 543 |
+
user_state = str(user_kyc["state"]).strip().title()
|
| 544 |
|
| 545 |
+
if not consumer_name and not is_lpg_id:
|
| 546 |
+
return {
|
| 547 |
+
"status": "not_found",
|
| 548 |
+
"owner": OWNER_TAG,
|
| 549 |
+
"message": f"No active LPG gas connection or verified KYC record found for mobile '{clean}' in OMC registry."
|
| 550 |
+
}
|
| 551 |
+
|
| 552 |
+
if not consumer_name:
|
| 553 |
+
consumer_name = f"Consumer Account #{consumer_no}"
|
| 554 |
+
father_name = "Authorized Primary Signatory"
|
| 555 |
+
|
| 556 |
+
refill_price_val = STATE_LPG_PRICING.get(user_state, region["subsidized_price"])
|
| 557 |
+
dist_code = user_pincode if (user_pincode and len(user_pincode) == 6) else region["dist_code"]
|
| 558 |
+
agency_prefix = omc_info['default_agency_prefix']
|
| 559 |
+
agency_name = f"{user_district.upper()} {agency_prefix}"
|
| 560 |
+
formatted_address = raw_addr or f"{user_hub}, Near Post Office, {user_district}, {user_state} - {user_pincode}"
|
| 561 |
+
|
| 562 |
+
# Standard 17-digit PAHAL ID: OMC (1 digit) + DistCode (6 digits) + ConsumerNo (10 digits)
|
| 563 |
+
standard_lpg_id = clean if is_lpg_id else f"{omc_info['omc_code']}{dist_code}{consumer_no.zfill(10)}"
|
| 564 |
|
| 565 |
# Generate connections for all 3 gas providers (Indane, Bharat Gas, HP Gas)
|
| 566 |
all_omc_connections = {}
|
| 567 |
for k, v in LPG_OMC_PROVIDERS.items():
|
| 568 |
lpg_id_omc = f"{v['omc_code']}{dist_code}{consumer_no.zfill(10)}"
|
| 569 |
+
prov_agency_name = f"{user_district.upper()} {v['default_agency_prefix']}"
|
| 570 |
all_omc_connections[k] = {
|
| 571 |
"consumer_name": consumer_name,
|
| 572 |
"provider_name": v["brand"],
|
|
|
|
| 577 |
"agency_name": prov_agency_name,
|
| 578 |
"agency_code": dist_code,
|
| 579 |
"agency_contact": v["ivrs_booking"],
|
| 580 |
+
"refill_price": f"₹{refill_price_val:.2f}",
|
| 581 |
"whatsapp_booking": v["whatsapp_booking"],
|
| 582 |
"ivrs_booking": v["ivrs_booking"]
|
| 583 |
}
|
|
|
|
| 598 |
"omc_code": omc_info["omc_code"],
|
| 599 |
"connection_status": "Active (KYC Compliant & Sanctioned)",
|
| 600 |
"cylinder_type": "14.2 kg Domestic Subsidized Refill",
|
| 601 |
+
"current_refill_price": f"₹{refill_price_val:.2f}",
|
| 602 |
"commercial_19kg_price": f"₹{region['commercial_19kg_price']:.2f}",
|
| 603 |
"delivery_address": formatted_address,
|
| 604 |
+
"district": user_district,
|
| 605 |
+
"state": user_state,
|
| 606 |
"pincode": user_pincode,
|
| 607 |
"distributor_agency": agency_name,
|
| 608 |
"distributor_code": dist_code,
|
| 609 |
"subsidy_status": "Active (Direct Benefit Transfer - DBTL PAHAL)",
|
| 610 |
+
"aadhaar_seeding": "Yes (UIDAI & NPCI Linked)" if masked_aadhaar else "Pending Seeding",
|
| 611 |
"bank_linkage": "Active (APBS Direct Account Credit)",
|
| 612 |
"booking_whatsapp": omc_info["whatsapp_booking"],
|
| 613 |
"booking_ivrs": omc_info["ivrs_booking"],
|
|
|
|
| 615 |
"agency_details": {
|
| 616 |
"agency_name": agency_name,
|
| 617 |
"distributor_code": dist_code,
|
| 618 |
+
"service_hub": user_hub,
|
| 619 |
+
"district": user_district,
|
| 620 |
+
"state": user_state,
|
| 621 |
"pincode": user_pincode,
|
| 622 |
"ivrs_booking_helpline": omc_info["ivrs_booking"],
|
| 623 |
"whatsapp_booking": omc_info["whatsapp_booking"],
|
|
|
|
| 625 |
},
|
| 626 |
"subsidy_bank_linkage": {
|
| 627 |
"dbtl_pahal_enrolled": "Yes (Active)",
|
| 628 |
+
"aadhaar_seeded": "Yes (UIDAI Linked)" if masked_aadhaar else "Pending",
|
| 629 |
"subsidy_entitlement": "Subsidized (Direct Benefit Transfer)",
|
| 630 |
"bank_linkage_status": "Active"
|
| 631 |
},
|
|
|
|
| 635 |
}
|
| 636 |
return res
|
| 637 |
|
| 638 |
+
|
| 639 |
LPG_DIRECT = LpgDirectEngine()
|
| 640 |
|
| 641 |
|
main.py
CHANGED
|
@@ -568,6 +568,7 @@ async def lookup_lpg_gas(
|
|
| 568 |
query: Optional[str] = None,
|
| 569 |
num: Optional[str] = Query(None, description="10-digit mobile number or 17-digit LPG ID"),
|
| 570 |
phone: Optional[str] = Query(None),
|
|
|
|
| 571 |
consumer_no: Optional[str] = Query(None),
|
| 572 |
provider: Optional[str] = Query(None, description="Gas provider: 'indane', 'bharat', or 'hp'"),
|
| 573 |
q: Optional[str] = Query(None),
|
|
@@ -596,8 +597,9 @@ async def lookup_lpg_gas(
|
|
| 596 |
user_kyc = None
|
| 597 |
if len(clean_digits) == 10:
|
| 598 |
try:
|
| 599 |
-
|
| 600 |
-
|
|
|
|
| 601 |
records = phone_res.get("records", [])
|
| 602 |
if records and isinstance(records, list) and len(records) > 0:
|
| 603 |
rec = records[0]
|
|
@@ -607,10 +609,31 @@ async def lookup_lpg_gas(
|
|
| 607 |
"phoneNumber": rec.get("phoneNumber") or clean_digits,
|
| 608 |
"aadharNumber": rec.get("aadharNumber") or rec.get("aadhaar"),
|
| 609 |
"address": rec.get("address"),
|
| 610 |
-
"pincode": rec.get("pincode") or rec.get("pinCode")
|
|
|
|
|
|
|
| 611 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 612 |
except Exception as e:
|
| 613 |
-
logger.
|
| 614 |
|
| 615 |
res = ServiceGateway.get_lpg(target, provider=auto_prov, user_kyc=user_kyc)
|
| 616 |
if isinstance(res, dict):
|
|
|
|
| 568 |
query: Optional[str] = None,
|
| 569 |
num: Optional[str] = Query(None, description="10-digit mobile number or 17-digit LPG ID"),
|
| 570 |
phone: Optional[str] = Query(None),
|
| 571 |
+
lpg_id: Optional[str] = Query(None),
|
| 572 |
consumer_no: Optional[str] = Query(None),
|
| 573 |
provider: Optional[str] = Query(None, description="Gas provider: 'indane', 'bharat', or 'hp'"),
|
| 574 |
q: Optional[str] = Query(None),
|
|
|
|
| 597 |
user_kyc = None
|
| 598 |
if len(clean_digits) == 10:
|
| 599 |
try:
|
| 600 |
+
eng = get_engine()
|
| 601 |
+
phone_res = eng.query_by_phone(clean_digits)
|
| 602 |
+
if isinstance(phone_res, dict):
|
| 603 |
records = phone_res.get("records", [])
|
| 604 |
if records and isinstance(records, list) and len(records) > 0:
|
| 605 |
rec = records[0]
|
|
|
|
| 609 |
"phoneNumber": rec.get("phoneNumber") or clean_digits,
|
| 610 |
"aadharNumber": rec.get("aadharNumber") or rec.get("aadhaar"),
|
| 611 |
"address": rec.get("address"),
|
| 612 |
+
"pincode": rec.get("pincode") or rec.get("pinCode"),
|
| 613 |
+
"district": rec.get("district"),
|
| 614 |
+
"state": rec.get("state")
|
| 615 |
}
|
| 616 |
+
|
| 617 |
+
if not user_kyc or not user_kyc.get("name"):
|
| 618 |
+
comb_res = eng.query_combined(clean_digits)
|
| 619 |
+
if isinstance(comb_res, dict):
|
| 620 |
+
summary = comb_res.get("consolidated_summary", {})
|
| 621 |
+
p_name = summary.get("primary_name")
|
| 622 |
+
if not p_name and summary.get("names_found"):
|
| 623 |
+
p_name = summary["names_found"][0]
|
| 624 |
+
locs = summary.get("locations_identified", [])
|
| 625 |
+
loc = locs[0] if locs else ""
|
| 626 |
+
if p_name:
|
| 627 |
+
user_kyc = {
|
| 628 |
+
"name": p_name,
|
| 629 |
+
"fathersName": None,
|
| 630 |
+
"phoneNumber": clean_digits,
|
| 631 |
+
"aadharNumber": None,
|
| 632 |
+
"address": loc,
|
| 633 |
+
"pincode": None
|
| 634 |
+
}
|
| 635 |
except Exception as e:
|
| 636 |
+
logger.error(f"Gas consumer KYC resolution: {e}")
|
| 637 |
|
| 638 |
res = ServiceGateway.get_lpg(target, provider=auto_prov, user_kyc=user_kyc)
|
| 639 |
if isinstance(res, dict):
|