
    hj;	                   r   d dl mZ d dlmZmZ d dlmZmZ d dlZd dlm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$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/m0Z0 d dl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z9 d dl:m;Z;m<Z< d dl=m>Z>m?Z? d dl@mAZA d dlBmCZC ddZDddZEddZFddZGdddZHdddd)ZIdd+ZJdd-ZKdd/ZLdd1ZMdd5Z8dd9ZNdd=ZOd> ZPd?ZQh d@ZRddCZSddDZTddFZUddGZVddIZWddMZXddNZYddOZZddQZ[ddRZ\ddUZ]ddWZ^dd[Z_dd^Z`ddaZaddbZbdddZcddgZdddhZedddjZfddlZgddnZhddqZiddsZjddtZkdduZlddxZmdd|Zndd}ZoddZpddZqddZrddZsddZtddZuddZvddZwddZxddZyddZzddZ{ddZ|ddZ}ddZ~ddZddZddZddZddZddZddZdS )    )annotations)UTCdatetime)DecimalInvalidOperationN)
Connection)uuid4)HTTPException)AccountValueConfirmRequestAccountValuePreviewRequest
ActionItem
AuditEntryCashConfirmRequestCashPositionDetailCashPreviewRequestCleanupPreviewResponseConfirmResponseContainerConfirmRequestContainerPreviewRequestCryptoActionConfirmRequestCryptoActionPreviewRequestEquityDividendConfirmRequestEquityDividendPreviewRequestEquitySellConfirmRequestEquitySellPreviewRequestGenericConfirmRequestInstrumentSearchCandidateInstrumentSearchRequestPositionConfirmRequestPositionPreviewRequestPreviewResponse
PricePointProviderSearchResponseReferenceAccountRemovePositionPreviewResponse) apply_review_test_equity_cleanup%identify_review_test_equity_artifacts)resolve_fx_rate_to_chf)	stable_id)CatalogSearchResultFmpSearchProviderFinnhubSymbolLookupProviderMassiveLookupProviderOpenFigiLookupProviderTwelveDataLookupProvidersearch_instruments)get_crypto_chart_pointsget_equity_chart_points)decimal_textoptional_decimal_text)get_cash_summary)get_equity_positionreturnstrc                     t          j        t                                        d                                                              dd          S )Nr   )microsecondz+00:00Z)r   nowr   replace	isoformat     /home/agent/.hermes/worktrees/FinanceManager-sprint16-smart-household-inbox-real-data-onboarding-v2/src/jarvis_finance/services/manual_entry_service.py_nowrB   :   s@    <$$$33==??GGRUVVVr@   prefixc                B    |  dt                      j        d d          S )N_   )r	   hex)rC   s    rA   _uuidrH   >   s%    ))uww{3B3')))r@   valuefieldr   c                    	 t          t          |                     }n.# t          t          f$ r}t	          dd|           |d }~ww xY w|dk    rt	          d| d          |S )N  Invalid decimal for status_codedetailr   z must be positiver   r8   r   
ValueErrorr
   rI   rJ   parsedexcs       rA   _decimalrV   B   s    ]U$$j) ] ] ]4R54R4RSSSY\\]{{u4O4O4OPPPPMs    A
AA

str | Nonec                    | dv rt          d          S 	 t          t          |                     }n.# t          t          f$ r}t	          dd|           |d }~ww xY w|dk     rt	          d| d          |S )NN 0rL   rM   rN   r   z must be zero or positiverQ   rS   s       rA   _decimal_non_negativer\   L   s    
s||]U$$j) ] ] ]4R54R4RSSSY\\]zzu4W4W4WXXXXMs   2 AAAasset_classc                   |                                                                                      dd                              dd          }|dv r
|dk    rdndS ddd	d	d	d
d
d
dddd}|                    ||          S )N rE   ->   initialinitial_snapshotcashinitial_cash_snapshotinitial_position_snapshotbuycash_depositcash_withdrawalmanual_cash_correction)kaufrf   cash_einzahlungrg   
einzahlungcash_auszahlungrh   
auszahlung	korrekturcash_korrekturri   striplowerr=   get)rI   r]   keymappings       rA   _normalise_transaction_typerw   X   s    
++--




'
'S
1
1
9
9#s
C
CC
---*5*?*?&&E``)&$,,'-2": G ;;sC   r@   ok)quality_statusconnr   actionentity_type	entity_idpayloaddictnotery   c                   t          d          }t                      }|                     d|||||t          j        |d          ||||f
           |S )Naudita1  
        INSERT INTO audit_log(audit_id, timestamp, source, action, entity_type, entity_id, old_values_json, new_values_json, user_text_note, confirmed, confirmation_timestamp, created_by, quality_status, created_at)
        VALUES (?, ?, 'vue_dashboard', ?, ?, ?, NULL, ?, ?, 1, ?, 'user', ?, ?)
        T)	sort_keys)rH   rB   executejsondumps)	rz   r{   r|   r}   r~   r   ry   audit_idtss	            rA   _auditr   l   sf    W~~H	BLL	 
2v{Itz'UY7Z7Z7Z\`bdftvxy   Or@   boolc                    | d          d| d                                           t          | d         pd                                           }|dv p"dv odv ot          fd	d
D                       S )Nplatformr_   account_nameaccount_typerZ   >   robo_portfoliomanaged_portfoliotruewealthc              3      K   | ]}|v V  	d S Nr?   ).0tokenlabels     rA   	<genexpr>z-_is_truewealth_account_row.<locals>.<genexpr>|   sW        uu  uu  INuz  D  vD  uu  uu  uu  uu  uu  uur@   >   totalmanaged
gesamtwert)rs   r8   any)rowr   r   s     @rA   _is_truewealth_account_rowr   y   s    :66^!466<<>>Es>*0b117799LBB  vvQV  Hu[cgl[l  Huqt  uu  uu  uu  uu  Rt  uu  uu  uu  ru  ru  vr@   tuple[str, str, bool]c                    t          | d         pd                                          }t          |           rdS |dk    r.dd| d          d| d	                                          v rd
nddfS |dk    rdS dS )Nr   rZ   )manual_total_value
truewealthF	brokerage	positionspostfinancer   r_   r   postfinance_equityequityTrc   )cash_balancerc   F)r   otherT)r8   rs   r   )r   r   s     rA   _account_portfolio_metar      s    s>*0b117799L!#&& 988{""MJEoEoZ]^lZmEoEoEuEuEwEw4w4w00  ~F  HL  L  	Lv,,%%r@   
account_idc                    |                      d|f                                          }|sdS t          |          \  }}}|dk    o| S )Nz
        SELECT a.account_id, p.name AS platform, a.account_name, a.account_type, a.currency
        FROM accounts a JOIN platforms p ON p.platform_id = a.platform_id
        WHERE a.account_id=?
        Fr   )r   fetchoner   )rz   r   r   valuation_mode_bucketallow_position_addss         rA   _is_manual_total_value_accountr      sh    
,,	
 
  hjj   u3J33O3O0NG011M:M6MMr@   list[ReferenceAccount]c                4   |                      d                                          }g }|D ]k}t          |          \  }}}|dk    rdn|d         }|                    t	          |d         |d          d|d          ||d	         |||
                     l|S )Nz
        SELECT a.account_id, p.name AS platform, a.account_name, a.account_type, a.currency
        FROM accounts a JOIN platforms p ON p.platform_id = a.platform_id
        WHERE a.is_active = 1
        ORDER BY p.name, a.account_name
        r   r   r   r   r       · r   currency)r   r   r   r   r   portfolio_bucketr   )r   fetchallr   appendr$   )rz   rowsaccountsrr   bucketr   r   s           rA   list_reference_accountsr      s    <<	  hjj 	 (*H K K6Ma6P6P3 3.4.D.D**!NJ[(AlOaPZmKtKtabcqarKtKt  DP  [\  ]g  [h  yG  Z`  vI  J  J  J  	K  	K  	K  	KOr@   requestr   list[InstrumentSearchCandidate]c                `   d|j                                                                          d}|j                                        }|dv rdn|f}|                     dd                    d |D                        dg ||||R                                           }d |D             S )	N%>   etfstockr   )r   r   z
        SELECT instrument_id, asset_class, name, ticker, isin, exchange, currency
        FROM instruments
        WHERE is_active = 1 AND lower(asset_class) IN (,c              3     K   | ]}d V  dS )?Nr?   )r   rE   s     rA   r   z%search_instruments.<locals>.<genexpr>   s"      @V@V@V@V@V@V@V@Vr@   z)
          AND (lower(name) LIKE ? OR lower(ticker) LIKE ? OR lower(isin) LIKE ?)
        ORDER BY name
        LIMIT 12
        c                    g | ]M}t          |d          |d         |d         |d         pd|d         pd|d         pd|d         pddd	d

  
        NS )instrument_idnamer]   isinrZ   tickerexchanger   localzLokal gespeichertF)
candidate_idr   r]   r   r   r   r   providerconfidence_labelreview_required)r   r   r   s     rA   
<listcomp>z&search_instruments.<locals>.<listcomp>   s         	"?+F)-(6bX;$"z](bz](b0!	
 	
 	
  r@   )queryrr   rs   r]   r   joinr   )rz   r   qassetallowedr   s         rA   r0   r0      s    ,GM!!'')),,,A%%''E"'+E"E"EE8G<<	 9<@V@Vg@V@V@V8V8V	 	 	 	'1a
 
 hjj 	     r@   amountrateDecimal | Nonec                l    | dv s|d S t          t          t          |                     |z  d          S )NrY      )r3   r   r8   )r   r   s     rA   _chf_amountr      s9    t|tF,,t3Q777r@   r   
trade_date.tuple[str, str | None, str | None, str | None]c                   |                                 }t          | ||dd          }|j        dd d |j        pdfS |dk    rdnd}|j        }|t          |j        d          |d fS )	NT)base_currency	rate_datepersistresolve_fixedmissingu:   FX fehlt: Speichern bleibt möglich, CHF-Wert bleibt leer.CHF
not_neededrx   f)upperr(   r   warningsourceformat)rz   r   r   curresultstatusr   s          rA   _fx_for_explicit_saver      s}    
..

C#Dz[_ostttF{$fn&t8ttt E\\\\tF]F6&+s++VT99r@   c                     t                      t                      t                      t                      t	                      gS r   )r+   r,   r/   r.   r-   r?   r@   rA   _provider_search_providersr      sG    !<!>!>@X@Z@Z\r\t\t  wL  wN  wN  O  Or@   )CDRADRGDRWARRANTCERTIFICATE
DERIVATIVERIGHTNOTE>   LSESIXTSXNYSEXETRANASDAQNYSEARCAr   r*   c                    d                     | j        pd| j        pd| j        pdg                                          t          fdt          D                       S )Nr_   rZ   c              3      K   | ]}|v V  	d S r   r?   )r   r   texts     rA   r   z&_is_derivative_like.<locals>.<genexpr>   s'      ==u}======r@   )r   r   security_typeevidence_noter   r   _DERIVATIVE_TOKENS)r   r  s    @rA   _is_derivative_liker	     sc    88V[&B(<(BFDXD^\^_``ffhhD====*<======r@   c                    d| j         pd                                v rdS | j        dk    rdS | j        dk    rdS | j        s| j        rdS dS )	Nzprovider conflictrZ      Manuell prüfenhigh	EindeutigmediumWahrscheinlichUnsicher)r  rs   
confidencer   r   )r   s    rA   _confidence_labelr     sl    v39r@@BBBB  F""{H$$}  zr@   tuple[int, int, str]c                   |j                                                                         }|j        pd                                }|j        pd                                }| j        p| j        pd                                }| j        p| j        pd                                }d}| j        r | j                                        |k    rd}n| j	        r0| j	                                        |k    r|r||k    r|r||k    rd}n| j	        r | j	                                        |k    rd}nlt          | j                  t          |j                   k    rd}n?|t          | j                                                                                  v rd}nd}d}|t          v r|dz  }t          |           r|d	z  }| j        d
k    r|dz  }||| j                                        fS )NrZ   d   r      r               low   )r   rr   r   r   r   trading_currencyinstrument_currencyprovider_marketr   r   normalize_textr   split_MAIN_EXCHANGESr	  r  rs   )	r   r   r   r   r   result_currencyresult_exchangerankpenaltys	            rA   _search_rankr'     s
   ##%%A &B--//H &B--//H.R&2LRPRYY[[OF&*@FBMMOOOD{ v{((**a//	 	6=..00A55x5?^fKfKfqyKf  ~M  QY  ~Y  ~Y	 6=..00A55		$	$w}(E(E	E	E	
nV[))//117799	9	9G/))16"" 2E!!1'6;,,..//r@   c                    d                     t          | pd                              dd                                                                                    S )Nr_   rZ   r`   )r   r8   r=   r!  rs   rI   s    rA   r   r     sH    88C$$,,S#66<<>>??EEGGGr@   codec                ~    |                                  }d|v rdS d|v rdS d|v rdS d|v rdS d	|v rd
S d|v sd|v rdS | S )Napi_key_missingzAPI-Key fehltrate_limitedz
Rate LimitnetworkzProvider nicht erreichbarendpoint_restrictedu   Endpoint eingeschränktauth_failedu1   API-Key ungültig oder Provider nicht autorisiertprovider_errorlookup_unavailablezBackend-/Provider-Fehler)rs   )r*  lowereds     rA   _provider_warning_labelr4    s    jjllGG##  |G**''((BB7""&:g&E&E))Kr@   
candidateswarnings	list[str]c                    | r|sd S t          d | D                       }|rd                    |d d                   nd}d| dS )Nc                    h | ]]}|j         pd                     dd                              d          D ]*}|                                |                                +^S )rZ   +r   )r   r=   r!  rr   )r   cps      rA   	<setcomp>z-_user_provider_source_hint.<locals>.<setcomp>(  sg    |||a
@Pb?Y?YZ]_b?c?c?i?ijm?n?n||!rsryryr{r{|		||||r@   /r  zeinem anderen Provideru\   Datenquelle teilweise eingeschränkt: Ein Provider lieferte keine Daten; Treffer stammt aus .)sortedr   )r5  r6  	providersr   s       rA   _user_provider_source_hintrB  %  sh     X t||:|||}}I(1OSXXim$$$7OFsjpssssr@   c                    | j         p| j        pd                                }|r|S | j        p| j        p|j        pd                                }|dv rdS |dv rdS |dv rdS |j        pd                                S )NrZ   >   AMEXARCAr   XNASXNYSr  r  USD>   r   XSWXr   >   FWBXFRAr   EUR)r  r  r   r   r  r   )r   r   explicitr   s       rA   _plausible_currencyrN  -  s    'K6+EKRRTTH S6#9SW=MSQSZZ\\HQQQu?""u+++u"))+++r@   c                   |j         rt          |           rdS |j        rS|j                                        dvr8| j        pd                                |j                                        k    rdS |j        rZ|j                                        dvr?| j        p| j        pd                                |j                                        k    rdS |j        rZ|j                                        dvr?| j        p| j        pd                                |j                                        k    rdS |j	        r/| j        p| j        pd                                }|r|t          vrdS dS )NF>   ALLALLErZ   T)hide_cdr_adr_derivativesr	  countryr   r   r  r  r   r  main_listing_onlyr"  )r   r   exs      rA   _passes_provider_filtersrV  ;  s   ' ,?,G,G u 7?0022/IIv~OcacNjNjNlNlpwp  qF  qF  qH  qH  OH  OHu G,2244OKK#Gv'AGRNNPPT[TdTjTjTlTlll5 G,2244OKKO;v5;BBDDHXH^H^H`H```5  o=!7=2DDFF 	"O++54r@   r    c                   |j         pd }|r+|                     d|f                                          r|S |j        pd }|r+|                     d|f                                          r|S |r)|                     d|f                                          nd }|rWd }|d         r`|d         p |d         p|j                                        }|                     d|d         |d         |f                                          }|r|d         S t          d	|d         pd
|d         pd
|d         pd
|d                   }t                      }|                     d||d         |d         |d         |d         |d         |d         p |d         p|j                                        |d         |d         |d         p|d         |d         p|j                                        d||f           |S |j        s|j	        s|j
        rt          d	|j
        pd
