
    ^i"%                        d Z ddlmZ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 ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ  e       Z G d de      Z G d de      Z G d de      Z G d de      Zej?                  de       ee       ee      fdefd       Z ej?                  dee          ee       ee      fdefd       Z!ejE                  de       ee       ee      fdedefd       Z#ejE                  de       ee       ee      fdedefd       Z$ejE                  de       ee       ee      fd e%defd!       Z&y")#uK   
API для управления балансом пользователя
    )	APIRouterDependsHTTPExceptionstatus)Session)and_)List)datetime	timedelta)Decimal)get_db)UserBalanceBalanceTransactionTenant)get_current_user)	BaseModelc                   h    e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<    G d d	      Zy
)UserBalanceOutid	tenant_idbalancetotal_depositedtotal_spent
created_at
updated_atc                       e Zd ZdZy)UserBalanceOut.ConfigTN__name__
__module____qualname__from_attributes     )/var/www/notifications/app/api/balance.pyConfigr          r$   r&   N)r   r    r!   int__annotations__r   r
   r&   r#   r$   r%   r   r      s4    GN r$   r   c                   |    e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<    G d
 d      Zy)BalanceTransactionOutr   r   transaction_typeamountbalance_beforebalance_afterdescriptionreference_idr   c                       e Zd ZdZy)BalanceTransactionOut.ConfigTNr   r#   r$   r%   r&   r3   ,   r'   r$   r&   N)	r   r    r!   r(   r)   strr   r
   r&   r#   r$   r%   r+   r+   !   s?    GNO r$   r+   c                   &    e Zd ZU eed<   dZeed<   y)DepositRequestr-   cardpayment_methodN)r   r    r!   r   r)   r8   r4   r#   r$   r%   r6   r6   0   s    O NC r$   r6   c                   "    e Zd ZU eed<   eed<   y)WithdrawRequestr-   r0   N)r   r    r!   r   r)   r4   r#   r$   r%   r:   r:   5   s    Or$   r:   z/balance)response_modeldbc                 p   | j                  t              j                  t        j                  |j                  k(        j	                         }|sft        |j                  t        d      t        d      t        d            }| j                  |       | j                          | j                  |       |S )u6   Получить баланс пользователя0r   r   r   r   )	queryr   filterr   firstr   addcommitrefresh)r<   current_userr   s      r%   get_user_balancerG   ;   s     hh{#**!7!77eg  ",,CL#CL	
 	w
		


7Nr$   z/transactionsc                    | j                  t              j                  t        j                  |j                  k(        j	                  t        j
                  j                               j                  d      j                         }|S )uH   Получить историю транзакций по балансу2   )	r@   r   rA   r   order_byr   desclimitall)r<   rF   transactionss      r%   get_balance_transactionsrO   T   se     88./66$$(>(>>h!,,1134UU2Yssu  r$   z/depositrequestc                    | j                   dk  rt        t        j                  d      |j	                  t
              j                  t
        j                  |j                  k(        j                         }|sft        |j                  t        d      t        d      t        d            }|j                  |       |j                          |j                  |       |j                  }|xj                  | j                   z  c_        |xj                  | j                   z  c_        t        j                          |_        t%        |j                  d| j                   ||j                  d| j&                   dt)        t        j                          j+                                	      }|j                  |       |j                          |j                  |       |S )
