o
    \iJ                     @   s|   d dl mZmZ d dlmZ d dlmZmZ d dlmZm	Z	 d dl
Z
d dlZe
jejejfdZdd Zd	d
 Zdd ZdS )    )requestjsonify)closing)connect_to_databaseConfig)datetime	timedeltaN)authc            
      C   st  t  } g d}|D ]}|| vrtd| dddf  S q
t }zzt|jdd}|d| d f | }|sStd	ddd
fW  d    W W |  S |d dkrotddddfW  d    W W |  S |d| d | d | d | 	d| 	df |d| d f | d pd}||d kr|d| d f |	dr|	ddkr|d|d f n$t
 }|tdd |tdd d	|d }|d ||||d f |  td!d"dd#fW  d    W W |  S 1 sw   Y  W n* ty- }	 z|  td$t|	 ddd%fW  Y d }	~	W |  S d }	~	ww W |  d S |  w )&N)
invoice_idamountpayment_methodMissing required field: Tmessageerror  
dictionarya  
                SELECT i.id, i.total_amount, i.status, i.subscription_id,
                       s.package_id, s.user_id, s.billing_cycle
                FROM invoices i
                LEFT JOIN subscriptions s ON i.subscription_id = s.id
                WHERE i.id = %s
            r
   zInvoice not found  statuspaidzInvoice already paidz
                INSERT INTO payments (
                    invoice_id, amount, payment_method, 
                    transaction_id, status,
                    gateway_response
                ) VALUES (%s, %s, %s, %s, 'completed', %s)
            r   r   Ztransaction_idZgateway_responsez
                SELECT SUM(amount) as paid_amount 
                FROM payments 
                WHERE invoice_id = %s AND status = 'completed'
            paid_amountr   total_amountzW
                    UPDATE invoices SET status = 'paid' WHERE id = %s
                subscription_idbilling_cyclelifetimez
                            UPDATE subscriptions 
                            SET status = 'active', end_date = NULL
                            WHERE id = %s
                           daysm  )monthlyannuala?  
                            UPDATE subscriptions 
                            SET status = 'active',
                                start_date = %s,
                                end_date = %s,
                                next_billing_date = %s
                            WHERE id = %s
                        zPayment recorded successfullyF   zError recording payment:   )r   get_jsonr   r   r   cursorexecutefetchoneclosegetr   nowr   commit	Exceptionrollbackstr)
datarequired_fieldsfield
connectionr%   invoicer   
start_dateend_datee r7   S/Users/harjaapdhillon/Desktop/newidea/medvista_backend/Services/Billing/Payments.pyrecord_payment   s   
Q
Q

	
QM(
Qr9   c            
      C   s  t  } dg}|D ]}|| vrtd| dddf  S q	t }zzt|jdd}|d| d f | }|sQtdddd	fW  d    W W |  S t	t
|d
 d }||d d| d  d| d |d|drtdnddd}| dr| d | dd|d< tjj|d}|d|d | d f |  td|d tj|d
 |d |ddddd fW  d    W W |  S 1 sw   Y  W n) ty }	 z|  td!t|	 ddd"fW  Y d }	~	W |  S d }	~	ww W |  d S |  w )#Nr
   r   Tr   r   r   am  
                SELECT i.id, i.total_amount, i.currency_id, i.subscription_id,
                       s.billing_cycle, p.package_name
                FROM invoices i
                LEFT JOIN subscriptions s ON i.subscription_id = s.id
                LEFT JOIN packages p ON s.package_id = p.id
                WHERE i.id = %s AND i.status = 'unpaid'
            zUnpaid invoice not foundr   r   d   currency_idZinvoice_   r   subscriptionzone-time)r
   r   type)r   currencyreceiptZpayment_capturenotesZcustomer_emailZcustomer_name)emailnamecustomer)r/   z
                UPDATE invoices 
                SET gateway_order_id = %s,
                    gateway_type = 'razorpay'
                WHERE id = %s
            idzRazorpay order createdpackage_namezInvoice PaymentF)r   order_idrazorpay_keyr   r?   product_namer   r"   zError creating Razorpay order: r#   )r   r$   r   r   r   r%   r&   r'   r(   intfloatr)   clientordercreater+   r   RAZORPAY_KEY_IDr,   r-   r.   )
r/   r0   r1   r2   r%   r3   Zamount_in_paiseZ
order_datarazorpay_orderr6   r7   r7   r8   create_razorpay_orderj   st   
?