|j	        pd
|j        pd
|j                                                  }t                      }|                     d||j                                        |j        p|j	        p|j
        pd|j	        |j
        |j                                        |j                                        d||f
           |S d S )Nz;SELECT instrument_id FROM instruments WHERE instrument_id=?zASELECT * FROM instrument_catalog_entries WHERE catalog_entry_id=?r   r  r  zSELECT instrument_id FROM instruments WHERE isin=? AND COALESCE(exchange,'')=COALESCE(?, '') AND COALESCE(currency,'')=COALESCE(?, '')r   r   
instrumentrZ   r   r   a]  
            INSERT OR IGNORE INTO instruments(instrument_id, asset_class, name, ticker, isin, exchange, currency, country, provider_symbol, data_provider_primary, trading_currency, instrument_status, valuation_policy, notes, created_at, updated_at)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'unknown', 'live_price', ?, ?, ?)
            r]   rS  provider_symbolr   r   zbMaterialized from explicit Vue provider-search selection; no provider call during preview/confirm.a$  
            INSERT OR IGNORE INTO instruments(instrument_id, asset_class, name, ticker, isin, exchange, currency, trading_currency, instrument_status, valuation_policy, notes, created_at, updated_at)
            VALUES (?, ?, ?, ?, ?, '', ?, ?, 'unknown', 'live_price', ?, ?, ?)
            Manuelles Instrumentz=Materialized from manual Vue input; explicit review required.)r   r   r   r   r   r   r)   rB   r   r   r   r]   rs   )rz   r   r   r   catalogexistingr   r   s           rA   _ensure_instrument_from_requestr]  M  s   )1TM &cfseuvv  B  B '/4L %beqdstt}}  @L  Vdll^am`oppyy{{{  RVG 6? 	k 56q'BT:UqY`YiYoYoYqYqH||  %m  pw  x~  p  AH  IS  AT  V^  o_  `  `  i  i  k  kH 	-O,,!,0E2wxGXG^\^`ghr`s`ywy  |C  DJ  |K  L  LVV GM2GFOWXEVX_`fXgipq{i|  F  G\  ]  X  ah  i{  a|  X  @G  @P  @V  @V  @X  @X  Za  bk  Zl  nu  vG  nH  JQ  R\  J]  Jr  ah  iq  ar  t{  |N  tO  tk  SZ  Sc  Si  Si  Sk  Sk  mQ  SU  WY  Z	
 	
 	
 | 
w~ 
 
!,0BGNDXVXZaZfZljlnun~  oE  oE  oG  oG  H  HVV G/5577  :B  :B[b[g  :B  lB  DK  DR  T[  T`  bi  br  bx  bx  bz  bz  |C  |L  |R  |R  |T  |T  VU  WY  []  ^	
 	
 	
 4r@   c                   |j         pd }|r-|                     d|f                                          }|r|S |j        pd }|rZ|                     d|f                                          }|r|S |                     d|f                                          }|r|S |j        s|j        s|j        rV|j        p|j        p|j        pd|j                                        |j	        
                                |j        |j        ddS d S )NzaSELECT name, currency, asset_class, ticker, isin, exchange FROM instruments WHERE instrument_id=?zSELECT name, COALESCE(NULLIF(instrument_currency,''), NULLIF(trading_currency,'')) AS currency, asset_class, ticker, isin, exchange FROM instrument_catalog_entries WHERE catalog_entry_id=?rZ  rZ   )r   r   r]   r   r   r   )r   r   r   r   r   r   r   r   r   r]   rs   )rz   r   r   instr   r[  s         rA   _instrument_preview_rowr`  t  s   )1TM ||  CP  BR  S  S  \  \  ^  ^ 	K'/4L ||  CO  BQ  R  R  [  [  ]  ] 	K,,   ^  am  `o  p  p  y  y  {  { 	N| 
w~ 
 
L\GN\gl\F\(..00".4466nL
 
 	
 4r@   resultslist[CatalogSearchResult]c                   i }| D ]g}|j         r]d|j                                         |j        p|j        pd                                |j        p|j        pd                                fnd|j        p|j        pd                                |j	        p|j
        pd                                |j        p|j        pd                                |j        p|j        pd                                f}|                    |          }||||<   t          d |j        |j        fD                       }t          d |j        |j        fD                       }|rd                    |          n|j        |_        |rd                    |          n|j        |_        t          |          dk    r3t          |          dk    r |j        dv s	|j        dv rd	n|j        |_        |j        p|j        |_        |j        p|j        |_        |j        p|j        |_        |j        p|j        |_        |j        p|j        |_        |j        p|j        |_        |j        p|j        |_        it/          |                                          S )
