
    YehR                    
   d 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 ddlmZmZ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mZmZ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 m!Z! ddl"Z#ddl$Z%ddl&Z'ddl(Z(ddl)Z)ddl*Z*ddl+Z+ddl,Z,ddl-Z-ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddl5 ddl6 ddl7 ddl8 ddl9 ddl: ddl; ddl< ddl=  e>ddd      5 Z? e*j                  e?j                               ZBddd        e4eBd   d   dddd      ZCeCeBd   d      ZDeDd    ZEeDd!   ZFeDd"   ZGeDd#   ZHeDd$   ZIeDd%   ZJeDd&   ZKeDd'   ZLeDd(   ZMeDd)   ZNeDd*   ZOeDd+   ZPeDd,   ZQeDd-   ZReDd.   ZSeDd/   ZTeDd0   ZUeDd1   ZV ej                         ZW e+j                         j                  ZZd2Z[d3Z\ ed4gd56      Z] ed78      Z^ e       Z_e_j                  ed9gdd9gd9g:       	 e_j                  d;      d<ebfd=       Zce_j                  d>      d<ebfd?       Zde_j                  d@      d<eefdA       Zf	 	 e_j                  dB      d<egfdC       Zh	 	 e_j                  dD      dE        Zie_j                  dF      d<ejfdG       ZkdHeel   dIeelef   fdJZm	 e_j                  dK      dL        Zk	 e_j                  dM      d<enfdN       Zoe_j                  dO      dPeqfdQ       Zre_j                  dR      d<esfdS       Zte_j                  dT      d<eufdU       Zv	 e_j                  dV      dWeew   fdX       Zxe_j                  dY      dZ        Zye_j                  d[       ed      fd\eqfd]       Zze_j                  d^      d_e{fd`       Z|e_j                  da      d<e}fdb       Z~	 e_j                  dc      d<efdd       Ze_j                  de      d<efdf       Ze_j                  dg      d<efdh       Ze_j                  di      d<efdj       Ze_j                  dk      dl        Z	 e_j                  dmee   n      ddoeeq   fdp       Ze_j                  dqen      dreqfds       Ze_j                  dt      d<efdu       Ze_j                  dv      dreqfdw       Ze_j                  dx      dyefdz       Ze_j                  d{      d|        Ze_j                  d}      d~eqfd       Z	 e_j                  d       ed       ed       ed      fdeqdeqdeqfd       Z	 e_j                  d      deqfd       Z	 e_j                  d       ed       ed      fdeeq   deeq   fd       Ze_j                  d       ed       ed      fdeeq   deeq   fd       Z	 e_j                  d       ed       ed      fdeeq   deeq   fd       Z	  ee^      fd7eqfdZe_j                  d      d        Z	 d Ze_j                  d       edd       edd      fdeqdeqfd       Ze_j                  d      d ee   fd       Z	 e_j                  d      defd       Ze_j                  d      d        Z	 e_j                  d      defd       Z|	 e_j                  d      defd       Z|	 e_j                  d      defd       Z|e_j                  d      d<efd       Ze_j                  d      d<efd       Z	  ee^      fd7eqfdZe_j                  den      d(efd       Ze_j                  den       e       fdefd       Ze_j                  d       ee      fdefd       Z	 e_j                  d      d        Zy# 1 sw Y   |xY w)z
* Developed by: Harsh Mistry & Amit Maliwad
* Date: 01-01-2025
* API Used On: tradeiq.rayvat.com
* Purpose: Calculates the required data for stocks.rayvat.com
    )OAuth2PasswordBearerOAuth2PasswordRequestForm)FastAPIQueryHTTPExceptionDependsstatus)JSONResponse)datetime	timedeltadate)CORSMiddleware)
KiteTicker)r   r   )OptionalDefaultDictAnyListDict)r   r   )BaseHTTPMiddleware)CryptContextdefaultdict)JWTErrorjwtN)PyMongoError)	ASCENDING
DESCENDING)AsyncIOMotorClient)*z/var/www/html/trade_iq/env.jsonrzutf-8)encodinglive	mongo_urld      Ti_ )maxPoolSizeminPoolSizeretryWritesmaxIdleTimeMSdatabaseorderstest_orders	nse_data1	bse_data1holdingsrealized_holdingstest_holdingslevelsuserindices_nseindices_bseohlc_reportsportfolio_reportszerodha_credentials	watchlistquery_formulassectionsquery_storeHS256   bcryptauto)schemes
deprecatedtoken)tokenUrlr   )allow_originsallow_credentialsallow_methodsallow_headersz
/bse_indexrequestc                 p  K   	 | j                   j                         j                         }t        d   }|j	                  d|i      j                  d        d {   }|st        dd| d      |D cg c]  }d|v s|d    }}||dS 7 3c c}w # t        $ r}t        d	d
|       d }~ww xY ww)Nr5   symbols  No index found with , enter a valid symbolstatus_codedetailIndexsymbolindexes  Error: rT   upperstripdbfindto_listr   	Exception)rI   rT   mycolresultdocindexes_bsees          %/var/www/html/trade_iq/tradeiq_api.pyget_bse_indexre   l        C%%'--/=!zz9f"56>>tDDC:NvhVl8mnn/5HCs7|HH [99 E
 I  CgaSMBBCS   B6AB BB 6	B BB B6B B 	B3B..B33B6z
/nse_indexc                 p  K   	 | j                   j                         j                         }t        d   }|j	                  d|i      j                  d        d {   }|st        dd| d      |D cg c]  }d|v s|d    }}||dS 7 3c c}w # t        $ r}t        d	d
|       d }~ww xY ww)Nr4   rK   rL   rM   rN   rO   rR   rS   rV   rW   rX   )rI   rT   r_   r`   ra   indexes_nserc   s          rd   get_nse_indexrj   }   rf   rg   z/get_pricesc           
      P  K   | j                   }| j                  }| j                  }| j                  }d| d}|3dd|ddiiddd	d
ddgidgiddididdidd||diiddddddidddiig}|j	                         dk(  rt
        j                        j                  d        d {   }t        j                  d|ddi      j                  d        d {   }|st        dd| d !      	 |D 	cg c]  }	d"|	v s|	d"    }
}	t        d#||
d   t        |
      d$%      S |j	                         d&k(  rt        j                        j                  d        d {   }t         j                  d|ddi      j                  d        d {   }|st        dd| d !      	 |D 	cg c]  }	d"|	v s|	d"    }}	t        d#||d   t        |      d$%      S d'd(i7 ;7 c c}	w # t        t        f$ r g }
Y w xY w7 7 tc c}	w # t        t        f$ r g }Y _w xY ww))N^(-[A-Z]{2})?$$matchrT   i$regexz$options$project   z$arrayElemAtz$split$symbol-r   $objectToArray$prices)rT   base_symbolfiltered_prices$unwind$filtered_pricesfiltered_prices.k)$gte$ltez$base_symbol$filtered_prices.k$filtered_prices.v.close_idrT   r   close$sortr   NSElengthrK   rL   rM   rN   rO   rR      )datafirst_indexindices_lengthrP   contentBSEmsgz Please enter a valid `exchange`.)rT   exchange
start_dateend_daterY   nseData_collection	aggregater]   nseIndices_collectionr\   r   
IndexErrorKeyErrorr
   lenbseData_collectionbseIndices_collection)rI   rT   r   r   r   symbol_regexpipeliner`   result_ira   ri   rb   s               rd   
get_pricesr      s    ^^FH##JHvho.L 8#%NO &%	3'78!)$
 )9)'D
 - '*h)O ,07	 &!?"
X ~~5 )33H=EETERR.33Y<eh@i4jksstxyyC:NvhVl8mnn	3;NCw#~3w<NKN fU`abUcwz  |G  xH  6I  J  	J		U	")33H=EETERR.33Y<eh@i4jksstxyyC:NvhVl8mnn	3;NCw#~3w<NKN fU`abUcwz  |G  xH  6I  J  	J 899; Sy OH% 	K	 Sy OH% 	K	s   B'H&)G$*0H&G'H&3G/ 7	G*G*G/ 
AH&"H#0H&HH&,H 0	H
:H
H "H&'H&*G/ /H H&HH&H&
H H# H&"H##H&z/get-symbol-price-indexc                   K   | j                   }|rg }t        t        dt        t        dfdfdfd}|D cg c]  } ||d   |d          }}t        j                  |  d {   }|D ]U  \  }}}	|D ]J  }
t        j                  dd|
d         }|j                  |||
d   |
d	   |	r|	d
   ndt        |	      d       L W t        dd|i      S t        dd      c c}w 7 w)N)r   r   c                   K   d   j                  d| i      j                  d        d {   }|s-d   j                  d| i      j                  d        d {   }|r|D cg c]  }d|v s|d    c}S g S 7 O7 "c c}w w)Nr   rK   r   rR   )r\   r]   )rT   indicesra   indices_dicts      rd   fetch_indiceszget_pu.<locals>.fetch_indices  s     (/44i5HIQQRVWWG ,U 3 8 8)V9L M U UVZ [[JQGFSw#~CLFYWYY X[Fs9   )BA<.BA>
B&	B 0B 7B>B Bc           
         K   d| d}dd|ddiiddd	d
ididdiddd|iiiddddddidddiiddig}|    j                  |      j                  d        d {   S 7 w)Nrl   rm   rn   rT   ro   rp   rr   rs   rv   rw   )rT   ry   rz   r{   r|   r~   r   r   r   r   r   r   z$limitr   )r   r]   )r   rT   r   r   r   exchange_dicts        rd   fetch_priceszget_pu.<locals>.fetch_prices  s     vho6L H3&OPQ?OQZ>[\].//&*1EFG07	  62,'1H 'x0::8DLLTXLYYYYs   AA$A"A$c                    K    d| |       d {   }|r|d |        d {   fS  d| |       d {   }|r|d |        d {   fS g dg fS 7 E7 37 "7 w)Nr   r     )rT   r   
result_nse
result_bser   r   s       rd   fetch_prices_and_indicesz(get_pu.<locals>.fetch_prices_and_indices  sw     +E6:FFJ!5f0E*EEE+E6:FFJ!5f0E*EEEr2: G*EF*EsA   AAAAAAAAAAAArT   r   z
-[A-Z]{2}$r   r   r   )rT   r   r   r   r   r   r   r   r     zNo data providedrO   )data_arrr   r   r   r   asynciogatherresubappendr   r
   r   )rI   r   output_datar   r   tasksresultsr`   r   rU   resrT   r   r   r   r   s               @@@@rd   get_pur     s    H 2;MN4=RS	Z	Z8		 U]]D)$x.$v,G]]..+2 	'VXw r3x=A""$ (K \1871:b&)'l$ 		 fk5JKK
C0B
CC' ^.s   ?C4C-C42C23B C4z/indicesc                  L  K   	 t         j                  ddddddd      j                  d        d {   } t        j                  ddddddd      j                  d        d {   }| |z   }d|dS 7 B7 # t        $ r}t        dd	t        |       
      d }~ww xY ww)NINDICEST)
Instrumentpriorityr   )r   prices	timestampsuccess)r	   r   rV   An error occurred: rO   )r   r\   r]   r   r^   r   str)nse_indices_databse_indices_dataaggregated_datarc   s       rd   get_indicesr     s     T!3!8!8$$73"
 '$-
 "4!8!8$$73"
 '$- +-==#_==
  T6I#a&4RSSTsJ   B$/A: A63A: 'A8(A: 5B$6A: 8A: :	B!BB!!B$z
/watchlistc                   K   	 t        j                  t        j                         t         j                  j                               }| j                  dk(  r~t        j                  | j                  | j                  d       d{   }|rt        dd      | j                  | j                  |d}t        j                  |       d{    dd	iS | j                  d
k(  rTt        j                  | j                  | j                  d       d{   }|j                  dkD  rddiS t        dd      t        dd      7 7 z7 5# t        $ r}t        ddt!        |             d}~ww xY ww)zD
        0 - Add to Watchlist
        1 - Remove from Watchlist
    r   )rT   r   Nr   z#Symbol already exists in watchlist.rO   )rT   r   r   messagez'Symbol added to watchlist successfully.rs   z+Symbol removed from watchlist successfully.rL   zSymbol not found in watchlist.z,Invalid action. Use 0 to add or 1 to remove.rV   r   )r   combiner   todaymintimeactionwatchlist_collectionfind_onerT   r   r   
insert_one
delete_onedeleted_countr^   r   )rI   r   existing_recordwatchlist_recordr`   rc   s         rd   get_watchlistr     sg     T  x||/@/@/BC>>Q$8$A$A!..#,,C % O #<abb "..#,, 
 '112BCCCHII^^q /::!..#,,<  F ##a'!#PQQ#<\]]C8fgg3 D  T6I#a&4RSSTsl   E5BE EAE EE E5>E E	E *E5+E E 	E 	E2E--E22E5instrument_tokensreturnc                     K   t        j                         i fd} fd}t        j                   |        |              d {    S 7 w)Nc                     K   t        j                  d       d {     j                         s j                          y y 7 &w)N
   )r   sleepis_setset)completion_events   rd   timeout_handlerz/fetch_close_price_once.<locals>.timeout_handler6  s;     mmB&&(  " ) 	 s   AA'Ac                    K   t        j                         } t        j                  dt	        |       iddd       d {   }|st        d      |d   }t        |      	
fd}	
fd}	fd	}	fd
}|_        |_        |_	        |_
        t        j                         }|j                  d j                  d       d {    y 7 7 w)Nr   r   r   enctokenz*No WebSocket configuration found for today	websocket)
