U
    - 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   sZ  t  } dddg}|D ](}|| krtd| dddf  S qt }zzt|jdd}|d	| d f | }|std
dddfW  5 Q R  W W S |d dkrtddddfW  5 Q R  W W vS |d| d | d | d | 	d| 	df |d| d f | d p(d}||d kr|d| d f |	dr|	ddkrz|d|d f nHt
 }|tdd |tdd d	|d }|d||||d f |  td d!dd"fW  5 Q R  W W `S Q R X W nP tk
rF }	 z0|  td#t|	 ddd$f W Y W S d }	~	X Y nX W 5 |  X d S )%N
invoice_idamountZ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
            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)
            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   closer   cursorexecutefetchonegetr   nowr   commit	Exceptionrollbackstr)
datarequired_fieldsfield
connectionr%   invoicer   
start_dateend_datee r6   7/var/www/html/api-medvista/Services/Billing/Payments.pyrecord_payment   sr    
&&	 :r8   c            
      C   s  t  } dg}|D ](}|| krtd| dddf  S qt }zzJt|jdd.}|d| d f | }|stdddd	fW  5 Q R  W W HS t	t
|d
 d }||d d| d  d| d |d|drd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  5 Q R  W W `S Q R X W nP tk
r }	 z0|  td!t|	 ddd"f W Y W S d }	~	X Y nX W 5 |  X d S )#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.   r/   r0   r1   r%   r2   Zamount_in_paiseZ
order_datarazorpay_orderr5   r6   r6   r7   create_razorpay_orderj   s`    &

 	:rP   c                  C   sH  t  } dddg}|D ](}|| krtd| dddf  S qt }zzR|jdd:}|d	| d | d f | }|std
dddfW  5 Q R  W W S |d | d k}zJ|rtj	
| d | d | d d n tj	| d | d | d d W n@ tjjk
rB   tddddf Y W  5 Q R  W W S X |r2tj| d }td|d   |d }|dkrtj| d }	|d|d |d t|	d d |	d | d dt|	di t|	f |j}
|d|d f t }|d dkr0|tdd }|d ||||d! f nJ|d d"krf|td#d }|d ||||d! f n|d$||d! f |  td%||
d&d'd(fW  5 Q R  W W S |d)kr|d*|d f |  td+| |dd,dfW  5 Q R  W W 8S td-| d.|d&d,d(fW  5 Q R  W W S n`tj| d }	|	d }|d/|d |d t|	d d |	d | d |t|	di t|	f |j}
|d0krB|d|d f t }|d dkr|tdd }|d1||||d! f nJ|d d"kr,|td#d }|d1||||d! f n|d2||d! f n|d3kr^|d*|d f |  td4||
|d0kd5d(fW  5 Q R  W W S W 5 Q R X W n tjjk
r   td6dddf Y W hS  tk
r. } zB|  td7t|  td8t| ddd9f W Y W S d:}~X Y nX W 5 |rB|  X d:S );z^
    SECURE payment verification - verifies subscription status instead of payment status
    
payment_idrF   	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
            z*No pending invoice found for this payment.r   razorpay_subscription_id)razorpay_payment_idrS   razorpay_signature)rT   razorpay_order_idrU   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   r9   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_statusrQ   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_statusrQ   r   zInvalid signature.zPayment verification error: zVerification failed: r"   N)r   r#   r   r   r$   r%   r&   r'   rK   utility%verify_subscription_payment_signatureverify_payment_signaturerazorpayerrorsSignatureVerificationErrorr<   fetchprintpaymentrJ   jsondumpsr(   	lastrowidr   r)   r   r*   r+   r,   r-   )r.   r/   r0   r1   r%   subscription_dataZis_subscriptionZsubscription_detailsr\   Zpayment_detailsrQ   r3   r4   rb   r5   r6   r6   r7   verify_payment_directly   s"   
&
,
	

	




$:rp   )flaskr   r   
contextlibr   confr   r   r   r   rf   rl   ClientrN   RAZORPAY_KEY_SECRETrK   r8   rP   rp   r6   r6   r6   r7   <module>   s   _L