Nr   rZ   r   c                    h | ]}||S r?   r?   r   r<  s     rA   r=  z+_dedupe_provider_results.<locals>.<setcomp>  s    QQQ!qQAQQQr@   c                    h | ]}||S r?   r?   re  s     rA   r=  z+_dedupe_provider_results.<locals>.<setcomp>  s    KKKK!KKKr@   r:  r  >   r  r  r  )r   r   r   r  r  r  r   r   rs   rY  r   rt   r@  r   r  r  exchange_namemicr  
last_priceprice_currency
price_daterS  listvalues)ra  mergedr   ru   r\  rA  sourcess          rA   _dedupe_provider_resultsrp    s   9;F > > rx  r}  ~vv{((**V_-\@V-\Z\,c,c,e,ehnh  id  DJ  D^  id  bd  hk  hk  hm  hm  n  n  EO  RX  Ra  Rx  ek  er  Rx  vx  Q  Q  QA  QA  DJ  DZ  Dq  ^d  ^k  Dq  oq  Cx  Cx  Cz  Cz  }C  }L  }l  PV  Pf  }l  jl  |s  |s  |u  |u  x~  xO  xs  SY  Sm  xs  qs  wz  wz  w|  w|  D}::c?? F3KQQ(96?'KQQQRR	KKhov}%EKKKLL3<SCHHY///(BS/6K#((7+++HOX&&*;;;@QRX@Y@Y]n@n@n,4,?CU,U,UY_Yj  oA  ZA  ZA&&  GO  GZH!)!7!O6;O|1vz!)!7!O6;O&1FV5F"*"9"RV=R&1FV5F#+=v~   r@   r#   c                n   j                                         st          dd          t          | j         j        t                                \  }}t          fd|D                       }|                    fd           fd|d d	         D             }g }|r(t          ||          }|r|	                    |           n|	                    d
           t          |          dk    r|	                    d           t          |t          t          |                    d          S )NrL   zSearch query requiredrN   )rA  c                4    g | ]}t          |          |S r?   )rV  r   r   r   s     rA   r   z/provider_search_instruments.<locals>.<listcomp>  s+    (d(d(dq?WXY[b?c?c(d(d(d(dr@   c                $    t          |           S r   )r'  )r   r   s    rA   <lambda>z-provider_search_instruments.<locals>.<lambda>  s    Q 8 8 r@   )ru   c                   g | ]}t          di d |j        p2t          d|j        |j        |j        pd|j        pd|j        pd          d|j        d|j        d|j        pdd|j        pdd|j        p|j	        pddt          |          d	|j        p|j        d
|j        p|j        pdd|j        pdd|j        p|j	        pdd|j        pdd|j        pdd|j        d|j        d|j        dt)          |          dd
S )r   	candidaterZ   r   r]   r   r   r   r   r   rY  rg  rh  rS  r  ri  rj  rk  r   r   Tr?   )r   catalog_entry_idr)   r   r   r   r   r   r]   r  rN  r   rY  rg  rh  rS  r  ri  rj  rk  r  rs  s     rA   r   z/provider_search_instruments.<locals>.<listcomp>  s      * ) 	" 	
 	
 	
+  HyahPQPVXYX^Xdbdfgfnftrtvw  wA  wG  EG  0H  0H	
&&	
 	
 2		

 8>r	
 Z:1#4:	
 )G444	
 Z+18	
 -??R	
 //R	
 0*0b	
 IO	
 //R	
 ||	
 ++	
  ||!	
" /q111#	
$ !D%	
  r@      u,   Keine verlässlichen Providerdaten gefunden.r  zMehrdeutige TrefferT)r5  r6  selection_required)r   rr   r
   search_catalog_instrumentsr]   r   rp  sortrB  r   lenr#   r@  set)rz   r   ra  r6  filteredr5  ui_warningshints    `      rA   provider_search_instrumentsr    sy   =   M4KLLLL24H[  hB  hD  hD  E  E  EGX'(d(d(d(dG(d(d(deeHMM8888M999   * #2#+  J.  K K)*h?? 	%t$$$IJJJ
:0111!Z&[IYIYBZBZosttttr@   r   r   Nonec                  |sd S |                      d|f                                          }|r|d         sd S |d         p|d         p	|d         pd                                }|sd S t                      d d         }t	          d|||d         |d	          }|                      d
|||t          |d                   ||d         p	|d         pdt                      f           d S )NzSELECT last_price, price_currency, trading_currency, instrument_currency, provider, source FROM instrument_catalog_entries WHERE catalog_entry_id=?ri  rj  r  r  rZ   
   mpricerw  z
        INSERT OR IGNORE INTO market_prices(market_price_id, instrument_id, price_date, close, currency, provider, quality_status, created_at)
        VALUES (?, ?, ?, ?, ?, ?, 'ok', ?)
        r   r   provider_search)r   r   r   rB   r)   r8   )rz   r   r   r[  r   rk  price_ids          rA   _cache_candidate_pricer    sY    ll  q  t@  sB  C  C  L  L  N  NG ',/ ()pW5G-HpGTiLjpnpwwyyH J=*gl>SU]_jkkHLL	 
=*c',2G.H.H(T[\fTg  URkrs{k|  UR  AR  TX  TZ  TZ  	[    r@   r   r!   c                   t          |j        d           |                     d|j        f                                          }|st          dd          |j                                        dk    rdnd}|dk    rg nd	g}|dk    rt          |j        d
          nd }t          t          d          |j         d|j                                         d|j         |||          S )Nr   2SELECT account_id FROM accounts WHERE account_id=?  Account not foundrN   r   r   r   uA   FX fehlt: Speichern bleibt möglich, CHF-Wert wird leer markiert.r   previewr_   )
preview_idsummary
amount_chf	fx_statusr6  )rV   r   r   r   r   r
   r   r   r3   r!   rH   transaction_type)rz   r   accountr  r6  r  s         rA   preview_cashr    s;   W^X&&&llORYRdQfggpprrG I4GHHHH ' 0 6 6 8 8E A AyI,..rr5x4yH4=4M4Mgna000SWJeI&6&67C[  AJ  AJ^e^n^t^t^v^v  AJ  AJ  zA  zH  AJ  AJ  Wa  mv  AI  J  J  J  Jr@   r   r   c                
   |j         st          dd          t          | |          }t          d          }t	                      }|j                                        dk    rdnd }|j                                        dk    rdnd}t          t          |j	        d	                    }t          |j        d
          }|                     d|||j        |j        |||j                                        ||rdnd|j        |j        ||j        |f           |                     dt          d
          |j        |j        |j                                        |||j        ||j        |f
           t#          | dd|j         d|j                                         |                                |j        |          }	|                                  t)          d|j         d|j                                         |	d          S )N  Explicit confirm requiredrN   txr   1rx   
missing_fxr   rc   an  
        INSERT INTO transactions(transaction_id, transaction_type, account_id, trade_date, gross_amount_original, net_amount_original, currency_original, fx_rate_to_chf, fx_status, gross_amount_chf, net_amount_chf, source_type, is_confirmed, quality_status, notes, created_at)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'vue_manual_cash', 1, ?, ?, ?)
        r   a  
        INSERT OR IGNORE INTO cash_balances(cash_balance_id, account_id, balance_date, currency, amount_original, fx_rate_to_chf, amount_chf, source_type, quality_status, notes, created_at)
        VALUES (?, ?, ?, ?, ?, ?, ?, 'vue_manual_cash', ?, ?, ?)
        cash_confirmcash_position:r{   r|   r}   r~   r   ry   	confirmedzCash gespeichertr   r}   r   message)confirmr
   r  rH   rB   r   r   r8   rV   r   rw   r  r   r   booking_dater  r   r   
model_dumpcommitr   )
rz   r   r  
balance_idr   fx_ratequalityr   r  r   s
             rA   confirm_cashr    s   ? Q4OPPPP4))GtJ	B%++--66ccDG&,,..%77dd\G'.(3344F273KVTTLL	 
%w'97;OQWY_ahaqawawayay  |C  MT  Ec  EI  EI  Zc  el  ew  y@  yK  MT  V]  Vb  df  	g   	LL	 
v*G,@'BRBXBXBZBZ\bdkmtm  BI  KR  KW  Y[  	\   d>]d]o  [M  [Mry  sC  sI  sI  sK  sK  [M  [M  W^  Wi  Wi  Wk  Wk  ry  r~  OV  W  W  WHKKMMM+G<N9k9kQXQaQgQgQiQi9k9kv~  I[  \  \  \  \r@   c           	        t          |j        d           |                     d|j        f                                          }|st          dd          t          | |j                  rt          dd          t          | |          }|st          dd          |j        	                                }t          | ||j        	          \  }}}}|r|gng }	t          |j        |rt          |          nd           }
t          t!          d
          |j                                        |d          d|j         d| |