socket_urlc                     |D ]  }|j                  d      }|s||<    t              t              k\  r2j                          j                         sj	                          y y y )Ninstrument_token)getr   r   r   r   )wstickstickrC   r   r   kite_tickerr   s       rd   on_ticksz>fetch_close_price_once.<locals>.fetch_prices.<locals>.on_ticksM  so     )!34$(F5M) 6{c"344!!#'..0$((* 1 5    c                     	 j                         j                  j                         y # t        $ r=}t	        d|        j                         sj                          Y d }~y Y d }~y d }~ww xY w)NzConnection error: )	subscribeset_mode	MODE_FULLr^   printr   r   )r   responserc   r   r   r   s      rd   
on_connectz@fetch_close_price_once.<locals>.fetch_prices.<locals>.on_connectZ  sn    +%%&78$$[%:%:<MN +*1#./'..0$((** 1+s   -1 	A7.A22A7c                 d    t        d|        j                         sj                          y y )NzWebSocket closed: r   r   r   )r   codereasonr   s      rd   on_closez>fetch_close_price_once.<locals>.fetch_prices.<locals>.on_closec  s0    &vh/0#**, $$& -r   c                 d    t        d|        j                         sj                          y y )NzWebSocket error: r   )r   r   errorr   s      rd   on_errorz>fetch_close_price_once.<locals>.fetch_prices.<locals>.on_errorh  s0    %eW-.#**, $$& -r   T)r   r   websocket_collectionr   r   
ValueErrorr   r   r   r   r   r   get_event_looprun_in_executorconnect)
today_date
socket_doc	getSocketr   r   r   r   loopr   r   r   r   s           @rd   r   z,fetch_close_price_once.<locals>.fetch_prices;  s      ZZ\
/88S_%1%
 


 IJJ{+	 !I6	+	+	'
	'
  (!+'' %%'""4)<)<dCCCi
h 	Ds$   <C CBCCCC)r   Eventr   )r   r   r   r   r   s   `  @@rd   fetch_close_price_oncer  /  sS     }}F#
9Dx ..  
 Ms   AAAAz/get-watchlistc                    K   	 t         j                  i ddi      j                  d       d{   } | sddiS | D cg c]  }|d   d	k(  s|d
    }}| D cg c]  }|d   dk(  s|d
    }}t        j                  d
d|iiddddd      j                  t	        |             d{   }t
        j                  d
d|iiddddd      j                  t	        |             d{   }i |D ci c]  }|d
   |
 c}|D ci c]  }|d
   |
 c}}| D ]*  }|d
   }|j                  |i       }|j                  |       , | D 	cg c]  }	|	d   	 }
}	t        |
      }t        |       d| iS 7 Fc c}w c c}w 7 7 c c}w c c}w c c}	w # t        $ r}t        ddt        |             d}~ww xY ww)z
    Fetch the watchlist with instrument and exchange tokens included for each symbol,
    querying different collections based on the exchange (NSE or BSE).
    r   r   i,  r   Nr   z No items found in the watchlist.r   r   rT   r   z$inrs   )r   rT   r   exchange_tokenr   r9   rV   r   rO   )r   r\   r]   r   r   r   r   updater  r   r^   r   r   )watchlist_itemsitemnse_symbolsbse_symbols
nse_tokens
bse_tokens
token_dictrT   
token_datatoken_dlist_tokdataGterc   s                rd   r   r     s    )T 4 9 9"uaj I Q QY\ Q ]]ABB 3B_$T*EUY^E^tH~__2A_$T*EUY^E^tH~__ .22{+,QO
 '[)'
*+

 .22{+,QO
 '[)'
*+

0:;tH~t#;
0:;tH~t#;

 $ 	$D(^F#3JKK
#	$
 @OOGG./OO(2g_--I ^ `_+
+ <; P  T6I#a&4RSSTs   F?+F E5	F F?F E8E8F E='E=.=F +F,?F +F,	F 5FF 	F7F FF 4F?5F 8F F F 	F<F77F<<F?z/analyze-multiplec                 J  K   	 g }| j                   dk(  r%t        j                  d| j                  iddi      }nN| j                   dk(  r%t        j                  d| j                  iddi      }nt        dd| j                          |j                  d	
       d	{   }|st        dd| j                         t        |      }| j                  }| j                  | j                  z   }||k\  rt        dd      ||| }|D cg c]  }t        || j                         }}t        j                  |  d	{   }	t        |	      }	| j                  | j                  | j                  ||	dS 7 c c}w 7 <# t        $ r}
t        dt!        |
            d	}
~
ww xY ww)z
    Endpoint to analyze price data for all symbols of a given instrument type concurrently.
    Supports pagination using length and offset.
    r   r   r   r   r   r   zUnsupported exchange: rO   Nr   rL   z!No symbols found for instrument: Offset exceeds available data)
instrumentr   offsettotal_itemsr   rV   )r   r   r\   r  r   r   r]   r   r  r   process_single_symbol_madurationr   r   make_json_safe_mar^   r   )rI   symbols_datacursorr  start_index	end_indexpaginated_datasymbol_datar   r   rc   s              rd   analyze_multiple_symbolsr$    s    *<u$',,lG<N<N-ORWYZQ[\F&',,lG<N<N-ORWYZQ[\FC:PQXQaQaPb8cdd $^^4^88C:[\c\n\n[o8pqq,' nnNNW^^3	+%C8WXX%k)< ]kk[)+w7G7GHkk.. $G, ",,nnnn&
 	
/ 9" l.  <CF;;<sZ   F#BE< E3A+E< 	E5&E< =E:>4E< 2F#3E< 5E< <	F FF  F#z/analyze/{symbol}rT   c                    K   d}	 t         j                  d| iddi       d{   }|st        dd|  d	      t        ||       d{   }|S 7 -7 # t        $ r}t        d
t        |      	      d}~ww xY ww)z=
    Endpoint to analyze price data for a single symbol.
    1YrT   r   r   NrL   zSymbol  not found.rO   rV   )r   r   r   r  r^   r   )rT   r  r#  outputrc   s        rd   analyze_symbolr)  -  s     
 H
<.7768JUTUJWWC'&8UVV 0XFF X
 G <CF;;<sJ   A<A A&A 
AA A<A A 	A9A44A99A<z/model-datac                   K   d| j                   i}| j                  j                         dk(  r!t        j	                  |ddi       d {   }n t
        j	                  |ddi       d {   }|st        dd      | j                  |d<   | j                  |d	<   | j                  |d
<   t        |      }|rt        |d      S t        dd      7 7 iw)NrT   r   r   r   rL   Symbol not foundrO   
time_ranger   r   r   r   rP   rV   Error processing data)rT   r   rY   r   r   r   r   r,  r   r   process_price_data_mar
   )rI   querysample_datar`   s       rd   analyze_datar2  ?  s      w~~&E5(.77qzJJ.77qzJJ4FGG !( 2 2K ' 2 2K%..K
";/FF<<4KLL# KJs%   AC	C
 C*C+A(CCz/graph-datac                 	  K   | j                   j                         dk(  r/t        j                  dd| j                  iiddi       d {   }nY| j                   j                         dk(  r/t
        j                  dd| j                  iiddi       d {   }nt        dd	      |st        d
d	      	 t        t        | j                              }|dk  rt        d      	 |}t        |      }|d   }|rFt        |j                         d       }| j                  t        | j                        }n||   d   }|d   D 	ci c]  }	|	d   |	d    }
}	|d   j!                         D ]5  \  }}||
v r|j#                  d|
|   d       "|j#                  ddd       7 g }g }|d   j!                         D ]$  \  }}|j%                  d      dk(  rz|j%                  d      }|kD  rd|j'                  ||j%                  d      ||j%                  d      |j%                  d      |j%                  d      |j%                  d      d       |j%                  d      dk(  s|j%                  d      }|k  s|j'                  ||j%                  d      |j%                  d      ||j%                  d      |j%                  d      |j%                  d      d       ' t)        |d d !      }t)        |d" d#!      }t+        |      }t+        |      }t        ||      }|d | }|d | }t-               }||z   D ]  }|j/                  |d$           |rt1        |d%       }t        |d&       }nt        d
d'	      i }|d   j!                         D ]8  \  }}||cxk  rk  sn ||v r|||<   |d   dk(  r|||<   -i |ddd||<   : ||d(<   d}d}|j!                         D ]  \  }}t3        |t4              sd|v s|j%                  d      } |j%                  d      dk(  r| | d)z
  | cxk  r| d*z   k  rn n|dz  }|j%                  d      dk(  sq| t| d)z
  | cxk  r	| d*z   k  sn |dz  } ||d+<   ||d,<   |rt7        |d-.      S t        d/d0	      7 Y7 # t        $ r}t        dt        |      	      d }~ww xY wc c}	w w)1Nr   rT   rq   r   r   r   r   zInvalid exchangerO   rL   r+  zOffset must be greater than 0r   r   c                 .    t        j                  | d      S N%Y-%m-%dr   strptimeds    rd   <lambda>zgraph_data.<locals>.<lambda>t  s    x7H7HJ7W r   )keyr   trendsr   trendrs   )r	   r?  nouptrendhighopenlowr	   )r   rC  rB  rD  r   r	   r?  	downtrendc                     | d   S )NrB  r   xs    rd   r<  zgraph_data.<locals>.<lambda>  s
    6 r   F)r=  reversec                     | d   S )NrD  r   rG  s    rd   r<  zgraph_data.<locals>.<lambda>  s
    qx r   Tr   c                 .    t        j                  | d      S r6  r8  r:  s    rd   r<  zgraph_data.<locals>.<lambda>  s    (:K:KAz:Z r   c                 .    t        j                  | d      S r6  r8  r:  s    rd   r<  zgraph_data.<locals>.<lambda>  s    9J9J1j9Y r   zNo trend points found
max_pointsgMbp?g{Gzt?uptrend_close_countdowntrend_close_countr   r-  rV   r.  )r   rY   r   r   rT   r   r   intfloatr  r   r   r/  maxkeys	new_closeitemsr
  r   r   sortedr   r   addr   
isinstancedictr
   )!rI   get_datar  rc   r   reference_apir   newest_datenewest_close_pricer?  trend_datesdate_str
price_data
top_pointsbottom_pointsdatesvalues	top_pricebottom_pricetop_points_sortedbottom_points_sortedtop_sum
bottom_sumsum_cselected_datespointsmallest_datelargest_datery   r   uptrend_countdowntrend_countr   s!                                    rd   
graph_datarr  X  sE    5(+44h7>>@Z5[^cef]ghh						!U	*+44h7>>@Z5[^cef]ghh4FGG4FGG<U7>>*+Q;<== 
 D)t4M (^F&++--WX (!&w'8'8!9!'!4W!= CPPXBYZ5$eGn4ZKZ !%X 4 4 6 <*{"[5JKLT:;	< JMh--/ v::g)+

6*I--!!!"JJv.%!::e,#ZZ0$jj2#ZZ0#  ::g+-!::e,L00$$!"JJv."JJv.'#ZZ0$jj2#ZZ0& #8 z/BER!-5GQUV #$G)*J$E *'62/8 UN"%99 *5=)* N0Z[>/YZ4KLL OX,,. fD/K/~%(.%D((.%))!)%" %*OL! MO'--/ 	)ffd#6(9JJw'Ezz'"i/E4E5=E:UU]:!Q&Mzz'"k1e6G5=E:UU]:#q(O	) .;O)*/>O+,OEE4KLL] i i  <CF;;<$ [s   AS	R"
ASR%!S8.R( &A#S	SDS'S>D+S*ASSASS S21S%S(	S1SSSz/portfolio-report-upload	get_listsc           	      ^  K   	 | D ]  }|j                   }|j                  }|j                  }t        j	                  d|idd|iid       d {    |D ]  }t        j	                  ||j
                  dd|j                  |j                  di       d {   }|j                  dk(  sWt        j	                  d|i||d	d
|j                         idd       d {      t        ddi      S 7 7 `7 # t        $ r%}t        dddt        |       i      cY d }~S d }~ww xY ww)Ninvestor$setdescriptionTupsert)ru  zholdings.symbol)zholdings.$.qtyzholdings.$.avg_pricer   )ru  rw  r/   )z$setOnInsertz	$addToSetr   z-Portfolio data inserted/updated successfully.r   rV   r   r   r   )ru  rw  r/   portfolioUpload_collection
update_onerT   qty	avg_pricematched_countrY  r
   r^   r   )rs  reportinvestor_namerw  new_holdingsholdingupdate_resultrc   s           rd   upload_reportr    sz    0
 %	F"OOM ,,K!??L -77]+-56 8    ( &@&K&K!.7>>R.5kk4;4E4E!' ! !..!34??#]3 -:/:- +5glln)E  $ @ 
 
 
