
    aj@,                       d dl mZ d dlmZ d dlZd dlmZ d dlmZm	Z	 d dl
mZmZ d dlmZ d dlmZmZ d d	lmZmZ d d
lmZmZmZ d dlmZ d dlmZ d ZddddZddZddZ ddZ!ddZ"ddZ#ddZ$ddZ%ddZ&ddZ'dS )    )annotations)DecimalN)set_manual_fx_override)HistoricalFxUnavailableMockFxProvider)update_fx_ratesupsert_fx_rate)calculate_positions)"ensure_instrument_metadata_qualityupdate_instrument_metadata) confirm_instrument_price_mapping'ensure_instrument_price_mapping_quality)MockEquityPriceProviderrefresh_market_pricesstore_market_price)connect_memory)apply_migrationsc                     t                      } t          |            |                     d           |                     d           |                     d           | S )Nz|INSERT INTO platforms(platform_id,name,platform_type,default_currency,created_at) VALUES('p1','Broker','broker','CHF','now')zINSERT INTO accounts(account_id,platform_id,account_name,account_type,currency,created_at) VALUES('a1','p1','Account','brokerage','CHF','now')zINSERT INTO instruments(instrument_id,asset_class,name,ticker,isin,exchange,currency,created_at) VALUES('usd1','ETF','USD ETF','USETF','US0000000001','NYSE','USD','now'))r   r   executeconns    .tests/unit/test_true_wealth_valuation_pilot.py
setup_connr      s}    DTLL  P  Q  Q  QLL  b  c  c  cLL  }  ~  ~  ~K    missing	fx_statusfx_ratec               6    |                      d||f           d S )Na_  
        INSERT INTO transactions(transaction_id, transaction_type, account_id, instrument_id, trade_date, quantity, currency_original, fx_status, fx_rate_to_chf, source_type, is_confirmed, quality_status, created_at)
        VALUES('tx-usd','initial_position_snapshot','a1','usd1','2025-12-31','2','USD',?,?, 'true_wealth',1,'warning','now')
        )r   )r   r   r   s      r   add_snapshotr       s1    LL	 
