
    y=j                        d Z ddlZddlZddlmZmZ ddlmZmZmZm	Z	m
Z
 ddlmZ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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&  eddg      Z' e       Z(e'jS                  d      defd       Z*e'jW                  d      defd       Z,e'jS                  d      defd       Z-e'jW                  d       ee      fde	dedefd       Z.e'jW                  d       ee      fde	dedefd       Z/e'jS                  d        ee      fde	dedefd!       Z0e'jS                  d"       ee      d#fdeded$e1fd%       Z2e'jS                  d&       ee      fde	dedefd'       Z3y)(zFOperations API: circuit breaker, go/no-go, reconciliation, tax export.    N)datetimetimezone)	APIRouterDependsHTTPExceptionRequestResponse)descselect)AsyncSession)RequireAdmin2FARequireAnalyst)get_settings)get_db)AuditLog	BotConfigOrderOrderStatusSymbol)record_audit_event)circuit_breaker)go_no_go_evaluator)notification_service)reconciliation_servicez/operations
Operations)prefixtagsz/notifications/statususerc                    K   t        t        j                  xr t        j                        t        t        j                  xr t        j
                        dS w)N)telegram_configuredemail_configured)boolsettingstelegram_bot_tokentelegram_chat_id	smtp_host	smtp_from)r   s    CC:\xampp\htdocs\tradingbinance\backend\app\api\routes\operations.pynotifications_statusr)      sD       $H$?$?$]HD]D]^ !3!3!J8J8JK s   AAz/notifications/testc                    K   t         j                  rt         j                  st        dd      t	        j
                  d       d {   }|st        dd      ddiS 7 w)	Ni  zOTelegram is not configured. Set TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID in .envstatus_codedetailuE   ✅ <b>Test notification</b>
TradingBinance is connected to Telegram.i  z5Telegram message failed to send. Check token/chat id.sentT)r#   r$   r%   r   r   _send_telegram)r   oks     r(   test_notificationr1   !   sf     ''H,E,Ed
 	
 $22S 
B 4kllD>
s   AA"A 	A"z/circuit-breakerc                 V   K   t        j                          d {   \  }}||dS 7 w)N)activedetails)r   	is_active)r   r3   datas      r(   get_circuit_breaker_statusr7   0   s+     (2244LFD.. 5s   )')z/circuit-breaker/resetrequestdbc                    K   t        j                  t        |j                               d {    t	        ||j                  ddddi|        d {    dddS 7 .7 w)NCIRCUIT_BREAKER_RESETCircuitBreakertrading_enabledTuser_idactionentity_type	new_valuer8   zCircuit breaker reset)messager=   )r   resetstridr   )r8   r   r9   s      r(   reset_circuit_breakerrG   6   si      

DGG
---

&$$d+   /4HH .s!   ,A!A$A!A
A!A!z
/reconcilec                    K   t        j                          d {   }t        ||j                  dd||        d {    |j	                  d      st        d|      |S 7 G7 &w)NMANUAL_RECONCILIATION_RUNReconciliationr>   passedi  r+   )r   reconcile_allr   rF   getr   )r8   r   r9   reports       r(   run_reconciliationrO   H   sl      *7799F

*$   ::hF;;M :s   A&A""A&A$%A&$A&z	/go-no-goc                   K   |j                  t        t              j                  d             d {   }|j	                         }|r|j
                  sdddS |j                  t        t              j                  t        t        j                              j                  d             d {   }|j                         j                         }t        j                  |D cg c]  }ddi c}dg|j
                  	      }|j                  |j                  |j                   |j"                  d
}	t%        ||j&                  dd|	|        d {    |	S 7 (7 c c}w 7 w)N   Fz:Paper trading not started. Set paper_start_date in config.)rK   rC      pnlr   i'  )tradesequity_curvepaper_start)rK   checksmetricsfailuresGO_NO_GO_EVALUATEDGoNoGor>   )executer   r   limitscalar_one_or_nonepaper_start_dater   order_byr
   