%	N  OP
 	
C!
  
 3CF8<=
 	

sr   D-A
C< C6AC< C8C< ,3C< C: C< 5D-6C< 8C< :C< <	D*D%D* D-%D**D-z/portfolio-investorsc                     K   	 t         j                  d       d {   } t        d| i      S 7 # t        $ r#}t        dt	        |      dd      cY d }~S d }~ww xY ww)Nru  	investorsrz  z0An error occurred while fetching investor names.r   r   rV   r-  )r{  distinctr
   r^   r   )investor_namesrc   s     rd   get_investor_namesr  "  sk     
9BB:NN .1
 	
 O  
MQ 
 	

s<   A 1 /1 A 1 	AAAA AA z/portfolio-investors-dataru  c                    K   	 i }| r| |d<   t         j                  |ddi      j                  d        d {   }t        d|i      S 7 # t        $ r#}t        dt        |      dd	
      cY d }~S d }~ww xY ww)Nru  r   r   r   r   rz  z&An error occurred while fetching data.r  rV   r-  )r{  r\   r]   r
   r^   r   )ru  r0  r   rc   s       rd   get_investors_datar  5  s     
 (E* 044UU1IFNNVZN[[ VTN33 \  
CQ 
 	

sD   A<4A AA 
A<A 	A9A4.A9/A<4A99A<z/portfolio-get-reportdatc                   (K   	 t        j                  | j                  d      }t        j                  | j                  d      }||kD  rt	        dd      ddddd	}i g d
}| j
                  }	 |g}t        j                  d| j                  iddi       d {   }|st	        dd      |j                  dg       }|st	        dd      |D ]  }	|j                  |	      }
|
st	        dd      g }i }g }|D ]2  }dd|d   iidddddidddidd|
 |d    gid!d"id#d$d%d&|gid'd&|gigid(id)d)d)d)d)d*ig}t        j                  |      j                  d +       d {   }|D ]  }|
|d   |d    |d,   |j                  d-      |j                  d.      |j                  d/      |j                  d0      |j                  d1      d2	}|j                  d3g       D ]8  }|d4   j                  d      }|d5   }|||<   |j                  |d      |z   ||<   :  |j                         5 t        |j!                               }|
d6d7d7d8|D ci c]  }|||   
 c}}|j                  |       |rQ||d      }|
d9|
 d7d7d8|D ci c]"  }||dk(  rd:nt#        ||   |z
  |z  d;z  d<      $ c}}|j                  |       i }|
d=|
 d7d7d8}t%        |      D ]8  \  }}|dk(  rd:||<   n ||d)z
     }t#        ||   ||   z
  d<      ||<   ||   ||<   : |j                  |       |
d>|
 d7d7d8t%        |      D ci c]9  \  }}||dk(  s|||d)z
        dk(  rd:nt#        ||   |||d)z
        z  d;z  d<      ; c}}}|j                  |       t'        |      ||
<   t'        |      |d?<   |dk(  s||d@   |
<    |dk(  rBddAiddBiddCiddDiddEiddFiddGiddHidI} | j)                         D ]  \  }!}D ]  }	 |!dJk(  r0|d@   d   |   |d@   d   |   g}"t#        |"d   |"d)   z
  d<      ||<   n|!dKk(  r0|d@   d   |   |d@   d   |   g}"t#        |"d   |"d)   z
  d<      ||<   n|!dLk(  r0|d@   d   |   |d@   d   |   g}"t#        |"d   |"d)   z
  d<      ||<   nP|!dMk(  r0|d@   d   |   |d@   d   |   g}"t#        |"d   |"d)   z
  d<      ||<   n|!dNk(  rB|d@   d   |   |d@   d   |   g}"|"d)   dk(  rd:nt#        |"d   |"d)   z
  |"d)   z  d;z  d<      ||<   n|!dOk(  rB|d@   d   |   |d@   d   |   g}"|"d)   dk(  rd:nt#        |"d   |"d)   z
  |"d)   z  d;z  d<      ||<   n|!dPk(  rB|d@   d   |   |d@   d   |   g}"|"d)   dk(  rd:nt#        |"d   |"d)   z
  |"d)   z  d;z  d<      ||<   nF|!dQk(  rA|d@   d   |   |d@   d   |   g}"|"d)   dk(  rd:nt#        |"d   |"d)   z
  |"d)   z  d;z  d<      ||<     |d@   j-                  |        i }#| j                  |#d<   ddddd	}$| j
                  |$vrt	        ddR      |$| j
                     }%|%|vrt	        ddS|% dT      t/        j0                  ||%         }&t3        j4                  dU      }'|&j6                  D ]1  (|'j9                  (      st/        j:                  |&(   dVW      |&(<   3 |&j=                  ddX       g }|&j6                  D ((cg c]#  (t?        (fdYtA        dZd[      D              s"(% })}(|)D ci c]  }|d }*}|)D ci c]  }|d }+}|)D ci c]  }|d },}|&jC                         D ]  \  }-}.|.d   }/|.d,   }0|.d    }1g }2d\\  }3}4}5tA        d)tE        |)            D ]  }|)|   }6|)|d)z
     }7	 tG        |.|6         tG        |.|7         z
  }8|2j                  |8       |8dk  r|3d)z  }3|*|6xx   d)z  cc<   W|8dkD  r|4d)z  }4|+|6xx   d)z  cc<   o|5d)z  }5|,|6xx   d)z  cc<    |3|4z   |5z   }9|4|3kD  }:|j                  |/|0|1d]tA        d)tE        |)            D ci c]  }|)|   |2|d)z
      c}|3|4|5|:rd^nd_d`        t/        j0                  |      };dadbgd d gd d gd d gdc}<|)d)d  D ]  }|*|   |+|   g|<|<    t/        j0                  |<      }=|;jM                  tN        jP                  tN        jP                   tN        jR                  gd:dX       |;jU                  dde      |#|%<   |=jU                  dde      |d?   z   |#df<   tW        |#dgh      S 7 7 c c}w c c}w c c}}w # t*        $ r Y dw xY wc c}(w c c}w c c}w c c}w # tH        tJ        f$ r d}8Y w xY wc c}w # tH        $ r}>t	        dditY        |>             d }>~>wtZ        $ r}>t	        djdktY        |>             d }>~>ww xY ww)lNr7  r   .start_date must be before or equal to end_daterO   rC  rB  rD  r   )r   rs         )summary_reportsummary_totalTru  r   r   rL   zInvestor data not foundr/   z"No holdings found for the investor(Invalid reqType. Must be between 1 and 4rn   rT   rr   $filter$maprv   rw   	priceData$toDate$$priceData.k	$multiply$$priceData.v.r}  r   price_multipliedinputasinfilteredPrice$andr}   $$filteredPrice.dater~   r  r  condrs   )r   security_namer  r   r	  r   r   r~  Security Namer   r   r	  r   )	typerT   r}  r~  r  r  r   r	  r   r   r   r  TOTALr   )r  SymbolQuantity	Avg_price% TOTAL CHANGE in ru   r$   r  DAY CHANGE in DAY CHANGE % in r  r  High - Open
Open - Low
High - LowOpen - CloseHigh - Open %Open - Low %High - Low %Open - Close %high_minus_openopen_minus_lowhigh_minus_lowopen_minus_closehigh_minus_open_propen_minus_low_prhigh_minus_low_propen_minus_close_prr  r  r  r  r  r  r  r  zFInvalid data_type. Use 0 for open, 1 for high, 2 for low, 3 for close.z	Data for r'  z^\d{4}coerce)errors)inplacec              3   8   K   | ]  }t        |      v   y wNr   ).0yearcols     rd   	<genexpr>zget_report.<locals>.<genexpr>b  s     8hdTc9I8hs   i  i  )r   r   r   )r  r  r  TRUEFALSE)LoserWin	UnchangedPositivezTotal Loserz	Total Win)r  r  r  r  records)orientsummaryr   r-  Invalid date format: rV   r   ).r   r9  r   r   r   	data_typer{  r   ru  r   r   r   r]   strftimer   rV  rS  round	enumerateconvert_objectid_prrU  r   r
  pd	DataFramer   compilecolumnsmatch
to_numericfillnaanyrangeiterrowsr   rQ  r   	TypeErrorreplacenpinfnanto_dictr
   r   r^   )?r  start_dtend_dtreport_type_mapresults_by_typereqType	req_typesinvestor_datar/   req_typereport_typeall_symbolstotal_pricesr  symbol_infor   r   r`   r#  r`  r_  pricesorted_datesr   total_entryfirst_totalchange_entryday_changesday_change_entryro   	prev_dateday_change_percent_entrymetricsmetricrd  result_dictdata_type_mapr=  dfdate_patternr  date_columnssummary_losersummary_winsummary_unchangedindexrowrT   r~  quantitycalculationsloserwin	unchangedcurrent_dateprevious_datechangetotalis_positive	result_dfsummary_rows
summary_dfrc   s?                                           `                      rd   
get_reportr  K  s    iT$$S^^Z@""3<<<fC8hii$EgF-/"E--  	I 9AA&

 
 C8QRR $$Z4C8\]] " M	MH)--h7K#<fggKLM  ( >0xX)>?@%$*2BI1N.95>4P0;6D[M4R4?4F>2A./*-&*" '6$*)/2H(1S(T)/2H&1Q(R-&)"#(#4 *+&',-*+$%? !  #L !3 < <X F N NVZ N [[ & WF +"-h"7*51%0%=)/O)D&,jj&>,2JJ7I,J*0**5E*F$*JJz$:
#K '-jj2&> W
#-f#5#>#>z#J *+= >05H-1=1A1A(A1NQV1VX.WW( "";/}>0B ","3"3"56L#!	
 9EE4d++EK   - *<?;' 2;-@ "!#	
  %1 ! [A%5cT 2[ @KORUUXYZ[
  $$\2 K#*;-8	  %\2 ;46(+K% ,QqS 1I(-l4.@<PYCZ.Z\](^K%)4T): &;   !12 $,[M:	
( $-\#:  4 a<QqS8I+Ja+O#;t,|L1<M/NNQTTWXYZ
($   !9:+>{+KOK(/B=/QOO, !|AL 01+>[M	M` a< %-m#<#+\":#+\":%-~$> (0&A&.%?&.%?(02B'CG #*--/ .!( -!D,!!%66&56F&G&OPT&U&56F&G&OPT&U&WF+0VAY1F+JF4L#'77&56F&G&OPT&U&56F&G&Nt&T&VF+0VAY1F+JF4L#'77&56F&G&OPT&U&56F&G&Nt&T&VF+0VAY1F+JF4L#'99&56F&G&OPT&U&56F&G&PQU&V&XF+0VAY1F+JF4L $';;&56F&G&OPT&U&56F&G&OPT&U&WF28)q.3eVTUYY_`aYbMbflmnfoLoruLuwxFyF4L#'::&56F&G&OPT&U&56F&G&Nt&T&VF28)q.3eVTUYY_`aYbMbflmnfoLoruLuwxFyF4L#'::&56F&G&OPT&U&56F&G&Nt&T&VF28)q.3eVTUYY_`aYbMbflmnfoLoruLuwxFyF4L#'<<&56F&G&OPT&U&56F&G&PQU&V&XF28)q.3eVTUYY_`aYbMbflmnfoLoruLuwxFyF4LU-!.!` ,-44W="%,,J 	
 ==-C  9A  B  B CMM* o%C)C58TUU \\/#./ zz),:: 	BC!!#&--3A3	B 			!T	" ')zziS8hV[\`bfVg8h5hii-9:Tq::+784tQw881=>T1W>>++- -	JE3]FK(I5zH L$+!E3	1c,/0 9+A ,QqS 1"3|#45c->P8QQF ##F+ A:QJE!,/14/aZ1HC-2-NI%l3q83+9. CK)+E+K NN &$	 @EQLHY?Z[!<?L1$55[		
 &&1Fw	 	I-	` LL)	 %k2tt	
 !$ 	Dd#D!"L	 \\,/
 	266BFF7BFF3S$G$,,I,>C!+!3!39!3!EXgHh!hI KSAAc

| \@ FDZ $ ! !T j:8>$ #I. F0 \F  V6KCPQF84TUU T6I#a&4RSSTs#  g)Bf eCf &e'C/f e	#,f 'e6Bf >e
7f <A	f G/e5B>f 4Af 7#e)e)f %
e./f 5
e3?f 
e8Af %e=B	f fC$f g)f f 	f 	e&"f %e&&f =ff ff 	g&#f<<g&g!!g&&g)z/portfolio-deletec                 D  K   	 | j                   rct        j                  dd| j                    ddi       d {   }|j                  dkD  rd| j                    ddd	S d
d| j                    diS d
diS 7 <# t        $ r}t        dt        |            d }~ww xY ww)Nru  rl   ro   rp   r   zPortfolio User z deleted successfully.r   r   r	   r   zNo portfolio found for .zPayload cannot be NULL.r   rO   )investorNamer{  r   r   r^   r   r   )rI   r`   rc   s      rd   delete_portfolior    s     <5@@!G,@,@+A(BPSTU F ##a'%4W5I5I4JJ`#ampqq!%<W=Q=Q<RRS#TUU899  <CF;;<sP   B 6A9 A7%A9  B !A9 2B 3A9 6B 7A9 9	BBBB z/report_details_NSEc                 	  K   	 | j                   r;| j                  r| j                  s#t        | j                         \  | _        | _        ni| j                  rN| j                  rB	 t	        j
                  | j                  d       t	        j
                  | j                  d       nt        ddid      S | j                  rddd	d
| j                  j                          iiiddddddiddddddiidd| j                  iigiddddiidd| j                  iigigidididdidddddddgiiddidd idd!idd"id#ig}t        j                  |d$%      }g }|2 3 d&{   }t        |'      }|j                  |       'di | j                  d*k7  rd+| j                  ini iddddddiddddddiidd| j                  iigiddddiidd| j                  iigigidididdidddddddgiiddidd idd!idd"id#ig}t        j                  |d$%      }t        d,       }|2 3 d&{   }|d   }|d-   }|d.   }	|d/   }
|d0   }|
|z
  }||	z
  }||z
  }|dk7  r||z
  |z  d1z  nd}|dk7  r||	z
  |z  d1z  nd}|dk7  r|
