
    7h$-                     t   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlZd dlmZmZmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ  ede      ZdedefdZej9                  ddg      ed               Zej9                  ddg      ed               Zej9                  ddg      ed               Zy)    N)EducoinsTopup)Coupon)PaymentOrder)User)ObjectId)	Blueprintrequestjsonify)datetime)ValidationErrorDoesNotExist)jwt_required)TransactionHistorypayments_bprupeesreturnc                     t        |       dz  S )Nd   )int)r   s    +/var/www/html/eduruby.in/routes/payments.py	_to_paiser      s    v;    z/create-orderPOST)methodsc                     t        j                  d      xs i } t        t         dd      }| j                  d      }| j                  d      }| j                  d      }|st	        dd	d
      dfS 	 t        j                  |d      j                         }|st	        ddd
      dfS d}|r6t        j                  |      j                         }|sIt	        ddd
      dfS |r7	 t        j                  |      j                         }|st	        ddd
      dfS |ra|j                  dk7  rt	        ddd
      dfS t        j                         }||j                  k  s||j                  kD  rt	        ddd
      dfS t!        |j"                        }d}	|r|j$                  dk(  r5|j&                  |k\  rt	        ddd
      dfS t!        |j&                        }	n?|j$                  dk(  r0|t!        |j&                        z  dz  }	|	|k\  rt	        ddd
      dfS ||	z
  }
|
dk  rt	        ddd
      dfS 	 t(        j*                  d   }t(        j*                  d   }t/        j0                  ||f      }d t3        |j4                        d!d  d"t!        t        j                         j7                                }	 |j8                  j;                  t=        |
      d#|dd$      }|j                  d'      }|st	        dd(d
      d&fS tA        |||||	|
||d)*	      jC                         }t	        dd+|t=        |
      t3        |j4                        |d,      d-fS # t        t        f$ r d}Y w xY w# t        t        f$ r d}Y |w xY w# t,        $ r t	        ddd
      dfcY S w xY w# t>        $ r&}t	        dd%t3        |       d
      d&fcY d}~S d}~ww xY w).z
    Body:
    {
      "topup_id": "<MongoID>",
      "coupon_code": "<CODE>"   # optional; we also accept coupon_id if you send it
      "coupon_id": "<MongoID>"  # optional
      "amount": <IGNORED>       # ignored per requirement
    }
    Tsilentuser_idNtopup_idcoupon_code	coupon_idFztopup_id is requiredstatusmessage     )idr#   zInvalid topup selected)r    zInvalid coupon coder'   zInvalid couponzCoupon is inactivezCoupon is expiredr   flat
percentager   zInvalid discountz(Payable amount must be greater than zeroRAZORPAY_KEY_IDRAZORPAY_KEY_SECRET#Razorpay credentials not configured  authztp-i-INR)amountcurrencyreceiptpayment_capturez Razorpay order creation failed:   r'   zFailed to get Razorpay order idcreated)	r   topupcouponsubtotaldiscountr3   razorpay_order_idr5   r#   zOrder created)r#   r$   order_idr3   payment_order_idr5      )"r	   get_jsongetattrgetr
   r   objectsfirstr   r   r   r#   r   utcnowcoupon_start_datecoupon_end_dater   topup_coin_valuecoupon_typecoupon_valueosenvironKeyErrorrazorpayClientstrr'   	timestampordercreater   	Exceptionr   save)datar   r   r    r!   r9   r:   nowr;   discount_appliedamount_to_paykey_id
key_secretclientr5   	rzp_orderer>   pos                      r   create_orderra      s%    4(.BDgy$/Gxx
#H((=)K%I%4JKLcQQ%%!<BBD %4LMNPSSS FK8>>@e8MNOQTTT		^^y1779F e8HIJCOO ==Ae8LMNPSSSoo)))S63I3I-Ie8KLMsRR 5))*H'""h.%<QRSUXXX"6#6#67</ (3v/B/B+C CK8+%<NOPRUUU//M%4^_`beeea-.ZZ 56
 __6:"67FCM"#&'qX__->-H-H-J)K(LMGgLL''. 	)
 	 }}T"H%4UVWY\\\ 
!"

 df  "M*J  	 o \*   . 	F	L  a%4YZ[]```a  g%6VWZ[\W]V^4_`acfffgsT   2%M &$M2 6&N
 <)N) M/.M/2NN
N&%N&)	O2OOOz/verifyc                     t        j                  d      xs i } t        t         dd      }| j                  d      }| j                  d      }| j                  d      }|r|st	        dd	d
      dfS d}|r%	 t        j                  |      j                         }|s$t        j                  |      j                         }|st	        ddd
      dfS t        |j                        t        |      k7  rt	        ddd
      dfS |j                  dk(  rXt        j                  |j                        j                         }t	        dd|j                  |r|j                  ndd      dfS 	 t        j                  d   }t        j                  d   }t#        j$                  ||f      }		 |	j&                  j)                  |      }
|
j                  d      }|
j                  d      }t+        |
j                  dd            }t+        |j,                        d z  }||k7  rt	        dd!d
      dfS ||k7  rt	        dd"d