||	          S )Nquantityr  r  r  rN   rL   zmTrueWealth/managed portfolio is a manually valued Gesamtwert-Konto; Einzelpositionen sind hier nicht erlaubt.Instrument not foundr   r   r  r   r   r  r]   r  r  r  r6  )rV   r  r   r   r   r
   r   r`  r   r   r   r   r   cost_basis_originalr   r!   rH   r]   rs   )rz   r   r  r_  r   r  r  
_fx_source
fx_warningr6  r  s              rA   preview_positionr  
  s   Wz***llORYRdQfggpprrG I4GHHHH%dG,>?? e  5d  e  e  e  	e"411D L4JKKKK%%''H1FtV^krk}1~1~1~.Iw
J)1
||rHW8g:_'':J:J:J[_``JeI&6&6GDWD]D]D_D_lpqwlx  j_  j_  F  O  j_  j_  U]  j_  j_  lv  BK  V^  _  _  _  _r@   r   c                   |j         st          dd          t          | |           t          | |          }|t          dd          t	          | ||j                   t          d          }t                      }|j        pd}t          | |j
        |j        	          \  }}}}	t          ||rt          |          nd           }
g }|j        s|                    d
           |dk    r|                    d           d                    |          pd}t!          |j                  }|                     d|||j        ||j        t)          t+          |j        d                    |||j
                                        ||||
|
||j        |f           t3          | dd|j         d| |                                |j        |          }|                                  t9          d||d          S )Nr  r  rN   r  r  )r   r   r  r[   r  cost_basis_missingr   r  ;rx   a  
        INSERT INTO transactions(transaction_id, transaction_type, account_id, instrument_id, trade_date, quantity, gross_amount_original, net_amount_original, currency_original, fx_rate_to_chf, fx_source, fx_status, gross_amount_chf, net_amount_chf, source_type, is_confirmed, quality_status, notes, created_at)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'vue_manual_position', 1, ?, ?, ?)
        r  position_confirmpositionr  r  r  zPosition gespeichertr  )r  r
   r  r]  r  r   rH   rB   r  r   r   r   r   r   r   r   rw   r  r   r   r8   rV   r  r   r   r   r  r  r   )rz   r   r   tx_idr   costr  r  	fx_source_fx_warning	gross_chfquality_partsr  r  r   s                  rA   confirm_positionr    s   ? Q4OPPPPT7###3D'BBM4JKKKK4}7K_````$KKE	B&-#D1FtV]Vfsz  tF  2G  2G  2G.Iw	;Dg"G''"2"2"24HHIM& 31222I\***hh}%%-G273KLLLL	 
 '"4mWEWY\]efmfv  yC  ^D  ^D  ZE  ZE  GK  MQ  SZ  Sc  Si  Si  Sk  Sk  mt  v  AJ  LU  W`  bi  kr  kw  y{  	|   d#5:\c\n  ZA  ZAq~  ZA  ZA  KR  K]  K]  K_  K_  fm  fr  CJ  K  K  KHKKMMM+[qrrrrr@   position_idr   c                   t          fdt          |           j        D             d           }                    dd          \  }}|s|                     d||f                                          }|st          dd          |d         |d	         |d
         t          |d                   pdt          |d         d          |d         pdd}|d         }nJ|                                }|                     d||f                                          }|r|d         nd }t          di ||t          dd          t          dd          t          dd          t          dd          gdS )Nc              3  2   K   | ]}|j         k    |V  d S r   )id)r   r<  r  s     rA   r   z+get_cash_position_detail.<locals>.<genexpr><  s/      XX1ADKDWDWQDWDWDWDWXXr@   r  r  a  
            SELECT p.name AS platform, a.account_name, cb.currency, cb.amount_original, cb.amount_chf, cb.quality_status, MAX(cb.created_at) AS last_change
            FROM cash_balances cb JOIN accounts a ON a.account_id = cb.account_id JOIN platforms p ON p.platform_id = a.platform_id
            WHERE cb.account_id=? AND cb.currency=?
            GROUP BY cb.account_id, cb.currency
            r  zCash position not foundrN   r   r   r   amount_originalr[   r  r   ry   rx   )r  r   account_labelr   r   r  r   last_changezZSELECT MAX(created_at) AS last_change FROM cash_balances WHERE account_id=? AND currency=?
EinzahlungTr   enabled
Auszahlung	KorrekturVerlauf)r  available_actionsr?   )nextr5   r   r!  r   r   r
   r4   r  r   r   )rz   r  r  r   r   r   r~   r  s    `      rA   get_cash_position_detailr  ;  s   XXXX 0 6 6 @XXXZ^__H&,,S!44J :ll "
 
 (** 	  	SC8QRRRR$#j/TWXfTgux  zD  vE  Qf  gj  k|  g}  Q~  Q~  QE  BE  Uj  kn  o{  k|  ~  U@  U@  LO  P`  La  Li  ei  j  j-(%%''llw  {E  GO  zP  Q  Q  Z  Z  \  \,/9c-((T  J  J  J[U_fr  }A  VB  VB  VB  DN  Ua  ko  Dp  Dp  Dp  r|  CN  X\  r]  r]  r]  _i  py  CG  _H  _H  _H  UI  J  J  J  J  Jr@   c                   |                     dd          \  }}	 t          | |          }|                                }n# t          $ r |                     d||f                                          }|s ||d         |d         pd|d         pd|d         pdt          |d	                                                   d
k    rdndd|d         pdd d dd}Y nw xY wt          | |d          }|                     d||f                                          }|                     d|f                                          }	|                     d|f                                          }
|	r|	d         nd }t          |r|d         r|d         nd p|p|	                    d          pd          
                                }|dk    rd}n|r|d         dk    r|d         rd}nd}i |||	                    d          rdndd |r|d         d         nd |	                    d           p|r|d         d          nd d |
r|
d!         nd p|	r|	d"         nd p|	r|	d!         nd |
r|
d#         nd p|	r|	d$         nd |	                    d%          p|	                    d          |r|d         nd |	                    d           p|
r|
d          nd t          d&d'(                                          gd) |D             d*S )+Nr  r  z
            SELECT i.name, i.ticker, i.isin, i.asset_class, i.currency, a.account_name
            FROM instruments i JOIN accounts a ON a.account_id = ?
            WHERE i.instrument_id = ?
            r   r   rZ   r   r   r]   r   ETFAktier[   r   r   u   Einstand unvollständig)r  r   r   r   r  r]   r  r   pricemarket_value_chfr      limitz
        SELECT fx_status, fx_rate_to_chf, currency_original
        FROM transactions
        WHERE account_id=? AND instrument_id=? AND coalesce(is_voided,0)=0
        ORDER BY trade_date DESC, created_at DESC
        LIMIT 1
        an  
        SELECT i.currency, i.exchange, i.provider_symbol, i.data_provider_primary,
               mp.currency AS price_currency, mp.provider AS price_provider,
               mp.provider_symbol AS price_provider_symbol,
               mp.close AS latest_price
        FROM instruments i
        LEFT JOIN market_prices mp ON mp.market_price_id = (
            SELECT market_price_id FROM market_prices
            WHERE instrument_id=i.instrument_id AND quality_status IN ('fresh','ok')
            ORDER BY COALESCE(price_timestamp, created_at, price_date) DESC LIMIT 1
        )
        WHERE i.instrument_id=?
        z
        SELECT provider, provider_symbol, provider_market, currency
        FROM instrument_price_mappings
        WHERE instrument_id=? AND mapping_status='mapped' AND provider_symbol IS NOT NULL
        ORDER BY created_at DESC LIMIT 1
        currency_originalr   r  rx   fx_rate_to_chfr   r  	timestampr   rY  price_provider_symbolr  r   rj  r  Tr  c           
         g | ]W}t          |d          t          |d                   pd|d         pd|d         |d                                                   XS r  r  r[   r   r   r   source_qualitydaterI   r   r   ry   )r"   r4   r  r   s     rA   r   z.get_equity_position_detail.<locals>.<listcomp>  s      c  c  c  YZ*!K.@UVWX_V`@a@a@hehstu  tA  tJ  EJ  UV  Wa  Ub  st  uE  sF  G  G  G  R  R  T  T  c  c  cr@   )r  cost_basis_statusday_change_chflast_trade_dater   
source_urlrY  r   rj  r  data_sourcer  price_history)r!  r6   r  r
   r   r   r8   rs   r2   rt   r   r   )rz   r  r   r   baser~   r   r   tx_fx	inst_metarv   inst_currencyr   r  s                 rA   get_equity_position_detailr  S  sY    + 1 1#q 9 9J