|z
  |z  d1z  nd}||   d2   j                  |       ||   d3   j                  |       ||   d4   j                  |       ||   d5   j                  |       ||   d6   j                  |       ||   d7   j                  |       # t        $ r t        ddid      cY S w xY w7 6 t        |d()      S 7 6 g }|j!                         D ]  \  }}||d2   rt#        |d2         t%        |d2         z  nd|d3   rt#        |d3         t%        |d3         z  nd|d4   rt#        |d4         t%        |d4         z  nd|d5   rt#        |d5         t%        |d5         z  nd|d6   rt#        |d6         t%        |d6         z  nd|d7   rt#        |d7         t%        |d7         z  ndd8}|j                  |        t        |d()      S # t&        $ r%}t        dd9t)        |       id:      cY d&}~S d&}~ww xY ww);zB
    Optimized function to fetch NSE data for Report Details.
    %d-%m-%YrQ   &Invalid date format. Use 'dd-mm-yyyy'.r   rP   ;Either duration or custom start/end dates must be provided.rn   rT   rq   rl   rr   r   rs   r  rv   rw   	date_itemr  r}   $dateFromString
dateString$$date_item.kr~   r  r   rT   r   rz   	$prices.k	$toDouble$ifNull$prices.v.prev_close$prices.v.open$prices.v.high$prices.v.low$prices.v.closerT   r   
prev_closerC  rB  rD  r   TallowDiskUseN)ra   r   r-  ALLr   c                       t        t              S r  r   listr   r   rd   r<  zaggregate_nse.<locals>.<lambda>M      {4/@ r   rB  rD  r   r3  r$   high_minus_prev_closer  close_minus_prev_closehigh_minus_prev_close_perchigh_minus_low_percclose_minus_prev_close_percrT   r;  r  r<  r=  r>  r?  r   rV   )r  r   r   calculate_date_range_rdr   r9  r   r
   input_symbolrY   r   r   calculate_report_values_rdr   r   r   rU  sumr   r^   r   )rI   r   r  	documentsra   processed_docgrouped_datarT   rB  rD  r   r3  r<  r  r;  r=  r>  r?  r`   fieldsavg_datarc   s                         rd   aggregate_nserJ    s    iYW%7%7G<L<L3J7K[K[3\0G 0G$4$4k!!'"4"4jA!!'"2"2J?  +h iwz{{  8q1E1E1K1K1M0N-O"P  "#%*:I)F&1$*,21B\SbDc0d1B\SZSeSeDf0g5.)* -31B\SbDc0d1B\SZScScDd0e5.)*-&)"(#!: y "# +'2YAWYZ@[4\&]!,.> ?!,.> ? +_="-/@!A!
K0Hd (11(1NFI# 0 0c :s C  /  AHASASW\A\L'*<*<=bd  "#%*:I)F&1$*,21B\SbDc0d1B\SZSeSeDf0g5.)* -31B\SbDc0d1B\SZScScDd0e5.)*-&)"(#!: y "# +'2YAWYZ@[4\&]!,.> ?!,.> ? +_="-/@!A!
K0Hd (11(1NF&'@AL# h hcX6{%jG .
 */);&!%(,z(9%WaefWfdZ.?:-MPS-Slm*CG19tczT&9C&?RS#YcghYhuz/AZ.ORU.Uno+ V$%<=DDEZ[V$%56==nMV$%=>EEF\]V$%ABIIJdeV$%:;BBCVWV$%BCJJKfgU  k#X/W$Xfijjkt0V  	sCCnhV0 F"."4"4"6 
($ }C  D[  }\S8O1P-QTWX^_vXwTx-x  bcgmn~gc&1A*B&Cc&QaJbFc&c  FG @F  G_  @`c&9Q2R.SVYZ`ayZzV{.{  fg LR  So  Lp#f=Y6Z2[^abh  jF  cG  _H  3H  vwv|  ~S  wT3v6K/L+MPSTZ[pTqPr+r  Z[ OU  Vs  Ot3v>[7\3]`cdj  lI  eJ  aK  4K  z{ h'
(  C@@ YX)<SVH'EFTWXXYs   R	AQ $A L $Q 3R	4B&Q L8L5L8"CQ %M	)M*M	-C*Q L2/Q 0R	1L22Q 5L88Q R	M		DQ R		R!R;R<R	RR	z/report_details_BSEc                 	  K   t         d   }	 | j                  r;| j                  r| j                  s#t	        | j                        \  | _        | _        ni| j                  rN| j                  rB	 t        j                  | j                  d       t        j                  | j                  d       nt        ddid      S | j                  rdd	d
d| j                   iiiddddddiddddddiidd| j                  iigiddddiidd| j                  iigigidididdidddddddgiidd idd!idd"idd#id$ig}|j                  |d%&      }g }|2 3 d'{   }|d(   }|d)   }|d*   }|d+   }	|d	   |d,   |d+   |d-   |d(   |d)   |d*   ||	z
  ||z
  ||	z
  |	dk7  r||	z
  |	z  d.z  nd|dk7  r||z
  |z  d.z  nd|	dk7  r||	z
  |	z  d.z  ndd/}
|j                  |
       di | j                  d2k7  rd3| j                  ini iddddddiddddddiidd| j                  iigiddddiidd| j                  iigigidididdidddddddgiidd idd!idd"idd#id$ig}|j                  |d%&      }t        d4       }|2 3 d'{   }|d	   }|d(   }|d)   }|d*   }|d+   }	||	z
  }||z
  }||	z
  }|	dk7  r||	z
  |	z  d.z  nd}|dk7  r||z
  |z  d.z  nd}|	dk7  r||	z
  |	z  d.z  nd}||   d5   j                  |       ||   d6   j                  |       ||   d7   j                  |       ||   d8   j                  |       ||   d9   j                  |       ||   d:   j                  |       # t        $ r t        ddid      cY S w xY w7 96 t        |d01      S 7 6 g }|j                         D ]  \  }}||d5   rt        |d5         t!        |d5         z  nd|d6   rt        |d6         t!        |d6         z  nd|d7   rt        |d7         t!        |d7         z  nd|d8   rt        |d8         t!        |d8         z  nd|d9   rt        |d9         t!        |d9         z  nd|d:   rt        |d:         t!        |d:         z  ndd;}|j                  |        t        |d01      S # t"        $ r%}t        dd<t%        |       id=      cY d'}~S d'}~ww xY ww)>zB
    Optimized function to fetch BSE data for Report Details.
    r.   r!  rQ   r"  r   r#  r$  rn   rT   rq   rl   rr   r   rs   r  rv   rw   r%  r  r}   r&  r'  r(  r~   r  r)  rz   r*  r+  r,  r-  r.  r/  r0  r1  r2  Tr4  NrB  rD  r   r3  r   rC  r$   )rT   r   r3  rC  rB  rD  r   r<  r  r;  r=  r>  r?  r   r-  r6  r   c                       t        t              S r  r8  r   r   rd   r<  zaggregate_bse.<locals>.<lambda>  r:  r   r;  r  r<  r=  r>  r?  r@  r   rV   )r[   r  r   r   rA  r   r9  r   r
   rB  r   r   r   r   rU  rD  r   r^   r   )rI   
collectionr   r  rE  ra   rB  rD  r   r3  rF  rG  rT   r<  r  r;  r=  r>  r?  r`   rH  rI  rc   s                          rd   aggregate_bserN  |  s    
 KJyYW%7%7G<L<L3J7K[K[3\0G 0G$4$4k!!'"4"4jA!!'"2"2J?  +h iwz{{  8q1E1E0F-G"H  "#%*:I)F&1$*,21B\SbDc0d1B\SZSeSeDf0g5.)* -31B\SbDc0d1B\SZScScDd0e5.)*-&)"(#!: y "# +'2YAWYZ@[4\&]!,.> ?!,.> ? +_="-/@!A!
K0Hd  ))()FFI# 0 0c6{%jG .
 "(mK"%l"3KKu: \.3j.@&*Sj-1J->\fjk\k4*3D
2RUX2XqrHLPQ	D3J$+>+DWX^hlm^mEJ4F*3TWZ3Zst!   /  AHASASW\A\L'*<*<=bd  "#%*:I)F&1$*,21B\SbDc0d1B\SZSeSeDf0g5.)* -31B\SbDc0d1B\SZScScDd0e5.)*-&)"(#!: y "# +'2YAWYZ@[4\&]!,.> ?!,.> ? +_="-/@!A!
K0Hd  ))()FF&'@AL# h hcX6{%jG .
 */);&!%(,z(9%WaefWfdZ.?:-MPS-Slm*CG19tczT&9C&?RS#YcghYhuz/AZ.ORU.Uno+ V$%<=DDEZ[V$%56==nMV$%=>EEF\]V$%ABIIJdeV$%:;BBCVWV$%BCJJKfg{  k#X/W$Xfijjkt0V.  	sCCnhV0 F"."4"4"6 
($ }C  D[  }\S8O1P-QTWX^_vXwTx-x  bcgmn~gc&1A*B&Cc&QaJbFc&c  FG @F  G_  @`c&9Q2R.SVYZ`ayZzV{.{  fg LR  So  Lp#f=Y6Z2[^abh  jF  cG  _H  3H  vwv|  ~S  wT3v6K/L+MPSTZ[pTqPr+r  Z[ OU  Vs  Ot3v>[7\3]`cdj  lI  eJ  aK  4K  z{ h'
(  C@@ YX)<SVH'EFTWXXYs   
S#AR2 -A M1 -R2 <S#=BR2 NNND%R2 ?N#N N#C*R2 1N	R2 
S#NR2 NR2 S# N##DR2 1S#2	S ;SS S#S  S#z/report_details_NSE_testc                   K   	 | j                   dk(  rt        | t               d {   S | j                   dk(  rt        | t               d {   S y 7 -7 # t        $ r%}t        ddt        |       id      cY d }~S d }~ww xY wwNr   )rM  rs   rQ   r   rV   r#  )r  overall_data_rdr   calculate_multidurar^   r
   r   rI   rc   s     rd   aggregate_nse_testrT  >       Y<<1(=OPPP<<1,WASTTT  QT YX)<SVH'EFTWXXY`   B
#A AA B
#A AA B
A A 	B"B<B=B
BB
z/report_details_BSE_testc                   K   	 | j                   dk(  rt        | t               d {   S | j                   dk(  rt        | t               d {   S y 7 -7 # t        $ r%}t        ddt        |       id      cY d }~S d }~ww xY wwrP  )r  rQ  r   rR  r^   r
   r   rS  s     rd   rT  rT  H  rU  rV  z/report_countsc                     K   t         j                  i ddi      j                  d        d {   } | g k7  r| S ddd7 w)Nr   r   r   zNo Records FoundrL   )r   rP   )queryStore_collr\   r]   )qUpdatess    rd   count_reportsr[  R  sJ     $))"uaj9AAANNH2~-cCC Os   ,A?Az/get_queries/{report_type})response_modelr  c                    K   i }| r| |d<   t         j                  |      j                  d       d {   }|st        dd      |D ],  }|j	                  dd       |d<   |j	                  d	d
      |d	<   . |S 7 Fw)Nr  r$   r   rL   zNo queries found.rO   
query_name	queryNamerw  r   )queryFormulas_collectionr\   r]   r   pop)r  query_filterqueriesr0  s       rd   get_queriesrd  ]  s      L&1]# -11,?GGsGSSG4GHH  <"YY|T:k$yy;m< N Ts   2A=A;AA=z/get_query/{query_name}r^  c                    K   t         j                  d| i       d {   }|st        dd|  d      |j                  dd       |d<   |j                  dd       |d<   |S 7 Cw)Nr^  rL   Query '' not found.rO   r_  rw  )r`  r   r   ra  )r^  r0  s     rd   	get_queryrh  q  sp      +33\:4NOOEgj\4VWW <6E+ 99]D9E-L Ps   A#A!AA#z/save_queryc                 b  K   | j                   }| j                  }| j                  }| j                  D cg c]  }|j	                          }}||||d}t
        j                  d|id|id       d {   }|j                  rdd| diS |j                  d	kD  rdd| d
