
    iM|                        U d dl Z d dlZd dlZd dlZd dlmZmZmZmZm	Z	 d dl
Zd dlZd dl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mZ d dlmZmZ e j                            e j                            e                     Z!e j        "                    e!d          Z#e j        $                    e#          s e j%        e#           dZ#e j        $                    e#          s e j%        e#           i a&ee'ef         e(d<   d	Z)ddZ*d dZ+d
ddgddgfdZ,dedefdZ-dee'ef         fdZ.d!dZ/deee'ef                  fdZ0de'dee         fdZ1dede'de'fdZ2dee         dej3        fdZ4dede'fdZ5de'de	e6e'f         fdZ7dee         fdZ8dee         deee'ef                  fdZ9dedeee'ef                  fdZ:dS )"    N)ListDictAnyOptionalTuple)datetime)BytesIO)
TEstruturaTOptionTOptionStatus
TCategoria)TOpLabTOplabStockData
estruturasESTRUTURAS_CARREGADASg{Gz?Fc                 `   | )t          | t                    rt          j        |           sdS t	          | d          r| j        } t          | t                    r| d}n)t          | t                    r| d}nt          |           }|rt          | t                    s|dz  }|rt          | t                    r;|                                 	                                }|dv rd| d	S |d
v rd| d	S n4t          | t          t          f          r| dk    rd| d	S | dk     rd| d	S d| d	S )u   
    Formatação Definitiva:
    - Erro/NaN: ---
    - Int: 400
    - Float: 60.00
    - Texto (C -> Verde, V -> Vermelho)
    - Números (Positivo -> Verde, Negativo -> Vermelho)
    Nz<span>---</span>value,z,.2f%)CCOMPRAz<span class="text-profit"></span>)VVENDAz<span class="text-loss">g-C6?g-C6z<span>)

isinstancefloatmathisfinitehasattrr   intstrstripupper)valorcolorir
percentualtextov_limpos        %/home/jrussi/acompanhamento/Server.pyFr*   .   s    }E511}$-:N:N}!!
 ug  % 	E5	!	! E

  *UC00   AeS!! 	Akkmm))++G/))BEBBBBN**@%@@@@ + U|,, 	Av~~BEBBBB@%@@@@ #E""""    c                     t          | t          t          f          rt          | |          n| }t          |t          t          f          rt          ||          n|}d| d| dS )uE   Empilha dois valores. Se forem números, chama a F() automaticamente.r%   z<div class="val-unit">z</div><div class="val-total">z</div>r   r    r   r*   )topbottomr%   tbs        r)   F_stackr3   d   so    #-cC<#@#@I#wcA&0#u&F&FR&'""""FAMAMMAMMMMr+    c                     t          | t          t          f          rt          | |          n| }t          |t          t          f          rt          ||          n|}|d          | |d          }|d          | |d          }d| d| dS )zt
    Exibe os valores lado a lado: Prefixo1 Unit Sufixo1 (Prefixo2 Total Sufixo2)
    afixo = [prefixo, sufixo]
    r-   r      z<span class="val-unit">z'</span> <span class="text-muted small">r   r.   )	unittotalr%   afixo1afixo2ur1   res_unit	res_totals	            r)   F_inliner>   l   s     %/tc5\$B$BL$    A%/U|%D%DO%!!!!%A )+Q+q	++H!9,a,,,IhXhhV_hhhhr+   	estruturareturnc                    | s| S | j         dk    rt          | j                   nd}|                                  | j        }d}| j        D ]\}|j        t          j        t          j        fv r||j	        dz  z  }/|j
        }||dk    rt          d          } n||j	        |z  z  }]|| _
        ||z
  | _        | j        }||z
  | _        | S )u  
    Única função de cálculo. Regras:
    1. ValorIn da estrutura é SEMPRE UNITÁRIO (preço médio de entrada).
    2. ValorNow da estrutura é SEMPRE TOTAL (valor de mercado agora).
    3. Se qualquer perna tiver preço <= 0 ou None, ValorNow vira NaN.
    r   r6           Nnan)	QuantBaseabsCalcValorInValorInOptionsStatusr   ZERADAEXPIRADAQuantValorNowr   
ValorLucroValorAimLucroAim)r?   qbcusto_entrada_totalv_now_totaloptionp_nowv_alvo_totals          r)   "sincronizar_propriedades_estruturarW   ~   s     %.%8A%=%=Y 	!	!	!1B $+ K# 	0 	0=]1=3IJJJ6<#--KKOE}

#Ell6<%//KK %I&)<<I %L%(;;Ir+   c                      t                                            t                      } | D ](}t          |d                   }|r|t           |j        <   )t           S )u   
    Carrega todas as estruturas salvas do disco para a memória (variável global).
    Retorna o dicionário de estruturas.
    id)r   clear!carregar_estrategias_salvas_listacarregar_estrutura_detalhadarY   )estrategias_resumoresumor?   s      r)   carregar_estruturas_em_loter_      sb     !!! ;<< % < <0>>	 	<2;!),/  r+   c                     t           st          d           dS t                      } i }t                                           D ]}\  }}|j        r|                     |j                   |j        D ]O}|                     |j                   |j        |vr
g ||j        <   ||j                                     |           P~| sdS t                      
                                }	 d                    |           }t          dt          |            d           |                    |          }|                                 n# |                                 w xY wd |D             }t                                           D ]>\  }}d}	|                    |j                  }
|
r|
j        p|
j        |_        |j        D ]}|                    |j                  }|r?|j        dk    r|j        dk    rt(          j        |_        nt(          j        |_        |j        dk     r|j        |_        n|j        |_        |j        dk    r|	|j        |j        z  z  }	n|	|j        |j        z  z  }	|j        |_        |j        |_        t?          |d	d          pt?          |d
d          }|rutA          |          dd         }tC          j"                    #                                $                                }||k     r!|j%        dv rt(          j&        |_        d|_        n!|j%        dv rt(          j&        |_        d|_        |                    |j                  rK|j        dk    r@|                    |j                  }|j        p|j        |_        |j'        p|j'        |_'        |(                                |_)        @dS )u   
    Cria uma lista única de todas as opções de todas as estruturas carregadas,
    cota os preços de mercado (Bid/Ask) e atualiza ValorNow e ValorOut.
    u2   Aviso: Nenhuma estrutura carregada para cotação.Nr   z$DEBUG: Consultando API em lote para u    símbolos.c                     i | ]
}|j         |S  )Symbol).0datas     r)   
<dictcomp>z8cotar_e_atualizar_estruturas_em_lote.<locals>.<dictcomp>   s    ===$DK===r+   rB   r   DueDateDataVencimento
   )callput)*r   printsetitems	AtivoBaseaddrH   Nomeappendr   CreatejoinlenCotarSymbolsplusDestroyget
ValorAtivoAskValorAtivoNowBidr   DISP_NArI   ATIVArL   rM   ValorAskValorBidStrikestrike
Vencimentogetattrr!   r   nowdate	isoformatTiporK   SigmaGetMenorVencimentoMenorVencimento)simbolos_unicosopcoes_referenciaest_idr?   rT   oplab_instancecomma_separated_symbols
stock_datacotacoes_mapcusto_montagem_agoracotacao_ativocotacaodue_date_strvencimento_limpo	datadodia
data_ativos                   r)   $cotar_e_atualizar_estruturas_em_loter      s    ! BCCC eeO24288:: : :	 	5	 3444' 	: 	:F,,,{"33313!&+.fk*11&9999		:   XX__&&N!"%((?";";VS5I5IVVVWWW,:,K,KLc,d,d
         >=*===L 388:: LC LC	" %(()<== 	T&3&>&S-BSI#  ' ?	G ?	GF"&&v{33G  4*;!##q(8(8$1$9FMM$1$7FM <!##&-kFOO '.kFO
 <!##(FL6?,JJ(((FL6?,JJ( '$+$6!
  'w	4@@lGGUegkDlDl   
2 (+<'8'8"'=$ ( 3 3 5 5 ? ? A AI')33!;/99,9,BFM.1FO ;/11$1$:FM&)FO 	 344 G9PTU9U9U*..y/BCC+5+@+RJN(#-#3#Fy$-$@$@$B$B	!!YLC LCs   %A
E Ec            
         g } t           j                            t                    s| S t          j        t                    D ]#}|                    d          r
|                    d          st           j                            t          |          }	 t          |d          5 }t          d|d           t          j        |          }|                     |                    d          |                    d          |                    d          |d	d
           ddd           n# 1 swxY w Y   # t          $ r }t          d| d|            Y d}~d}~ww xY w%| S )u?   Carrega dados de todas as estruturas que NÃO começam com '_'..json_rz	
filepath
rY   nome	ativoBaseSalva)rY   r   ativocaminho_arquivotipoNzErro ao carregar : )ospathexistsESTRUTURAS_DIRlistdirendswith
startswithrt   openrl   jsonloadrr   rx   	Exception)estrategiasfilenamefilepathfre   es         r)   r[   r[   H  s   K7>>.)) J~.. ; ;W%% 	;h.A.A#.F.F 	;w||NH==H;(C(( 	A,x5559Q<<D&&"hhtnn $ 0 0!%+!6!6+3 '( (   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  ; ; ;9(99a99::::::::; s=   D8&A:D, D8,D0	0D83D0	4D88
E"EE"estrategia_idc                    t          j        t                    D ]1}|                    d          r|                    d          st           j                            t          |          }	 t          |d          5 }t          j	        |          }|
                    d          | k    rVt                      }|
                    d          |_        |
                    dd          pd|_        |
                    d          |_        |
                    dd	          pd	|_        |
                    d
          |_        |
                    d          |_        |
                    d          |_        |
                    dd          |_        |
                    dd          |_        |
                    d          p|
                    d          pd|_        |
                    d          p|
                    d          pd|_        	 t/          |
                    dd                    |_        n!# t2          $ r t.          j        |_        Y nw xY w|
                    dd          |_        |
                    dg           D ]f}t9                      }|
                    d          |_        |
                    d          |_        |
                    d          |_        |
                    dd          |_        |
                    d          |_         |
                    d          |_!        |
                    d          |_        |
                    dd          |_"        |
                    d           |_#        |
                    d!          |_$        |
                    d"          |_%        |
                    d#d$          |_&        |j'        (                    |           h|cd%d%d%           c S 	 d%d%d%           n# 1 swxY w Y   # tR          $ r }tU          d&| d'|            Y d%}~)d%}~ww xY w3d%S )(z;Carrega uma TEstrutura completa de um arquivo JSON pelo ID.r   r   r   rY   	quantBaser6   r   valorAtivoIng?sigmar   valorInvalorAimrB   valorOutDTEdter   Infoinfor4   	categoria	corretoraopcoesquantr   operr   r   vencimento_diastransacaoValuevalorBidvalorAsk	valorLastexpiradaFNzErro ao carregar detalhe de r   )+r   r   r   r   r   r   rt   r   r   r   rx   r
   rY   rD   ro   ValorAtivoInr   rq   rG   rO   ValorOutr   r   r   	Categoria
ValueErrorSEM_CATEGORIA	Corretorar   rL   r   Operr   r   TransacaoValuer   r   	ValorLastr   rH   Addr   rl   )	r   r   r   r   re   r?   op_dataopr   s	            r)   r\   r\   b  s4   J~.. -F -FW%% ,	Fh.A.A#.F.F ,	Fw||NH==H*F(C(( ')A9Q<<Dxx~~66$.LL	'+xx~~	.2hh{1.E.E.J	+.2hh{.C.C	+15.#1N1N1URU	.*.((7*;*;	)-&)9)9	,0HHY,?,?	)-1XXj#-F-F	*-1XXj#-F-F	*(,(O488E??(Oa	)-&)9)9)STXXf=M=M)SQS	K2<TXXkSU=V=V2W2WI//) K K K2<2JI///K.2hh{B.G.G	+'+xx"'='= 6 6G!(B'.{{7';';BH&-kk&&9&9BG&-kk&&9&9BG&-kk&#&>&>BG(/H(=(=BI,3KK8I,J,JBM)0Y)?)?BJ07<Lc0R0RB-*1++j*A*ABK*1++j*A*ABK+2;;{+C+CBL*1++j%*H*HBK%-11"5555  )O') ') ') ') ') ') ') ') ') ')6') ') ') ') ') ') ') ') ') ') ') ') ') ') ')P  F F FDXDDDDEEEEEEEEF4sh   /P?FP(H:9P:IPIFP5PPP	PP	P
Q(QQnome_estrategiac                    t          | d          r| j        s%t          t          j                              | _        t          j        t                    D ]}|                    d          r|	                    d          sst
          j
                            t          |          }	 t          |dd          5 }t          j        |          }t          |                    d                    t          | j                  k    r|                                 dt
          j
                            |          d          d}t
          j
                            t          |          }t
          j
                            |          rt          j        |           t          j        ||           t+          d	| d
           ddd           n# 1 swxY w Y   # t,          $ r}Y d}~d}~ww xY wt/          j        dd|          }	|	 d| j         d}
t
          j
                            t          |
          }|| _        t5          j        |           }| j        |d<   | j        |d<   | j        |d<   t          |dd          5 }t          j        ||d           ddd           n# 1 swxY w Y   | t@          | j        <   | j        S )zASalva a estrutura e limpa QUALQUER arquivo antigo com o mesmo ID.rY   r   r   r   utf-8encodingr   z	_bak.jsonzDEBUG: Arquivo antigo z movido para backup.Nz[^a-zA-Z0-9_\-]valorAtivoNowr   valorNoww   )indent)!r   rY   r!   uuiduuid4r   r   r   r   r   r   rt   r   r   r   rx   closesplitextr   removerenamerl   r   resubrq   r
   #ConverterEstruturaParaEstruturaJSONr{   r   rM   dumpr   )r?   r   r   r   r   re   backup_namebackup_pathr   nome_seguronovo_filenamenovo_filepathdados_para_salvars                r)   salvar_estruturar     s)    9d## )9< )4:<<((	
 J~..  W%% 	h.A.A#.F.F 	w||NH==H(C'::: Wa9Q<<D488D>>**c),.?.???			&R"'*:*:8*D*DQ*G&R&R&R&(gll>;&O&O7>>+66 3Ik222	(K888UxUUUVVVW W W W W W W W W W W W W W W    
 &+S/BBK"88Y\888MGLL??M %IN #FyQQ *3)@o&$-$6j!$-$6j! 
mS7	3	3	3 2q	#Qq11112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 +4),'<sI   +G =D
GG G	G G	G  
G50G5J11J58J5c                    | st          j        ddgi          S g }| j        D ]p}|j        dk    r|j        n|j        }|                    |j        |j        dk    rdnd|j        |j        |j	        |j
        | j        |j        ||j        d
           qt          j        |          }|d                             dj                  |d<   |d	                             dj                  |d	<   |d
                             dj                  |d
<   |d                             d           |d<   |d                             d           |d<   g d}||         S )uP   Converte a TEstrutura para um DataFrame de exibição para a tabela de detalhes.r   z+Nenhuma estrutura selecionada ou carregada.r   r   r   )
rL   Opr   rq   r   VencVolrG   rM   r   r   {:,.2f}r   rG   rM   c                 <    | dk    rd                     |           ndS Nr   r   r4   formatxs    r)   <lambda>z-obter_detalhes_estrutura_df.<locals>.<lambda>  "    1q55I4D4DQ4G4G4GVX r+   r   c                 <    | dk    rd                     |           ndS r   r   r   s    r)   r   z-obter_detalhes_estrutura_df.<locals>.<lambda>  r  r+   )pd	DataFramerH   r   r   rr   rL   r   rq   r   r   r   rG   r   mapr   apply)r?   re   r   	valor_nowdfcolunas_finaiss         r)   obter_detalhes_estrutura_dfr
    sw    W|V&S%TUVVVD  $&L1$4$4BLL"+	XBHqLLSSc27Gry"-PYP_zybk
 
 	 	 	 	
 
d		B h<##I$455BxL5	i.//BuIyM%%i&677ByM
^))*X*XYYBzN
^))*X*XYYBzN  N
 nr+   c                 8   |                                  }|xj        |j        z  c_        |xj        |j        z  c_        |xj        |j        z  c_        |                    dd|                                           \  }}|                    ||t                    S )uB   
    Função wrapper para gerar o SVG de uma estrutura real.
    rB   )	GetUnitaryCopyrO   rD   rG   rM   CalcGraphLimitsr   PlotarPayoff_PlotlyCDI_SIMULACAO)r?   estrutura_para_plotmin_xmax_xs       r)   gerar_svg_payoff_realr  ,  s     $2244  $7$AA  #6#@@  $7$AA   '66sCA]A]A_A_``LE5 225%OOOr+   c                 R   t          d|             	 t          j        t                    }n# t          $ r}dd| fcY d }~S d }~ww xY w|D ]}|                    d          r|                    d          st          j                            t          |          }	 t          |dd          5 }t          j        |          }t          |                    d	                    t          |           k    r|                    d
d          }d| }t          j                            t          |          }	t          j                            |	          rt          j        |	           |                                 t          j        ||	           | t$          v rt$          | = t          d| d           d|fcd d d            c S 	 d d d            n# 1 swxY w Y   # t          $ r }t          d| d|            Y d }~d }~ww xY wt          d           dS )Nu"   DEBUG: Iniciando exclusão do ID: Fu   Erro ao acessar diretório: r   r   r   r   r   rY   r   zSem Nomeu   DEBUG: Estratégia z ocultada com sucesso.TzERRO ao ler arquivo r   u'   DEBUG: Fim do loop, ID não encontrado.)Fu0   Estratégia não localizada nos arquivos ativos.)rl   r   r   r   r   r   r   r   rt   r   r   r   r!   rx   r   r   r   r   r   )
r   arquivosr   r   r   r   re   nome_estr   novo_caminhos
             r)   excluir_estrategia_por_idr  A  s    

>}
>
>???9:n-- 9 9 98Q8888888889  % %W%% #	h.A.A#.F.F #	w||NH==H (C'::: .a9Q<<D 488D>>**c-.@.@@@#'88FJ#?#? )7H')w||NM'R'R 7>>,77 4Il333 				(L999 ),AAA 5m DTHTTTUUU#X~3. . . . . . . . . . A	. . . . . . . . . . . . . . .6    <X<<<<===
 

3444DDs\   . 
A	AA	A	#G)5DG G)G)G 	 G)#G 	$G))
H3HHc                    | sdg dS | j         dk    rt          | j                   nd}|                                 }| j        }| j        | j        z
  }| j        r
|| j        z  nt          d          }|r||z  nt          d          }ddd| j        fd	d	t          | j
                  pd
fdd| j        pd
fddt          | j                   fddt          ||ddg          fdd| j        fddt          | j        |z  | j        ddg          fdd| j        fgdddd| j        pd
fdd t          | j        |z  | j        ddg          fd!d"t          | j        |z  | j        d#ddg$          fd%d&t          | j                  fgdd'd(d)t          | j        |z  | j        ddg          fd*d+t          ||z  |d#ddg$          fd,d-t          |t          |           d.t          | j                   d#ddg$          fd/d-t          |t          |           d.t          |           ddg          fgdg}| j        |dS )0Nu   Nenhuma Estratégia Selecionada)r   gruposr   r6   rC   z1. MONTAGEMu   Nome da Estratégiarq   r   -r   zQuantidade BaserD   zDias p/ o VencimentoDTEs[])r:   z
Ativo Basero   zCusto na EntradarG   zTot: r4   u	   ID ÚnicorY   )catitensz2. ACOMPANHAMENTOu   Informaçõesr   zValor AtualrM   z	P&L AtualrN   T)r%   r:   u   Preço Spot Atualr{   z3. DESMONTAGEMu   Alvo p/ a SaídarO   z
Lucro AlvorP   zLucro NormalizadoNormalizadoz / zDias Normalizado)rD   rE   r   r   rO   rG   rN   r   rq   r*   r   r   r>   ro   rY   r   rM   r{   )r?   rQ   dias_mercadodias_manual
lucro_alvolucro_normalizadodias_normalizadodadoss           r)   !obter_resumo_estrutura_organizador(    s    I9RHHH%.%8A%=%=Y 	!	!	!1B//11L-K $y'88J >G=Qc
Y%999W\]bWcWc5@R|k11eEll "FIN;+q)<'='='DE+y':'AcBQy/B-C-CD#VXlKY\]`Xa-b-b-bc;	(;<HY5F5KYM^hoprgs,t,t,tu$	-	)
 		 		 $fin&;<J1Cb1H)J\fmnpeq(r(r(rs,1E1JIL`jnx  AC  xD  )E  )E  )E  F /1Y5L3M3MN/
 	 	 !Xi6H26MyOakrsujv-w-w-wx:x
RUYcjkmbn'o'o'op -*q}},Z,Z9CWAXAX,Z,Zdhryz|q}~~~@)aoo+R+R!K..+R+R\_`c[deeeg,
 	 	%E6 Ne444r+   c                 n   | r| j         sg S g }| j         D ]}t          t          |j                            t          |j        d          |j        |j        t          |j        dk    rt          |j                  nt          j
                  t          |j        dk    rt          |j                  nt          j
                  t          t          |j                            t          |j        t          |j                  nd           |j        j        d	}|                    |            |S )NTr-   r   )	rL   r   r   rq   r   r   rG   rM   rI   )rH   r*   r    rL   r   r   rq   r   r   r   rC   r   rG   rM   rI   r   rr   )r?   re   r   pernas       r)   obter_opcoes_estruturar+    s    I- 	D   s28}}%%BGT***GGBGw,>,>bi(((DHMMBGw,>,>c"-(((DHMMrz**++0G%,,,TRRio

 

 	EKr+   c                     g }| j         D ]B}|                    |j        |j        |j        |j        |j        |j        |j        d           C|S )uU   
    Prepara uma lista de dicionários com os campos editáveis de cada opção.
    )rL   r   r   rq   r   r   rG   )	rH   rr   rL   r   r   rq   r   r   rG   )r?   r'  r   s      r)   obter_estrutura_para_edicaor-    sj     E 	 	XGGGi-z
 
 	 	 	 	 Lr+   )FF)F)r@   N);r   r   r   r   typingr   r   r   r   r   pandasr  r   numpynpmatplotlib.pyplotpyplotpltr   ior	   	Estruturar
   r   r   r   Oplabr   r   r   dirnameabspath__file__BASE_DIRrt   r   r   makedirsr   r!   __annotations__r  r*   r3   r>   rW   r_   r   r[   r\   r   r  r
  r  boolr  r(  r+  r-  rb   r+   r)   <module>r?     s   
				   				 3 3 3 3 3 3 3 3 3 3 3 3 3 3                            D D D D D D D D D D D D ) ) ) ) ) ) ) ) 7??27??84455h55	w~~n%%  BK	w~~n%%  BK/1 tCO, 1 1 1 2# 2# 2# 2#lN N N N #(R"b i i i i$)* ) ) ) ) )X!T#z/%: ! ! ! !,xC xC xC xCP4S#X+?    40 08L 0 0 0 0d8
 8S 8S 8 8 8 8x8J+? BL    xPZ PC P P P P*3ES 3EU495E 3E 3E 3E 3E~*5*1E *5 *5 *5 *5^hz&: tDcN?S    2: $tCH~:N      r+   