Ë
    %xEi  ã                  ó&  — d 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
mZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZ ddlmZmZmZ  G d„ dej<                  «      Z G d„ dej<                  «      Z  G d„ dejB                  «      Z"y)z4Views for payment deposit and withdrawal operations.é    )Úannotations)ÚDecimal)Útransaction)Útimezone)ÚOpenApiResponseÚextend_schema)ÚpermissionsÚstatusÚviewsets)Úaction)ÚResponse)ÚTransactioné   )ÚDepositÚPaymentAddressÚWithdrawalRequest)ÚDepositSerializerÚPaymentAddressSerializerÚWithdrawalRequestSerializerc                  ó¬   — e Zd ZdZej
                  j                  «       ZeZ	e
j                  gZd„ Z edeedœ¬«       eddgd¬	«      d
„ «       «       Zy)ÚPaymentAddressViewSetz#View and request deposit addresses.c                ó¦   — t         j                  j                  | j                  j                  t         j
                  ¬«      j                  d«      S )N)Úuserr
   z-created_at)r   ÚobjectsÚfilterÚrequestr   ÚSTATUS_ACTIVEÚorder_by©Úselfs    úD/home/cursorai/projects/telegram-earn/backend/apps/payments/views.pyÚget_querysetz"PaymentAddressViewSet.get_queryset   sB   € Ü×%Ñ%×,Ñ,Ø—‘×"Ñ"Ü!×/Ñ/ð -ó 
÷ ‰(�=Ó
!ð	"ó    Úpayment_addresses_get_or_create)éÈ   éÉ   ©Úoperation_idÚ	responsesFÚpostzget-or-create)ÚdetailÚmethodsÚurl_pathc                ó®  — |j                   j                  dd«      j                  «       }|dvrt        ddit        j
                  ¬«      S t        j                  j                  |j                  |t        j                  ¬«      j                  «       }|r6| j                  |«      }t        |j                   t        j                  ¬«      S dd	l}dd	l}|j                  j                   › d
|› d
t#        |j                  «       «      › �}|j%                  |j'                  «       «      j)                  «       d	d }|dk(  rd|› �}	nd|› �}	t        j                  j+                  |j                  |d|	t        j                  d|j                  j,                  › �dddœ¬«      }
| j                  |
«      }t        |j                   t        j.                  ¬«      S )zè
        Get or create a deposit address for the specified blockchain.
        
        For now, this creates a placeholder address. In production, this would
        call the payment gateway API to generate a real address.
        Ú
blockchainÚtron)r0   ÚbnbÚerrorz,Only 'tron' and 'bnb' networks are supported©r
   )r   r/   r
   r   NÚ_é*   ÚTÚ0xÚUSDTzDeposit address for ÚsystemT)Úgenerated_byÚplaceholder)r   r/   ÚassetÚaddressr
   ÚlabelÚmetadata)ÚdataÚgetÚlowerr   r
   ÚHTTP_400_BAD_REQUESTr   r   r   r   r   ÚfirstÚget_serializerÚHTTP_200_OKÚhashlibÚtimeÚidÚintÚsha256ÚencodeÚ	hexdigestÚcreateÚ