"455//## 
 
 
ll
 '
 
 (** 	  	&K(m)rK%2>*0b$'M(:$;$;$A$A$C$Cu$L$L55RYJ05 $/
 

0 #4bAAADLL	 
]#	 	 hjj 
 	 
  hjj   ll	 
  hjj  .7@Ij))DM%`EBU<V`E-..\`  Wer  Wv}  wB  wB  CM  wN  wN  W  RW  X  X  ^  ^  `  `H5 			 5%--%8H2I-			
%,[[1C%D%DcTTJc48B48K00dKK
++W0VR0D0DRV:AKG$566t  E  xA  RKQZ[rQsQs  GK  E  qz  QD  QZ  [l  Qm  Qm  @D3:DW.//wclJv)T^J_J_rv!++&677R7;;z;R;R5:D% 011{{:..\'3[7:3F3FW[(y$GGGRRTTU c  c  ^b  c  c  c   s   $A   BCClist[AuditEntry]c                b   g }g }|r*|                     d           |                     |           |r*|                     d           |                     |           |rdd                    |          z   nd}|                     d| d|                                          }d |D             S )	Nzentity_type=?zentity_id=?zWHERE z AND rZ   zjSELECT audit_id, timestamp, action, entity_type, entity_id, user_text_note, quality_status FROM audit_log z! ORDER BY timestamp DESC LIMIT 50c                    g | ]B}t          |d          |d         |d         |d         |d         |d         |d                   CS )r   r  r{   r|   r}   user_text_notery   )r   r  r{   r|   r}   r   ry   )r   r   s     rA   r   zlist_audit.<locals>.<listcomp>  s      b  b  b  XYJ*;PQRZP[ijkxiy  FG  HS  FT  [\  ]m  [n  @  AQ  R  S  S  S  b  b  br@   )r   r   r   r   )rz   r|   r}   clausesparamswherer   s          rA   
list_auditr    s   GF #'''k""" !}%%%i   07?Hw||G,,,,RE<<  n  FK  n  n  n  pv  w  w  @  @  B  BD b  b  ]a  b  b  b  br@   list[PricePoint]c                >    t          | |d          }d |D             S )Nx   r  c           
         g | ]E}t          |d          t          |d                   pd|d         pd|d         |d                   FS r  )r"   r4   r   s     rA   r   z(market_price_history.<locals>.<listcomp>  s      H  H  H  ~JAkN2G'
2S2S2ZWZefgqere{v{  GH  IS  GT  ef  gw  ex  y  y  y  H  H  Hr@   )r2   )rz   r   r   s      rA   market_price_historyr    sA    "4cBBBD H  H  CG  H  H  H  Hr@   asset_idc                @    t          | |dd          }d |D             S )Nr   <   )r   r  c           
         g | ]E}t          |d          pdt          |d                   |d         pd|d         |d                   FS )r  rZ   r  r   r   r   r  r  )r"   r3   r   s     rA   r   z(crypto_price_history.<locals>.<listcomp>  s      ~  ~  ~  tuJAkN0bQwZ8P8P[\]g[h[qlq|}  I  }J  [\  ]m  [n  o  o  o  ~  ~  ~r@   )r1   )rz   r  r   s      rA   crypto_price_historyr    sC    "4ELLLD ~  ~  y}  ~  ~  ~  ~r@   r   tuple[str | None, str, str]c                   |j         r|                     d|j         f                                          }|t          dd          t	          |d                   t	          |d                   t	          |d                   fS t	          |j        pd                                          }t	          |j        pd                                                                          }|r|st          d	d
          d ||fS )NzFSELECT asset_id, coin_name, symbol FROM crypto_assets WHERE asset_id=?r  zCrypto asset not foundrN   r  	coin_namesymbolrZ   rL   z8coin_name and symbol are required for a new crypto asset)	r  r   r   r
   r8   r  rr   r  r   )rz   r   r   r  r  s        rA   _crypto_asset_identityr    s    Ollcfmfvexyy  C  C  E  E;C8PQQQQ3z?##S[)9%:%:CH<N<NNNG%+,,2244I%2&&,,..4466F pF p4nooooF""r@   r  c                    |                                                                                      dd                              dd          }ddddddddddd	d
                    |d          S )Nr_   rE   r`   zCrypto Initial Snapshotu   Crypto Bestand erhöhenzCrypto Bestand reduzierenzCrypto Bestand korrigierenzCrypto auf 0 setzenzCrypto Transfer)rb   initial_snapshot_additionincreasebestand_erhoehendecreasebestand_reduzieren
correctionmanual_adjustmentset_zeroauf_0_setzentransferzCrypto Anpassungrq   )r  ru   s     rA   _crypto_action_labelr    s    

 
 
"
"
(
(
*
*
2
23
<
<
D
DS#
N
NC5%>-5/929)-%  
c#!""#r@   c                    |                                                                                      dd                              dd          S )Nr_   rE   r`   )rr   rs   r=   )r  s    rA   _crypto_operationr    s@    !!##))++33C==EEc3OOOr@   c                "    t          | d          S )Nr   )r   r)  s    rA   _format_decimalr    s    %r@   	wallet_idr  c          	     @   t                      }|                     d||f                                          }|r.|                     dt          |          ||d         f           d S |                     dt	          d          ||t          |          |f           d S )NzNSELECT crypto_holding_id FROM crypto_holdings WHERE wallet_id=? AND asset_id=?zMUPDATE crypto_holdings SET quantity=?, updated_at=? WHERE crypto_holding_id=?crypto_holding_idzINSERT INTO crypto_holdings(crypto_holding_id, wallet_id, asset_id, quantity, verification_status, created_at) VALUES (?, ?, ?, ?, 'ok', ?)holding)rB   r   r   r  rH   )rz   r  r  r  r<   r\  s         rA   _set_crypto_holdingr    s3   
&&C||lox  {C  oD  E  E  N  N  P  PH mdgvw  hA  hA  CF  HP  Qd  He  gf  	g  	g  	g  	g  	g  c  fk  lu  fv  fv  xA  CK  M\  ]e  Mf  Mf  hk  el  	m  	m  	m  	m  	mr@   from_wallet_idto_wallet_idfee_quantityc                  |                      d||f                                          }|r"t          t          |d                             nt          d          }||z
  |z
  }|dk     rt	          d          |                      d||f                                          }	|	r"t          t          |	d                             nt          d          }
t          | |||           t          | |||
|z              d S )NESELECT quantity FROM crypto_holdings WHERE wallet_id=? AND asset_id=?r  r[   r   negative wallet balance blocked)r  r  r  )r   r   r   r8   rR   r  )rz   r  r  r  r  r  
source_rowsource_beforesource_after
target_rowtarget_befores              rA   _apply_crypto_transfer_holdingsr$    s7   ehv  yA  hB  C  C  L  L  N  NJ<FXGC
: 677888GTWLLM 8+l:La:;;;ehtv~g  A  A  J  J  L  LJ<FXGC
: 677888GTWLLMT`aaaaxR_bjRjkkkkkkr@   c                   t          | |          \  }}}t          |j                  dv rf	 t          t	          |j                            }n+# t          t          f$ r}t          dd          |d }~ww xY w|dk     rt          dd          nt          |j        d          }t          |j                  }t          |j                  }|                     d|j        f                                          }	|	t          d	d
          g }
|dk    rO|j        st          dd          |                     d|j        f                                          }|t          d	d          |j        |j        k    rt          dd          t          |j        d          }|                     d|j        |j        f                                          }|r"t          t	          |d                             nt          d          }|||z   k     rt          dd          t%          t'          d          d| d| d| d|	d          d|d          d| d d|
          S |j                                        s|dvr|
                    d           t%          t'          d          d| d| d| d|	d          d | 	d d|
          S )!N   r  r  rL   zInvalid decimal for quantityrN   r   z!quantity must be zero or positiver  z8SELECT wallet_name FROM crypto_wallets WHERE wallet_id=?r  zWallet not foundr  z)target_wallet_id is required for transferzTarget wallet not foundz+source and target wallets must be differentr  r  r[   r  r  cryptoz: r_   z von wallet_namez nach u    · Fee r   r     rb   r  uW   Notiz ist für Korrekturen/Bestandsänderungen empfohlen und beim Confirm erforderlich.z in r   )r  r  r  r   r8   r  r   rR   r
   rV   r  r   r  r   target_wallet_idr\   r  r  r!   rH   r   rr   r   )rz   r   rE   r  r  r  rU   opr   walletr6  target_walletfeecurrent	availables                  rA   preview_crypto_actionr1    s   1$@@Ay&1226RRR	as7#34455HH *- 	a 	a 	aC8VWWW]``	aa<<C8[\\\\  G,j99	73	4	4B !9::E\\TW^WhVjkkttvvF~4FGGGGH	Z' 	eC8cdddd%_bibza|}}  G  G  I  I C8QRRRR#w'888C8effff#G$8.II,,fipiz  }D  }M  iN  O  O  X  X  Z  Z9@RGC
 344555gcll	x#~%%C8YZZZZ%	*:*:]b  [G  [Gfn  [G  [Gqw  [G  [G  E  FS  T  [G  [G  \i  jw  \x  [G  [G  BE  [G  [G  TX  dp  {C  D  D  D  	D< sB._$_$_qrrreI&6&6HY^  W`  W`bj  W`  W`ms  W`  W`y  AN  zO  W`  W`  U^  W`  W`  mq  }I  T\  ]  ]  ]  ]s   !A A6A11A6r   c                V   |j         st          dd          t          | |          \  }}}t          |j                  }	 ddlm}m}m}m	}	 |dv r> || |||j
        |j        |j        d|j        d|j        	
  
        }
|
j        p|
j        }n|d
v r> || |||j
        |j        |j        d|j        d|j        	
  
        }
|
j        p|
j        }n|dv rG|st%          d           || ||j
        |j        |j        |j        d          }
|
j        p|
j        }ni|dv rO|st%          d          |dv rdn|j        } || ||j
        ||j        |j        d          }
|
j        p|
j        }n|dk    r |st%          d          |j        st%          d           |	| ||j
        |j        |j        |j        |j        |j        d	  	        }
t+          | ||j
        |j        t-          |j        d          t/          |j        d                     |
j        p|
j        }t1          | dd||                                |j        d          }|                                  t7          d||d !          S t%          d"          n1# t$          $ r$}t          dt9          |                    |d }~ww xY w|                     d#|f                                          }|r|d$         n,t1          | d%d||                                |j        d          }t7          d||d&!          S )'NrL   zconfirm=true requiredrN   r   )add_crypto_positionadjust_crypto_positionreduce_crypto_positiontransfer_crypto_positionr)  r  T)	r  r  r  quantity_texteffective_dateoperation_typer   r  coingecko_id>   r  r  r  >   r  r	  z(existing asset is required for reduction)r  r  reduction_quantity_textr8  r   r  >   r  r
  r  r  z)existing asset is required for correctionr&  r[   )r  r  new_quantity_textr8  r   r  r  z'existing asset is required for transferz&target wallet is required for transfer)r  r  r  r7  fee_quantity_textr8  r   r  r  r  )r  r  r  r  r  crypto_transfer_confirmcrypto_transactionrx   r  r  u/   Crypto Transfer bestätigt · Audit geschriebenr  zunsupported crypto actionzQSELECT audit_id FROM audit_log WHERE entity_id=? ORDER BY created_at DESC LIMIT 1r   crypto_action_confirmu-   Crypto Aktion bestätigt · Audit geschrieben)r  r
   r  r  r  jarvis_finance.crypto.manager3  r4  r5  r6  r  r  r8  r   r:  
holding_idr  transaction_idrR   r*  r  r$  rV   r\   r   r  r  r   r8   r   r   )rz   r   r  r  r  r+  r3  r4  r5  r6  r   r}   target_quantityr   rU   	audit_rows                   rA   confirm_crypto_actionrF  %  s   ? M4KLLLL"8w"G"GHi	73	4	4B!G 	O  	O  	O  	O  	O  	O  	O  	O  	O  	O  	O  	OBBB((6]d]n  F  O  `g  `v  Gb  ip  iu  C  RY  Rf  g  g  gF)<V_II333((6]d]n  F  O  `g  `v  GZ  ah  am  w{  JQ  J^  _  _  _F-@II555 M !KLLL++D8wO`  {B  {K  \c  \r  y@  yE  OS  T  T  TF-@IIRRR N !LMMM%'+G%G%GccWM]O++D8wO`  uD  U\  Uk  ry  r~  HL  M  M  MF-@II: L !JKKK+ K !IJJJ--dXV]Vgv}  wO  _f  _o  CJ  CW  ho  h~  EL  EQ  [_  `  `  `F+D8T[Tet{  uM  X`  ah  aq  s}  X~  X~  Mb  cj  cw  yG  MH  MH  I  I  I  I-@Id+DRfr{  FM  FX  FX  FZ  FZ  ah  am  ~B  C  C  CHKKMMM"+U]  hY  Z  Z  Z  Z8999 G G GCHH===3FGps|r~  I  I  K  KI(1  ay$$vdKb  qE  QZ  dk  dv  dv  dx  dx  F  K  \`  8a  8a  8aH+X  `O  P  P  P  Ps   H4J 7J 
J5J00J5tuple[str, str]c                r    d| vrt          dd          t          |                     dd                    S )Nr  rL   z,position_id must be account_id:instrument_idrN   r  )r
   tupler!  )r  s    rA   _position_idsrJ  Q  s?    