?;(
?rQ   c                  C   s  t  } g d}|D ]}|| vrtd| dddf  S q
t }zzR|jdd@}|d| d | d f | }|sYtd	ddd
fW  d   W W |rX|  S S |d | d k}z%|rutj	
| d | d | d d ntj	| d | d | d d W n$ tjjy   tddddf Y W  d   W W |r|  S S w |rtj| d }td|d   |d }|dv rftj| d }	|d|d |d t|	d d |	d | d dt|	di t|	f |j}
|d|d f t }|d dkr!|td d! }|d"||||d# f n%|d d$kr<|td%d! }|d"||||d# f n
|d&||d# f |  td'||
d(d)d*fW  d   W W |re|  S S |d+v r|d,|d f |  td-| |dd.dfW  d   W W |r|  S S td/| d0|d(d.d*fW  d   W W |r|  S S tj| d }	|	d }|d1|d |d t|	d d |	d | d |t|	di t|	f |j}
|d2v r=|d|d f t }|d dkr|td d! }|d3||||d# f n4|d d$kr2|td%d! }|d3||||d# f n|d4||d# f n|d5v rK|d,|d f |  td6||
|d2vd7d*fW  d   W W |rl|  S S 1 sqw   Y  W nT tjjy   td8dddf Y W |r|  S S  ty } z*|  td9t|  td:t| ddd;fW  Y d}~W |r|  S S d}~ww W |r|  dS dS |r|  w w )<z^
    SECURE payment verification - verifies subscription status instead of payment status
    )
payment_idrG   	signaturezMissing field: Tr   r   r   a  
                SELECT 
                    s.id AS subscription_id,
                    s.billing_cycle,
                    s.user_id,
                    s.razorpay_subscription_id,
                    i.id AS invoice_id,
                    i.total_amount AS amount,
                    i.status AS invoice_status
                FROM subscriptions s
                LEFT JOIN invoices i ON s.id = i.subscription_id
                WHERE (s.razorpay_subscription_id = %s OR i.gateway_order_id = %s)
                    AND i.status IN ('draft', 'pending', 'unpaid')
                ORDER BY i.created_at DESC
                LIMIT 1
            rG   z*No pending invoice found for this payment.r   Nrazorpay_subscription_idrR   rS   )razorpay_payment_idrT   razorpay_signature)rU   razorpay_order_idrV   zInvalid payment signature.zSubscription Status: r   )authenticatedactiveaT  
                        INSERT INTO payments (
                            invoice_id, user_id, amount, payment_method,
                            transaction_id, payment_date, status,
                            acquirer_data, razorpay_payment
                        ) VALUES (%s, %s, %s, %s, %s, NOW(), %s, %s, %s)
                    r
   user_idr   r:   method	completedZacquirer_datazx
                        UPDATE invoices SET status = 'paid' 
                        WHERE id = %s
                    r   r    r   r   a9  
                            UPDATE subscriptions 
                            SET status='active', 
                                start_date=%s, 
                                end_date=%s,
                                next_billing_date=%s
                            WHERE id = %s
                        r   r!   r   a=  
                            UPDATE subscriptions 
                            SET status='active', 
                                start_date=%s, 
                                end_date=NULL,
                                next_billing_date=NULL
                            WHERE id = %s
                        z1Subscription verified and activated successfully.F)r   subscription_statusrR   r      )	cancelledexpiredza
                        UPDATE invoices SET status = 'failed' WHERE id = %s
                    zSubscription is )r   r]   r   zSubscription is in z statea<  
                    INSERT INTO payments (
                        invoice_id, user_id, amount, payment_method,
                        transaction_id, payment_date, status,
                        acquirer_data, razorpay_payment
                    ) VALUES (%s, %s, %s, %s, %s, NOW(), %s, %s, %s)
                )capturedZ
authorizedz
                            UPDATE subscriptions 
                            SET status='active', start_date=%s, end_date=%s, next_billing_date=%s
                            WHERE id = %s
                        z
                            UPDATE subscriptions 
                            SET status='active', start_date=%s, end_date=NULL, next_billing_date=NULL
                            WHERE id = %s
                        )failedr_   zPayment verified and recorded.)r   payment_statusrR   r   zInvalid signature.zPayment verification error: zVerification failed: r#   )r   r$   r   r   r%   r&   r'   r(   rL   utility%verify_subscription_payment_signatureverify_payment_signaturerazorpayerrorsSignatureVerificationErrorr=   fetchprintpaymentrK   jsondumpsr)   	lastrowidr   r*   r   r+   r,   r-   r.   )r/   r0   r1   r2   r%   subscription_dataZis_subscriptionZsubscription_detailsr]   Zpayment_detailsrR   r4   r5   rc   r6   r7   r7   r8   verify_payment_directly   s   a
 
 a
 
	

	 a

  a

  a



  a
  Z
(
  a

rq   )flaskr   r   
contextlibr   confr   r   r   r   rg   rm   ClientrO   RAZORPAY_KEY_SECRETrL   r9   rQ   rq   r7   r7   r7   r8   <module>   s    _L