
    V
hNL              
       4   S SK r S SKrS SKrS SKJrJr  S SKJr  S SKJr  SSK	J
r
JrJrJrJrJrJrJr  SSKJr  S SKJr  SS	KJrJrJr  SS
KJrJrJrJr  \R>                  " \ 5      r!Sr"Sr#Sr$Sr%Sr&\ RN                  " S5      r(S\
S\RR                  S\4S jr*S\RR                  S\+4S jr,S\-S\RR                  S\4S jr.S\S\RR                  S\-4S jr/S\S\RR                  S\S\04S jr1S\S\RR                  S\S\04S jr2S\-S\RR                  S\S\4S jr3S\RR                  S\+4S jr4S\RR                  S\S\04S  jr5S!\S\RR                  4S" jr6S\-S#\-S$\-S\RR                  S\74
S% jr8S#\-S$\-S\RR                  S\74S& jr9S'\-S$\-S\RR                  S\74S( jr:S)\-S#\-S$\-S\RR                  S\74
S* jr;S\RR                  4S+ jr<S\RR                  4S, jr=S\RR                  4S- jr>S\RR                  4S. jr?S/\-S\04S0 jr@S\-S\RR                  S\04S1 jrAg)2    N)	timedeltadatetime)
Collection)database   )SubscriptionTypeCreateSubscriptionTypeSubscriptionCreateSubscriptionPaymentCreatePaymentSubscriptionUpdateSubscriptionLog)User)str_to_objectid)create_checkout_sessionupdate_stripe_subscriptionverify_stripe_signature)send_subscription_success_emailsend_payment_success_emailsend_payment_failure_email!send_subscription_cancelled_emailsubscription_typessubscriptionspaymentsaccountssubscription_logsMY_APP_DOMAINsubscription_typedbreturnc                    #    U[            nUR                  U R                  5       5      n[        S0 U R                  5       DS[	        UR
                  5      0D6$ 7f)Nsubscription_type_id )SUBSCRIPTION_TYPE_COLLECTION