+4bcccc""3**+++r@   c                   |                      d||f                                          }|r$t          t          |d         pd                    nt          d          S )NzSELECT SUM(CAST(quantity AS TEXT)) AS quantity FROM transactions WHERE account_id=? AND instrument_id=? AND coalesce(is_voided,0)=0 AND quantity IS NOT NULLr  r[   )r   r   r   r8   )rz   r   r   r   s       rA   _current_equity_quantityrL  W  sy    
,,  v  yC  ER  xS  T  T  ]  ]  _  _C36H73s:-#..///GCLLHr@   c               f   |                      d||f                                          }t          d          }t          d          }|D ]Z}t          t          |d         pd                    }t          t          |d         pd                    }|dk    r
||z  }||z  }[|dk    rd S ||z  S )NzSELECT quantity, gross_amount_original FROM transactions WHERE account_id=? AND instrument_id=? AND coalesce(is_voided,0)=0 AND CAST(quantity AS TEXT) > '0' AND gross_amount_original IS NOT NULLr[   r  gross_amount_originalr   )r   r   r   r8   )	rz   r   r   r   	total_qty
total_costr   qtyr  s	            rA   _weighted_average_costrR  \  s    <<  ]  `j  ly  _z  {  {  D  D  F  FDIJ  c#j/0S1122s367>3??@@77I$JA~~t	!!r@   c                `    |sdS |                      d|f                                          d uS )NFzBSELECT account_id FROM accounts WHERE account_id=? AND is_active=1)r   r   )rz   r   s     rA   _cash_account_existsrT  k  sD     u<<\_i^klluuww  @D  D  Dr@   r   c                   t          |j                  \  }}t          |j        d          }t          |j        d          }t          |j        d          }t          | ||          }||k    rt          dd          ||z  }||z
  }	|	dk     rt          dd	          |j	        
                                }
t          | |
|j        
          \  }}}}t          t          |	          |rt          |          nd           }t!          | ||          }|r|gng }||                    d           t%          t'          d          dd| d|
 dt          |	           |||          S )Nr  price_originalfees_original)r   r   rL   u%   Verkauf würde Bestand negativ machenrN   r   zfees exceed gross proceedsr  uH   Einstand unvollständig: realisierter P&L nur eingeschränkt verfügbar.r  r   zVerkauf u    · Erlös r_   r  )rJ  r  rV   r  rV  r\   rW  rL  r
   r   r   r   r   r   r  r   rR  r   r!   rH   )rz   r   r   r   r  r  feesr/  grossnetr   r  r  r  r  r  avgr6  s                     rA   preview_equity_sellr\  q  s    -g.A B BJ(*55HW+-=>>E !6HHD&t
R_```G'4[\\\\uE
$,C
Qww4PQQQQ%%''H1FtV^krk}1~1~1~.Iw
J_S11w3X773C3C3CTXYYJ
 *M
Z
Z
ZC)1
||rH
{bccceI&6&6H  WXai  WX  WXv~  WX  WX  BQ  RU  BV  BV  WX  WX  eo  {D  OW  X  X  X  Xr@   r   c                   |j         st          dd          t          | |           t          |j                  \  }}t          |j        d          }t          |j        d          }t          |j	        d          }||z  }||z
  }t          | |j        |j                  \  }	}
}}t          t          |          |
rt          |
          nd           }t          t          |          |
rt          |
          nd           }t          t          |          |
rt          |
          nd           }t!          d          }t#                      }|                     d	||||j        t          |           t          |          t          |          t          |          t          |          |j                                        |
||	||||	d
k    rdnd|j        |f           t+          | |j                  rl|                     dt!          d          |j        |j        |j                                        t          |          |
|d| |	d
k    rdnd|j        |f           t/          | dd|j        i |                                t          |          t          |          d|j        |	d
k    rdnd          }|                                  t5          d||d          S )Nr  r  rN   r  rV  rW  r  r  a  
        INSERT INTO transactions(transaction_id, transaction_type, account_id, instrument_id, trade_date, quantity, price_original, gross_amount_original, fee_original, net_amount_original, currency_original, fx_rate_to_chf, fx_source, fx_status, gross_amount_chf, fee_chf, net_amount_chf, source_type, is_confirmed, quality_status, notes, created_at)
        VALUES (?, 'sell', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'vue_equity_sale', 1, ?, ?, ?)
    r   rx   r  zINSERT INTO cash_balances(cash_balance_id, account_id, balance_date, currency, amount_original, fx_rate_to_chf, amount_chf, source_type, quality_status, notes, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)rc   zvue_equity_sale:equity_sell_confirmr  )net_amount_originalrN  r  r  u'   Verkauf bestätigt · Audit geschriebenr  )r  r
   r\  rJ  r  rV   r  rV  r\   rW  r   r   r   r   r  r   rH   rB   r   r   r   rT  cash_account_idr   r  r  r   )rz   r   r   r   r  r  rX  rY  rZ  r  r  r  rE   r  fee_chfnet_chfr  r   r   s                      rA   confirm_equity_sellrc    s   ? Q4OPPPPg&&& -g.A B BJ(*55HW+-=>>E !6HHDuE
$,C'<TGL\ipi{'|'|'|$Iw	1OE224YGG4D4D4DUYZZI/$//W1V1A1A1ARVWWG/#..G0U0@0@0@QUVVG$KKE	BLL  ]G,>QYPY@Z@Z\klq\r\r  uD  EJ  uK  uK  M\  ]a  Mb  Mb  ds  tw  dx  dx  zA  zJ  zP  zP  zR  zR  T[  ]f  hq  s|  ~E  GN  Xa  en  Xn  Xn  PT  PT  t@  BI  BN  PR  
ST T T D'"9:: M  l  ot  u{  o|  o|  ~E  ~U  W^  Wi  kr  k{  kA  kA  kC  kC  ET  UX  EY  EY  [b  dk  mG  @E  mG  mG  QZ  ^g  Qg  Qg  IM  IM  my  {B  {G  IK  nL  	M  	M  	Md#8j\c\o  zp  }D  }O  }O  }Q  }Q  zp  jy  z}  j~  j~  Yh  in  Yo  Yo  zp  zp  zp  w~  wC  \e  ir  \r  \r  TX  TX  xD  E  E  EHKKMMM+  \E  F  F  F  Fr@   r   c                   t          |j                   t          |j        d          }t	          |j        d          t	          |j        d          z   t	          |j        d          z   }||z
  }|dk     rt          dd          t          | |j
                  st          d	d
          t          | |j        |j                  \  }}}}|r|gng }	t          t          d          dd|j                                         dt#          |           t%          t#          |          |rt'          |          nd           ||	          S )Ngross_amount	swiss_taxforeign_taxother_deductionsr   rL   z deductions exceed gross dividendrN   r  zCash account not foundr  r  incomezDividende netto r_   r  )rJ  r  rV   re  r\   rf  rg  rh  r
   rT  r`  r   r   payment_dater!   rH   r   r  r   r   )
rz   r   rY  taxesrZ  r  r  r  r  r6  s
             rA   preview_equity_dividendrl    s   '%&&&W)>::E!'"3[AADYZaZmo|D}D}}  AV  W^  Wo  qC  AD  AD  DE
%-C
Qww4VWWWWg&=>> N4LMMMM1FtV]Vfsz  tH  2I  2I  2I.Iw
J)1
||rHeI&6&6H  W[ipiyii  jB  jB  W[  W[  ET  UX  EY  EY  W[  W[  hs  tC  DG  tH  tH  ^e  Jo  JQ  RY  JZ  JZ  JZ  ko  hp  hp  |E  PX  Y  Y  Y  Yr@   r   c                   |j         st          dd          t          | |           t          |j                  \  }}t          |j        d          }t          |j        d          t          |j	        d          z   t          |j
        d          z   }||z
  }t          | |j        |j                  \  }}}	}