G    r   returnNonec                    t                      } t          | d          }|j        dk    sJ |                     d                                          d         dk    sJ t          | dddd	d
ddd	  	         |                     d                                          d         dk    sJ |                     d                                          d         dk    sJ d S )Nusd1instrument_idmissing_provider_symbolz\SELECT COUNT(*) AS c FROM alerts WHERE rule_id='missing_provider_symbol' AND status='active'c   mockUSETF.NNYSEmanualzconfirmed in pilotunhedgedactiver&   providerprovider_symbolprovider_market
confidencenotehedge_statusinstrument_statuszSSELECT COUNT(*) AS c FROM audit_log WHERE action='confirm_instrument_price_mapping'r   )r   r   mapping_statusr   fetchoner   )r   results     r   Btest_provider_symbol_missing_alert_and_confirm_resolves_with_auditr;   %   sn   <<D4TPPPF $=====<<vww  A  A  C  C  DG  H  LM  M  M  M  M$T&bk  ~D  QY  `t  CM  ai  j  j  j  j<<mnnwwyyz}~  CD  D  D  D  D<<vww  A  A  C  C  DG  H  LM  M  M  M  M  M  Mr   c                 $   t                      } t          | d           |                     d                                          d         dk    sJ t	          | dddd	           |                     d
                                          }|d         dk    sJ |d         dk    sJ |                     d                                          d         dk    sJ |                     d                                          d         dk    sJ d S )Nr$   r%   zYSELECT COUNT(*) AS c FROM alerts WHERE rule_id='hedge_status_unknown' AND status='active'r(   r)   hedgedCHFzmanual hedge confirmation)r&   r6   hedged_to_currencyr5   zeSELECT hedge_status,is_currency_hedged,hedged_to_currency FROM instruments WHERE instrument_id='usd1'r6   is_currency_hedgedzMSELECT COUNT(*) AS c FROM audit_log WHERE action='update_instrument_metadata'r   )r   r   r   r9   r   r   insts     r   1test_hedge_status_unknown_warns_and_change_auditsrC   1   ss   <<D&t6BBBB<<stt}}  AD  E  IJ  J  J  J  Jt6ej  rM  N  N  N  N<<  A  A  J  J  L  LD8++++$%****<<ghhqqsstwx|}}}}}<<stt}}  AD  E  IJ  J  J  J  J  J  Jr   c            
     l   t                      } t          | dd           t          | ddddd	           t          | dd
t	          d          dddd           t          | ddd
t	          d          dd           t          |           j        d         }|j        J d|j	        v sJ |j
        J d S )Nok0.9r   r$   r=   r>   r/   zhedged review)r&   r6   r?   r7   r5   
2026-01-0210USDr*   r+   2026-01-02T20:00:00+00:00r&   
price_dateclosecurrencyr1   r2   price_timestampz0.91rM   base_currencyquote_currency	rate_daterater1   	rate_typea1r$   currency_hedged_fx_attribution)r   r    r   r   r   r	   r
   	positionsmarket_value_chfquality_warningstotal_return_chf)r   poss     r   ?test_chf_hedged_instrument_marks_fx_attribution_not_free_fx_pnlr^   ?   s!   <<Du5555t6ej  G  N]  ^  ^  ^  ^t6lRYZ^R_R_jo  {A  S\  nI  J  J  J  J4uUlahioapap  |B  NU  V  V  V  V
d
#
#
-n
=C++++s/CCCCC'''''r   c                    t                      } t          |            t          i dh          }t          | |dgd          }|j        dk    sJ |                     d                                          }|d         d	k    sJ |                     d
                                          d         dk    sJ |                     d                                          d         dk    sJ d S )N)rI   r>   
2025-12-31)unavailablerI   r`   )r1   
currenciesrS   r)   zcSELECT quality_status,error_status FROM fx_rates WHERE base_currency='USD' AND quote_currency='CHF'quality_statusmanual_override_requiredz^SELECT COUNT(*) AS c FROM alerts WHERE rule_id='historical_fx_unavailable' AND status='active'r(   z]SELECT COUNT(*) AS c FROM alerts WHERE rule_id='manual_override_required' AND status='active')r   r    r   r   warning_countr   r9   )r   r1   r:   rows       r   Jtest_historical_fx_unavailable_sets_manual_override_required_without_crashrg   M   sR   <<Db/K.LMMMHTH%T`aaaF1$$$$
,,|
}
}  G  G  I  IC $>>>>><<xyy  C  C  E  E  FI  J  NO  O  O  O  O<<wxx  B  B  D  D  EH  I  MN  N  N  N  N  N  Nr   c            
         t                      } t          |            |                     d           t          j        t
                    5  t          | dddt          d          d           d d d            n# 1 swxY w Y   t          | dddt          d          d           |                     d	                                          d
         dk    sJ |                     d                                          d         dk    sJ d S )NzINSERT INTO alerts(alert_id,priority,category,entity_type,entity_id,rule_id,message,status,created_at) VALUES('m1','kritisch','fx','instrument','usd1','manual_override_required','manual','active','now')rI   r>   r`   rF    )rQ   rR   rS   rT   r5   zstatement ratezESELECT COUNT(*) AS c FROM audit_log WHERE action='manual_fx_override'r(   r)   z-SELECT status FROM alerts WHERE alert_id='m1'statusresolved)	r   r    r   pytestraises
ValueErrorr   r   r9   r   s    r   Itest_manual_fx_override_requires_note_audits_and_resolves_manual_requiredro   [   s   <<DLL  ^  _  _  _	z	"	" F Ft5Zfmtuzm{m{  CE  	F  	F  	F  	FF F F F F F F F F F F F F F F 4uUVbipqviwiw  O  P  P  P  P<<_``iikkloptuuuuu<<GHHQQSST\]akkkkkkks   #A;;A?A?c                    t                      } t          | dddddddd		  	         |                     d
           t          | t	          dt          d          i          dd          }|j        dk    sJ |                     d                                          d         dk    sJ t          | dddd           t          | t	          dd i          dd          }t          | t	          dd i          dd          }|j	        dk    sJ |j	        dk    sJ |                     d                                          d         dk    sJ d S )Nr$   r*   r+   r,   r-   mapr.   r/   r0   zINSERT INTO alerts(alert_id,priority,category,entity_type,entity_id,rule_id,message,status,created_at) VALUES('mp1','warnung','market_data','instrument','usd1','missing_market_price','missing','active','now')rH   etfrG   )r1   asset_classrL   r)   z.SELECT status FROM alerts WHERE alert_id='mp1'rj   rk   delistedexclude_from_auto_price_updatezstatus reviewr&   r7   valuation_policyr5   z
