o
    x›h;'  ã                   @   sL   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ G dd„ deƒZ	dS )é    N)ÚBaseCommand)Útimezone)ÚSystemSettings)ÚMpesaServicec                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚCommandz3Comprehensive M-Pesa error checking and diagnosticsc                 O   sX   | j  d¡ | j  d¡ | j  d¡ |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  d S )Nú<============================================================z&M-PESA COMPREHENSIVE ERROR DIAGNOSTICS)ÚstdoutÚwriteÚcheck_configurationÚcheck_connectivityÚcheck_api_accessÚcheck_c2b_capabilityÚcheck_url_configurationÚprovide_recommendations)ÚselfÚargsÚoptions© r   úO/var/www/html/optinet_system/payments/management/commands/check_mpesa_errors.pyÚhandle   s   zCommand.handlec                 C   sÒ   | j  d¡ | j  d¡ t ¡ }g d¢}g }|D ]0}| |d¡}|r&| ¡ s,| |¡ q|dv r:dtt|ƒdƒ }n|}| j  d|› d	|› ¡ q|r]| j  | j	 
d
d |¡› ¡¡ dS | j  | j	 d¡¡ dS )Nz
1. CONFIGURATION CHECKú------------------------------)Úconsumer_keyÚconsumer_secretÚbusiness_short_codeÚpasskeyÚenvironmentÚ )r   r   Ú*é
   õ     âœ… ú: u     âŒ Missing: z, Fu&     âœ… All required settings configuredT)r   r	   r   Úget_mpesa_settingsÚgetÚstripÚappendÚminÚlenÚstyleÚERRORÚjoinÚSUCCESS)r   Úmpesa_settingsÚrequired_settingsÚmissing_settingsÚsettingÚvalueÚdisplay_valuer   r   r   r
   "   s(   ÿzCommand.check_configurationc                 C   sº   | j  d¡ | j  d¡ g d¢}|D ]H}z&tj|dd}|jdkr,| j  d|› d¡ n| j  d	|› d
|j› ¡ W q tyZ } z| j  d|› d
t|ƒ› ¡ W Y d }~qd }~ww d S )Nz
2. NETWORK CONNECTIVITY CHECKr   )zhttps://www.google.comzhttps://api.safaricom.co.kezhttps://sandbox.safaricom.co.ker   ©ÚtimeoutéÈ   r   z: OKõ	     âš ï¸ r    õ     âŒ )r   r	   Úrequestsr"   Ústatus_codeÚ	ExceptionÚstr)r   Ú	test_urlsÚurlÚresponseÚer   r   r   r   D   s   
€(€ÿùzCommand.check_connectivityc              
   C   sÊ  | j  d¡ | j  d¡ tƒ }| j  d|j› ¡ | j  d|j› ¡ | ¡ }|rÙ| j  | j d¡¡ | j  d|d d… › d¡ |j› d	}d
d|› i}zltj	||i dd}| j  d|j
› ¡ |j
dkr‘|j}d|v r| j  | j d¡¡ | j  d¡ n6| j  | j d|d d… › ¡¡ n!|j
dkr¡| j  | j d¡¡ n| j  d|jd d… › ¡ W d S W d S W d S W d S  tyØ } z| j  dt|ƒ› ¡ W Y d }~d S d }~ww | j  | j d¡¡ d S )Nz
3. API ACCESS CHECKr   z  Environment: ú  Base URL: u(     âœ… Access token obtained successfullyz  Token preview: é   z...z/mpesa/accountbalance/v1/queryÚAuthorizationzBearer )ÚheadersÚjsonr2   z  API Test Response: i‘  z-Invalid API call as no apiproduct match foundu;     âŒ CRITICAL: Your M-Pesa app lacks required API productszQ     This means your app is not properly configured on Safaricom Developer Portalu     âŒ Authentication issue: éd   i  u9     âœ… API is accessible (400 expected with empty payload)z  Response: r3   u     âš ï¸ API test failed: u      âŒ Failed to get access token)r   r	   r   r   Úbase_urlÚget_access_tokenr'   r*   r6   Úpostr7   Útextr(   r8   r9   )r   Úmpesa_serviceÚaccess_tokenÚtest_urlrA   Útest_responseÚresponse_textr=   r   r   r   r   X   sJ   

ÿÿ