created_atscalarsallr   evaluaterK   rW   rX   rY   r   rF   )
r8   r   r9   config
bot_configorders_resultordersoresultresponses
             r(   evaluate_go_no_gorl   \   sB     ::fY/55a899F**,JZ88S
 	

 **VE]%;%;DAQAQ<R%S%Y%YZ]%^__M""$((*F(($*+Fq
F+W//F ---->>OO	H 
#   O= : ` ,sA   1E'EA=E'1E25E''E 2A"E'E%E'E' E'z/auditd   r]   c                   K   t        t        |d      d      }|j                  t        t              j                  t        t        j                              j                  |             d {   }|j                         j                         }|D cg c]  }t        |j                        |j                  rt        |j                        nd |j                  |j                  |j                   rt        |j                         nd |j"                  |j$                  |j&                  |j(                  |j                  j+                         d
 c}S 7 c c}w w)NrQ   i  )
rF   r?   r@   rA   	entity_id	old_valuerB   
ip_address
user_agentra   )minmaxr\   r   r   r`   r
   ra   r]   rb   rc   rE   rF   r?   r@   rA   ro   rp   rB   rq   rr   	isoformat)r   r9   r]   
safe_limitrj   logslogs          r(   list_audit_logsry      s     S]C(J::x!!$x':':";<BB:N F >>!D  C cff++.;;s3;;'Djj??/2}}S]]+$......224	
  	s%   A-E/E0&EB=EEEz/reports/tax-exportc                 ,  K   |j                  t        t        t        j                        j                  t        t        j                  t        j                  k(        j                  t        j                  t        j                  k(        j                  t        j                               d{   }|j                         }t        j                          }t#        j$                  |      }|j'                  g d       |D ]  \  }}|j'                  |j                  r|j                  j)                         nd||j*                  j,                  t/        |j0                        t/        |j2                  xs d      t/        |j4                        |j6                  j,                  t/        |j                        g        t9        ||j                  dddt;        |      i|        d{    t=        |j?                         dd	d
i      S 7 ^7 %w)zAExport trades for tax declaration (Colombia DIAN compatible CSV).N)	fecha_utcsimbololadocantidadprecio_ejecucioncomisionmodoorder_id TAX_EXPORT_GENERATEDr   rowsr>   ztext/csvzContent-Dispositionz*attachment; filename=trades_tax_export.csv)content
media_typeheaders) r\   r   r   r   symboljoin	symbol_idrF   wherestatusr   FILLEDr`   	filled_atrc   ioStringIOcsvwriterwriterowru   sidevaluerE   quantityfilled_price
commissiontrading_moder   lenr	   getvalue)	r8   r   r9   rj   r   outputr   ordersyms	            r(   tax_export_csvr      s     ::ufmm$	feoo2	3	u||{111	2	%//	"	 F ::<D[[]FZZF
OO   
s+0??EOO%%'JJ""(b)  !$$M	
 		  
%3t9%   !&(TU G4s%   B/H1H2D:H,H-#HH)4__doc__r   r   r   r   fastapir   r   r   r   r	   
sqlalchemyr
   r   sqlalchemy.ext.asyncior   app.api.depsr   r   app.core.configr   app.core.databaser   
app.modelsr   r   r   r   r   app.services.audit_servicer   app.services.circuit_breakerr   app.services.go_no_gor   !app.services.notification_servicer   #app.services.reconciliation_servicer   routerr#   rM   r)   postr1   r7   rG   rO   rl   intry   r        r(   <module>r      s
   L 
 	 ' H H # / 8 ( $ F F 9 8 4 B F	-|n	=> #$^  % "#.  $ /> /  /
 %& vII
I 	I 'I" \ v
 	 & K v##
# 	# #L H v
  6 !" v--
- 	- #-r   