From d3a0cabede33a5af0c868fb30fc4cfcd39439778 Mon Sep 17 00:00:00 2001 From: Koncept Kit <63216427+konceptkit@users.noreply.github.com> Date: Tue, 20 Jan 2026 23:51:38 +0700 Subject: [PATCH] - Details Column - Expandable chevron button for each row- Expandable Transaction Details - Click chevron to show/hide details- Payment Information Section:- Stripe Transaction IDs Section- Copy to Clipboard - One-click copy for all transaction IDs- Update Stripe webhook event permission on Stripe Config page. --- __pycache__/database.cpython-312.pyc | Bin 1158 -> 1425 bytes __pycache__/models.cpython-312.pyc | Bin 30190 -> 33150 bytes __pycache__/payment_service.cpython-312.pyc | Bin 10398 -> 12308 bytes __pycache__/server.cpython-312.pyc | Bin 269694 -> 295856 bytes ...1628264_add_stripe_transaction_metadata.py | 76 ++++++++++ models.py | 19 ++- server.py | 143 ++++++++++++++++-- 7 files changed, 221 insertions(+), 17 deletions(-) create mode 100644 alembic/versions/956ea1628264_add_stripe_transaction_metadata.py diff --git a/__pycache__/database.cpython-312.pyc b/__pycache__/database.cpython-312.pyc index 0234c7388e338a780cf729426cdfcfc017ec922d..86802418944657304dfaa2941dd90a1ed86c9962 100644 GIT binary patch delta 710 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 delta 4540 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 delta 2013 zcmZ`(OKcNI7@pnr?s~m;;@8Fri4!LwAxjE@f3EY6 z>O6`#AXTcG4pOOv3hJQ}f_U!3a7U zal~bWE{Vf_BWi>%al?VKUIo1dofH%+RXMZPdayVWZB}RAY^^kqTSa!w1?7 zuQxJ@yR8QXj~(5AxIZ!2zvpQGvBZJ?AzLe}PV~q39XfQNY+@gC`y*22cCc2#6kx7U zj_v3?*vT2(C|3{+-VmE)oP7v32m5_tx&~eD9;2Tzf&Cv zduHW1d77Ih=Y=6M&FO0LBaR&xUt01?r#SYj+$G_ysLD3F_o+Ulcofyx8}1%;K=;^E z-lFLVlO0joPBnnZ7EMZX)K&)_eZM0p{pVBWgq6-^bvJc3#M@C70b7l(?ri&0V`l1H zZqiER&3qodusJi2d0~&0`G5{23^V^Fzyc{g#{~5%=V9Ndo9b&pb+NCvZzs94GaBy} z?yiZ%Hw$++i}7yO?QM$iV6O}rh*MBM7PO6ZtTWEwa%NI(iE?0&SC#Aw) zX*4)XWluYs-TbUDCron|d%P~npRHocRgvmv{e+TVsO-0zaaS_T)>mI=aV^3&$s*h4 zKe^#TV1IThnMoV5iR4Tsmo$1~0~bOST|PaUOqwK>#V+7-~J;#%oNz+L= zZ3YExWuFIPEiSqqg-&!4%_%c$QF!kp?*fRypdD;`uraU&#Dl1R9RPCM!2Sqo+WqG4 z6@d?UE{jEp__fR4rw>$(oeT}M#=z}jyH0K@aZ&gr(x(V_lo-%EdL&MSyF`qOOOHYi zxZqZBq&ooeSOVv~@3bay7YHLuziYoJLjj=(R~!JHJP_^Wc zNp#LRE|0%T%C`-EW`cRp*wt6FtFB>1XDnKyCRj%^8y^i^fnA z57TtYq%G*wim(=;4FT(`%hXB8E2wZTcp6y(A&B6V`Cpd{rKp*-%tYzsCMKLSMlfN& zk)=KBAM)H7>)g;)3aIK#I+ICfM-vk{Y9%wY3HOa5;A{WSs9bauO=AGITz>^QVV zMolYG%BV@p`zI!8hK_@^iDN%(Sd2Qopz{L*dW|h75=JhSNKhwJd@j%4+}JR0OR$ZZ zowDWRL^^TKoT2y@O8t+&3tK!hW0`r|Wuzgk*yI#DiNs@OsrUc?CM@L>8f!fpho z72G?^kzoDX!FTHx>z3;`-V1asNSCVMxzx2> z<*zI6Da$QA_iB5WiB@!Vb6dXm`HKRqKlwvN5ms=l3KV5zZcs diff --git a/__pycache__/server.cpython-312.pyc b/__pycache__/server.cpython-312.pyc index 250dae28f737027b76580c6f11eb2c943b7ec3a2..e42c0a0885f92887a01904f060d5ef69c7c85927 100644 GIT binary patch delta 67526 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 diff --git a/alembic/versions/956ea1628264_add_stripe_transaction_metadata.py b/alembic/versions/956ea1628264_add_stripe_transaction_metadata.py new file mode 100644 index 0000000..fe28920 --- /dev/null +++ b/alembic/versions/956ea1628264_add_stripe_transaction_metadata.py @@ -0,0 +1,76 @@ +"""add_stripe_transaction_metadata + +Revision ID: 956ea1628264 +Revises: ec4cb4a49cde +Create Date: 2026-01-20 22:00:01.806931 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '956ea1628264' +down_revision: Union[str, None] = 'ec4cb4a49cde' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # Add Stripe transaction metadata to subscriptions table + op.add_column('subscriptions', sa.Column('stripe_payment_intent_id', sa.String(), nullable=True)) + op.add_column('subscriptions', sa.Column('stripe_charge_id', sa.String(), nullable=True)) + op.add_column('subscriptions', sa.Column('stripe_invoice_id', sa.String(), nullable=True)) + op.add_column('subscriptions', sa.Column('payment_completed_at', sa.DateTime(timezone=True), nullable=True)) + op.add_column('subscriptions', sa.Column('card_last4', sa.String(4), nullable=True)) + op.add_column('subscriptions', sa.Column('card_brand', sa.String(20), nullable=True)) + op.add_column('subscriptions', sa.Column('stripe_receipt_url', sa.String(), nullable=True)) + + # Add indexes for Stripe transaction IDs in subscriptions + op.create_index('idx_subscriptions_payment_intent', 'subscriptions', ['stripe_payment_intent_id']) + op.create_index('idx_subscriptions_charge_id', 'subscriptions', ['stripe_charge_id']) + op.create_index('idx_subscriptions_invoice_id', 'subscriptions', ['stripe_invoice_id']) + + # Add Stripe transaction metadata to donations table + op.add_column('donations', sa.Column('stripe_charge_id', sa.String(), nullable=True)) + op.add_column('donations', sa.Column('stripe_customer_id', sa.String(), nullable=True)) + op.add_column('donations', sa.Column('payment_completed_at', sa.DateTime(timezone=True), nullable=True)) + op.add_column('donations', sa.Column('card_last4', sa.String(4), nullable=True)) + op.add_column('donations', sa.Column('card_brand', sa.String(20), nullable=True)) + op.add_column('donations', sa.Column('stripe_receipt_url', sa.String(), nullable=True)) + + # Add indexes for Stripe transaction IDs in donations + op.create_index('idx_donations_payment_intent', 'donations', ['stripe_payment_intent_id']) + op.create_index('idx_donations_charge_id', 'donations', ['stripe_charge_id']) + op.create_index('idx_donations_customer_id', 'donations', ['stripe_customer_id']) + + +def downgrade() -> None: + # Remove indexes from donations + op.drop_index('idx_donations_customer_id', table_name='donations') + op.drop_index('idx_donations_charge_id', table_name='donations') + op.drop_index('idx_donations_payment_intent', table_name='donations') + + # Remove columns from donations + op.drop_column('donations', 'stripe_receipt_url') + op.drop_column('donations', 'card_brand') + op.drop_column('donations', 'card_last4') + op.drop_column('donations', 'payment_completed_at') + op.drop_column('donations', 'stripe_customer_id') + op.drop_column('donations', 'stripe_charge_id') + + # Remove indexes from subscriptions + op.drop_index('idx_subscriptions_invoice_id', table_name='subscriptions') + op.drop_index('idx_subscriptions_charge_id', table_name='subscriptions') + op.drop_index('idx_subscriptions_payment_intent', table_name='subscriptions') + + # Remove columns from subscriptions + op.drop_column('subscriptions', 'stripe_receipt_url') + op.drop_column('subscriptions', 'card_brand') + op.drop_column('subscriptions', 'card_last4') + op.drop_column('subscriptions', 'payment_completed_at') + op.drop_column('subscriptions', 'stripe_invoice_id') + op.drop_column('subscriptions', 'stripe_charge_id') + op.drop_column('subscriptions', 'stripe_payment_intent_id') diff --git a/models.py b/models.py index c0b50e0..930ce27 100644 --- a/models.py +++ b/models.py @@ -238,6 +238,15 @@ class Subscription(Base): donation_cents = Column(Integer, default=0, nullable=False) # Additional donation amount # Note: amount_paid_cents = base_subscription_cents + donation_cents + # Stripe transaction metadata (for validation and audit) + stripe_payment_intent_id = Column(String, nullable=True, index=True) # Initial payment transaction ID + stripe_charge_id = Column(String, nullable=True, index=True) # Actual charge reference + stripe_invoice_id = Column(String, nullable=True, index=True) # Invoice reference + payment_completed_at = Column(DateTime(timezone=True), nullable=True) # Exact payment timestamp from Stripe + card_last4 = Column(String(4), nullable=True) # Last 4 digits of card + card_brand = Column(String(20), nullable=True) # Visa, Mastercard, etc. + stripe_receipt_url = Column(String, nullable=True) # Link to Stripe receipt + # Manual payment fields manual_payment = Column(Boolean, default=False, nullable=False) # Whether this was a manual offline payment manual_payment_notes = Column(Text, nullable=True) # Admin notes about the payment @@ -269,9 +278,17 @@ class Donation(Base): # Payment details stripe_checkout_session_id = Column(String, nullable=True) - stripe_payment_intent_id = Column(String, nullable=True) + stripe_payment_intent_id = Column(String, nullable=True, index=True) payment_method = Column(String, nullable=True) # card, bank_transfer, etc. + # Stripe transaction metadata (for validation and audit) + stripe_charge_id = Column(String, nullable=True, index=True) # Actual charge reference + stripe_customer_id = Column(String, nullable=True, index=True) # Customer ID if created + payment_completed_at = Column(DateTime(timezone=True), nullable=True) # Exact payment timestamp from Stripe + card_last4 = Column(String(4), nullable=True) # Last 4 digits of card + card_brand = Column(String(20), nullable=True) # Visa, Mastercard, etc. + stripe_receipt_url = Column(String, nullable=True) # Link to Stripe receipt + # Metadata notes = Column(Text, nullable=True) created_at = Column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) diff --git a/server.py b/server.py index cbbbc48..8cf51a7 100644 --- a/server.py +++ b/server.py @@ -227,6 +227,7 @@ class UserResponse(BaseModel): role: str email_verified: bool created_at: datetime + member_since: Optional[datetime] = None # Date when user became active member # Profile profile_photo_url: Optional[str] = None # Subscription info (optional) @@ -2476,6 +2477,9 @@ async def activate_payment_manually( # 6. Activate user user.status = UserStatus.active set_user_role(user, UserRole.member, db) + # Set member_since only if not already set (first time activation) + if not user.member_since: + user.member_since = datetime.now(timezone.utc) user.updated_at = datetime.now(timezone.utc) # 7. Commit @@ -4525,8 +4529,17 @@ async def get_all_subscriptions( "donation_cents": sub.donation_cents, "payment_method": sub.payment_method, "stripe_subscription_id": sub.stripe_subscription_id, + "stripe_customer_id": sub.stripe_customer_id, "created_at": sub.created_at, - "updated_at": sub.updated_at + "updated_at": sub.updated_at, + # Stripe transaction metadata + "stripe_payment_intent_id": sub.stripe_payment_intent_id, + "stripe_charge_id": sub.stripe_charge_id, + "stripe_invoice_id": sub.stripe_invoice_id, + "payment_completed_at": sub.payment_completed_at.isoformat() if sub.payment_completed_at else None, + "card_last4": sub.card_last4, + "card_brand": sub.card_brand, + "stripe_receipt_url": sub.stripe_receipt_url } for sub in subscriptions] @api_router.get("/admin/subscriptions/stats") @@ -4766,7 +4779,15 @@ async def get_donations( "donor_email": d.donor_email or (d.user.email if d.user else None), "payment_method": d.payment_method, "notes": d.notes, - "created_at": d.created_at.isoformat() + "created_at": d.created_at.isoformat(), + # Stripe transaction metadata + "stripe_payment_intent_id": d.stripe_payment_intent_id, + "stripe_charge_id": d.stripe_charge_id, + "stripe_customer_id": d.stripe_customer_id, + "payment_completed_at": d.payment_completed_at.isoformat() if d.payment_completed_at else None, + "card_last4": d.card_last4, + "card_brand": d.card_brand, + "stripe_receipt_url": d.stripe_receipt_url } for d in donations] @api_router.get("/admin/donations/stats") @@ -6314,23 +6335,67 @@ async def stripe_webhook(request: Request, db: Session = Depends(get_db)): donation = db.query(Donation).filter(Donation.id == donation_id).first() if donation: + # Get Stripe API key from database + import stripe + stripe_key = get_setting(db, 'stripe_secret_key', decrypt=True) + if not stripe_key: + stripe_key = os.getenv("STRIPE_SECRET_KEY") + stripe.api_key = stripe_key + + # Extract basic payment info + payment_intent_id = session.get('payment_intent') donation.status = DonationStatus.completed - donation.stripe_payment_intent_id = session.get('payment_intent') + donation.stripe_payment_intent_id = payment_intent_id + donation.stripe_customer_id = session.get('customer') donation.payment_method = 'card' + donation.payment_completed_at = datetime.fromtimestamp(session.get('created'), tz=timezone.utc) + + # Capture donor email and name from Stripe session if not already set + if not donation.donor_email and session.get('customer_details'): + customer_details = session.get('customer_details') + donation.donor_email = customer_details.get('email') + if not donation.donor_name and customer_details.get('name'): + donation.donor_name = customer_details.get('name') + + # Retrieve PaymentIntent to get charge details + try: + if payment_intent_id: + payment_intent = stripe.PaymentIntent.retrieve(payment_intent_id) + + # Get charge ID from latest_charge + charge_id = payment_intent.latest_charge if hasattr(payment_intent, 'latest_charge') else None + + if charge_id: + # Retrieve the charge to get full details + charge = stripe.Charge.retrieve(charge_id) + donation.stripe_charge_id = charge.id + donation.stripe_receipt_url = charge.receipt_url + + # Get card details + if hasattr(charge, 'payment_method_details') and charge.payment_method_details and charge.payment_method_details.card: + card = charge.payment_method_details.card + donation.card_last4 = card.last4 + donation.card_brand = card.brand.capitalize() # visa -> Visa + except Exception as e: + logger.error(f"Failed to retrieve Stripe payment details for donation: {str(e)}") + donation.updated_at = datetime.now(timezone.utc) db.commit() - # Send thank you email - try: - from email_service import send_donation_thank_you_email - donor_first_name = donation.donor_name.split()[0] if donation.donor_name else "Friend" - await send_donation_thank_you_email( - donation.donor_email, - donor_first_name, - donation.amount_cents - ) - except Exception as e: - logger.error(f"Failed to send donation thank you email: {str(e)}") + # Send thank you email only if donor_email exists + if donation.donor_email: + try: + from email_service import send_donation_thank_you_email + donor_first_name = donation.donor_name.split()[0] if donation.donor_name else "Friend" + await send_donation_thank_you_email( + donation.donor_email, + donor_first_name, + donation.amount_cents + ) + except Exception as e: + logger.error(f"Failed to send donation thank you email: {str(e)}") + else: + logger.warning(f"Skipping thank you email for donation {donation.id}: no donor email") logger.info(f"Donation completed: ${donation.amount_cents/100:.2f} (ID: {donation.id})") else: @@ -6360,15 +6425,26 @@ async def stripe_webhook(request: Request, db: Session = Depends(get_db)): ).first() if not existing_subscription: + # Get Stripe API key from database + import stripe + stripe_key = get_setting(db, 'stripe_secret_key', decrypt=True) + if not stripe_key: + stripe_key = os.getenv("STRIPE_SECRET_KEY") + stripe.api_key = stripe_key + # Calculate subscription period using custom billing cycle if enabled from payment_service import calculate_subscription_period start_date, end_date = calculate_subscription_period(plan) + # Extract basic payment info + payment_intent_id = session.get('payment_intent') + subscription_id = session.get("subscription") + # Create subscription record with donation tracking subscription = Subscription( user_id=user.id, plan_id=plan.id, - stripe_subscription_id=session.get("subscription"), + stripe_subscription_id=subscription_id, stripe_customer_id=session.get("customer"), status=SubscriptionStatus.active, start_date=start_date, @@ -6376,13 +6452,48 @@ async def stripe_webhook(request: Request, db: Session = Depends(get_db)): amount_paid_cents=total_amount, base_subscription_cents=base_amount or plan.minimum_price_cents, donation_cents=donation_amount, - payment_method="stripe" + payment_method="stripe", + stripe_payment_intent_id=payment_intent_id, + payment_completed_at=datetime.fromtimestamp(session.get('created'), tz=timezone.utc) ) + + # Retrieve PaymentIntent and Subscription to get detailed transaction info + try: + if payment_intent_id: + payment_intent = stripe.PaymentIntent.retrieve(payment_intent_id) + + # Get charge ID from latest_charge + charge_id = payment_intent.latest_charge if hasattr(payment_intent, 'latest_charge') else None + + if charge_id: + # Retrieve the charge to get full details + charge = stripe.Charge.retrieve(charge_id) + subscription.stripe_charge_id = charge.id + subscription.stripe_receipt_url = charge.receipt_url + + # Get card details + if hasattr(charge, 'payment_method_details') and charge.payment_method_details and charge.payment_method_details.card: + card = charge.payment_method_details.card + subscription.card_last4 = card.last4 + subscription.card_brand = card.brand.capitalize() # visa -> Visa + + # Get invoice ID from subscription + if subscription_id: + stripe_subscription = stripe.Subscription.retrieve(subscription_id) + if hasattr(stripe_subscription, 'latest_invoice') and stripe_subscription.latest_invoice: + subscription.stripe_invoice_id = stripe_subscription.latest_invoice + + except Exception as e: + logger.error(f"Failed to retrieve Stripe payment details for subscription: {str(e)}") + db.add(subscription) # Update user status and role user.status = UserStatus.active set_user_role(user, UserRole.member, db) + # Set member_since only if not already set (first time activation) + if not user.member_since: + user.member_since = datetime.now(timezone.utc) user.updated_at = datetime.now(timezone.utc) db.commit()