iS ddiS c c}w 7 8w)N)r^  r  rw  payloadr^  rv  Trx  r   rf  z' created successfully.r   z' updated successfully.z+No changes were made to the existing query.)	r_  r  rw  rj  rY  r`  r|  upserted_idmodified_count)rI   r^  r  rw  r  rj  	query_docr`   s           rd   
save_queryrn    s     ""J%%K%%K'.7ttyy{7G7 !""	I ,66	z"	 7  F WZL0GHII				"WZL0GHIIHII- 8s   3B/B((B/4B-59B/z/delete_queryc                    K   t         j                  d| i       d {   }|j                  dkD  rdd|  diS t        dd|  d      7 ,w)	Nr^  r   r   rf  ' deleted successfully.rL   rg  rO   )r`  r   r   r   )r^  r`   s     rd   delete_queryrq    s]     +66j7QRRFaWZL0GHIIgj\4VWW Ss   AA
-Az	/sectionssectionc                 t  K   	 t        j                  | j                        }t
        j                  d| j                  i       d {   }|ry|D ]B  t        fd|d   D        d       }|r|j                         /|d   j                         D t
        j                  d|d   id| j                  |d   d	i       d
ddS | j                  | j                  || j                  | j                  d}t
        j                  |       dddS # t         j                  $ r t	        dd      w xY w7 w)Nr   zInvalid JSON in 'Queries' fieldrO   sectionNamec              3   :   K   | ]  }|d    d    k(  s|  yw)r_  Nr   )r  qr0  s     rd   r  z(add_or_update_section.<locals>.<genexpr>  s"     `q1[>US^M_;_`s   Queriesr   rv  )rw  rw  zSection updated successfullyr   r  )rt  rw  rw  	queryTyper  zSection created successfully)jsonloadsrw  JSONDecodeErrorr   sections_collectionr   rt  nextr
  r   r|  rw  rx  r  r   )rr  rc  existing_sectionexisting_querynew_sectionr0  s        @rd   add_or_update_sectionr    sS    W**W__-
 199='J]J]:^__ 
	:E!`,Y7`N %%e, !+2259
	: 	&&$U+,W%8%8EUV_E`ab	
 :SII #..".. **"..
 	&&{39SIIG  W4UVVW `s(   D8D $D8D6	C	D8!D33D8z/get_sectionsc                     K   t         j                  i ddi      j                  d        d {   } | st        dd      | rdd| d	} | S 7 w)
Nr   r   r   rL   zSection not foundrO   zSections Fetched Successfullyr   )r   r	   r   )r|  r\   r]   r   )rr  s    rd   get_sectionr    s[     ',,R%<DDDDQQG4GHH =V]^N Rs   ,AAAz/delete_sectionsection_namec                    K   t         j                  d| i       d {   }|st        dd|  d      t         j                  d| i       d {   }|j                  dk(  rdd|  diS t        d	d
      7 Z7 *w)Nrt  rL   z	Section 'rg  rO   rs   r   rp  rV   zFailed to delete the section.)r|  r   r   r   r   )r  r~  r`   s      rd   delete_sectionr    s      199=,:WXXi~\4Z[[ '11=,2OPPFq Y|n4KLMM4STT Y
 Qs!   A<A81A<A:)A<:A<z/fetch-date-range.	startdateenddater  c                   K   |dk(  r	t         d   nt         d   }	 t        j                  | d      }t        j                  |d      }|j                  d      }|j                  d      }dddd	iiddd
iididddidddddddiddddddiddgi|giddddiddgi|gigidididdddiiidd d!iig}|j	                  |      j                  d"#       d"{   }	|	D ]'  }
|
j                  di       }i }i }i }|j                         D ]P  \  }}t        |t              r;d$|v r7d%|v r3|j                  d&      d!   }||vr|d%   |d%   d'||<   E|d%   ||   d(<   QR |j                         D ]0  \  }}|d(   |d)   z
  }|d)   d!k7  r|d*z  |d)   z  }nd!}|||<   |||<   2 ||
d+<   ||
d,<   |r%t        |j                               t        |      z  nd!}||
d-<   |r%t        |j                               t        |      z  nd!}||
d.<   * t        |	d/0      S 7 ?# t        $ r"}t        d1d2t!        |      i3      cY d"}~S d"}~ww xY ww)4zCTrend Analysis Api to get range data and calculate to privious yearr   r-   r.   r!  z%m-%drn   z$notrq   %z-(GS|TB))r  rT   rr   z	$toString$_idrs   r  rv   rw   r  r  r}   z$substrz	$$price.k   r~   r  )r   rT   r  r	  r   ry   
$addFieldsr   $arrayToObjectr{   ry   r   Nr   rC  r   ru   )old_date_closelatest_date_closer  r  r$   rs_chgpr_chg
rs_chg_avg
pr_chg_avgr   r-  rV   r   r   )r[   r   r9  r  r   r]   r   rU  rX  rY  splitrD  rd  r   r
   r^   r   )r  r  r  rM  r   r   start_day_monthend_day_monthr   r`   r  r   yearly_changesrs_chg_dictpr_chg_dictr_  r`  r  	year_datar  r  
avg_rs_chg
avg_pr_chgrc   s                           rd   fetch_data_testr    sZ     %)EMKr+JjJ&&y*=
$$Wj9$--g6 ))'2
 &,xo%>%*'=> '0%&&'()! 0)& #* &%+yK;UWXZ[:\.]_n-o$p%+yK;UWXZ[:\.]_l-m$n)"%$(0 (*< %qK*
X "++H5==T=JJ .	,DXXh+FNKK )/ $*j$/Fj4HWXbMb#>>#.q1D>1 /9.A1;G1D0t, EOwDWt,-@A !& $2#7#7#9 +i"#67)DT:UU-.!3$slY7G-HHFF$*D!$*D!+ )DN(DN JU[//12S5EEZ[J!+D JU[//12S5EEZ[J!+D].	,b F<<g Kj  JiQ5HIIJsH   IB<H HD=H IH 	I"H?9I:I?IIz/search-symbol/{prefix}prefixc                 `  K   t         d   }t         d   }dt        dt        fd} || d      } || d      }|j                  |      j                  d	      }|j                  |      j                  d	      }t	        j
                  ||       d{   \  }}	||	z   }
t        |
d
      S 7 w)z'This Function Gets All NSE, BSE Symbolsr.   r-   r  r   c                 R    ddd|  ddiidddd	idd
iddiddididdd|idddigS )Nrn   rT   rl   ro   rp   $grouprt   z$firstz$security_namez$instrumentz$instrument_tokenz$exchange_token)r   r  r  r   r	  rr   r  z$literalrs   )rT   r   r   r	  r   )r  r   s     rd   create_pipelinez#Symbol_Get.<locals>.create_pipelineh  s    q\s"KLMyHFV;Whpr  hA  X`  bu  Wv  KS  Uf  Jg  h  i$!+X 6()&'	
 	
r   r   r   Nr   r   r-  )r[   r   r   r]   r   r   r
   )r  collection_bsecollection_nser  nse_pipelinebse_pipelinense_taskbse_taskr  r  r`   s              rd   
Symbol_Getr  a  s      _N_N
 
s 
 #651L"651L ''5==T=JH''5==T=JH%,^^Hh%GGK ;&F C88  Hs   BB.B,B.z/daily-table/searchc                   K   |dk(  r
t         d   }n	t         d   }dd| iidddd	id
iddidddddddddiddddgiddddgidddddgidgidgidgid id!d"d#d$d%did&iddd'd(d)d*d+d,d-d.d/iid0ig}|j                  |d12      j                  d3       d{   }g }|D ]n  }|d   }|d4   }t        d5       }	|j	                         D ]&  \  }
} |
j
                  d6      \  }}}||	|   |   |<   ( |j                  |t        |	      d7       p t        d8       }g }|D ]  }|j                  d      }|j                  d4i       }|j	                         D ]  \  }}|j	                         D ]g  \  }}|j	                         D ]O  \  }}|j                  d9      |d9   dkD  r||   |   d:xx   dz  cc<   4|d9   dk  s=||   |   d;xx   dz  cc<   Q i   |j	                         D ]Z  \  }}|j	                         D ]B  \  }}|d:   }|d;   }||z   }|dkD  r	||z  |d<<   nd=|d<<   ||kD  rd>|d?<   3||k  rd@|d?<   >dA|d?<   D \ |j	                         D ci c]  \  }}|t        |       }}}|D ]:  }|j                  d      }|j                  d4i       }|j                  |||dB       < t        |dCD      S 7 )c c}}w w)Ez
        Contains Data for Two Sections:
        1) Daily Section
        2) Day Month Section

        Parameters: [search] [type]
    r   r-   r.   rn   rT   rr   rs   rv   rw   )rT   date_pricesrz   z$date_pricesr  z$date_prices.kz$date_prices.v.openz$date_prices.v.highz$date_prices.v.lowz$date_prices.v.closez$date_prices.v.prev_close)rC  rB  rD  r   r3  )r   price_detailsz	$subtractz$price_details.closez$price_details.prev_closez$condz$ner   r  z$divider$   N)zprice_details.rp_changezprice_details.pr_changer  rt   z$pushz$datez$price_details)r   rc  r  r  r  z$dates
date_entryz$$date_entry.datez$$date_entry.price_details)kvr  )r   rT   rc  Tr4  r   rc  c                       t        t              S r  r   rY  r   r   rd   r<  zdaily_table.<locals>.<lambda>  s    K,= r   ru   )rT   rc  c                      t        d       S )Nc                      dddS )Nr   )increasedecreaser   r   r   rd   r<  z/daily_table.<locals>.<lambda>.<locals>.<lambda>	  s    1Z[>\ r   r   r   r   rd   r<  zdaily_table.<locals>.<lambda>	  s    +6\*] r   	pr_changer  r  inc_prob        Increaser	   DecreaseNeutral)rT   rc  DayMonthTabler   r-  )
r[   r   r]   r   rU  r  r   rY  r   r
   )r  r  rM  r   r`   formatted_resultr  rT   rc  grouped_datesr   r  r  monthdayday_month_tablefinal_resultmonthsdaysr   countsr  r  r  s                           rd   daily_tabler    sS     u}_
_
 &	
 $i 	
 ~	
 (11/3"="		
   "8:U!V, "=q!AC'$-*58NPk7l(n(C0&!" !$*
 ,	
4   ')9
	
  $%-".%8%A#!	'	
CSHj ''t'DLLTXLYYF hW $$=>#(;;= 	<D-)tzz#D%.;M$&s+	< 	-(!
 	$ ""]^OL ! I(#"% "KKM 
	ILD&%||~ It!% IICxx,8,q0+E237
CqHC!+.2+E237
CqHCII
	II$ ',,. -t::< 	-KCj)Hj)Hx'E qy%-%5z"%(z" ("#-x H$#-x #,x #	--* =L<Q<Q<ST[UDud4j(TOT ! 	(#"% 	,
 		 #>>[ Z~ Us3   BKKDK$KBKK5AKKz/year-month-table/c                 "  K   |dk(  r
t         d   }n	t         d   }dd| iidddddig}|j                  |d	
      j                  d       d{   }|st        ddid      S |d   }|j	                  di       }t        d       }t        dd      D ci c]  }|ddd
 }	}d}
|j                         D ]  \  }}t        j                  |d      }|j                  }|j                  }||vri ||<   |||   vr|d   |d   |d   |
|d   d||   |<   nPt        ||   |   d   |d         ||   |   d<   t        ||   |   d   |d         ||   |   d<   |d   ||   |   d<   |d   }
 |j                         D ]  \  }}|j                         D ]{  \  }}|d   }|d   }