first_nameÚHTTP_201_CREATED)r    r   r/   ÚexistingÚ
serializerrG   rH   r;   Úaddress_hashr=   Úpayment_addresss              r!   Úget_or_create_addressz+PaymentAddressViewSet.get_or_create_address%   s¨  € ð —\‘\×%Ñ% l°FÓ;×AÑAÓCˆ
à˜_Ñ,ÜØÐHÐIÜ×2Ñ2ôð ô "×)Ñ)×0Ñ0Ø—‘Ø!Ü!×/Ñ/ð 1ó 
÷ ‰%‹'ð	 	ñ Ø×,Ñ,¨XÓ6ˆJÜ˜JŸO™O´F×4FÑ4FÔGÐGó 	Ûð !Ÿ™Ÿ™Ð)¨¨:¨,°a¼¸D¿I¹I»KÓ8HÐ7IÐJˆØ—~‘~ k×&8Ñ&8Ó&:Ó;×EÑEÓGÈÈÐLˆà˜ÒØ˜,˜Ð(‰Gà˜<˜.Ð)ˆGä(×0Ñ0×7Ñ7Ø—‘Ø!ØØÜ!×/Ñ/Ø(¨¯©×)@Ñ)@Ð(AÐBØ&.¸tÑDð 8ó 
ˆð ×(Ñ(¨Ó9ˆ
Ü˜
Ÿ™´×0GÑ0GÔHÐHr#   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚnoneÚquerysetr   Úserializer_classr	   ÚIsAuthenticatedÚpermission_classesr"   r   r   rU   © r#   r!   r   r      sr   „ Ù-à×%Ñ%×*Ñ*Ó,€HØ/ÐØ%×5Ñ5Ð6Ðò"ñ Ø6à)Ø)ñ
ôñ �5 6 (°_ÔEñ3Ió Fóñ3Ir#   r   c                  óh   — e Zd ZdZej
                  j                  «       ZeZ	e
j                  gZd„ Zy)ÚDepositViewSetzView deposit history.c                óˆ   — t         j                  j                  | j                  j                  ¬«      j                  d«      S )N©r   z-detected_at)r   r   r   r   r   r   r   s    r!   r"   zDepositViewSet.get_querysetj   s/   € Ü�‰×%Ñ%¨4¯<©<×+<Ñ+<Ð%Ó=×FÑFÀ~ÓVÐVr#   N)rV   rW   rX   rY   r   r   rZ   r[   r   r\   r	   r]   r^   r"   r_   r#   r!   ra   ra   c   s2   „ Ùà�‰×#Ñ#Ó%€HØ(ÐØ%×5Ñ5Ð6ÐóWr#   ra   c                  ó  ‡ — e Zd ZdZej
                  j                  «       ZeZ	e
j                  gZg d¢Zd„ Z ede ed¬«      dœ¬«      ˆ fd	„«       Z ed
 ed¬«       ed¬«       ed¬«      dœ¬«      d„ «       Zˆ xZS )ÚWithdrawalRequestViewSetz$Create and view withdrawal requests.)rA   r*   Údeletec                óˆ   — t         j                  j                  | j                  j                  ¬«      j                  d«      S )Nrc   z-requested_at)r   r   r   r   r   r   r   s    r!   r"   z%WithdrawalRequestViewSet.get_querysetv   s2   € Ü ×(Ñ(×/Ñ/°T·\±\×5FÑ5FÐ/ÓG×PÑPÐQ`ÓaÐar#   Úwithdrawal_requests_createz=Validation error (insufficient balance, invalid amount, etc.))Údescription)r&   é�  r'   c                ó*   •— t        ‰| �  |g|¢­i |¤ŽS )z/Create a withdrawal request and deduct balance.)ÚsuperrN   )r    r   ÚargsÚkwargsÚ	__class__s       €r!   rN   zWithdrawalRequestViewSet.createy   s   ø€ ô ‰w‰~˜gÐ7¨Ò7°Ñ7Ð7r#   Úwithdrawal_requests_cancelú!Withdrawal cancelled successfullyz*Cannot cancel withdrawal in current statuszWithdrawal not found)r%   rj   i”  c                óÞ  — | j                  «       }|j                  t        j                  k7  r+t	        dd|j                  › d�it        j
                  ¬«      S t        j                  «       5  |j                  j                  j                  j                  «       j                  |j                  j                  ¬«      }t        j                  j                  «       j                  |j                  ¬«      }|j                  j                  dd«      }|j                  }|xj                  t!        |«      z  c_        |j#                  dg¬	«       |j                  r=t$        j&                  |j                  _        |j                  j#                  d
