
    h)g              
          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  S SKJ r   \RB                  " \"5      r#Sr$Sr%Sr&Sr'Sr(\ RR                  " S5      r*S\
S\RV                  S\4S jr,S\RV                  S\-4S jr.S\/S\RV                  S\4S jr0S\S\RV                  S\/4S jr1S\S\RV                  S\S\24S jr3S\S\RV                  S\S\24S jr4S\/S\RV                  S\S\4S jr5S\RV                  S\-4S  jr6S\RV                  S\S\24S! jr7S"\S\RV                  4S# jr8S\/S$\/S%\/S\RV                  S\94
S& jr:S$\/S%\/S\RV                  S\94S' jr;S(\/S%\/S\RV                  S\94S) jr<S*\/S$\/S%\/S\RV                  S\94
S+ jr=S\RV                  4S, jr>S\RV                  4S- jr?S\RV                  4S. jr@S\RV                  4S/ jrAS0\/S\24S1 jrBS\/S\RV                  S\24S2 jrCS\
S\RV                  S\4S3 jrDS4\/S\RV                  S\4S5 jrES4\/S6\
S\RV                  S\4S7 jrFS4\/S\RV                  S\94S8 jrGg)9    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)get_next_sequence_value_intsubscription_typessubscriptionspaymentsaccountssubscription_logsMY_APP_DOMAINsubscription_typedbreturnc                    #    U[            n[        SU5      nU R                  5       nX4S'   X4S'   UR                  U5      n[	        S0 UD6$ 7f)Nsubscription_type_idtype )SUBSCRIPTION_TYPE_COLLECTIONr   dict
insert_oner	   )r    r!   
collection	custom_iddataresults         PC:\Suresh\moveshuttle\MDcreated\moveengine\app\v1\services\saas\subscriptions.py create_subscription_type_servicer/       sc        <=J ,,BBGI !!#D#,	 L ""4(F #d##s   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)Nr%      r$   r&   )r'   listfindsortpopr	   )r!   r*   r   sts       r.   list_subscription_types_servicer7   5   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 foundr8   r&   )SUBSCRIPTION_COLLECTIONfind_oner   
ValueErrorstrr   )r8   r!   subscription_collectionsubscription_dicts       r.   get_subscription_servicerA   >   sb     *,-D*E/88%Q`Aa9bc122+./@/G+H'(,+,,   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>   inserted_idloggerinfo)rC   r!   log_collectionr-   log_ids        r.   log_subscription_change_servicerK   F   sN     !#$?!@N&&'7'<'<'>?F##$F
KK8&AMs   AAsubscriptioncurrent_userc                 B  #    U[            nU[           nUS   S:  a  US   S:w  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 R                  05      nU(       a  UR                  SS5      US'   [        S5        [        U5        [        S5        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   d   z/You are not permitted to create a subscription.r:   
account_id
start_daterenew_start_date   )daysrenew_end_dater%   name 	plan_name<subscription_dictsubscription_dictsubscription_dictplan_namez!***************************** END$setnewstatusr8   updated_user_idupdated_dateuser_id)active_subscription_idsubscription_statusaccount_typestripe_price_idaccount_nameemailrR   rg   rh   r8   r$   rf   quantityrJ   urlrL   checkout_urlr&   )r;   ACCOUNTS_COLLECTIONr=   r<   r   r(   r   utcnowr   r'   r$   getprint
update_oner)   rF   r   r>   rK   r   rb   r^   r   subscription_agents_count)rL   r!   rM   r?   account_collectionaccountr@   subscription_type_docexisting_subscriptionr8   r-   created_subscription_dictcreated_subscriptionrJ   rf   checkout_session_responses                   r.   create_subscription_servicer{   M   s    
 +--D*E%'(;%<Gq \'%:c%AJKK ))5/,|B\2]*^_G$))+&.oo&7l#,=l,K()*;L*II[]L^*^&' ;<EE	223 )>)B)B62)N+&	
HI	
	
-.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%   GJJB<JJJJ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)Nr8   zSubscription ID is required.rO   rP   z/You are not permitted to update a subscription.r:   rR   z'Subscription not found or access deniedT)exclude_noners   peragent_cost
total_costr%   r$   rf   stripe_subscription_id)r8   new_price_idnew_quantityr\   r_   z!Stripe subscription update failedrX   rh   rY   ri   rk   re   rl   r&   )r(   r=   r;   rn   r<   r   rp   r'   r   rr   rK   r   r>   r   ro   r   )rL   r!   rM   r@   r8   r?   rt   rw   updated_datarv   rf   stripe_updatedupdated_subscriptionrm   ru   rz   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)	Nr:   rb   z(Subscription not found or access denied.r\   r^   	cancelled)rc   rd   r&   )r;   r<   r   rb   r=   rr   rn   r   )r8   r!   rM   r?   rL   rt   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;   r2   r3   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)NrR   rO   rP   z%Not permitted to view these payments.r:   
payment_id)r   total_count)r=   PAYMENTS_COLLECTIONr2   r3   r>   len)r!   rM   rR   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                 t   #    [        S5        U[           nUR                  U R                  5       5      nU$ 7f)Nz%Create payment service 25025222502520)rq   r   r)   r(   )r   r!   r*   r-   s       r.   create_payment_servicer     s4     	
12 34J""7<<>2FMs   68r   r^   c                    #    U[            nUR                  S[        U 5      0SX!S.05      n[        R	                  SU5        UR
                  S:  $ 7f)Nr:   r\   )r^   r   zStripe ID updated to %sr   )r;   rr   r   rG   rH   modified_count)r8   r   r^   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)Nr   z(Subscription not found for Stripe ID: %sFrR   r\   r^   r   r   r8   r:   )ra   )r4   )	r;   r<   rG   errorrr   r   update_account_status_servicer>   update_log_status_service)	r   r^   r!   r?   rL   rR   r-   rI   
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rR   c                 |   #    U[            nUR                  S[        U 5      0SSU005      nUR                  S:  $ 7f)Nr:   r\   rd   r   )rn   rr   r   r   )rR   r^   r!   rt   r-   s        r.   r   r   -  sO     %'(;%<**	
+,	'01F   1$$   :<rJ   c                 |   #    U[            nUR                  S[        U 5      0SXS.05      nUR                  S:  $ 7f)Nr:   r\   )r   r^   r   )rE   rr   r   r   )rJ   r   r^   r!   rI   r-   s         r.   r   r   5  sL     !#$?!@N&&	'(	,BUVF   1$$r   c           	        #     [        U 5      I S h  vN n[        R                  SUS   5        UR                  S0 5      R                  S0 5      nUR                  S5      nUS:X  a  Sn[	        XFX!5      I S h  vN   GO]US;   a  UR                  S5      nUR                  S	5      nUR                  S
5      n	UR                  S5      n
[        R                  SU	 SU SU 35         US   R                  SU0SUU	U
[        R                  " 5       S.0SS9  [        R                  S5        [        XB5      I S h  vN   GOUS:X  a  [        USU5      I S h  vN   UnUR                  S5      nUR                  S5      nU(       a^  U(       aW   [        R                  R                  U5      nUR                  S
S5      nUR!                  ["        XUR                  SS5      S9  OUS :X  a  [        USU5      I S h  vN   OUS!:X  a  [        US"U5      I S h  vN   UnUR                  S5      nUR                  S5      nU(       a^  U(       aW   [        R                  R                  U5      nUR                  S
S5      nUR!                  ["        XUR                  SS5      S9  O4US#:X  a  [        R                  S$5        O[        R                  S%U 35        S&S'0$  GN GNk! [         a#  n[        R                  SU 35         S nAGNS nAff = f GN GN! [         a%  n[        R                  SU 35        Sn S nAGNS nAff = f GNQ GN8! [         a$  n[        R                  SU 35        Sn S nANS nAff = f! [         a7  nSS Kn[        R                  S(UR'                  5       5        [)        S)S*S+9eS nAff = f7f),Nu   ✅ Stripe event received: %sr%   r,   objectzcheckout.session.completedactive)zcustomer.subscription.createdzcustomer.subscription.updatedidrh   rX   phoneu"   👤 New Stripe customer created: z (z) - ID: stripe_customersstripe_customer_idr\   )rh   rX   r   
created_atT)upsertu(   ✅ Stripe customer stored successfully.u%   ❌ Failed to store Stripe customer: zcustomer.subscription.deletedr   customer_emailcustomerzValued CustomerzStripe Customer fetch failed: 
amount_duer   )rh   rX   amountzpayment.payment_failedzinvoice.payment_failedholdzcustomer.createduA   🔔 customer.created event received. No action needed currently.u$   ℹ️ Unhandled Stripe event type: r^   successu(   🔥 Error in stripe_webhook_service:
%si  z(Internal error processing Stripe webhook)status_codedetail)r   rG   rH   rp   )handle_checkout_session_completed_servicerr   r   ro   	Exceptionr   "handle_subscription_update_service%handle_payment_payment_failed_servicestripeCustomerretrievewarningadd_taskr   	traceback
format_excHTTPException)requestbackground_tasksr!   event
stripe_obj
event_type	setstatuscustomer_idrh   rX   r   db_errinvoice
user_emailr   customer_nameer   s                     r.   stripe_webhook_servicer   ]  s    V`-g663U6]CYYvr*..x<
YYv&
55 I;JSUhhh]]$...KNN7+E>>&)DNN7+EKK<TF"UG8T_S`abO%&11);7%*$(%**2//*;	!   2  FG 5ZDDD::7
KQSTTT G %56J!++j1Kk6%77DH$,LL9J$KM
 !))*DJszs~s~  @L  NO  tP)  Q337