|
|z
  }|dk7  r|dz  |z  nd}||   |   j                  |||d        |dkD  r|	|   d!xx   dz  cc<   n|dk  r|	|   d"xx   dz  cc<   ||   |   d= ||   |   d= }  t        |d#         |d   ||	j                         D ci c]1  \  }}||d!   |d"   |d!   |d"   z   dkD  r|d!   |d!   |d"   z   z  ndd$3 c}}d%}t        |d&      S 7 2c c}w c c}}w w)'z
        Contains Data for Two Sections:
        1) Overall Probability Section
        2) Year Month Section

        Parameters: [search] [type]
    r   r-   r.   rn   rT   rr   rs   r)  Tr4  Nr   r   zNo data foundrL   r-  r   r   c                       t        t              S r  r  r   r   rd   r<  z&year_month_table_new.<locals>.<lambda>l	  s    +d*; r      )	Increased	Decreasedr  r7  rC  rB  rD  r   )rC  rB  rD  first_date_closelast_date_closer  r  r$   )	rs_changer  rC  r  r  r   )r  r  Inc_Prob)r   rT   r   Probabilityr   )r[   r   r]   r
   r   r   r  rU  r   r9  r  r  rR  r   r
  r   )r  r  rM  r   r`   r   r   year_month_datar  probability
last_closer_  day_datar   r  r  rd  first_closer  r  countresponse_datas                         rd   year_month_table_newr  ?	  s     u}_
_

 &	
 	
H  ''t'DLLTXLYYFWo$>CPP !9DXXh#F "";<OHMaQSUu5::UKUJ$lln '(  :6yy

 &$&OD!-- ( ($.#+G#4,OD!%( 47t7LU7STZ7[]efl]m3nOD!%(025od6KE6RSX6Y[cdi[j2kOD!%(/>Fw>OOD!%():; g&
3'8 (--/ @f#\\^ 	@ME6 !34K 12J"[0I;F!;KS;6QRI D!%(//&&#1  1}E";/14/QE";/14/  %e,-?@%e,->?+	@@4 4;x.! !, 1 1 3
 u ";/";/_dep_qty  {F  uG  `G  KL  _LE+.%2Du[GY2YZ  RS 
	M 3??a Z Vz
s2   AJJAJJ#FJ86J	.JJz/stock-information/c                 X  K   | r|st        ddid      S d| i}	 |dk(  r|  d}t        d   }n|  d	}t        d
   }|j                  |       d {   }|sddiS t        j                  |      }|j
                  }i d|j                  dd      dt        |j                  dd            t        |j                  dd            z
  t        |j                  dd            z  dz  dt        |j                  dd            t        |j                  dd            z
  dt        |j                  dd            d|j                  dd      dt        |j                  dd            d|j                  dd      dt        |j                  dd            d|j                  dd      dt        t        |j                  dd            d z  d!      d"t        |j                  d"d            d#t        |j                  d$d            d%t        |j                  d&d            d't        |j                  d(d            d)t        |j                  d*d            d+|j                  d+d,      d-|j                  dd      |j                  d.d      |j                  d/d      |j                  d0d      |j                  d1d      d2}|j                  d34      }	|j                  d54      }
|j                  d64      }|j                  d74      }|j                  d84      }|j                  d94      }|j                  d:4      }|j                  d;4      }|j                  d<4      }i d=|
j                  s|	d>   j                         nd d?|
j                  s|	d@   j                         nd dA|
j                  s|
d>   j                         nd dB|
j                  s|
d@   j                         nd dC|j                  s|d>   j                         nd dD|j                  s|d@   j                         nd dE|j                  s|d>   j                         nd dF|j                  s|d@   j                         nd dG|j                  s|d>   j                         nd dH|j                  s|d@   j                         nd dI|j                  s|d>   j                         nd dJ|j                  s|d@   j                         nd dK|j                  s|d>   j                         nd dL|j                  s|d@   j                         nd dM|j                  s|d>   j                         nd dN|j                  s|d@   j                         nd dO|j                  s|d>   j                         nd dP|j                  s|d@   j                         nd i}t        j                         }|t        dQR      z
  }|j                  dSi       }|j!                         dTk\  r#|t        dQR      z  }|j!                         dTk\  r#t#        |dT      dU   }t#        |dV      dU   }t#        |dW      dU   }t#        |dX      dU   }t#        |dY      dU   }t#        |dZ      dU   }t#        |d[      dU   }t#        |d\      dU   }t#        |d]      dU   }t%        ||       d {   }t%        ||       d {   } t%        ||       d {   }!t%        ||       d {   }"t%        ||       d {   }#t%        ||       d {   }$t%        ||       d {   }%t%        ||       d {   }&t%        ||       d {   }'t%        ||       d {   }(|r| r|| z
  nd })|r|!r||!z
  nd }*|r|"r||"z
  nd }+|r|#r||#z
  nd },|r|$r||$z
  nd }-|r|%r||%z
  nd }.|r|&r||&z
  nd }/|r|'r||'z
  nd }0|r|(r||(z
  nd }1| r
|)r|)| z  dz  nd }2|!r
|*r|*|!z  dz  nd }3|"r
|+r|+|"z  dz  nd }4|#r
|,r|,|#z  dz  nd }5|$r
|-r|-|$z  dz  nd }6|%r
|.r|.|%z  dz  nd }7|&r
|/r|/|&z  dz  nd }8|'r
|0r|0|'z  dz  nd }9|(r
|1r|1|(z  dz  nd }:|j'                  d^      |d_|j'                  d^      | |)|2d`|j'                  d^      |!|*|3d`|j'                  d^      |"|+|4d`|j'                  d^      |#|,|5d`|j'                  d^      |$|-|6d`|j'                  d^      |%|.|7d`|j'                  d^      |&|/|8d`|j'                  d^      |'|0|9d`|j'                  d^      |(|1|:d`da
};|||;|db}t        |dc      S 7 	
7 7 s7 b7 Q7 @7 /7 7 7 7 # t(        $ r"}<t        dt+        |<      idd      cY d }<~<S d }<~<ww xY ww)eNr   z/Search query and type (NSE or BSE) are requiredr   r-  rT   r   z.NSr-   z.BOr.   r+  longName	shortName0dchangecurrentPricer  previousCloser$   rchangeprevious_closerw  longBusinessSummaryzDescription not available.rC  sectorweek_52_change52WeekChangeindustry
market_cap	marketCapi r  betafull_time_employeesfullTimeEmployees
book_value	bookValueprice_to_bookpriceToBooklast_dividend_valuelastDividendValuewebsitez	Not Foundcurrent_pricedayHighdayLowfiftyTwoWeekHighfiftyTwoWeekLow)day_highday_lowweek_52_highweek_52_low1d)period5d1mo3mo6mo1y2y5y10yr  Highr  Lowweek_high_priceweek_low_pricemonth_high_pricemonth_low_pricequarter_high_pricequarter_low_pricesix_month_high_pricesix_month_low_priceyear_high_priceyear_low_pricetwo_year_high_pricetwo_year_low_pricefive_year_high_pricefive_year_low_priceten_year_high_priceten_year_low_pricers   r  r   r  r   ?   ~      i  i  i  i  i	  r7  )r   r  )r   r  r  r  )
	yesterdayone_Weekthree_Months
six_Monthsone_Yeartwo_Year
three_Year	four_Year	five_Yearten_Year)ticker
stock_info	hist_info
price_infor   rV   )r
   r[   r   yfTickerinfor   rQ  r  historyemptyrR  r   r   r   r   weekdayget_trading_daysget_price_for_dater  r^   r   )=r  r  r0  r(  st_collectionr`   stockr.  r)  r  	week_data
month_dataquarter_datasix_month_datar  two_year_datafive_year_dataten_year_datar+  r   r  r   date_1wdate_3mdate_6mdate_1ydate_2ydate_3ydate_4ydate_5ydate_10yprice_yesterdayprice_1wprice_3mprice_6mprice_1yprice_2yprice_3yprice_4yprice_5y	price_10yprice_chg_1wprice_chg_3mprice_chg_6mprice_chg_1yprice_chg_2yprice_chg_3yprice_chg_4yprice_chg_5yprice_chg_10y
per_chg_1w
per_chg_3m
per_chg_6m
per_chg_1y
per_chg_2y
per_chg_3y
per_chg_4y
per_chg_5yper_chg_10yr*  rc   s=                                                                rd   StockInformationrb  m
  s
     W._$`nqrrvEiH5=xs^F{OMxs^F{OM$--e44/00 		&!zz
+s3
5.#!>?%Q`beHfBggkpquqyqy  {J  LO  rP  lQ  Q  UX  X
 dhh~s;<uTXXo_bEc?dd
 eDHH_c$BC	

 488$9;WX
 E$((63/0
 dhhx-
 uTXXnc%BC
 S1
 %dhh{C&@ AH LaP
 E$((63/0
 "52Es)K#L
 %c :;
 U488M3#?@
 "52Es)K#L
  txx	;7!
" TXXnc:#
$ C0xx#. HH%7=88$5s;+

0 ===-MMM.	]]%]0
}}E}2e4MMM.	T2d3U3%
y&)--/D%
 IOOx**,%
 y	& 1 5 5 7TX%
 IOOi.224QU%
 AQAQF!3!7!7!9W[%
 z?O?O
5 1 5 5 7UY%
 !\EWEW<#7#;#;#=]a%
  <CUCU,u"5"9"9";[_%
$ #I[I[^F%;%?%?%Aae%%
& "|GYGYN5$9$=$=$?_c'%
, y	& 1 5 5 7TX-%
. Y__y/335RV/%
4 "yM&$9$=$=$?\`5%
6 !Y__=#7#;#;#=Z^7%
< #^F%;%?%?%A^b=%
> "yN5$9$=$=$?\`?%
D "yM&$9$=$=$?\`E%
F !Y__=#7#;#;#=Z^G%

N  I1--	Hb) !Q&**I !Q& #9a04"9b1"5"9c226"9c226"9e4R8"9e4R8"9e4R8"9e4R8#Iv6r: !369 EE+FG<<+FG<<+FG<<+FG<<+FG<<+FG<<+FG<<+FG<<,VX>>	 6E1W[5D1W[5D1W[5D1W[5D1W[5D1W[5D1W[5D1W[7F9)3Z^ 9A\lX-3W[
8@\lX-3W[
8@\lX-3W[
8@\lX-3W[
8@\lX-3W[
8@\lX-3W[
8@\lX-3W[
8@\lX-3W[
;D}y036\` #,"4"4Z"@?[!(!1!1*!=\ht~%,%5%5j%AH`l  yC  D#*#3#3J#?(^j  wA  B!(!1!1*!=\ht~!(!1!1*!=\ht~#*#3#3J#?(^j  wA  B")"2"2:">]iu  A")"2"2:">]iu  A!)!2!2:!>^k  xC  D
	 $"%	
 F<<{ 5N F<<<<<<<<>^  HWc!f$53GGHs  f*6e< e	e< f*W'e< Be< ee< .e!/e< e$e< e'e< *e*+e< >e-?e< e0e< &e3'e< :e6;e< e9Ge< f*e< e< !e< $e< 'e< *e< -e< 0e< 3e< 6e< 9e< <	f'f"f'f*"f''f*c                 z  K   	 t        j                  | t        t        g      }|j	                  d      }|t        t        j                  d      t        j                  d|i       d {   }|t        t        j                  d      |S 7 ## t        $ r t        t        j                  d      w xY wwN)
algorithmsr   zInvalid tokenrO   usernamezUser not foundr   decode
SECRET_KEY	ALGORITHMr   r   r	   HTTP_401_UNAUTHORIZEDAuth_collectionr   r   rC   rj  rf  r3   s       rd   get_user_from_token_prn  #       
^**UJI;GE*F,H,HQ`aa$--z8.DEE<F,H,HQabb F  ^(D(D_]]^/   B;A)B -B."B B;B %B88B;z	/holdingsc                  &  K   	 t         j                  i ddi      j                  d        d {   } | D cg c]  }t        |       } }t	        d| d      S 7 +c c}w # t
        $ r#}t	        dt        |      dd	
      cY d }~S d }~ww xY ww)Nr   r   r   zHoldings fetched successfullyr   r+   rz  z)An error occurred while fetching holdingsr  rV   r-  )holdings_collectionr\   r]   convert_datetime_pr
   r^   r   )holdings_listr  rc   s      rd   get_holdingsrv  0  s     	@166rE1:FNNVZN[[ ERR+G4RR0O[h$ijj \ S  @0[fijkfl$m{~@sU   B+A" AA" A
A" BA" A" "	B+B	BB	BBc                 ,    | rt        | d         | d<   | S )Nr   r  )documents    rd   serialize_documentry  @  s    huo.Or   z/get-orderszStart date in YYYY-MM-DD format)rw  zEnd date in YYYY-MM-DD formatr   r   c                 |  K   	 | r|s't        j                         }|j                  d      x} }t        j                  | d      }t        j                  |d      }t	        |t        d      z          t        j                  d||t        d      z   di      dk(  r]t        j                  dd|ii      j                  dt              j                  d      j                  d        d {   }|r|d   d   }t        j                  d||t        d      z   di      dk(  rjt        j                  dd|t        d      z   ii      j                  dt              j                  d      j                  d        d {   }|r|d   d   }t        j                  d||t        d      z   di      j                  d        d {   }|D cg c]  }t        |       }	}t        d	|	d
      S 7 7 v7 0c c}w # t         $ r}
t#        dd|
       d }
~
wt$        $ r}t#        dd|       d }~ww xY ww)Nr7  rs   r  r   )r}   $ltr   z$gtr{  zOrders fetched successfullyrr  rz  rV   Database error: rO   r   r  )r   nowr  r9  r   r   orders_collectioncount_documentsr\   sortr   limitr]   r   serialize_order_or
   r   r   r   )r   r   r  start_date_objend_date_obj
next_startprev_endr`   orderserialized_ordersrc   ves               rd   
get_ordersr  E  s    
)R I$-$6$6z$BBJ "**:zB((:>nya001 ,,j>Zhktz{k|Z|:}-~  DE  E055zE>CZ6[\aablnwx~~  @A   B   J   J  KO   P  PJ!+Az!: ,,j<XdgpvwgxXx:y-z{  @A  A.33Z%XaghXiIiAj4klqqr|  I  J  P  P  QR  S  [  [  \`  a  aH'{:6(--*')*;;/ 
 wt} DJJ%.u5JJ0MYj$kll+ P a K  L6Fqc4JKK R6KB44PQQRs   H<C'G? +G3,BG? ?G6 AG? G8G? G:"G? 2H<3G? 6G? 8G? :G? ?	H9HH9$H44H99H<z/add-orders/c                 d  K   | D cg c]  }i |dt        j                         i }}	 t        j                  |       d {   }t	        |       d {    d|j
                  D cg c]  }t        |       c}dS c c}w 7 B7 1c c}w # t        $ r}t        dd|       d }~ww xY ww)Nr   zOrders added successfully)r   inserted_idsrV   r|  rO   )	r   utcnowr~  insert_manyplace_orderr  r   r   r   )r+   r  orders_datar`   r   rc   s         rd   
add_ordersr  u  s     IOP;e;Z):;PKPL(44[AA+&&& 7]c]p]pHqVYSHqrr Q B& Ir L6Fqc4JKKLsh   B0!BB0B BB BB *B
<B  B0B B 
B 	B-B((B--B0z/unit-orderr  c                   K   	 | j                         }t        j                         |d<   t        j	                  |       d {   }| j
                  }| j                  }| j                  }| j                  }| j                  j                         }| j                  }t        j                         j                  d      }	t        |      t        |      z  }