u   Пополнить балансr   uD   Сумма пополнения должна быть больше 0status_codedetailr>   r?   depositu/   Пополнение баланса через zDEPOSIT-r   r,   r-   r.   r/   r0   r1   )r-   r   r   HTTP_400_BAD_REQUESTr@   r   rA   r   rB   r   rC   rD   rE   r   r   r
   utcnowr   r   r8   r(   	timestamprP   r<   rF   r   r.   transactions         r%   deposit_balancer\   a   st    ~~33Y
 	
 hh{#**!7!77eg  ",,CL#CL	
 	w
		


7 __NOOw~~%Ow~~-!*G %(("~~%ooEgF\F\E]^HOO$5$?$?$A BCDK FF;IIKJJwNr$   z	/withdrawc                    | j                   dk  rt        t        j                  d      |j	                  t
              j                  t
        j                  |j                  k(        j                         j                         }|st        t        j                  d      |j                  | j                   k  rt        t        j                  d      |j                  }|xj                  | j                   z  c_        |xj                  | j                   z  c_        t        j                         |_        t!        |j                  d| j                    ||j                  | j"                  dt%        t        j                         j'                                      }|j)                  |       |j+                          |j-                  |       |S )	u    Списать с балансаr   u@   Сумма списания должна быть больше 0rR   u   Баланс не найденu;   Недостаточно средств на балансеwithdrawz	WITHDRAW-rV   )r-   r   r   rW   r@   r   rA   r   with_for_updaterB   HTTP_404_NOT_FOUNDr   r   r
   rX   r   r   r0   r(   rY   rC   rD   rE   rZ   s         r%   withdraw_balancera      so    ~~33U
 	
 hh{#**!7!77o  113
 	

 '33P
 	
 __NOOw~~%O7>>)!*G %((#%oo'' X__%6%@%@%B!C DEK FF;IIKJJwNr$   z/pay-subscriptionsubscription_idc                 2   ddl m} |j                  |      j                  t	        |j
                  | k(  |j                  |j                  k(  |j                  dk(              j                         }|st        t        j                  d      |j                  t              j                  t        j                  |j                  k(        j                         j                         }|sft        |j                  t        d      t        d      t        d            }|j                  |       |j                          |j!                  |       |j"                  j$                  }|j&                  |k  r,t        t        j(                  d| d	|j&                   d
      |j&                  }|xj&                  |z  c_        |xj*                  |z  c_        t-        j.                         |_        t3        |j                  d| ||j&                  d|j"                  j4                   t7        |             }|j                  |       d|_        t-        j.                         |_        t-        j.                         t;        d      z   |_        ddl m}	 t-        j.                         }
 |	|j                  |j
                  |
|
t;        d      z   d|j"                  j@                        }|j                  |       ddl m!}  ||j                  |j
                  |ddddtE        t-        j.                         jG                                t-        j.                               }|j                  |       |j                          |j!                  |       |S )u3   Оплатить подписку с балансаr   )Subscriptionpending_paymentuC   Подписка не найдена или уже оплаченаrR   r>   r?   uQ   Недостаточно средств на балансе. Требуется: u    ₽, доступно: u    ₽subscription_paymentu   Оплата тарифа rV   active   )days)UsageRecord)r   rb   period_start
period_endnotifications_sentnotifications_limit)PaymentRUB	completedr   zBALANCE-)r   rb   r-   currencyr   r8   transaction_idcompleted_at)$app.db.modelsrd   r@   rA   r   r   r   r   rB   r   r`   r   r_   r   rC   rD   rE   planmonthly_pricer   rW   r   r
   rX   r   r   namer4   
started_atr   
expires_atrj   rn   ro   r(   rY   )rb   r<   rF   rd   subscriptionr   payment_amountr.   r[   rj   nowusage_recordro   payments                 r%   pay_subscriptionr      s    + 88L)00OO.""l&<&<<#44	
 eg  11X
 	
 hh{#**!7!77o  ",,CL#CL	
 	w
		


7!&&44N'33fgufv  wO  PW  P_  P_  O`  `d  e
 	
 __NOO~%O>)!*G %((/%oo01B1B1G1G0HI)K FF; #L&oo/L&oo/)2DDL *
//
C(($++(--AAL FF< &(($ !#hoo&7&A&A&C"D!EF__&	G FF7OIIKJJwNr$   N)'__doc__fastapir   r   r   r   sqlalchemy.ormr   
sqlalchemyr   typingr	   r
   r   decimalr   app.db.sessionr   ru   r   r   r   app.api.depsr   pydanticr   routerr   r+   r6   r:   getrG   rO   postr\   ra   r(   r   r#   r$   r%   <module>r      s   > = "   (  ! A A ) 	
Y 
I !Y !
i  J~6&/+, 70 OD1F,GH&/+,		 I	 Z7 &/+,111 81h [8 &/+,222 92j  @ &/+,ddd Adr$   