BOC-3: load matching PW card from ERPNext (stripe/paypal/crypto per payment method)

EIN: add handler with IRS hours check (Mon-Fri 7am-10pm ET), dev mode guard
This commit is contained in:
justin 2026-05-30 22:43:30 -05:00
parent cf270e9f5b
commit 6ca835b1b4
2 changed files with 242 additions and 1 deletions

View file

@ -52,7 +52,7 @@ SCREENSHOTS_DIR = Path(os.getenv("SCREENSHOTS_DIR", "/tmp/boc3-screenshots"))
SCREENSHOTS_DIR.mkdir(parents=True, exist_ok=True)
# Performance West company card for $25 BOC-3 payments
# Loaded from env — never hardcoded
# Loaded from ERPNext Sensitive ID at runtime, fallback to env vars
PW_CARD_FIRST = os.environ.get("PW_CARD_FIRST_NAME", "Justin")
PW_CARD_LAST = os.environ.get("PW_CARD_LAST_NAME", "Hannah")
PW_CARD_NUMBER = os.environ.get("PW_CARD_NUMBER", "")
@ -60,6 +60,66 @@ PW_CARD_CVC = os.environ.get("PW_CARD_CVC", "")
PW_CARD_EXP_MONTH = os.environ.get("PW_CARD_EXP_MONTH", "")
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
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", ""))
cur = conn.cursor()
cur.execute(
"SELECT payment_method FROM compliance_orders WHERE order_number = %s",
(order_number,),
)
row = cur.fetchone()
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)
except Exception as exc:
LOG.warning("[boc3] Card lookup failed for %s: %s (using env fallback)", order_number, exc)
return card
# Account password for carriers on processagent.com
# We create a unique account per carrier with a standard password
BOC3_ACCOUNT_PASSWORD = os.environ.get("BOC3_ACCOUNT_PASSWORD", "")