billing frontend for mariadb. setup as otb_billing for outsidethebox.top accounting. also involved with outsidethedb
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

74 lines
2.0 KiB

#!/bin/bash
set -e
STAMP="$(date +%Y%m%d-%H%M%S)"
cp app.py "app.py.auto-expire-pending.${STAMP}.bak"
python3 <<'PY'
from pathlib import Path
p = Path("app.py")
text = p.read_text()
anchor = "def portal_invoice"
if anchor not in text:
raise SystemExit("FAILED: portal_invoice route not found")
# find insertion point (start of function body)
idx = text.index(anchor)
start = text.index(":", idx) + 1
inject_code = '''
# === AUTO-EXPIRE STALE PENDING CRYPTO PAYMENTS ===
try:
from datetime import datetime, timedelta
conn2 = get_db_connection()
cur2 = conn2.cursor(dictionary=True)
cur2.execute(
"SELECT id, payment_status, txid, created_at "
"FROM payments "
"WHERE invoice_id = %s AND payment_method = 'crypto' "
"ORDER BY id DESC LIMIT 1",
(invoice_id,)
)
last_payment = cur2.fetchone()
if last_payment:
is_pending = str(last_payment.get("payment_status") or "").lower() == "pending"
has_tx = bool(last_payment.get("txid"))
created_at = last_payment.get("created_at")
is_expired = False
if created_at:
is_expired = datetime.utcnow() > (created_at + timedelta(minutes=15))
if is_pending and not has_tx and is_expired:
cur2.execute(
"UPDATE payments SET payment_status = 'expired' WHERE id = %s",
(last_payment["id"],)
)
conn2.commit()
print(f"[auto-expire] expired stale payment id={last_payment['id']} invoice_id={invoice_id}")
conn2.close()
except Exception as e:
print(f"[auto-expire] error: {e}")
# === END AUTO-EXPIRE ===
'''
text = text[:start] + inject_code + text[start:]
p.write_text(text)
print("OK: auto-expire logic injected cleanly")
PY
python3 -m py_compile app.py
echo "PY_COMPILE_OK"
sudo systemctl restart otb_billing
sudo systemctl status otb_billing --no-pager -l