KQSTTT337
FBOOO G %56J!++j1Kk6%77DH$,LL9J$KM
 !))*DJszs~s~  @L  NO  tP)  Q--KK[\ KK>zlKL)$$a 7 i0  ODVHMNNO E U ! 6NN%CA3#GH$5M6 U P ! 6NN%CA3#GH$5M6  `@)BVBVBXY4^__`s  ON K"A'N :K%;A.N *AK( /N =L>N L6N 1L <N ?M N M6N 1M AN !O"N %N (
L2L
N LN N 
M(MN MN N 
N M?:N ?NN 
O2OOO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metadatar8   rR   rg   rh   rL   amount_totalrQ   payment_intentrJ   rj   paid)r8   r   stripe_transaction_idrR   r   due_dater^   )rh   rX   countr   zIUpdated local subscription %s with Stripe ID %s and set status to active.)rp   r   r   r   r   r   ro   r   r   r   rG   rH   )session_objr   r!   r   r   local_subscription_idrR   rg   rh   r   r   r   rJ   agent_countpayment_datas                  r.   r   r     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)Nr   r^   r   r   zSubscription %s updated to %s.r   rG   rH   )subscription_objr!   r   r^   
new_statuss        r.   r   r     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)NrL   z5Payment failed for subscription %s. Set to cancelled.r   )payment_objr   r!   r   s       r.   r   r     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   messager^   FzPayment verification failed.)r   r   z#Error verifying payment session: %s)r   checkoutSessionr   payment_statusr   rG   r   )r   sessionr   s      r.   verify_payment_servicer     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)Nr:   r   zBStripe Subscription ID not found for the provided subscription ID.zStripe API error: z/billing)r   
return_urlrk   )r;   r<   r   r=   r   r   r   r   r   StripeErrorr>   billing_portalr   creater   rk   )	r8   r!   r?   rL   r   subscription_detailsr   r   r   s	            r.   create_portal_session_servicer     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+c                    #    U[            nU R                  5       nSUS'   UR                  U5      n[        UR                  5      US'   [        S0 UD6$ 7f)NTr^   r$   r&   )r'   r(   r)   r>   rF   r	   )r    r!   r*   r@   r-   s        r.   #create_subscription_type_serviceNewr     sg        <=J *..0"&h""#45F 14F4F4F0G,-0/00s   AAr$   c                    #    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)Nr:   Subscription type not found.r$   r&   )r'   r<   r   r=   r>   r	   )r$   r!   r*   docs       r.   get_subscription_type_servicer     s[     01J