||||
|	d}t        j                  d|i       d {   }|dk(  r|r|d   d   |gz   }t!        d |D              }t!        d	 |D              }||z
  }t!        d
 |D              }|dkD  r||z  n
|d   d   d   }|dk  rt#        dd      |dkD  r||z  nd}d|	||t%        |d      t%        |d      ddi}t        j'                  d|i|       d {    nC|||||dd|	|	|g|t%        |d      t%        |
d      ddd
}t        j	                  |       d {    n|dk(  r|r|d   d   d   |k\  r|d   d   |gz   }|d   d   d   |z
  }|d   d   d   |
z
  }|dkD  r||z  nd}d|	||t%        |d      t%        |d      ddi}t        j'                  d|i|       d {    |dk(  rn|dk(  rit        j                  d|i       d {   }t(        j	                  |       d {    t        j+                  d|i       d {    nt#        dd      t-        |j.                        |d<   |S 7 7 )7 j7 %7 7 v7 [7 ># t0        $ r}t#        dt-        |            d }~ww xY ww) Nr   z%Y-%m-%dT%H:%M:%S)r   r  r~  invested_amountexecuted_atr   BUYr/   r  c              3   f   K   | ])  }|d    j                         dk(  st        |d          + ywr   r  r  NrY   rP  r  r  s     rd   r  zunit_order.<locals>.<genexpr>  s2     (~4^bck^l^r^r^tx}^}T*-=)>(~   11c              3   f   K   | ])  }|d    j                         dk(  st        |d          + ywr   SELLr  Nr  r  s     rd   r  zunit_order.<locals>.<genexpr>  s8       *AD_cdl_m_s_s_uy_#d:.>*?  *Ar  c              3   f   K   | ])  }|d    j                         dk(  st        |d          + yw)r   r  r  N)rY   rQ  r  s     rd   r  zunit_order.<locals>.<genexpr>  sA       %Dcghpcqcwcwcy  ~C  dCU40A+B%C  %Dr  r   r  total_avg_pricer   zInvalid quantity calculationrO   r  rv  r  )total_quantityr  total_invested)last_updatedzholdings.summaryzholdings.totalTradeIQinfinite)r  r  )
r   rT   r   initial_avg_priceinitial_buy_qtybrokerallocated_balance
created_atr  r/   r  r  r  zInsufficient holdings to sell.r   rV   )rY  r   r  r~  r   r   amountrT   r}  r   rY   r   r  rQ  rs  r   rD  r   r  r|  realized_collectionr   r   inserted_idr^   )r  
order_data	unitorderr   ltprT   r  r   r   r   r  new_summary_entryexisting_entryupdated_summarytotal_buy_quantitytotal_sell_quantityr  r  r  updated_holding_entrynew_holding_entryrealized_datarc   s                          rd   
unit_orderr    s*    s<ZZ\
!)!2
:+66zBB	 11ll99##%>>OO%../BC	/E#J6  .$
  3;;=OQa<bccU?"0"<Y"GK\J]"]%((~?(~%~"&)  *AO  *A  'A#!36I!I "%  %DP_  %D  "D HVXYGY>N#B_mnx_y  {B  `C  DU  `V "A%'C@^__GUXYGY>N#B_b (1,;.</4_a/H.3NA.F+
)% *44')9:<Q  
 )9$ (),'/')3"+$-$5#6.6/4S!}.3OQ.G"!%!& *445FGGGv."<W"EFV"W[c"c"0"<Y"GK\J]"]!/
!;G!DEU!VYa!a!/
!;G!DEU!VYh!hGUXYGY>N#B_b (1,;.</4_a/H.3NA.F+
)% *44')9:<Q  
 "Q&?a+?*=*F*FHZ\lGm*n$nM-88GGG-88:LN^9_```#<\]]	 5 56