2026-01-03zZSELECT COUNT(*) AS c FROM alerts WHERE rule_id='delisted_or_suspended' AND status='active'r(   )
r   r   r   r   r   r   updated_countr9   r   excluded_count)r   r:   result2result3s       r   Otest_market_price_resolves_missing_and_delisted_is_excluded_without_alert_floodr|   h   s   <<D$T&bk  ~D  QY  `e  t~  RZ  [  [  [  [LL  d  e  e  e"42I9V]^bVcVcJd2e2esx  FR  S  S  SF1$$$$<<HIIRRTTU]^blllllt6Z  kK  Ra  b  b  b  b#D3JIW[K\3]3]kp  ~J  K  K  KG#D3JIW[K\3]3]kp  ~J  K  K  KG!Q&&&&!Q&&&&<<tuu~~  A  A  BE  F  JK  K  K  K  K  K  Kr   c            
        t                      } t          | dd           t          | dddd           t          | dd	t	          d
          dddd           t          | ddd	t	          d          dd           t          |           j        d         }|j        dv sJ | 	                    d           | 	                    d           t          | dddt	          d          dd           t          | d          j        d         }|j        dk    sJ | 	                    d          
                                d         dk    sJ d S )NrE   rF   r   r$   r.   r/   review)r&   r6   r7   r5   rG   rH   rI   r*   r+   rJ   rK   r>   rM   rP   rV   >   aligned
acceptablezDELETE FROM fx_ratesz#UPDATE alerts SET status='resolved'
2026-01-01r)   )max_price_fx_time_delta_hoursstale_mismatchzTSELECT COUNT(*) AS c FROM alerts WHERE rule_id='stale_valuation' AND status='active'r(   )r   r    r   r   r   r	   r
   rY   valuation_timestamp_statusr   r9   )r   r]   pos2s      r   2test_timestamp_alignment_and_stale_valuation_alertr   x   s   <<Du5555t6
fnu}~~~~t6lRYZ^R_R_jo  {A  S\  nI  J  J  J  J4uUlahinaoao  {A  MT  U  U  U  U
d
#
#
-n
=C)-FFFFFLL'(((LL67774uUlahinaoao  {A  MT  U  U  U  Ut1EEEOP^_D*.>>>>><<nooxxzz{~  DE  E  E  E  E  E  Er   c            	        t                      } t          | ddt          d          ddd           t          | ddt          d	          ddd           |                     d
                                          }|d         dk    sJ |d         dk    sJ |                     d                                          d         dk    sJ d S )Nr$   r   100rI   r*   r+   )r&   rL   rM   rN   r1   r2   rG   50ztSELECT corporate_action_status,split_or_corporate_action_review_required FROM instruments WHERE instrument_id='usd1'corporate_action_status	suspected)split_or_corporate_action_review_requiredr)   z_SELECT COUNT(*) AS c FROM alerts WHERE rule_id='corporate_action_suspected' AND status='active'r(   )r   r   r   r   r9   rA   s     r   Etest_corporate_action_large_price_move_flags_no_auto_split_correctionr      sH   <<Dt6lRYZ_R`R`kp  |B  T]  ^  ^  ^  ^t6lRYZ^R_R_jo  {A  S\  ]  ]  ]  ]<<  O  P  P  Y  Y  [  [D)*k9999;<AAAA<<yzz  D  D  F  F  GJ  K  OP  P  P  P  P  P  Pr   c            
     8   t                      } t          | dd           t          | ddddd	           t          |           j        d
         }|j        dk    sJ t          | ddt          d          dddd           t          | dddt          d          dd           t          |           j        d
         }|j        dk    sJ |j	        J d|j
        v sJ t          | dddd           t          |           j        d
         }|j        dk    sJ d S )NrE   rF   r   r$   r.   r/   
none_knownr~   )r&   r6   r7   r   r5   rV   partially_valuablerG   rH   rI   r*   r+   rJ   rK   r>   rM   rP   valuablesnapshot_onlyrt   ru   excluderv   not_valuable)r   r    r   r
   rY   valuation_statusr   r   r	   r\   r[   )r   pos_missingr]   pos_blockeds       r   Htest_valuation_statuses_and_total_return_remains_incomplete_for_snapshotr      s   <<Du5555t6
fn  IU  \d  e  e  e  e%d++5nEK'+?????t6lRYZ^R_R_jo  {A  S\  nI  J  J  J  J4uUlahinaoao  {A  MT  U  U  U  U
d
#
#
-n
=C:----'''c22222t6Z  kK  R[  \  \  \  \%d++5nEK'>999999r   )r!   r"   )(
__future__r   decimalr   rl   jarvis_finance.fx.overridesr   jarvis_finance.fx.providersr   r   jarvis_finance.fx.ratesr   r	   jarvis_finance.ledger.positionsr
   &jarvis_finance.market_data.instrumentsr   r   #jarvis_finance.market_data.mappingsr   r   !jarvis_finance.market_data.pricesr   r   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r    r;   rC   r^   rg   ro   r|   r   r   r    r   r   <module>r      s   " " " " " "        > > > > > > O O O O O O O O C C C C C C C C ? ? ? ? ? ? q q q q q q q q y y y y y y y y p p p p p p p p p p : : : : : : > > > > > >   %.t     	M 	M 	M 	MJ J J J( ( ( (N N N N
l 
l 
l 
lK K K K E E E E"P P P P: : : : : :r   