
    bAj#                         d 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
mZ ddlmZ ddlmZ  ee      Z G d	 d
      Z e       Zy)z>Reconcile local DB state with Binance on startup or on demand.    )datetimetimezone)Decimal)Any)
get_logger)OrderStatusPositionStatus)binance_service)notification_servicec                   b    e Zd ZdZdeeef   fdZdedee   defdZ	dedefdZ
dee   fd	Zy
)ReconciliationServicezu
    Compare open orders and positions against Binance.
    Must pass before trading resumes after crash/deploy.
    returnc           
        K   t        j                  t        j                        j	                         dg g dg dd}	 t        j                          d {    | j                          d {   }t        j                          d {   }t        |      |d<   t        |      |d<   t        j                  di |j                         D ci c]  \  }}|dk7  s|| c}} |S 7 7 }7 cc c}}w # t        $ r_}d|d<   t        |      |d<   t        j                  d	t        |      
       t!        j"                  d|        d {  7   Y d }~|S d }~ww xY ww)Nr   T)	timestamporders_matchedorders_orphan_localorders_orphan_exchangepositions_matchedpositions_inconsistentpassedexchange_open_ordersexchange_balancesFr   errorreconciliation_failedr   zReconciliation failed: )reconciliation_completed)r   nowr   utc	isoformatr
   connect_get_open_exchange_ordersget_account_balancelenloggerinfoitems	Exceptionstrr   r   send_critical_error)selfreportexchange_ordersr   kves          MC:\xampp\htdocs\tradingbinance\backend\app\services\reconciliation_service.pyreconcile_allz#ReconciliationService.reconcile_all   sE    !hll3==?#%&(!"&("
	Z!))+++$($B$B$DDO&5&I&I&K K-0-AF)**-.?*@F&' KKt6s1Z[_rZrq!t6st  ,D K 7t 	Z$F8!!fF7OLL0AL?&::=TUVTW;XYYY	Zs   :EC4 C(C4 ,C*-C4 C,	AC4 C.C. C4 &E(C4 *C4 ,C4 .C4 4	E=AEEEEEElocal_orderr,   c                    K   |j                  d      }|j                  d      }|D ]O  }|r|j                  d      |k(  rd|dc S |s#t        |j                  d            t        |      k(  sJd|dc S  d|dS w)	z*Match single local order against exchange.client_order_idexchange_order_idclientOrderIdmatched)statusexchangeorderIdorphan_local)r8   local)getr(   )r*   r2   r,   	client_idexchange_idexs         r0   reconcile_orderz%ReconciliationService.reconcile_order2   s       OO$56	!oo&9:!BRVVO4	A"+<<s266)#45[9II"+<<	 " );??s   AA>
&A>1A>positionc                 V  K   |j                  d      t        j                  j                  k7  rddiS |j                  d      rt	        t        |d               dk  rEt        j                  d|j                  d       d       d	{    d
d|j                  d      dS ddiS 7 w)z(Alert if open position has no stop loss.r8   okT	stop_lossr   z	Position symbolu1    OPEN without stop loss — emergency SL requiredNFplace_emergency_sl)rD   actionrF   )r=   r	   OPENvaluer   r(   r   r)   )r*   rB   s     r0   check_position_sl_consistencyz3ReconciliationService.check_position_sl_consistencyC   s     <<!^%8%8%>%>>$<||K(GC8M4N,OST,T&::HLL233de   .",,x0 
 d|s   BB)	B'
B)c                 ,  K   t        j                          d {    t         j                  sg S 	 t         j                  j                          d {   S 7 =7 # t        $ r,}t
        j                  dt        |             g cY d }~S d }~ww xY ww)Nfetch_open_orders_failedr   )r
   r    clientget_open_ordersr'   r$   r   r(   )r*   r/   s     r0   r!   z/ReconciliationService._get_open_exchange_ordersS   sx     %%'''%%I	(//??AAA	 	( B 	LL33q6LBI	sP   BAB!A AA BA 	B%!BBBBBN)__name__
__module____qualname____doc__dictr(   r   r1   listrA   rK   r!        r0   r   r      sg    
T#s(^ :@@ d@ 
	@"D T  d rW   r   N)rS   r   r   decimalr   typingr   app.core.loggingr   
app.modelsr   r	   app.services.binance_servicer
   !app.services.notification_servicer   rP   r$   r   reconciliation_servicerV   rW   r0   <module>r_      s?    D '   ' 2 8 B	H	L L^ /0 rW   