
    Mih`7                        S SK r S SKrS SKrS SKJrJr  S SKJrJrJrJ	r	J
r
JrJr  S SKJrJr  S SKJr  S SKJrJrJrJr  \" S\5      r\ R2                  " S5      r\ R2                  " S	5      r\ R2                  " S
S5      rSS SSSSSS./ SQS.SSS\ R2                  " S5      SSSSS./ SQS.SSS\ R2                  " S 5      SSSS!S./ S"QS.S#.rS8S$ jr\R?                  S%5      \S& 5       5       r \R?                  S'5      \S( 5       5       r!\R?                  S)5      \S* 5       5       r"\R?                  S+S,/S-9\S. 5       5       r#\R?                  S/S,/S-9S0 5       r$S1 r%S2 r&S3 r'S4 r(S5 r)S6 r*S7 r+g)9    N)datetime	timedelta)	Blueprintrender_templaterequestredirecturl_forflashjsonify)login_requiredcurrent_user)wraps)dbOrganizationSubscriptionInvoicebillingPAYSTACK_SECRET_KEYPAYSTACK_PUBLIC_KEYPAYSTACK_BASE_URLzhttps://api.paystack.coz	Free PlanKES         basic)assessments_per_monthprojectsusersreports)zBasic assessmentszLimited reportszCommunity support)namepricecurrencylimitsfeaturesProfessionalid  PAYSTACK_PRO_PLAN_CODEd   	unlimited
   advanced)zUnlimited assessmentszAdvanced analyticszPriority supportzCustom reports)r    r!   r"   	plan_coder#   r$   
Enterpriseie  PAYSTACK_ENTERPRISE_PLAN_CODEpremium)zEverything in ProzSSO integrationzCompliance reportszDedicated supportz
API access)freeprofessional
enterprisec                 N   S[          3SS.n[         SU 3nU S:X  a%  [        R                  " XCUS9nUR                  5       $ U S:X  a%  [        R                  " XCUS9nUR                  5       $ U S	:X  a%  [        R
                  " XCUS9nUR                  5       $ [        S
U  35      e)zMake requests to Paystack APIzBearer zapplication/json)AuthorizationzContent-Type/GET)headersparamsPOST)r6   jsonPUTzUnsupported method: )r   r   requestsgetpostput
ValueErrorr9   )methodendpointdatar6   urlresponses         (/home/kali/devsecops-assessor/billing.pypaystack_requestrF   =   s     ##6"78*G
 q

+C<<TB ==? 
6	==DA ==? 
5<<4@ ==? /x899    z/billingc            	         [         R                  n [        R                  R	                  U R
                  S9R                  5       n[        R                  R	                  U R
                  S9R                  [        R                  R                  5       5      R                  S5      R                  5       n[        SU UU[        [        S9$ )N)organization_idr   zbilling/dashboard.html)organizationsubscriptionrecent_invoicesplanspaystack_public_key)r   rJ   r   query	filter_byidfirstr   order_by
created_atdesclimitallr   SUBSCRIPTION_PLANSr   )orgrK   rL   s      rE   billing_dashboardrZ   Q   s     
#
#C%%///GMMOLmm--cff-ENNwOaOaOfOfOhioopqrvvxO3&)&2)81-@B BrG   z/upgrade/<plan>c                    U [         ;  a   [        SS5        [        [        S5      5      $ U S:X  a   [        SS5        [        [        S5      5      $ [        R
                  nUR                  U :X  a.  [        S[         U    S    S	3S5        [        [        S5      5      $  UR                  (       d  [        R                  [        R                  [        R                  [        [        S
S5      UR                  UR                  S.S.n[        SSU5      nUS   (       a,  US   S   Ul        [        R                   R#                  5         O [        SS5        [        [        S5      5      $ [        R                  [         U    S   S-  S[         U    S   UR                  [        SSS9UR                  U [        SSS9S.S.n[        SSU5      nUS   (       a  [        US   S   5      $ [        SS5        [        [        S5      5      $ ! [$         a6  n[        S ['        U5       3S5        [        [        S5      5      s S nA$ S nAff = f)!NzInvalid subscription planerrorbilling.billing_dashboardr/   z You are already on the free planinfozYou are already on the r    z planphone )rI   organization_name)email
first_name	last_namer_   metadatar8   customerstatusrB   customer_codezError creating customer profiler!   r'   r   r+   zbilling.upgrade_successT)	_external)rI   plancancel_action)rb   amountr"   rj   rf   callback_urlre   ztransaction/initializeauthorization_urlzError initializing paymentzError processing upgrade: )rX   r
   r   r	   r   rJ   subscription_planpaystack_customer_coderb   rc   rd   getattrrQ   r    rF   r   sessioncommit	Exceptionstr)rj   rY   customer_datarD   transaction_dataes         rE   upgrade_planry   _   s%    %%)73 ;<==v~0&9 ;<==

#
#C $'(:4(@(H'IOQWX ;<==0>))%++*55)33 w;'*vv),	M (
MJH!-5f-=o-N*

!!#7A(C DEE "''(.w7#=&t,[922#$=N#&66!()DPT!U
 $F,DFVWHHV,-@ABB.8G$?@AA >*3q6(3W= ;<==>s,    CH ,A>H +H 
I+I IIz/upgrade/successc                  r   [         R                  R                  S5      n U (       d   [        SS5        [	        [        S5      5      $  [        SSU  35      nUS   (       Ga  US   S   S	:X  a  [        R                  nUS   S
   nUR                  S5      nU[        ;   a  XBl
        SUl        US   R                  S0 5      R                  SS5      Ul        [        U   S   nUS   S:w  a  US   Ul        OSUl        [        R                  " 5       [!        SS9-   Ul        [$        R&                  R)                  5         [        S[        U   S    S3S	5        O[        SS5        O[        SS5         [	        [        S5      5      $ ! [*         a"  n[        S[-        U5       3S5         S nAN;S nAff = f)N	referencezNo payment reference foundr\   r]   r5   ztransaction/verify/rg   rB   successre   rj   activerK   subscription_coder`   r#   r   r(   i?B    )dayszSuccessfully upgraded to r    z plan!z Invalid plan in payment metadatazPayment verification failedzError verifying payment: )r   argsr<   r
   r   r	   rF   r   rJ   rX   ro   subscription_statuspaystack_subscription_codemonthly_assessments_limitr   nowr   subscription_ends_atr   rr   rs   rt   ru   )r{   rD   rY   re   rj   r#   rx   s          rE   upgrade_successr      s      -I*G4 ;<==!=#E-@+LMH(6"28"<	"I++C'
3H<<'D))(,%*2'19&1A1E1EnVX1Y1]1]^qsu1v. ,D1(;12kA4:;R4SC14:C1+3<<>I2<N+N(

!!#12DT2J62R1SSYZ\ef8'B/9
 G7899  =)#a&2G<<=s%   DF
 F
 )F
 