ÿ"øþ$€ÿzCommand.check_api_accessc              
   C   s  | j  d¡ | j  d¡ tƒ }d}d}zT| ||¡}| j  d|› ¡ | d¡dkr7| j  | j d¡¡ W d S | d	| d
d¡¡}d|v sId|v r\| j  | j d¡¡ | j  d¡ W d S | j  d|› ¡ W d S  ty… } z| j  dt	|ƒ› ¡ W Y d }~d S d }~ww )Nz%
4. C2B REGISTRATION CAPABILITY CHECKr   z$https://test.example.com/validation/z&https://test.example.com/confirmation/z  Registration Response: ÚResponseCodeÚ0u+     âœ… C2B registration capability confirmedÚerrorMessageÚResponseDescriptionÚUnknownzInvalid Access TokenzInvalid API callu2     âŒ CRITICAL: C2B API not available for your appz2     Your M-Pesa app needs C2B API product enabledu!     âš ï¸ C2B registration issue: u     âŒ C2B test failed: )
r   r	   r   Úregister_c2b_urlsr"   r'   r*   r(   r8   r9   )r   rH   Útest_validation_urlÚtest_confirmation_urlr<   Ú	error_msgr=   r   r   r   r   ‡   s0   þ
ÿ$€ÿzCommand.check_c2b_capabilityc           
      C   s8  | j  d¡ | j  d¡ dd l}|j dd¡ d¡}|r”|d r”d|d › }| j  d|› ¡ |› d	}|› d
}d|fd|ffD ]O\}}z+tj|dd}|jdkr`| j  d|› d|› ¡ n| j  d|› d|j› d|› ¡ W qB ty‘ }	 z| j  d|› dt	|	ƒ› ¡ W Y d }	~	qBd }	~	ww d S | j  d¡ d S )Nz
5. URL CONFIGURATION CHECKr   r   ÚREPLIT_DOMAINSr   ú,zhttps://r>   z#/payments/mpesa-paybill-validation/z%/payments/mpesa-paybill-confirmation/Ú
ValidationÚConfirmationr   r1   i•  r   z URL accessible: r4   z URL status r    r5   z URL not accessible: u!     âš ï¸ REPLIT_DOMAINS not found)
r   r	   ÚosÚenvironr"   Úsplitr6   r7   r8   r9   )
r   rZ   ÚdomainsrD   Úvalidation_urlÚconfirmation_urlÚurl_namer;   r<   r=   r   r   r   r   ©   s,   


 €(€ÿù
zCommand.check_url_configurationc                 C   s\  | j  d¡ | j  d¡ t ¡ }| j  d¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ | j  d	¡ | j  d
¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ | dd¡}|ro| j  d|› ¡ | j  d| dd¡› ¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ d S )Nz
6. RECOMMENDATIONSr   u*   
ðŸ“‹ NEXT STEPS TO RESOLVE M-PESA ISSUES:z
1. SAFARICOM DEVELOPER PORTAL:u1      â€¢ Log into https://developer.safaricom.co.keuG      â€¢ Go to your production app (Prod-optinet-global-links-1703160740)u9      â€¢ Check 'APIs' section and ensure these are enabled:z      - M-Pesa Express (STK Push)z     - C2B APIz     - Transaction Status APIz
2. API PRODUCTS:uB      â€¢ If C2B API is missing, click 'Add API' and select 'C2B API'u/      â€¢ Wait for approval (can take 24-48 hours)u'      â€¢ Regenerate credentials if neededz
3. CREDENTIALS VERIFICATION:r   r   u      â€¢ Your Consumer Key: u      â€¢ Environment: r   Úsandboxu8      â€¢ Ensure credentials match the selected environmentz
4. TESTING SEQUENCE:u)      â€¢ python manage.py test_mpesa_configuC      â€¢ python manage.py register_paybill_urls --base-url [YOUR_URL]u"      â€¢ Test STK Push functionalityz=
============================================================zDIAGNOSIS COMPLETEr   )r   r	   r   r!   r"   )r   r+   r   r   r   r   r   Å   s8   zCommand.provide_recommendationsN)Ú__name__Ú
__module__Ú__qualname__Úhelpr   r
   r   r   r   r   r   r   r   r   r   r      s    "/"r   )
r6   Údjango.core.management.baser   Údjango.utilsr   Úsettings.modelsr   Úpayments.servicesr   r   r   r   r   r   Ú<module>   s   