dg¬	«       t$        j                  j)                  |t$        j*                  t!        |«      t$        j&                  ||j                  |j,                  ddœ¬«       t        j&                  |_        t/        j0                  «       |_        |j#                  d
dg¬	«       ddd«       t	        ddit        j4                  ¬«      S # 1 sw Y   Œ&xY w)z7Cancel a pending withdrawal request and refund balance.r2   z&Cannot cancel withdrawal with status 'Ú'r3   )ÚpkÚtotal_deductionÚ0Úcredit_balance)Úupdate_fieldsr
   Ú
updated_atzUser cancelled withdrawal)Úwithdrawal_idÚreason)r   Útransaction_typeÚamountr
   Úbalance_beforeÚbalance_afterr@   Úprocessed_atNÚmessagerq   )Ú
get_objectr
   r   ÚSTATUS_REQUESTEDr   rC   r   Úatomicr   ro   r   Úselect_for_updaterA   rt   r?   rw   r   Úsaver   ÚSTATUS_CANCELLEDrN   ÚTYPE_WITHDRAWALrI   r   Únowr€   rF   )	r    r   rm   rn   Ú
withdrawalÚuser_lockedÚwithdrawal_lockedru   r~   s	            r!   Údestroyz WithdrawalRequestViewSet.destroy†   s  € ð —_‘_Ó&ˆ
ð ×ÑÔ 1× BÑ BÒBÜØÐBÀ:×CTÑCTÐBUÐUVÐWÐXÜ×2Ñ2ôð ô
 ×ÑÕ!à$Ÿ/™/×3Ñ3×;Ñ;×MÑMÓO×SÑSÐWa×WfÑWf×WiÑWiÐSÓjˆKÜ 1× 9Ñ 9× KÑ KÓ M× QÑ QÐU_×UbÑUbÐ QÓ cÐð 0×8Ñ8×<Ñ<Ð=NÐPSÓTˆOð )×7Ñ7ˆNØ×&Ò&¬'°/Ó*BÑBÕ&Ø×ÑÐ,<Ð+=ÐÔ>ð !×,Ò,Ü7B×7SÑ7SÐ!×-Ñ-Ô4Ø!×-Ñ-×2Ñ2À(ÈLÐAYÐ2ÔZô ×Ñ×&Ñ&Ø Ü!,×!<Ñ!<Ü˜Ó/Ü"×3Ñ3Ø-Ø)×8Ñ8à%6×%9Ñ%9Ø9ñð 'ô ô (9×'IÑ'IÐÔ$Ü-5¯\©\«^ÐÔ*Ø×"Ñ"°(¸NÐ1KÐ"ÔL÷G "ôJ ØÐ;Ð<Ü×%Ñ%ô
ð 	
÷K "Ð!ús   Á-GI#É#I,)rV   rW   rX   rY   r   r   rZ   r[   r   r\   r	   r]   r^   Úhttp_method_namesr"   r   r   rN   r�   Ú__classcell__)ro   s   @r!   re   re   n   s¦   ø„ Ù.à ×(Ñ(×-Ñ-Ó/€HØ2ÐØ%×5Ñ5Ð6ÐÚ1Ðòbñ Ø1à,Ù Ø[ôñ
ôó8óð8ñ Ø1á Ð-PÔQÙ Ð-YÔZÙ Ð-CÔDñ
ôñ3
óô3
r#   re   N)#rY   Ú
__future__r   Údecimalr   Ú	django.dbr   Údjango.utilsr   Údrf_spectacular.utilsr   r   Úrest_frameworkr	   r
   r   Úrest_framework.decoratorsr   Úrest_framework.responser   Úapps.transactions.modelsr   Úmodelsr   r   r   Úserializersr   r   r   ÚReadOnlyModelViewSetr   ra   ÚModelViewSetre   r_   r#   r!   Ú<module>r�      su   ðÙ :å "å å !Ý !ß @ß 8Ñ 8Ý ,Ý ,å 0ç >Ñ >÷ñ ôHI˜H×9Ñ9ô HIôVW�X×2Ñ2ô WôS
˜x×4Ñ4õ S
r#   