uo6J&KL
MC788"%c%j/C"c""rB   r,   c                 *  #    U[            nUR                  5       nSUS'   UR                  S[        U 5      0SU05      nUR                  S:X  a  [        S5      eUR                  S[        U 5      05      n[        US   5      US'   [        S0 UD6$ 7f)	NTr^   r:   r\   r   r   r$   r&   )	r'   r(   rr   r   matched_countr=   r<   r>   r	   )r$   r,   r!   r*   update_datar-   r   s          r.    update_subscription_type_servicer     s     01J))+K K""E?;O+P#QTZ\gShiFq 788


uo6J&KL
MC"%c%j/C"c""s   BBc                 r   #    U[            nUR                  S[        U 5      05      nUR                  S:  $ 7f)Nr:   r   )r'   
delete_oner   deleted_count)r$   r!   r*   r-   s       r.    delete_subscription_type_servicer   %  s<     01J""E?;O+P#QRF!##s   57)H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   app.v1.services.sequencer   	getLogger__name__rG   r'   r;   r   rn   rE   getenvr   MongoDBr/   r2   r7   r>   rA   rK   r(   r{   r   r   r   r   r   boolr   r   r   r   r   r   r   r   r   r   r   r   r   r   r&       r.   <module>r     s   	   ( )    + 3 l l  A			8	$  4 )     1 		/*$-$$ $*Ah.>.> A4 A-C -X=M=M -R^ -O QYQaQa fi F$FF F 
	FP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W`@P@P W`vTPXP`P` T>V8CSCS VaHL\L\ a
	S 	T 	   (BRBR  W[  (1-11 1 #c #xGWGW #\l #	# 	#Lb 	#hphxhx 	#  ~N 	#$ $(JZJZ $_c $r  