insert_onedictr	   strinserted_id)r   r    
collectionresults       PC:\Suresh\moveshuttle\MDcreated\moveengine\app\v1\services\saas\subscriptions.py create_subscription_type_servicer-      sU        <=J""#4#9#9#;<Fe/446eSQWQcQcMdees   AAc                    #    U [            n[        UR                  5       R                  SS5      5      nU H  nUR	                  S5      US'   M     U Vs/ s H  n[        S0 UD6PM     sn$ s  snf 7f)Ntype   r#   r$   )r%   listfindsortpopr	   )r    r*   r   sts       r,   list_subscription_types_servicer6   '   so      <=Jjoo/44VQ?@ %'VVF^!" !-?@-?r"r"-?@@@s   AA3A.+A3subscription_idc                    #    U[            nUR                  S[        U 5      05      nU(       d  [        S5      e[	        US   5      US'   [        S0 UD6$ 7f)N_idzSubscription not foundr7   r$   )SUBSCRIPTION_COLLECTIONfind_oner   
ValueErrorr(   r   )r7   r    subscription_collectionsubscription_dicts       r,   get_subscription_servicer?   0   sb     *,-D*E/88%Q`Aa9bc122+./@/G+H'(,+,,s   AAsubscription_logc                    #    U[            nUR                  U R                  5       5      n[        UR                  5      n[
        R                  SU5        U$ 7f)Nz&Logged subscription change with id: %s)LOG_SUBSCRIPTION_COLLECTIONr&   r'   r(   r)   loggerinfo)r@   r    log_collectionr+   log_ids        r,   log_subscription_change_servicerG   8   sN     !#$?!@N&&'7'<'<'>?F##$F
KK8&AMs   AAsubscriptioncurrent_userc                 n  #    U[            nU[           nUS   S:  a  [        S5      eUR                  S[	        US   5      05      nU R                  5       n[        R                  " 5       US'   US   US'   US   [        SS	9-   US
'   UR                  SUS   05      nU(       a  US   nUR                  SU0SU05        O"SUS'   UR                  U5      n	U	R                  nUR                  SU05      n
[        S0 U
DS[        U5      0D6n[        [        S0 UR                  5       D[        US   5      [        R                  " 5       S.D6U5      I S h  vN nUR                  SUR                   0S[        U5      UR"                  UR$                  S.05        U[&           R                  SU R$                  05      nUR)                  S5      n[+        US   US   US   [        U5      UR$                  UUR,                  [        U5      S9I S h  vN nUUR)                  SS5      S.$  N N7f)Nroles   z/You are not permitted to create a subscription.r9   
account_id
start_daterenew_start_date   )daysrenew_end_date$setnewstatusr7   updated_user_idupdated_dateuser_id)active_subscription_idsubscription_statusaccount_typer/   stripe_price_idaccount_nameemailrM   r^   r_   r7   r#   r]   quantityrF   url rH   checkout_urlr$   )r:   ACCOUNTS_COLLECTIONr<   r;   r   r'   r   utcnowr   
update_oner&   r)   r   r(   rG   r   rY   rU   r#   r%   getr   subscription_agents_count)rH   r    rI   r=   account_collectionaccountr>   existing_subscriptionr7   r+   created_subscription_dictcreated_subscriptionrF   subscription_type_docr]   checkout_session_responses                   r,   create_subscription_servicerr   ?   s}    
 +--D*E%'(;%<Gq JKK ))5/,|B\2]*^_G$))+&.oo&7l#,=l,K()*;L*II[]L^*^&'3<<lLYeLf=gh/6**E?+CfN_E`a&+(#(334EF ,, 7 @ @%AY Z'j*CjUXYhUij2  	A.335  	As<X]K^G_nvn}n}n  	A
 F
 !!	(001	&)/&:#7#>#>0EE
 	 ;<EEv|OpOpFqr+//0ABO&=-^,gO,1FF'%??6{	' 	! -155eR@ 9"	!s%   EH5H1B<H5H3H53H5c                   #    U R                  5       nUS   nU(       d  [        S5      eUS   S:  a  [        S5      eU[           nU[           nUR	                  S[        U5      05      nU(       a  UR                  S5      US   :w  a  [        S5      eU R                  S	S
9nSU;   a  SU;   a  US   US   -  US'   U[           R	                  SUS   05      n	U	R                  S5      n
UR                  S5      (       a  [        US   U
US   S9I S h  vN nU(       a}  UR                  S[        U5      0SU05        UR	                  S[        U5      05      n[        [        S0 UD[        US   5      [        R                  " 5       S.D6U5      I S h  vN   O[        S5      eS nOUR	                  S[        US   5      05      nUR                  S[        U5      0SU05        UR	                  S[        U5      05      n[        [        S0 UD[        US   5      [        R                  " 5       S.D6U5      I S h  vN   [        US   US   US   UUS   U
US   SS9I S h  vN nUR                  S5      nSU;   a'  UR                  S[        US   5      0SSUS   005        [        US   5      US'   [        US   5      US'   XS.$  GN GN= N Np7f)Nr7   zSubscription ID is required.rK   rL   z/You are not permitted to update a subscription.r9   rM   z'Subscription not found or access deniedT)exclude_nonerj   peragent_cost
total_costr/   r#   r]   stripe_subscription_id)r7   new_price_idnew_quantityrS   rV   z!Stripe subscription update failednamer_   rc   r`   rb   r\   rd   r$   )r'   r<   r:   rf   r;   r   ri   r%   r   rh   rG   r   r(   r   rg   r   )rH   r    rI   r>   r7   r=   rk   rm   updated_datarp   r]   stripe_updatedupdated_subscriptionre   rl   rq   s                   r,   update_subscription_servicer~   |   se    
 %))+'(9:O788Gq JKK*,-D*E%'(;%<3<<e_UdEe=fg $9$=$=l$K|\hOi$iBCC$$$$7L"l2,7V%12M%NQ]^mQn%n\";<EEv|\rOsFtu+//0ABO  !9::912JK(%&AB 
 

 #..7W/X[acoZpq#:#C#CUO\kLlDm#n 1  B"6  BLY^L_H`owo~o~  pA  B  
 @AA$--uolS_F`6a.bc**E??3S+TW]_kVlm6??XgHh@ij-}2}CUZH[D\kskzkzk|}
 	
 	
 +B#L1 w'+!-.D!E+!"=>	+
 	%
! 144U;-%%O$9,$GHInl3I&JKL	

 /22Fu2M.N*+"%&:5&A"B0OOY
	
	%
sK   DKKBKKB)KK&K+K,A)KKKKc                   #    U[            nUR                  S[        U 5      05      nU(       a  US   UR                  :w  a  [	        S5      eUR                  S[        U 5      0SSS005        U[           nUR                  SUR                  0SS SS.05        UR                  S[        U 5      05      n[        S0 UD6$ 7f)	Nr9   rY   z(Subscription not found or access denied.rS   rU   	cancelled)rZ   r[   r$   )r:   r;   r   rY   r<   rh   rf   r   )r7   r    rI   r=   rH   rk   r}   s          r,   cancel_subscription_servicer      s     
 +--D*E*33UOO<\4]^L<	2l6J6JJCDD&&/O'PSY\dfq[rRst%'(;%<!!	L(()	DUV 3;;UOTcDd<ef/.//s   B?Cc                    #    U [            n[        UR                  5       5      nU Vs/ s H  n[        S0 UD6PM     sn$ s  snf 7f)Nr$   )r:   r1   r2   r   )r    r*   r   ss       r,   list_subscriptions_servicer      sA      78J*+M'45}!L1}555s   'AAAc                    #    US   nUS   S:  a  [        S5      eU [           nSU0n[        UR                  U5      5      nU H  n[	        US   5      US'   M     [        U5      nXWS.$ 7f)NrM   rK   rL   z%Not permitted to view these payments.r9   
payment_id)r   total_count)r<   PAYMENTS_COLLECTIONr1   r2   r(   len)r    rI   rM   r*   payments_queryr   paymentr   s           r,   list_payments_servicer      s     l+JGq @AA 34J"J/NJOON34H #GEN 3 h-K ==s   A*A,r   c                 ^   #    U[            nUR                  U R                  5       5      nU$ 7f)N)r   r&   r'   )r   r    r*   r+   s       r,   create_payment_servicer      s+      34J""7<<>2FMs   +-rw   rU   c                    #    U[            nUR                  S[        U 5      0SX!S.05      n[        R	                  SU5        UR
                  S:  $ 7f)Nr9   rS   )rU   rw   zStripe ID updated to %sr   )r:   rh   r   rC   rD   modified_count)r7   rw   rU   r    r=   r+   s         r,   "update_subscription_status_servicer      s^      +--D*E$//	01	FUVF KK)+AB  1$$s   AAc                   #    U[            nUR                  SU 05      nU(       d  [        R                  SU 5        gUS   nUR	                  SU 0SSU005      nUR
                  S:  a`  [        XQU5      I S h  vN   US   nUR                  S	[        US
   5      0S/S9nU(       a!  [        [        US
   5      XU5      I S h  vN   UR
                  S:  $  N_ N7f)Nrw   z(Subscription not found for Stripe ID: %sFrM   rS   rU   r   r   r7   r9   )rX   )r3   )	r:   r;   rC   errorrh   r   update_account_status_servicer(   update_log_status_service)	rw   rU   r    r=   rH   rM   r+   rE   
latest_logs	            r,   "update_subscription_stripe_servicer      s     +--D*E*335MOe4fgL?AWXl+J$//	!#9:	(F#$F q +JCCC%'(;%<#,,L$7 89&' - 

 +C
50A,BDZdfggg  1$$ 	D hs%   A7C9C:ACCCCrM   c                 |   #    U[            nUR                  S[        U 5      0SSU005      nUR                  S:  $ 7f)Nr9   rS   r[   r   )rf   rh   r   r   )rM   rU   r    rk   r+   s        r,   r   r     sO     %'(;%<**	
+,	'01F   1$$   :<rF   c                 |   #    U[            nUR                  S[        U 5      0SXS.05      nUR                  S:  $ 7f)Nr9   rS   )rw   rU   r   )rB   rh   r   r   )rF   rw   rU   r    rE   r+   s         r,   r   r     sL     !#$?!@N&&	'(	,BUVF   1$$r   c                 J  #    [        U 5      I S h  vN n[        R                  SUS   5        US   S   nUS   S:X  a  Sn[        XEX!5      I S h  vN   SS0$ US   S;   a  [	        XB5      I S h  vN   SS0$ US   S;   ar  [        US	U5      I S h  vN   US   S   nUS
   n[        R                  R                  US   5      nUR                  SS5      n	UR                  [        XyUS   S9  SS0$ US   S:X  a  S	n[        XEU5      I S h  vN   SS0$ US   S:X  an  [        USU5      I S h  vN   US   S   nUS
   n[        R                  R                  US   5      nUR                  SS5      n	UR                  [        XyUS   S9  SS0$  GN GNE GN( GN	 N No7f)NzReceived event: %sr/   dataobjectzcheckout.session.completedactive)zcustomer.subscription.createdzcustomer.subscription.updated)zcustomer.subscription.deletedr   customer_emailcustomerrz   zValued Customer
amount_due)r_   rz   amountzpayment.payment_failedzinvoice.payment_failedholdrU   success)r   rC   rD   )handle_checkout_session_completed_service"handle_subscription_update_service%handle_payment_payment_failed_servicestripeCustomerretrieveri   add_taskr   )
requestbackground_tasksr    event
stripe_obj	setstatusinvoice
user_emailr   customer_names
             r,   stripe_webhook_servicer   %  s    )'22E
KK$eFm4vx(JV}44	7
rddd( i  ' 
v\	\0@@@$ i  # 
v;	;3JRPPP-)-.
??++GJ,?@ V->?!!"<Jkrs  lA!  	B i   
v2	2	3J2NNN i   
v2	23JKKK-)-.
??++GJ,?@ V->?!!"<Jkrs  lA!  	Bi  5 3 	e@P 	OKsk   F#F?F#FF#1F2!F#FA;F#F!F#1F!2A"F#F#F#F#F#!F#c           
        #    U R                  S0 5      nUR                  S5      nUR                  S5      nUR                  S5      nUR                  S5      nU R                  S5      n	U R                  S5      S-  n
U R                  S	5      nUR                  S
5      nUR                  S5      nU(       a  U R                  S5      n	U	(       a  [        XYX5      I S h  vN   [        XaU5      I S h  vN   [        XX5      I S h  vN   [	        UU	UUU
[
        R                  " 5       SS9n[        X5      I S h  vN   UR                  [        XXS9  [        R                  SXY5        g g g  N N} Nk N87f)Nmetadatar7   rM   r^   r_   rH   amount_totald   payment_intentrF   ra   paid)r7   rw   stripe_transaction_idrM   r   due_daterU   )r_   rz   countr   zIUpdated local subscription %s with Stripe ID %s and set status to active.)ri   r   r   r   r   r   rg   r   r   r   rC   rD   )session_objr   r    r   r   local_subscription_idrM   r^   r_   rw   r   r   rF   agent_countpayment_datas                  r,   r   r   B  sb    z2.H$LL):;l+J<</LLL!E(__^<??>2S8L'OO,<=\\(#F,,z*K!,!@!45Jdmrrr/
rJJJ+FIZZZ( 5'=&;%#!*L ):::%%&EUmx%  OKKcez  T "  sJZ ;sH   CE7E/ E73E14E7E34E7<E5=3E71E73E75E7c                    #    U S   nU S   nUS:X  a  SOSn[        X$U5      I S h  vN   [        R                  SX$5        g  N7f)NidrU   r   r   zSubscription %s updated to %s.r   rC   rD   )subscription_objr    rw   rU   
new_statuss        r,   r   r   a  sP     -d3h'F#x/VJ
,-CQS
TTT
KK02HU Us   $AAAc                 n   #    U S   n[        X1U5      I S h  vN   [        R                  SU5        g  N7f)NrH   z5Payment failed for subscription %s. Set to cancelled.r   )payment_objr   r    rw   s       r,   r   r   h  s8     (8
,-CPR
SSS
KKGI_` Ts   535
session_idc                    #     [         R                  R                  R                  U 5      nUR                  S:X  a  SSSS.$ SSS.$ ! [
         a  n[        R                  S	U5        UeS nAff = f7f)
Nr   TzPayment verified successfully.r   )r   messagerU   FzPayment verification failed.)r   r   z#Error verifying payment session: %s)r   checkoutSessionr   payment_status	ExceptionrC   r   )r   sessiones      r,   verify_payment_servicer   m  sp     //))22:>!!V+#0P\dee$1OPP :A>s4   A2>A A2A A2
A/A**A//A2c                   #    U[            nUR                  S[        U 5      05      nU(       a  SU;  a  [        S5      eUS   n [        R
                  R                  U5      nUR                  n[        R                  R                  R                  U[         S3S9nSUR                  0$ ! [        R                  R                   a  n[        S[        U5       35      eS nAff = f7f)Nr9   rw   zBStripe Subscription ID not found for the provided subscription ID.zStripe API error: z/billing)r   
return_urlrb   )r:   r;   r   r<   r   r   r   r   r   StripeErrorr(   billing_portalr   creater   rb   )	r7   r    r=   rH   rw   subscription_detailscustomer_idr   r   s	            r,   create_portal_session_servicer   x  s      !89*33UOO<\4]^L3<G]^^)*BC8%22;;<RS*33 ##++22#_H- 3 G 7;; <<## 8-c!fX6778s*   AC++B. 1=C+.C(C##C((C+)Bosr   loggingr   r   pymongo.collectionr   app.dbr   models.saas.subscriptionsr   r	   r
   r   r   r   r   r   models.saas.usersmodelr   app.v1.libraries.objectr   libraries.striper   r   r   libraries.email_templatesr   r   r   r   	getLogger__name__rC   r%   r:   r   rf   rB   getenvr   MongoDBr-   r1   r6   r(   r?   rG   r'   rr   r~   r   r   r   r   boolr   r   r   r   r   r   r   r   r   r   r$       r,   <module>r      s+   	   ( )    + 3 l l 
 
		8	$  4 )     1 		/*f-ff fAh.>.> A4 A-C -X=M=M -R^ -O QYQaQa fi ;$;; ; 
	;zHP$HPHP HP 
	HPT000 0 	0$6)9)9 6d 6

>H$4$4 
>D 
>T 
>- X=M=M 
	%	%25	%?B	%HPHXHX	%		%%%),%2:2B2B%	%0%C % %(JZJZ %_c %%C % %VY %_g_o_o %tx %!@P@P !:TPXP`P` T>V8CSCS VaHL\L\ a
	S 	T 	   (BRBR  W[  r   