F6F11F6z/cancel-subscriptionr8   )methodsc                  b   [         R                  " 5       (       d   [        SS5        [        [	        S5      5      $ [         R
                  n U R                  (       d   [        SS5        [        [	        S5      5      $  [        SSU R                  [         R                  S.5      nUS   (       a2  S	U l	        [        R                  R                  5         [        S
S5        O[        SS5         [        [	        S5      5      $ ! [         a"  n[        S[        U5       3S5         S nAN;S nAff = f)Nz5You do not have permission to cancel the subscriptionr\   r]   z No active subscription to cancelr8   zsubscription/disable)codetokenrg   canceledz#Your subscription has been canceledr^   zError canceling subscriptionzError canceling subscription: )r   can_manage_orgr
   r   r	   rJ   r   rF   rb   r   r   rr   rs   rt   ru   )rY   rD   rx   s      rE   cancel_subscriptionr      s    &&((EwO ;<==

#
#C))0': ;<==B#F.B22!''F
 
 H&0C#JJ7@0':
 G7899  B.s1vh7AABs   =A#D !D 
D.D))D.z/webhooks/paystackc                     [         R                  " 5       n [         R                  R                  S5      n[        R
                  " SS5      n SSKnSSKnUR                  UR                  S5      U UR                  5      R                  5       nUR                  XQ=(       d    S5      (       d  g  [        R                  " U R!                  S5      5      nUR                  S
5      nUS:X  a  [%        US   5        gUS:X  a  ['        US   5        gUS:X  a  [)        US   5        gUS:X  a  [+        US   5        gUS:X  a  [-        US   5        gUS:X  a  [/        US   5        g! [         a     gf = f! [        R"                   a     g	f = f)zHandle Paystack webhookszX-Paystack-SignatureWEBHOOK_SECRETr`   r   Nzutf-8)zInvalid signature  )zInvalid payloadr   )zInvalid JSONr   eventzsubscription.createrB   zsubscription.disablezinvoice.createzinvoice.updatezinvoice.payment_failedzcharge.success)Success   )r   get_datar6   r<   osgetenvhmachashlibnewencodesha512	hexdigestcompare_digestrt   r9   loadsdecodeJSONDecodeErrorhandle_subscription_createdhandle_subscription_disabledhandle_invoice_createdhandle_invoice_updatedhandle_payment_failedhandle_charge_success)payload
sig_headerwebhook_secretr   r   expected_signaturer   
event_types           rE   paystack_webhookr      s     G$$%;<J YY/4N&!XX!!'*NN
 )+	 	 ""#57GRHH+ I#

7>>'23
 7#J**#E&M2  
-	-$U6]3  
'	'uV}-  
'	'uV}-  
/	/eFm,  
'	'eFm,1  &%&
  #"#s%   A!E% 1%E5 %
E21E25FFc                 l   U R                  S0 5      R                  S5      n[        R                  R                  US9R	                  5       nU(       d  gU S   Ul        U S   Ul        [        R                  " U S   R                  SS	5      5      Ul
        [        R                  R                  5         g)
z$Handle subscription creation webhookrf   rh   rp   Nr~   rg   next_payment_dateZ+00:00)r<   r   rO   rP   rR   r   r   r   fromisoformatreplacer   r   rr   rs   rB   rh   rY   s      rE   r   r   !  s    HHZ,00AM



&
&m
&
L
R
R
TC%)*=%>C""8nC'55d;N6O6W6WX[]e6fgCJJrG   c                     U S   n[         R                  R                  US9R                  5       nU(       d  gSUl        SUl        SUl        [        R                  R                  5         g)z(Handle subscription cancellation webhookr~   )r   Nr/   r   r   )
r   rO   rP   rR   ro   r   r   r   rr   rs   )rB   r~   rY   s      rE   r   r   /  s_    01



&
&BS
&
T
Z
Z
\C"C(C$%C!JJrG   c                    U R                  S0 5      R                  S5      n[        R                  R                  US9R	                  5       nU(       d  g[        UR                  U S   U S   S-  U S   U S	   [        R                  " U S
   R                  SS5      5      S9n[        R                  R                  U5        [        R                  R                  5         g)zHandle invoice creation webhookrf   rh   r   NrQ   rl   r'   r"   rg   rT   r   r   )rI   paystack_invoice_idrl   r"   rg   rT   )r<   r   rO   rP   rR   r   rQ   r   r   r   r   rr   addrs   )rB   rh   rY   invoices       rE   r   r   =  s    HHZ,00AM



&
&m
&
L
R
R
TC  JH~#j!H~))$|*<*D*DS(*STG JJNN7JJrG   c                    [         R                  R                  U S   S9R                  5       nU(       aL  U S   Ul        U S   S:X  a  [
        R                  " 5       Ul        [        R                  R                  5         gg)zHandle invoice update webhookrQ   )r   rg   r|   N)r   rO   rP   rR   rg   r   r   paid_atr   rr   rs   )rB   r   s     rE   r   r   R  sb    mm%%$t*%EKKMGh>Y&&llnGO


	 rG   c                    U R                  S0 5      R                  S5      n[        R                  R                  US9R	                  5       nU(       d  gUR
                  S:w  a&  SUl        [        R                  R                  5         gg)zHandle payment failure webhookrf   rh   r   Npast_due	r<   r   rO   rP   rR   r   r   rr   rs   r   s      rE   r   r   [  sr    HHZ,00AM



&
&m
&
L
R
R
TC *,",


 -rG   c                    U R                  S0 5      R                  S5      n[        R                  R                  US9R	                  5       nU(       d  gUR
                  S:X  a&  SUl        [        R                  R                  5         gg)z Handle successful charge webhookrf   rh   r   Nr   r}   r   r   s      rE   r   r   h  sr    HHZ,00AM



&
&m
&
L
R
R
TC *,"*


 -rG   c                    ^  U 4S jnU$ )z#Decorator to track assessment usagec                    > [         R                  (       a  [         R                  n[        US5      (       a  [        US5      (       au  UR                  UR
                  :  a   [        SS5        [        [        S5      5      $ UR                  =(       d    SS-   Ul        [        R                  R                  5         T" U 0 UD6$ )Nmonthly_assessments_usedr   zIYou have reached your monthly assessment limit. Please upgrade your plan.warningr]   r   r   )r   is_authenticatedrJ   hasattrr   r   r
   r   r	   r   rr   rs   )r   kwargsrY   fs      rE   decorated_function2track_assessment_usage.<locals>.decorated_functionx  s    ((++C s677GCId<e<e//33P3PPegpq#G,G$HII 140L0L0QPQUV/V,

!!#$!&!!rG    )r   r   s   ` rE   track_assessment_usager   v  s    " rG   )N),r   r;   r9   r   r   flaskr   r   r   r   r	   r
   r   flask_loginr   r   	functoolsr   modelsr   r   r   r   __name__
billing_bpr   r   r   r   rX   rF   routerZ   ry   r   r   r   r   r   r   r   r   r   r   r   rG   rE   <module>r      s   
   ( X X X 4  : :y(+
 ii 56 ii 56 II13LM 
 %&	
 R YY78%(#!	
 j YY>?%0#  	
 v5' R( *
B  
B #$@>  %@>D $%*:  &*:X (6(;:  <:< &9- :-^*rG   