t          t          |          |rt!          |          nd           }t          t          |          |rt!          |          nd           }t          t          |          |rt!          |          nd           }t#          d	          }t%                      }|                     d
||||j        t          |          t          |          t          |          |j                                        ||	|||||dk    rdnd|j        |f           |                     dt#          d          |j        |j        |j                                        t          |          |||dk    rdnd|j        |f
           t/          | dd|j        i |                                t          |          t          |          d|j        |dk    rdnd          }|                                  t5          d||d          S )Nr  r  rN   re  rf  rg  rh  r  r  a  
        INSERT INTO transactions(transaction_id, transaction_type, account_id, instrument_id, trade_date, gross_amount_original, tax_original, net_amount_original, currency_original, fx_rate_to_chf, fx_source, fx_status, gross_amount_chf, tax_chf, net_amount_chf, source_type, is_confirmed, quality_status, notes, created_at)
        VALUES (?, 'dividend', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'vue_equity_dividend', 1, ?, ?, ?)
    r   rx   r  zINSERT INTO cash_balances(cash_balance_id, account_id, balance_date, currency, amount_original, fx_rate_to_chf, amount_chf, source_type, quality_status, notes, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, 'vue_equity_dividend', ?, ?, ?)rc   equity_dividend_confirmr  )r_  tax_originalr  r  u)   Dividende bestätigt · Audit geschriebenr  )r  r
   rl  rJ  r  rV   re  r\   rf  rg  rh  r   r   rj  r   r  r   rH   rB   r   r   r   r`  r   r  r  r   )rz   r   r   r   rY  rk  rZ  r  r  r  rE   r  tax_chfrb  r  r   r   s                    rA   confirm_equity_dividendrq    s}   ? Q4OPPPPD'*** -g.A B BJW)>::E!'"3[AADYZaZmo|D}D}}  AV  W^  Wo  qC  AD  AD  DE
%-C'<TGL\ipi}'~'~'~$Iw	1OE224YGG4D4D4DUYZZI/%00g2W''2B2B2BSWXXG/#..G0U0@0@0@QUVVG$KKE	BLL  ]G,@/RWBXBXZijoZpZp  sB  CF  sG  sG  IP  IY  I_  I_  Ia  Ia  cj  lu  w@  BK  MT  V]  gp  t}  g}  g}  _c  _c  CO  QX  Q]  _a  
bc c c 	LL  |  D  EK  L  L  NU  Ne  gn  g{  }D  }M  }S  }S  }U  }U  Wf  gj  Wk  Wk  mt  v}  GP  T]  G]  G]  C  C  co  qx  q}  A  ~B  C  C  Cd#<*`g`s  ~k  AH  AS  AS  AU  AU  ~k  n}  ~A  nB  nB  Tc  di  Tj  Tj  ~k  ~k  ~k  ry  r~  W`  dm  Wm  Wm  OS  OS  s  @  @  @HKKMMM+  \G  H  H  H  Hr@   r   c                    t          |           }g }|j        r|                    d           t          t	          |j                  t	          |j                  t	          |j                  t	          |j                  |j	        |          S )NzOReview-/Test-Artefakte werden archiviert; manuelle Positionen bleiben erhalten.)r   instrumentstransactionsalertsmanual_positions_preservedr6  )
r'   artifact_countr   r   r}  account_idsinstrument_idstransaction_ids	alert_idsmanual_position_count)rz   planr6  s      rA    cleanup_review_artifacts_previewr~    s    066DH kijjj!3t/?+@+@cRVReNfNfuxy}  zN  vO  vO  X[  \`  \j  Xk  Xk  HL  Hb  mu  v  v  v  vr@   r   c                    |j         st          dd          t          |           }t          | ||j        pd          }t          dd|d	          S )
Nr  r  rN   z%Vue v1.2 review/test artifact cleanup)r}  r   r  equity_review_test_artifactsz!Review-/Test-Artefakte archiviertr  )r  r
   r'   r&   r   r   )rz   r   r}  r   s       rA    cleanup_review_artifacts_confirmr    st    ? Q4OPPPP066D/4glF}V}~~~H+9Wbj  uX  Y  Y  Y  Yr@   r%   c           	        |                     dd          \  }}|                     d||f                                          }h d}h d}t          |          dk    o|d         d         |v o|d         d         |v }|rd	nd
}t	          |t          |          |||rdnt          |          |rg dnddg          S )Nr  r  z
        SELECT transaction_id, transaction_type, source_type, is_voided
        FROM transactions
        WHERE account_id=? AND instrument_id=? AND coalesce(is_voided,0)=0
        ORDER BY created_at
        >   manual_snapshotmanual_dashboardvue_manual_positionvue_manual_snapshotmanual_initial_snapshot>   rb   r  re   r   r  source_typez5Ein manueller Initial Snapshot kann storniert werden.z~Position hat Historie oder stammt nicht eindeutig aus einem manuellen Initial Snapshot. Nur Storno-/Korrekturworkflow erlaubt.)z'Transaktion wird als storniert markiertzAudit-Eintrag wird geschriebenz1Dashboard liest danach den aktualisierten Bestandu   Kein hartes Löschenz*Bitte Korrektur-/Storno-Workflow verwenden)r  transaction_countsafe_to_removereasonaffected_transactionsconsequences)r!  r   r   r}  r%   )	rz   r  r   r   r   safe_source_typessafe_tx_typessafer  s	            rA   preview_remove_positionr    sg    + 1 1#q 9 9J<<	 
]#  hjj 	 I  I  IZZZMt99>zd1g&89]JztTUwWdOeizOzDHL  SDD  SSF([TWX\T]T]nr  |B  _c  Zr  Z[  Z[  il  mq  ir  ir  GK  AW  AC  AC  AC  AC  Rh  jV  QW  X  X  X  Xr@   c           	     ,   |j         r|j        dk    rt          dd          t          | |          }|j        st          d|j                  |                    dd          \  }}|                     d||f                                          }t                      }|                     d	||j
        pd
||d         f           t          | dd||d         |d|j
        pdd          }|                                  t          d||d          S )N	ENTFERNENr  z$Confirmation text ENTFERNEN requiredrN   i  r  r  zjSELECT transaction_id FROM transactions WHERE account_id=? AND instrument_id=? AND coalesce(is_voided,0)=0zUPDATE transactions SET is_voided=1, voided_at=?, void_reason=?, voided_by='vue_dashboard', updated_at=? WHERE transaction_id=?zPosition entfernenrC  position_remove_confirmr  )rC  r  zPosition entferntrx   r  r  zPosition storniertr  )r  confirmation_textr
   r  r  r  r!  r   r   rB   r   r   r  r   )	rz   r  r   r  r   r   r   r<   r   s	            rA   confirm_remove_positionr    s   ? \g7;FF4Z[[[[%dK88G! DGNCCCC + 1 1#q 9 9J
,,  D  GQ  S`  Fa  b  b  k  k  m  mC
&&CLL  S  VY  [b  [g  [  k  AD  FI  JZ  F[  U\  ]  ]  ]d#<*`k  IL  M]  I^  oz  v{  v{  BI  BN  Be  Re  vz  {  {  {HKKMMM+xauvvvvr@   r   c                    |j         pd                                }|st          dd          t          t	          d          dd| dg 	          S )
NrZ   rL   Wallet name requiredrN   r  crypto_walletzWallet erstellen: r   r  r]   r  r  r6  )r   rr   r
   r!   rH   rz   r   r   s      rA   preview_walletr    sx    LB%%''D L4JKKKKeI&6&6O]xrv]x]x  EQ  \^  _  _  _  _r@   r   c           	        |j         st          dd          |j        pd                                }|st          dd          t	          d          }t                      }|                     d|||j        pd	|j        |j	        |f           t          | d