d      S |d#k7  r;|d$k(  rd$|_        |j/                          t	        dd%| d&|j                  d'      dfS t        j                  |j                        j                         }|st	        dd(d
      dfS |j0                  st	        dd)d
      dfS t+        |j0                  j2                  xs d      }t+        |j                  xs d      }||z   }|dkD  rJ||_        |j/                          t5        |j6                  |d*d+|d,| d-| d||d./
      j/                          d|_        |j/                          t	        dd0|j                  ||d1      dfS # t        $ r d}Y w xY w# t         $ r t	        ddd
      dfcY S w xY w# t        $ r&}t	        ddt        |       d
      dfcY d}~S d}~ww xY w)2z
    Body:
    {
      "order_id": "<razorpay_order_id>",
      "payment_id": "<razorpay_payment_id>",
      "payment_order_id": "<internal id>"   # optional
    }
    Verifies directly with Razorpay (no signature) and credits coins on 'captured'.
    Tr   r   Nr>   
payment_idr?   Fz$order_id and payment_id are requiredr"   r%   r(   )r=   zPayment order not foundi  	Forbiddeni  paidz#Order already verified and credited)r#   r$   order_statuscoins_wallet_balancer@   r+   r,   r-   r.   r/   zFailed to fetch payment: r7   r#   r3   r   r   z#Payment not linked to this order_idzAmount mismatchcapturedfailedzPayment not captured (status=))r#   r$   rf   zUser not foundzTopup not found for this ordercoins_purchasecreditzCoins purchase: +z coins via Razorpay order r&   )
	parent_idr   transaction_type
entry_typer3   descriptionrelated_user_idbalance_beforebalance_aftertransaction_statusz$Payment verified and wallet credited)r#   r$   rf   coins_addedrg   )r	   rA   rB   rC   r
   r   rD   rE   rU   rQ   r   r#   r   rg   rL   rM   rN   rO   rP   paymentfetchr   r3   rV   r9   topup_coinsr   r'   )rW   r   r>   rc   r?   r`   userr[   r\   r]   rv   r_   payment_statuspayment_orderpayment_amountexpected_paisecoins_to_creditrr   rs   s                      r   verify_orderr      s'    4(.BDgy$/Gxx
#H,'Jxx 23%4Z[\^aaa 
B	%%)9:@@BB !!H=CCE%4MNOQTTT 2::#g,&%K@A3FF 
yyF||rzz*002<IIAED$=$=4	
 
  	a-.ZZ 56
 __6:"67F`..&&z2 [[*NKK
+MXq12N ^c)N %4YZ[]```'%4EFLL#X% BIGGI6~6FaHII
  	 	 <<2::&,,.D%4DEFKK88%4TUVX[[["((..3!4O227a8N"_4M $1!		 	ee-"+O+<<VW_V`a )' 	
 $& BIGGI9		& -  	 A  	B	6  a%4YZ[]```a  `%6OPSTUPVx4XYZ\___`sB   8$N% -&N7 ,O %N43N47OO	PP :P Pz/transactions/historyc                     t        j                  d      xs i } | j                  d      }t        t         dd      }|st	        ddd      d	fS |r|d
vrt	        ddd      dfS 	 t        t        |            }t        j                  |      }|r|j                  |      }|j                         j                  d      }g }|D ]  }|j                  t        |j                        t        |      |j                  |j                   |j"                  |j$                  |j&                  rt        |j&                        nd|j(                  |j*                  |j,                  |j.                  r|j.                  j1                         ndd        t	        dt3        |      |xs d|d      dfS # t        $ r t	        ddd      dfcY S w xY w)z
    Body:
    {
      "entry_type": "credit" | "debit"   # optional; if omitted returns all
    }
    Uses user_id from JWT (request.user_id).
    Tr   ro   r   NFUnauthorizedr"   i  )rl   debitzInvalid entry_typer%   zInvalid user id)r   )ro   z-created_date)r'   r   rn   ro   r3   rp   rq   rr   rs   rt   created_dateall)r#   countro   rW   r@   )r	   rA   rC   rB   r
   r   rQ   rU   r   rD   filterno_dereferenceorder_byappendr'   rn   ro   r3   rp   rq   rr   rs   rt   r   	isoformatlen)rW   ro   r   uidqsitemstxs          r   get_transaction_historyr     s    4(.BD,'Jgy$/G%NCDcIIj(;;%4HIJCOOMs7|$
 
	#	#C	0BYY*Y- 
				%	%o	6B E bee*3x " 3 3--ii>>:<:L:Ls2#5#56RV //--"$"7"7;=??BOO557PT
 	 U )E	 
 	 9  M%4EFGLLMs   &F1 1GG) rL   models.EducoinsTopupr   models.Couponr   models.PaymentOrderr   models.userr   bsonr   rO   flaskr   r	   r
   r   mongoengine.errorsr   r   utils.jwt_servicer   models.transaction_historyr   __name__r   r   r   routera   r   r    r   r   <module>r      s    	 .   ,    - -  < * 9x0c c  ?VH5t  6tp 9vh/  0F *VH=6  >6r   