From ad41de817c627fca6b369b4f512fad785e83e056 Mon Sep 17 00:00:00 2001 From: justin Date: Sat, 30 May 2026 22:46:52 -0500 Subject: [PATCH] BOC-3: use relay_integration.load_card_from_erpnext() for proper card matching --- scripts/workers/services/boc3_playwright.py | 59 ++++++++------------- 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/scripts/workers/services/boc3_playwright.py b/scripts/workers/services/boc3_playwright.py index 9cc1365..14b4469 100644 --- a/scripts/workers/services/boc3_playwright.py +++ b/scripts/workers/services/boc3_playwright.py @@ -64,20 +64,13 @@ PW_CARD_EXP_YEAR = os.environ.get("PW_CARD_EXP_YEAR", "") def _load_matching_card(order_number: str) -> dict: """Load PW company card matching the customer's payment method. - We have 3 company cards tied to payment processors: - - PW-STRIPE → used when customer paid via card or Klarna - - PW-PAYPAL → used when customer paid via PayPal - - PW-CRYPTO → used when customer paid via crypto + Uses relay_integration.load_card_from_erpnext() which maps: + - card/ach/klarna → Stripe Issuing virtual card (SID-0002) + - paypal → PayPal Mastercard (SID-0001) + - crypto → crypto filing card - Cards stored in ERPNext Sensitive ID documents. Falls back to env vars if ERPNext lookup fails. """ - card = { - "first_name": PW_CARD_FIRST, "last_name": PW_CARD_LAST, - "number": PW_CARD_NUMBER, "cvc": PW_CARD_CVC, - "exp_month": PW_CARD_EXP_MONTH, "exp_year": PW_CARD_EXP_YEAR, - } - try: import psycopg2 conn = psycopg2.connect(os.environ.get("DATABASE_URL", "")) @@ -90,35 +83,27 @@ def _load_matching_card(order_number: str) -> dict: conn.close() payment_method = (row[0] or "card") if row else "card" - # Map customer payment method → our company card - card_map = { - "card": "PW-STRIPE", - "klarna": "PW-STRIPE", - "ach": "PW-STRIPE", - "paypal": "PW-PAYPAL", - "crypto": "PW-CRYPTO", - } - card_name = card_map.get(payment_method, "PW-STRIPE") - - from scripts.workers.erpnext_client import ERPNextClient - erp = ERPNextClient() - doc = erp.get_resource("Sensitive ID", card_name) - - card = { - "first_name": doc.get("custom_first_name", PW_CARD_FIRST), - "last_name": doc.get("custom_last_name", PW_CARD_LAST), - "number": doc.get("custom_card_number", ""), - "cvc": doc.get("custom_cvc", ""), - "exp_month": doc.get("custom_exp_month", ""), - "exp_year": doc.get("custom_exp_year", ""), - } - LOG.info("[boc3] Using %s for order %s (customer paid via %s)", - card_name, order_number, payment_method) - + from scripts.workers.relay_integration import load_card_from_erpnext + card_details = load_card_from_erpnext(payment_method) + if card_details: + LOG.info("[boc3] Using %s card for order %s (customer paid via %s)", + card_details.masked(), order_number, payment_method) + return { + "first_name": card_details.cardholder_name.split()[0] if card_details.cardholder_name else PW_CARD_FIRST, + "last_name": " ".join(card_details.cardholder_name.split()[1:]) if card_details.cardholder_name else PW_CARD_LAST, + "number": card_details.card_number, + "cvc": card_details.cvv, + "exp_month": card_details.exp_month, + "exp_year": card_details.exp_year, + } except Exception as exc: LOG.warning("[boc3] Card lookup failed for %s: %s (using env fallback)", order_number, exc) - return card + return { + "first_name": PW_CARD_FIRST, "last_name": PW_CARD_LAST, + "number": PW_CARD_NUMBER, "cvc": PW_CARD_CVC, + "exp_month": PW_CARD_EXP_MONTH, "exp_year": PW_CARD_EXP_YEAR, + } # Account password for carriers on processagent.com # We create a unique account per carrier with a standard password