d|||j        d|j	        d          }|                                  t          d||d          S )Nr  r  rN   rZ   rL   r  r,  zINSERT INTO crypto_wallets(wallet_id, wallet_name, wallet_type, platform_provider, is_active, notes, created_at) VALUES (?, ?, ?, ?, 1, ?, ?)	Sonstigeswallet_create_confirmr  )r   wallet_typerx   r  r  zWallet erstelltr  )r  r
   r   rr   rH   rB   r   r  platform_namer   r   r  r   )rz   r   r   r  r<   r   s         rA   confirm_walletr     s[   ? Q4OPPPPLB%%''D L4JKKKKhI
&&CLL  a  dm  os  v}  vI  vX  MX  [b  [p  ry  r~  @C  cD  E  E  Ed#:cl  @D  U\  Uh  wi  wi  pw  p|  MQ  R  R  RHKKMMM+X_pqqqqr@   c           	        |j         st          dd          t          |                     d|f                                          d         pd          }t                      }|dk    r|                     d|f           d}d}n|                     d	||f           d
}d}t          | |d|d|i|j        d          }|                                  t          d|||          S )Nr  r  rN   z6SELECT COUNT(*) FROM crypto_holdings WHERE wallet_id=?r   z,DELETE FROM crypto_wallets WHERE wallet_id=?wallet_delete_confirmu   Wallet gelöschtzEUPDATE crypto_wallets SET is_active=0, updated_at=? WHERE wallet_id=?wallet_deactivate_confirmzWallet deaktiviertr  holdingsrx   r  r  r  
r  r
   intr   r   rB   r   r   r  r   )rz   r  r   r  r<   r{   r  r   s           rA   confirm_delete_walletr    s   ? Q4OPPPP4<< X[dZfggpprrstuzyz{{H
&&C1}}Ci\RRR($\_bdm^nooo,&d6R[fprze{  CJ  CO  `d  e  e  eHKKMMM+X_fggggr@   c                    |j         p|j        pd                                }|st          dd          t	          t          d          dd| dg 	          S )
NrZ   rL   Account name requiredrN   r  r  zKonto erstellen: r   r  )r   r   rr   r
   r!   rH   r  s      rA   preview_accountr     s     6GL6B==??D M4KLLLLeI&6&6IWqkoWqWq  ~J  UW  X  X  X  Xr@   r   r   c          	        |                      d|f                                          }|r|d         S t          d|          }|                      d|||dk    rdnd|                                t	                      f           |S )Nz<SELECT platform_id FROM platforms WHERE lower(name)=lower(?)platform_idr   zINSERT INTO platforms(platform_id, name, platform_type, country, default_currency, is_active, notes, created_at) VALUES (?, ?, ?, 'CH', ?, 1, 'Vue manual account container', ?)r   brokerbank)r   r   r)   r   rB   )rz   r   r   r   r   r  s         rA   _ensure_platformr  '  s    
,,UX\W^
_
_
h
h
j
jC
 "=!!J--KLL  D  GR  TX  fr  vA  fA  fA  Zb  Zb  GM  OW  O]  O]  O_  O_  ae  ag  ag  Fh  i  i  ir@   c           
     F   |j         st          dd          |j        p|j        pd                                }|st          dd          |j        pd                                }t          | |j        pd||j	        	          }t          d
          }t                      }|                     d|||||j	                                        |j        |f           t          | dd|||d|j        d          }|                                  t#          d||d          S )Nr  r  rN   rZ   rL   r  r   zAnderes Konto)r   r   acctzINSERT INTO accounts(account_id, platform_id, account_name, account_type, currency, performance_included, is_active, notes, created_at) VALUES (?, ?, ?, ?, ?, 0, 1, ?, ?)account_create_confirmr  )r   r   rx   r  r  zKonto erstelltr  )r  r
   r   r   rr   r   rs   r  r  r   rH   rB   r   r   r   r   r  r   )rz   r   r   r   r  r   r<   r   s           rA   confirm_accountr  0  s   ? Q4OPPPP 6GL6B==??D M4KLLLL(7K>>@@L"4)>)Q/`lw~  xH  I  I  IKvJ
&&CLL  ~  AK  MX  Z^  `l  nu  n~  nD  nD  nF  nF  HO  HT  VY  @Z  [  [  [d#;^h  DH  Zf  sg  sg  nu  nz  KO  P  P  PHKKMMM+h`pqqqqr@   r   c           
         t          | |          st          dd          t          |j        d          }t	          t          d          dd|j         t          t          |          d          d	g 
          S )NrL   z2Account is not a manually valued managed portfoliorN   total_value_chfr  r   zGesamtwert CHF per r   r   r  )	r   r
   rV   r  r!   rH   valuation_dater4   r8   )rz   r   r   rI   s       rA   preview_account_valuer  @  s    )$
;; j4hiiiiW,.?@@EeI&6&6DW  bPw~  xN  bP  bP  ]r  sv  w|  s}  s}  @  ]A  ]A  MY  df  g  g  g  gr@   r   c                   |j         st          dd          t          | ||           t          |j        d          }t          d          }t                      }|                     d|||j        t          t          |          d          |j        |f           t          | dd	|||j        d
|j        d          }|                                  t          d||d          S )Nr  r  rN   r  acctvalz
        INSERT INTO account_value_snapshots(snapshot_id, account_id, valuation_date, total_value_chf, currency, source_type, quality_status, notes, created_at)
        VALUES (?, ?, ?, ?, 'CHF', 'manual_total_value', 'ok', ?, ?)
        r   account_value_confirmr  )snapshot_idr  rx   r  r  u+   Gesamtwert gespeichert · Audit geschriebenr  )r  r
   r  rV   r  rH   rB   r   r  r4   r8   r   r   r  r   )rz   r   r   rI   r  r<   r   s          rA   confirm_account_valuer  G  s7   ? Q4OPPPP$
G444W,.?@@E	""K
&&CLL	 
j'"8:OPSTYPZPZ\]:^:^`g`lnqr   d#:	]g  BM  ah  aw  rx  rx  F  K  \`  a  a  aHKKMMM+x  bO  P  P  P  Pr@   c           	        |j         st          dd          t          |                     d|f                                          d         pd          t          |                     d|f                                          d         pd          z   }t                      }|                     d||f           d}|rd	nd	}t          | |d
|d|i|j        d          }|                                  t          d|||          S )Nr  r  rN   z4SELECT COUNT(*) FROM transactions WHERE account_id=?r   z5SELECT COUNT(*) FROM cash_balances WHERE account_id=?z@UPDATE accounts SET is_active=0, updated_at=? WHERE account_id=?account_deactivate_confirmzKonto deaktiviertr  history_rowsrx   r  r  r  r  )rz   r   r   has_historyr<   r{   r  r   s           rA   confirm_deactivate_accountr  Z  s   ? Q4OPPPPdll#Y\f[hiirrttuvw|{|}}  AD  EI  EQ  EQ  RI  LV  KX  EY  EY  Eb  Eb  Ed  Ed  ef  Eg  El  kl  Am  Am  mK
&&CLLSVY[eUfggg)F%0I!!6IGd6yJaoq|`}  EL  EQ  bf  g  g  gHKKMMM+h`ghhhhr@   )r7   r8   )rC   r8   r7   r8   )rI   r8   rJ   r8   r7   r   )rI   rW   rJ   r8   r7   r   r   )rI   r8   r]   rW   r7   r8   )rz   r   r{   r8   r|   r8   r}   r8   r~   r   r   r8   ry   r8   r7   r8   )r7   r   )r7   r   )rz   r   r   r8   r7   r   )rz   r   r7   r   )rz   r   r   r   r7   r   )r   rW   r   r   r7   rW   )rz   r   r   r8   r   rW   r7   r   )r   r*   r7   r   )r   r*   r7   r8   )r   r*   r   r   r7   r  )rI   rW   r7   r8   )r*  r8   r7   r8   )r5  r   r6  r7  r7   rW   )r   r*   r   r   r7   r8   )r   r*   r   r   r7   r   )rz   r   r   r    r7   rW   )rz   r   r   r    )ra  rb  r7   rb  )rz   r   r   r   r7   r#   )rz   r   r   r8   r   rW   r7   r  )rz   r   r   r   r7   r!   )rz   r   r   r   r7   r   )rz   r   r   r    r7   r!   )rz   r   r   r   r7   r   )rz   r   r  r8   r7   r   )rz   r   r  r8   )NN)rz   r   r|   rW   r}   rW   r7   r  )rz   r   r   r8   r7   r  )rz   r   r  r8   r7   r  )rz   r   r   r   r7   r  )r  r8   r7   r8   )rI   r   r7   r8   )
rz   r   r  r8   r  r8   r  r   r7   r  )rz   r   r  r8   r  r8   r  r8   r  r   r  r   r7   r  )rz   r   r   r   r7   r!   )rz   r   r   r   r7   r   )r  r8   r7   rG  )rz   r   r   r8   r   r8   r7   r   )rz   r   r   r8   r   r8   r7   r   )rz   r   r   rW   r7   r   )rz   r   r   r   r7   r!   )rz   r   r   r   r7   r   )rz   r   r   r   r7   r!   )rz   r   r   r   r7   r   )rz   r   r7   r   )rz   r   r   r   r7   r   )rz   r   r  r8   r7   r%   )rz   r   r  r8   r   r   r7   r   )rz   r   r   r   r7   r!   )rz   r   r   r   r7   r   )rz   r   r  r8   r   r   r7   r   )
rz   r   r   r8   r   r8   r   r8   r7   r8   )rz   r   r   r8   r   r   r7   r!   )rz   r   r   r8   r   r   r7   r   )rz   r   r   r8   r   r   r7   r   )
__future__r   r   r   decimalr   r   r   sqlite3r   uuidr	   fastapir
   $jarvis_finance.api.schemas.positionsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   jarvis_finance.equity.cleanupr&   r'   jarvis_finance.fx.ratesr(   jarvis_finance.imports.commonr)   "jarvis_finance.market_data.catalogr*   r+   r,   r-   r.   r/   r0   r{   jarvis_finance.market_data.cacher1   r2   #jarvis_finance.services.api_helpersr3   r4   $jarvis_finance.services.cash_servicer5   &jarvis_finance.services.equity_servicer6   rB   rH   rV   r\   rw   r   r   r   r   r   r   r   r   r  r"  r	  r  r'  r   r4  rB  rN  rV  r]  r`  rp  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r$  r1  rF  rJ  rL  rR  rT  r\  rc  rl  rq  r~  r  r  r  r  r  r  r  r  r  r  r  r  r?   r@   rA   <module>r     s   " " " " " " " " " " " " " " - - - - - - - -              ! ! ! ! ! !                                                         : r q q q q q q q : : : : : : 3 3 3 3 3 3                  ^ ] ] ] ] ] ] ] S S S S S S S S A A A A A A F F F F F FW W W W* * * *   	 	 	 	! ! ! ! !( @D 
 
 
 
 
 
v v v v& & & &N N N N   "   @8 8 8 8: : : :O O O d NNN> > > >
	 	 	 	0 0 0 0:H H H H   "t t t t, , , ,   $$ $ $ $N   4! ! ! !.&u &u &u &uR   (J J J J\ \ \ \:_ _ _ _"s s s s@J J J J0X X X Xvb b b b bH H H H
~ ~ ~ ~

# 
# 
# 
## # # #"P P P P   m m m m	l 	l 	l 	l!] !] !] !]H)P )P )P )PX, , , ,I I I I
" " " "D D D DX X X X,F F F F6Y Y Y YH H H H0v v v vY Y Y YX X X X$w w w w_ _ _ _r r r rh h h h$X X X X   r r r r g g g gP P P P&
i 
i 
i 
i 
i 
ir@   