5] C& dD. H* %oG`  <CF;;<s   M?L4 L B6L4 :L#;CL4 <L&=AL4 L)B	L4 L,(L4 7L.8L4 L0L4 3L24+L4 M L4 #L4 &L4 )L4 ,L4 .L4 0L4 2L4 4	M=MMMz/realized-reportc                  x  K   	 t         j                  i ddi      j                  d        d {   } g }| D ]  }|j                  di       j                  dg       }t	        d |D              }t	        d |D              }|dkD  rt        ||z  d      nd}t	        d	 |D              }t	        d
 |D              }|dkD  rt        ||z  d      nd}	||z
  }
||||||	t        |
d      d|d   d<   |j                  |        t        d|d      S 7 # t        $ r}t        dt        |            d }~ww xY ww)Nr   r   r/   r  c              3   8   K   | ]  }|d    dk(  s|d     ywr  r   r  ra   s     rd   r  z"realized_report.<locals>.<genexpr>i  s      WcHQV@V#j/W   
c              3   D   K   | ]  }|d    dk(  s|d   |d   z    yw)r   r  r~  r  Nr   r  s     rd   r  z"realized_report.<locals>.<genexpr>j  s-     ocX[\dXeinXns;/#j/Ao     r  r  c              3   8   K   | ]  }|d    dk(  s|d     ywr  r   r  s     rd   r  z"realized_report.<locals>.<genexpr>n  s      YsXRXAX3z?Yr  c              3   D   K   | ]  }|d    dk(  s|d   |d   z    yw)r   r  r~  r  Nr   r  s     rd   r  z"realized_report.<locals>.<genexpr>o  s-     qsY\]eYfjpYpK 03z? Bqr  )buy_qtybuy_investedtotal_avg_buysell_qtysell_investedtotal_avg_sellpnl_overallrealizedz$Realized report fetched successfully)r   entriesrz  rV   rO   )r  r\   r]   r   rD  r  r   r
   r^   r   r   )r  updated_entriesentryr  r  r  r  r  r  r  r  rc   s               rd   realized_reportr  _  sa    #<+00eQZ@HHNN 	*Eii
B/33IrBG WWWWGoWooL@G!E,"8!<QTM YgYYHqgqqMCKa<U=8#;Q?UXN (,6K # ,!.$!."0$[!4-E*j) ""5)7	*: 0Vcr$sttA OB  <CF;;<s9   D:*D DC!D D:D 	D7D22D77D:z/get-reportreqc                 H  K   	 t        j                  | j                  d      }t        j                  | j                  d      }||kD  rt	        dd      ddddd	}d
i i}| j
                  dk(  rt        |j                               }n| j
                  g}t        j                  i        d {   }| j                  |k\  rt	        dd      t        j                         }| j                  rG| j                  t        j                  k(  rdnd}|j!                  | j                  j"                  |      }|D ]#  }	|j%                  |	      }
|
st	        dd      t        j                         j'                  t)        | j                        t)        | j*                        z        j-                  | j*                        j/                  | j*                         d {   }|st	        dd      g }i }i }g |d<   |D ]  }ddd|d    iiiddddddidddid d!|
 |d"   gid#d$id%d&d'd(|gid)d(|gigid*iiig}t0        j3                  |      j/                  d        d {   }|
|d   |d"   |d+   d,}|D ]O  }|j%                  dg       D ]8  }|d-   j5                  d      }|d.   }|||<   |j%                  |d      |z   ||<   : Q |d   j7                  |        |j7                  |       | j*                  | j                  |d/}t9        |
|      }|j7                  |       |t;        |      d0||
<   | j
                  dk(  s|d1   d   |d
   |
<   & | j
                  dk(  r#t=        |t?        j                                      | j
                  dk7  rtA        |      dk(  rtC        |
   2      S tC        |2      S 7 7 7 j# tD        $ r}t	        dd3tG        |             d }~wtH        $ r}t	        d4d5tG        |             d }~ww xY ww6Nr7  r   r  rO   rC  rB  rD  r   rs   r  r     r  r   rL   r  rs   r   r  r   (No data found in reportUpload collectionr#  rn   rT   rq   rr   r   r  r  rv   rw   r  r  r  r  r  r}  r  r  r  r  r}   r  r~   r  r~  r  rT   r}  r~  r   r  )r   r  r  )
paginationr   r  rz  r  rV   r   %r   r9  r   r   r   r  r9  rS  reportUpload_collectionr  r  r\   
sort_field
sort_order	SortOrderascr  valuer   skiprP  r   r  r]   r   r   r  r   process_summary_calculationsconvert_objectid_ohlcprocess_metricsrV  r   r
   r   r   r^   r  r  r  r  r  r  r  r0  r  r  r  r  r  r  data_symr  r   r   r#  r`   r`  r_  r  pagination_infor  rc   s                             rd   r  r        NT$$S^^Z@""3<<<fC8hii$EgF+R0 ;;!_1134II 4CCBGG ::$C8WXX (,,. >>!nn	=2JJJs~~33Z@E " ^	cH)--h7K#<fgg "9!=!=!?c#**oc#**o56szz"

+,L
  #<fggKLH&(H]#  , 3<8H8M7N*PQR %$*2BI1N.95>4P0;6D[M4R4?4F>2A./*-&*" '6$*)/2H(1S(T)/2H&1Q(R-&)"#(#" @ !3 < <X F N NVZ N [[ ()(3&u-!,[!9	 & WF&,jj2&> W
#-f#5#>#>z#J *+= >05H-1=1A1A(A1NQV1VX.WW '..{;g3<j x( *****O 9lSM}- .-k:,OK( {{aANA_`aAb 01+>}^	cB ;;!OVL4E4E4G-HI ;;!I! 3(DEEO44q H,,` \h  V6KCPQF84TUU T6I#a&4RSST   P"B+O /O
0D/O O BO &O'C&O A.O =P">O 	P"
O O O 	PO55PPPP"z/get-report1c                 H  K   	 t        j                  | j                  d      }t        j                  | j                  d      }||kD  rt	        dd      ddddd	}d
i i}| j
                  dk(  rt        |j                               }n| j
                  g}t        j                  i        d {   }| j                  |k\  rt	        dd      t        j                         }| j                  rG| j                  t        j                  k(  rdnd}|j!                  | j                  j"                  |      }|D ]#  }	|j%                  |	      }
|
st	        dd      t        j                         j'                  t)        | j                        t)        | j*                        z        j-                  | j*                        j/                  | j*                         d {   }|st	        dd      g }i }i }g |d<   |D ]  }ddd|d    iiiddddddidddid d!|
 |d"   gid#d$id%d&d'd(|gid)d(|gigid*iiig}t0        j3                  |      j/                  d        d {   }|
|d   |d"   |d+   d,}|D ]O  }|j%                  dg       D ]8  }|d-   j5                  d      }|d.   }|||<   |j%                  |d      |z   ||<   : Q |d   j7                  |        |j7                  |       | j*                  | j                  |d/}t9        |
|      }|j7                  |       |t;        |      d0||
<   | j
                  dk(  s|d1   d   |d
   |
<   & | j
                  dk(  r#t=        |t?        j                                      | j
                  dk7  rtA        |      dk(  rtC        |
   2      S tC        |2      S 7 7 7 j# tD        $ r}t	        dd3tG        |             d }~wtH        $ r}t	        d4d5tG        |             d }~ww xY wwr  r  r  s                             rd   r  r  (  r  r  z/get-report-ohlcc                   K   	 t        j                  | j                  d      }t        j                  | j                  d      }| j                  j                         }| j                  }d}|dk(  rd}n|dk(  rd}n
|dk(  rd}nd}||kD  rt        dd	
      ddddd}di i}| j                  dk(  rt        |j                               }n| j                  g}|D ]e  }	|j                  |	      }
|
st        dd
      t        j                  d|i      j                  d        d {   }|st        dd
      g }i }i }g |d<   |D ]1  }dd|d    iddiddddd id!d"d#id$d%|
 |d&   gid'd(id)d*d+d,|gid-d,|gigid.iddddd/ig}|d0k(  r.t        j!                  |      j                  d        d {   }n-t"        j!                  |      j                  d        d {   }	 |r|d   ni }|
|d   |d1   |d2   |d3   |d4   |d5   d6}|D ]O  }|j                  d7g       D ]8  }|d8   j%                  d      }|d9   }|||<   |j                  |d      |z   ||<   : Q |d   j'                  |       4 |j'                  |       i }g |d:<   t)        |j                               }|
d;d<d<d=|D ci c]  }|||   
 c}}|d:   j'                  |       |rT||d      }|
d>|
 d<d<d=|D ci c]"  }||dk(  rd?nt+        ||   |z
  |z  d@z  d      $ c}}|d:   j'                  |       i }|
dA|
 d<d<d=}t-        |      D ]8  \  } }| dk(  rd?||<   n || dz
     }!t+        ||   ||!   z
  d      ||<   ||   ||<   : |d:   j'                  |       |
dB|
 d<d<d=t-        |      D  ci c]9  \  } }|| dk(  s||| dz
        dk(  rd?nt+        ||   ||| dz
        z  d@z  d      ; c}} }"|d:   j'                  |"       |j'                  |       t/        |      ||
<   | j                  dk(  s^||d   |
<   h | j                  dk(  rBddCiddDiddEiddFiddGiddHiddIiddJidK}#|#j1                         D ]  \  }$}D ]  }	 |$dLk(  r0|d   d   |   |d   d   |   g}%t+        |%d   |%d   z
  d      ||<   n|$dMk(  r0|d   d   |   |d   d   |   g}%t+        |%d   |%d   z
  d      ||<   n|$dNk(  r0|d   d   |   |d   d   |   g}%t+        |%d   |%d   z
  d      ||<   nP|$dOk(  r0|d   d   |   |d   d   |   g}%t+        |%d   |%d   z
  d      ||<   n|$dPk(  rB|d   d   |   |d   d   |   g}%|%d   dk(  rd?nt+        |%d   |%d   z
  |%d   z  d@z  d      ||<   n|$dQk(  rB|d   d   |   |d   d   |   g}%|%d   dk(  rd?nt+        |%d   |%d   z
  |%d   z  d@z  d      ||<   n|$dRk(  rB|d   d   |   |d   d   |   g}%|%d   dk(  rd?nt+        |%d   |%d   z
  |%d   z  d@z  d      ||<   nF|$dSk(  rA|d   d   |   |d   d   |   g}%|%d   dk(  rd?nt+        |%d   |%d   z
  |%d   z  d@z  d      ||<     |d   j5                  |#       | j                  dk7  rt7        |      dk(  rt9        |
   T      S t9        |T      S 7 7 7 c c}w c c}w c c}} w # t2        $ r Y kw xY w# t:        $ r}&t        ddUt=        |&       
      d }&~&wt>        $ r}&t        dVdWt=        |&       
      d }&~&ww xY ww)XNr7  EQUITYr   rs   SMEr  ETFr   r  rO   rC  rB  rD  r   r  r  r  
symboltyper   rL   r  r#  rn   rq   rT   Equity)rT   r   rr   r  r  rv   rw   r  r  r  r  r  r}  r  r  r  r  r}   r  r~   r  )r   r  r   zISIN Nor   r   nameofcompanyseriesisinr   listingdate)r  rT   r  r  r  r   date_of_listingr   r   r  r  r  r   r  r  ru   r$   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rz  r  rV   r   ) r   r9  r   r   r   rZ   r  r   r  r9  rS  r   r  r\   r]   r   r   r   r  r   rV  r  r  r  rU  r   r
  r   r
   r   r   r^   )'r  r  r  req_exchangereq_instrumentinsttyper  r  r  r  r  r  r  r  r  r  r   r   first_resultr#  r`   r`  r_  r  r  r  r   r  r  r  r  r  ro   r  r   r  r  rd  rc   s'                                          rd   r  r    s
    hT$$S^^Z@""3<<<||))+1HQHQHH fC8hii$EgF+R0 ;;!_1134II! }	MH)--h7K#<fgg "9!=!=|H>U!V!^!^fj!^!kkL  #<fggKLH&(H]#  , \< !'/K4I3J&L*2# %$*2BI1N.95>4P0;6D[M4R4?4F>2A./*-&*" '6$*)/2H(1S(T)/2H&1Q(R-&)"#(#4 *+&'#$$%? !  (X  5($6$@$@$J$R$RZ^$R$__G$6$@$@$J$R$RZ^$R$__G& .5wqz" '(2$/$@!,X!6&v.)*5%0%? & WF&,jj2&> W
#-f#5#>#>z#J *+= > 16H-1=1A1A(A1NQV1VX.WW '..{;y\<| x(M-/M/* ","3"3"56L#!	
 9EE4d++EK /*11+> *<?;' 2;-@!#	
  %1 ! [A%5cT 2[ @KORUUXYZ[
  o.55lC K#*;-8	  %\2 ;46(+K% ,QqS 1I(-l4.@<PYCZ.Z\](^K%)4T): &; /*112BC $,[M:	
( $-\#:  4 a<QqS8I+Ja+O#;t,|L1<M/NNQTTWXYZ
($ /*112JK}-+@+MOK( {{aAL 01+>{}	M@ ;;! %-m#<#+\":#+\":%-~$> (0&A&.%?&.%?(02B'CG #*--/ .!( -!D,!!%66&56F&G&OPT&U&56F&G&OPT&U&WF+0VAY1F+JF4L#'77&56F&G&OPT&U&56F&G&Nt&T&VF+0VAY1F+JF4L#'77&56F&G&OPT&U&56F&G&Nt&T&VF+0VAY1F+JF4L#'99&56F&G&OPT&U&56F&G&PQU&V&XF+0VAY1F+JF4L $';;&56F&G&OPT&U&56F&G&OPT&U&WF28)q.3eVTUYY_`aYbMbflmnfoLoruLuwxFyF4L#'::&56F&G&OPT&U&56F&G&Nt&T&VF28)q.3eVTUYY_`aYbMbflmnfoLoruLuwxFyF4L#'::&56F&G&OPT&U&56F&G&Nt&T&VF28)q.3eVTUYY_`aYbMbflmnfoLoruLuwxFyF4L#'<<&56F&G&OPT&U&56F&G&PQU&V&XF28)q.3eVTUYY_`aYbMbflmnfoLoruLuwxFyF4LU-!.!` ,-44W= ;;!I! 3(DEEO44A lx `_r FJ\ $ ! !  V6KCPQF84TUU T6I#a&4RSSTs   ]D%[7 )[*B[7 ;[<-[7 )[*C[7 :[/[7 6'[B[7 2>[!
0A[7 9A[7 G/['<A[7 ][7 ][7 [7 [7 [7 '	[40[7 3[44[7 7	] \]%\>>]]z/edit-reportc                    t         j                  j                  | j                        st	        dd      t        | j                  d      5 }|j                  | j                         d d d        dd| j                   diS # 1 sw Y   xY w)NrL   File not foundrO   wr   zFile 'z ' has been updated successfully!)ospathexistsreport_pathr   rC  writenew_content)rI   files     rd   	edit_filer    s    77>>'--.4DEE 
g!!3	' (4

7&&'(  3 344TUVV( (s   BBz/read-reportc                     t         j                  j                  | j                        st	        dd      t        | j                  d      5 }|j                         }d d d        ddS # 1 sw Y   xY w)NrL   r  rO   r    zFile read successfully!)r   r   )r  r  r  r  r   rC  read)rI   r  file_contents      rd   	read_filer    sg    77>>'--.4DEE 
g!!3	' #4yy{# 1\JJ# #s   A++A4c                 z  K   	 t        j                  | t        t        g      }|j	                  d      }|t        t        j                  d      t        j                  d|i       d {   }|t        t        j                  d      |S 7 ## t        $ r t        t        j                  d      w xY wwrd  rg  rm  s       rd   get_user_from_tokenr    ro  rp  z	/registerc                 :  K   t         j                  d| j                  i       d {   rt        t        j
                  d      t        | j                        }| j                  | j                  |d}t         j                  |       d {    ddiS 7 o7 
w)Nrf  zUsername already existsrO   )rf  emailhashed_passwordr   zUser registered successfully)
rl  r   rf  r   r	   HTTP_400_BAD_REQUESThash_passwordpasswordr  r   )r3   r  	user_datas      rd   registerr    s     %%z4==&ABBB(C(CLeff#DMM2O!]]TZZTcdI

$
$Y
///566 C 0s"   %BBA&BB	BBz/token	form_datac                   K   t         j                  d| j                  i       d {   }|t        | j                  |d         st        t        j                  d      t        d|d   i      }t        |ddd	
      S 7 [w)Nrf  r  zInvalid username or passwordrO   r   r4  bearer)access_token
token_typer   r-  )
rl  r   rf  verify_passwordr  r   r	   r	  create_access_tokenr
   )r  r3   r  s      rd   loginr    s      )):y7I7I*JKKD|?9+=+=tDU?VW(C(CLjkk&UD4D,EFLX Vcfgg Ls   %BBABz
/protectedcurrent_userc                 \   K   t        | d         | d   | d   | d   d}t        |d      S w)Nr   rf  r  roles)idrf  r  r  r   r-  )r   r
   )r  r3   s     rd   read_protected_datar  !  sC      ,u%& ,g&g&	D 55s   *,z/get_socketc                  L  K   	 t        j                         } t        j                  dt	        |       iddd       d {   }|t        dd      |ddd	}t        d|
      S 7 &# t
        $ r}|d }~wt        $ r"}t        ddt	        |      i
      cY d }~S d }~ww xY ww)Nr   r   r   rL   z"No websocket data found for today.rO   z Websocket received successfully.r   )r   r   r	   r   rV   r   )r   r   r   r   r   r   r
   r^   )r  r  r   rc   s       rd   
get_socketr  .  s     HZZ\
.77Z8Q\]klSnoo	C8\]]&3UadeT:: p   Hgs1v5FGGHsQ   B$;A( A& %A( %B$&A( (	B!1A33B!?BB!B$B!!B$r  )__doc__fastapi.securityr   r   fastapir   r   r   r   r	   fastapi.responsesr
   r   r   r   fastapi.middleware.corsr   zerodha.zerodha_tickerr   typingr   r   r   r   r   starlette.middleware.baser   passlib.contextr   collectionsr   joser   r   numpyr  yfinancer,  pandasr  loggingr   ry  uuidr   r  pymongo.errorsr   pymongor   r   motor.motor_asyncior   modelshelper_functions.loginhelper_functions.ordershelper_functions.portfoliohelper_functions.ohlc_reporthelper_functions.report_details helper_functions.market_analysis!helper_functions.portfolio_report!helper_functions.heatmap_analysisrC  frz  r  r   clientr[   r~  orders_collection_testr   r   rs  r  holdings_collection_testlevels_collectionrl  r   r   r  r{  r   r   r`  r|  rY  r   uuid4hexri  rj  ACCESS_TOKEN_EXPIRE_MINUTESpwd_contextoauth2_schemeappadd_middlewarepostIndexAPIre   rj   	PricesAPIr   PuTestr   r   WatchlistAPIr   rP  r  AnalyzeMultipleRequestr$  r   r   r)  
ModelInputr2  GraphDataInputrr  PortfolioReportListr  r  r  PortfolioReportGetr  PortfolioDeleter  ReportDetails_NSErJ  ReportDetails_BSErN  ReportDetails_testrT  r[  
QueryStorerd  rh  rn  deleterq  Sectionr  r  r  r  r  r  r  rb  rn  rv  ry  r  r  	UnitOrderr  r  
ReportTypeReportEditorr  r  r  rY  Userr  r  r  r  r   r   rd   <module>rZ     s
   M B B * . . 2 . # 9 9 ( 8 ( #         	 	 ( ) 2  $ % ( * - . / / 

,cGD  4::affhD  
DL53TVdhx}	~DL$%xL M* _ _ n ,- o. xL V*=) =) ^,  34 /0 + ./ n ]#

 TZZ\
	   H:&A %g6 i   %%%   3,C C C  ,C C C  -S:i S: S:jCJ8t 
#$HD& HD %HDT 3 *T T( ,%T %T %TNMDI M$sCx. M^FP 
.T .T` 
2<#2< 2<h 	< < <" -M
 M M0 -QMn QM QMh 
$%1
4(;#< 1
 &1
f 	 
 !
$ 	$%-24[ 
s 
 &
* 
!"jT, jT #jTX 
<O < <" 
 nY!2 nY !nY` 
 Y!2 Y !YB 
$%Y&8 Y &Y 
$%Y&8 Y &Y 
D D 	%d:6FG8C=  H& 	":>  ? -Jj J J: OX3 X X +'J 'J 'JT 	 	 Us U U 	+0:eCj^cdg^h nJS nJ nJX[ nJ nJb 	"#"9S "9 $"9J !$K+t?SMt?
3-t? t?l 	!$K+s@SMs@
3-s@ s@jvp 	!$K+rHSMrH
3-rH  rHh -4]-C ^s ^ 
@ 
@ 
 D.OP$,KL-R-R-R -R^ .
LT$Z 
L 
LdL -t<I t< t<l 
$< $<T -OT* OT OTv .OT* OT OTd 
iT* iT iTZ	 .W| W W .K| K K +2=+A ^S ^ +d+7 7 ,7 (4(7>y h4 h )h 3:;N3O 6D 6 6 H H{w   s   !]88^