Ë
    ¼|Si#  ã                  óü   — d Z ddlmZ ddlmZ ddlmZm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 dd
lmZ ddlmZmZ ddlmZmZ  ed«      Z G d„ dej6                  «      Z G d„ dej6                  «      Zy)z+Serializers for investment and reward APIs.é    )Úannotations)Ú	timedelta)ÚDecimalÚROUND_HALF_UP)Útransaction)Útimezone)Úserializers)ÚValidationError)ÚInsufficientBalanceError)ÚTransaction)Úget_wallet_serviceÚMAKE_INVESTMENTé   )Ú
InvestmentÚRewardz
0.00000001c                  ó,   — e Zd ZdZ G d„ d«      Zdd„Zy)ÚInvestmentSerializerz3Create/read investments with tier auto-calculation.c                  ó    — e Zd ZeZg d¢Zg d¢Zy)úInvestmentSerializer.Meta)ÚidÚamountÚtierÚdaily_reward_rateÚduration_daysÚstatusÚ
start_dateÚend_dateÚroi_total_amountÚroi_total_percentÚ
created_atÚ
updated_at)
r   r   r   r   r   r   r   r   r    r!   N)Ú__name__Ú
__module__Ú__qualname__r   ÚmodelÚfieldsÚread_only_fields© ó    úM/home/cursorai/projects/telegram-earn/backend/apps/investments/serializers.pyÚMetar      s   „ Øˆò
ˆò
Ñr)   r+   c                ó
  — | j                   d   j                  }t        j                  |d   «      }t	        j
                  «       t        d¬«      z   }|t        |d   ¬«      z   }t        |d   «      j                  t        t        ¬«      }t        «       }t        j                  «       5  |j                  j                  j!                  «       j#                  |j$                  ¬«      }|j&                  }		 |j)                  |j*                  d|d	|d
   › �t,        d|j*                  ¬«       |j9                  «        |j&                  }t        j                  j;                  ||d   |d
   |d   |d   t        j<                  ||¬«      }t>        j                  j;                  |t>        j@                  |t>        jB                  |	|d|j*                  i¬«       |cddd«       S # t.        $ r‹}
|
j0                  �t        t3        |
j0                  «      «      n
t        d«      }|
j4                  �t        t3        |
j4                  «      «      n
t        d«      }|d›}|d›}t7        dd|› d|› �gi«      ‚d}
~
ww xY w# 1 sw Y   yxY w)z0Derive tier, rate, and schedule from the amount.Úrequestr   r   )ÚdaysÚduration)Úrounding)ÚpkÚcredit_balancezInvestment in tier r   F)Úuser_idÚ
point_typer   ÚremarksÚ
trans_typeÚallow_negativeÚiidNÚ0z.8fz!Insufficient balance. Available: z, Required: Úrate)Úuserr   r   r   r   r   r   r   Úinvestment_id)r;   Útransaction_typer   r   Úbalance_beforeÚbalance_afterÚdata)"Úcontextr;   r   Úget_tier_infor   Únowr   r   ÚquantizeÚDECIMAL_QUANTIZEr   r   r   ÚatomicÚ	__class__ÚobjectsÚselect_for_updateÚgetr1   r2   Údeduct_pointr   r   r   Ú	availableÚstrÚ	requestedr
   Úrefresh_from_dbÚcreateÚSTATUS_PENDINGr   ÚTYPE_INVESTMENTÚSTATUS_COMPLETED)ÚselfÚvalidated_datar;   Ú	tier_infor   r   Úinvestment_amountÚwallet_serviceÚuser_lockedr>   ÚerL   rN   Úavailable_strÚrequested_strr?   Ú
investments                    r*   rP   zInvestmentSerializer.create7   sd  € à�|‰|˜IÑ&×+Ñ+ˆÜ×,Ñ,¨^¸HÑ-EÓFˆ	ä—\‘\“^¤i°QÔ&7Ñ7ˆ
Ø¤	¨y¸Ñ/DÔ EÑEˆÜ# N°8Ñ$<Ó=×FÑFÜ¤}ð Gó 
Ðô ,Ó-ˆä×ÑÕ!àŸ.™.×0Ñ0×BÑBÓD×HÑHÈDÏGÉGÐHÓTˆKØ(×7Ñ7ˆNðØ×+Ñ+Ø'ŸN™NØ/Ø,Ø1°)¸FÑ2CÐ1DÐEÜ.Ø#(Ø#Ÿ™ð ,ô ð, ×'Ñ'Ô)Ø'×6Ñ6ˆMô $×+Ñ+×2Ñ2Ø Ø% hÑ/Ø˜vÑ&Ø"+¨FÑ"3Ø'¨
Ñ3Ü!×0Ñ0Ø%Ø!ð 3ó 	ˆJô ×Ñ×&Ñ&Ø Ü!,×!<Ñ!<Ø(Ü"×3Ñ3Ø-Ø+Ø% z§}¡}Ð5ð 'ô ð ÷o "Ñ!øô  ,ò 
à9:¿¹Ð9PœG¤C¨¯©Ó$4Ô5ÔV]Ð^aÓVb�	Ø9:¿¹Ð9PœG¤C¨¯©Ó$4Ô5ÔV]Ð^aÓVb�	Ø#,¨S /�Ø#,¨S /�Ü%à Ð%FÀ}ÀoÐUaÐboÐapÐ#qÐ"rðóð ûð
ú÷! "Ð!ús3   Â*AI9Ã66G"Ä,B,I9Ç"	I6Ç+BI1É1I6É6I9É9JN)rU   ÚdictÚreturnr   )r"   r#   r$   Ú__doc__r+   rP   r(   r)   r*   r   r      s   „ Ù=÷
ñ 
ô:Dr)   r   c                  óP   — e Zd ZdZ ej
                  dddd¬«      Z G d„ d«      Zy	)
ÚRewardSerializerz'Read-only serializer for daily rewards.é   é   zinvestment.daily_reward_rateT)Ú
max_digitsÚdecimal_placesÚsourceÚ	read_onlyc                  ó   — e Zd ZeZg d¢ZeZy)úRewardSerializer.Meta)r   r]   r   Úreward_dater   Úcalculated_atÚdistributed_atN)r"   r#   r$   r   r%   r&   r'   r(   r)   r*   r+   rj   ˆ   s   „ Øˆò
ˆð "Ñr)   r+   N)r"   r#   r$   r`   r	   ÚDecimalFieldr   r+   r(   r)   r*   rb   rb   ~   s.   „ Ù1à0˜×0Ñ0ØØØ-Øô	Ð÷"ò "r)   rb   N)r`   Ú
__future__r   Údatetimer   Údecimalr   r   Ú	django.dbr   Údjango.utilsr   Úrest_frameworkr	   Úrest_framework.exceptionsr
   Údjango_wallet_utils.exceptionsr   Úapps.transactions.modelsr   Úutils.walletr   r   Úmodelsr   r   rE   ÚModelSerializerr   rb   r(   r)   r*   Ú<module>r{      s[   ðÙ 1å "å ß *å !Ý !Ý &Ý 5å Cå 0ß <ç &á˜<Ó(Ð ôd˜;×6Ñ6ô dôN"�{×2Ñ2õ "r)   