
    pjfp                    0   d dl mZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ d dlmZ dZd Zdddd4dZdddd5d!Zd" Zd# Zd$ Z d% Z!d& Z"d' Z#d( Z$d) Z%d* Z&d+ Z'd, Z(d- Z)d. Z*d/ Z+d0 Z,d1 Z-d2 Z.d3 Z/dS )6    )annotationsDecimalSimpleNamespace)wealth_cockpit)CashSnapshotConfirmRequest)WealthCockpitResponse)confirm_cash_snapshot)!set_performance_cashflow_coverage$set_performance_scope_classification)build_portfolio_performance)connect_memory)apply_migrations2026-08-01T12:00:00+00:00c                     t                      } t          |            |                     dt          f           |                     dt          f           |                     dt          f           |                     dt          f           | S )Nz_INSERT INTO platforms(platform_id,name,platform_type,created_at) VALUES('bank','Bank','bank',?)zeINSERT INTO platforms(platform_id,name,platform_type,created_at) VALUES('broker','Broker','broker',?)zINSERT INTO accounts(account_id,platform_id,account_name,account_type,currency,performance_included,is_active,created_at)
           VALUES('bank-a','bank','Household bank','cash','CHF',0,1,?)zINSERT INTO accounts(account_id,platform_id,account_name,account_type,currency,performance_included,is_active,created_at)
           VALUES('depot','broker','Investment account','brokerage','CHF',0,1,?))r   r   executeNOWconns    $tests/unit/test_wealth_cockpit_v1.pybase_dbr      s    DTLLi	   	LLo	   	LL	J	  
 	LL	T	  
 K    N
2026-03-01)groupattx_idstr
account_idkindamountr   
str | Noner   c               `    |                      d||||||||ddddd| t          |f           d S )Na~  INSERT INTO transactions(
             transaction_id,transaction_type,activity_kind,account_id,trade_date,booking_date,
             event_timestamp,net_amount_original,currency_original,fx_rate_to_chf,source_type,
             source_id,row_hash,is_confirmed,is_voided,quality_status,created_at,internal_transfer_group_id)
           VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,1,0,'ok',?,?)CHF1synthetic_importfixturezhash-r   r   )r   r   r   r    r!   r   r   s          r   add_activityr)   .   s`    LL	=
 
dJBFE3HZ\egvotgvgvx{  ~C  	D    r   r$   r%   currencyfxsnapshot_idvaluer+   r,   c               V    |                      d|ddd||||t          d| f
           d S )Na  INSERT INTO portfolio_valuation_snapshots(
             snapshot_id,scope_kind,scope_id,account_id,value_original,currency,base_currency,
             fx_rate_to_base,fx_direction,valuation_at,source,captured_at,snapshot_version,
             source_reference,quality_status,reason_codes_json)
           VALUES(?,?,?,?,?,?,'CHF',?,'original_to_base',?,'synthetic',?,1,?,'complete','[]')accountdepotzref-r(   )r   r-   r   r.   r+   r,   s         r   add_valuationr2   9   sW     	LL	a  ;  	
    r   c                    t                      } t          | ddddd           t          | dddd	d           t          | d
dd
dd           t          | ddddd           t          | ddddd           t          j        | ddgddt                    }t          j        | dgddt                    }|g k    sJ |ddddgk    sJ d S )Nzbank-legbank-ainternal_transferz-1000zpair-1)r   z	depot-legr1   1000buyz-700z
2026-03-02r   sell300z
2026-03-03dividend50z
2026-03-04
2026-01-01
2026-12-31)account_ids	from_dateto_datedata_cutoffr   external_deposit1000.00)r   r    
amount_chf)r   r)   cockpitscope_cashflowsr   )r   	householdinvestmentss      r   dtest_scope_boundary_keeps_household_transfer_neutral_but_counts_portfolio_deposit_and_ignores_tradesrJ   W   s.   99Dz8-@'QYZZZZ{G-@&PXYYYYugufFFFFvw,GGGGz7JNNNN'w'  I )I  K ????%7yQQ      r   c            
     
   t                      } t          | dddddt                     t          | dddd	dd
t                     t	          | ddd           t	          | ddd           t	          | ddd           t          | ddddd           t          | dddt                    }t          | dddt                    }||k    sJ |d         d         dk    sJ |d         d         dk    sJ |d         d         J d S )Nr1   Tcrypto_portfoliotestzsynthetic complete portfolior   includedclassification_rolesourcenoteclassified_atr=   r>   completesynthetic complete historyr   coverage_fromcoverage_tostatusrQ   rR   recorded_atopen10000boundaryr   11000close13000depositrC   r6   r8   twrr@   rA   methodrB   summarynet_external_cashflowsinvestment_result2000ttwror_cumulative)r   r   r   r   r2   r)   r   )r   firstseconds      r   `test_canonical_performance_engine_adjusts_investment_result_for_net_deposit_and_is_deterministicrl   t   sh   99D(.+    &" )	 	 	 	 $g666$
L':::$w777y'+=v,WWWW'l5VY  E )l5VY  F F????45????/0F::::/0<<<<<r   c            
     V   t                      } t          | dddddt                     t          | dddd	dd
t                     t	          | ddd           t          | dddt                    }|d         d         J |d         d         J d|d         d         d         v sJ d S )Nr1   TrL   rM   zsynthetic incomplete portfoliorN   r=   r>   rT   rU   rV   r_   r`   rb   rc   re   ri   rg   missing_opening_valuationqualityttwrorreason_codesr   r   r   r   r2   r   )r   results     r   5test_missing_opening_value_never_creates_false_returnrt      s    99D(.-    &" )	 	 	 	 $w777(l5VY  F )01999)01999&&*;H*En*UUUUUUUr   c            
        t                      } t          | dddddt                     t          | dddd	dd
t                     t	          | ddddd           t	          | ddddd           t          | dddt                    }|d         d         dk    sJ |d         d         dk    sJ t                      }t          |dddddt                     t          |dddd	dd
t                     t	          |ddddd            t	          |ddddd            t          |dddt                    }|d         d         J d|d          d!         d"         v sJ d S )#Nr1   TrL   rM   zsynthetic FX portfoliorN   r=   r>   rT   rU   rV   zeur-openr\   EURz0.9r*   z	eur-closer^   z1.0rb   rc   re   opening_valuez9000.0closing_valuez11000.0zsynthetic missing FX portfoliozmissing-openzmissing-closeri   
missing_fxro   rp   rq   rr   )r   rs   missingunavailables       r   Otest_fx_uses_stored_canonical_rate_at_each_stichtag_and_missing_fx_fails_closedr|      s   99D(.%    &" )	 	 	 	 $
L'EeTTTT$\7UuUUUU(l5VY  F )_-9999)_-::::iiG(.-    &" )	 	 	 	 '><5UYZZZZ'?L'EVZ[[[[-<eY\  K y!"56>>>;y1(;NKKKKKKKr   c                   t          dddd d          |                     t          dfd           |                     t          dd	            |                     t          d
d            |                     t          dd            |                     t          dd            t          j        t	                      t          j        ddd                    }|d         t          d          k    sJ |d         t          d          k    sJ t          d |d         D                       |d         k    sJ d |d         D                                 d          dk    sJ t          d |d         D                       sJ t          d |d         D                       d         d k    sJ t          d! |d         D                       sJ d S )"N
Raiffeisen100.00
2026-07-31Aktuell)platformrE   last_manual_reconciliationlast_imported_bookingrY   get_cash_summaryc                (    t          dg          S )Nr   cash_chf	positionsr   )r   cash_positions    r   <lambda>zjtest_current_distribution_counts_truewealth_once_keeps_unassigned_visible_and_reconciles.<locals>.<lambda>   s    /[cp}o~BBB r   get_equity_summaryc                (    t          dddd          S )N200.00Tr   r   valued_partial_chfcoverage_completeunvalued_positionsas_ofr   r   s    r   r   zjtest_current_distribution_counts_truewealth_once_keeps_unassigned_visible_and_reconciles.<locals>.<lambda>   s'    _TXmn  wC  D  D  D r   list_crypto_positionsc                &    t          dd          gS )N50.00r   market_value_chflast_price_updater   r   s    r   r   zjtest_current_distribution_counts_truewealth_once_keeps_unassigned_visible_and_reconciles.<locals>.<lambda>  s    owRmnnno r   _truewealthc                $    t          d          dfS )Nr:   r   r   r   s    r   r   zjtest_current_distribution_counts_truewealth_once_keeps_unassigned_visible_and_reconciles.<locals>.<lambda>  s    gennl=[ r   _unassigned_valuesc                .    t          d          ddddgfS )N25u   Bestätigter weiterer Wert25.00r   )label	value_chfr   r   r   s    r   r   zjtest_current_distribution_counts_truewealth_once_keeps_unassigned_visible_and_reconciles.<locals>.<lambda>
  s!    gdmm0L[bmy&z&z%{| r           r   totalz675.00rI   z575.00c              3  @   K   | ]}t          |d                    V  dS )r   Nr   .0rows     r   	<genexpr>zktest_current_distribution_counts_truewealth_once_keeps_unassigned_visible_and_reconciles.<locals>.<genexpr>  s/      LLSws;'((LLLLLLr   distributionc                    g | ]
}|d          S )key r   s     r   
<listcomp>zltest_current_distribution_counts_truewealth_once_keeps_unassigned_visible_and_reconciles.<locals>.<listcomp>  s    :::3CJ:::r   
truewealthc              3  F   K   | ]}|d          dk    o|d         dk    V  dS )r   otherr   r   Nr   r   s     r   r   zktest_current_distribution_counts_truewealth_once_keeps_unassigned_visible_and_reconciles.<locals>.<genexpr>  s:      hhs5zW$D[)9W)Dhhhhhhr   c              3  2   K   | ]}|d          dk    |V  dS r   cryptoNr   r   s     r   r   zktest_current_distribution_counts_truewealth_once_keeps_unassigned_visible_and_reconciles.<locals>.<genexpr>  s0      LLSZ85K5K5K5K5K5KLLr   sourcesfreshness_statusfreshc              3  B   K   | ]}|d          dv |d         dk    V  dS )r   >   postfinance-investmentsr   r   reconciliation_statusnot_assessableNr   r   s     r   r   zktest_current_distribution_counts_truewealth_once_keeps_unassigned_visible_and_reconciles.<locals>.<genexpr>  sJ        u:LLL 	#$(88LLLL r   )r   setattrrF   _current_valuesr   dater   sumcountanynextall)monkeypatchcurrentr   s     @r   Xtest_current_distribution_counts_truewealth_once_keeps_unassigned_visible_and_reconcilesr      sW   ##/"  M !35555  A  A  A 	D  	D  
 oo  
 0[0[\\\||   %giiw|D!Q7O7OPPPG7wx000000=!WX%6%66666LLGN4KLLLLLPWX_P`````::'."9:::@@NNRSSSSShhPWXfPghhhhhhhhLLwy1LLLLLM_`dkkkkk  9%         r   c                   t          d          t          d          t          d          dddddd	d
ddddddddddgg dddg d
ddddddg diddddgd|                     t          dfd            |                     t          d!d"            |                     t          d#d$            |                     t          d%fd&           |                     t          d'd(            |                     t          d)d*            |                     t          d+d,            |                     t          d-d.            t          j        t	                      d/d0t
          1          }t          j        t	                      d/d0t
          1          }||k    sJ |d2         d3         d4k    sJ |d5         d6dd7d8d9k    sJ |d:         d;         d<k    sJ |d:         d=         d>k    sJ |d:         d?         dk    sJ t          |d@                   dAk    sJ t          |dB                   dCk    sJ d S )DNr6   700r:   TcashBankguthaben300.00)r   r   r   equityzAktien und ETFs700.00r   True Wealth0.00r      Kryptowährungenr   r   )
r   rI   r   rT   r   r   
data_as_ofunpriced_countmissing_cash_countunassigned_itemsr<   100z0.05)rg   rf   ri   rp   rT   )rY   rq   r   rC   )r   r    r!   )re   ro   external_cashflowsr   c                    S Nr   )r   r   r   s     r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>7  s     r   _latest_data_cutoffc                    t           S r   )r   r   s    r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>8  s    S r   _latest_valuation_datec                    |S r   r   )r   fallbacks     r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>9  s    RZ r   r   c                     S r   r   )argskwargsperfs     r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>:  s    X\ r   rG   c                     g S r   r   r   r   s     r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>;  s    B r   build_reconciliation_snapshotc                    dddigg dS )NstalerY   
difference)data_quality_statusreconciliations	snapshotsr   )r   nows     r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>?  s    #*!)< 89
 
 r   _policy_comparisonc                    dd g d dS )NF)
configuredversionrowscontributionr   )r   r   s     r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>E  s"    \anr|~  QU  NV  NV r   get_annual_budget_assistantc                     ddddgiS )Nsummary_kpisfree_after_special500.00r   r   r   r   s     r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>I  s    :N]e2f2f1g h r   ytd
2026-08-01)periodr   rB   totalscaptured_wealth_chfrD   planningr   z/planning/budget/planningF)free_plannable_chf	availablelinkincluded_in_wealthdata_qualityr   r{   r   r   performance_statuskpis   hints   )r   r   rF   build_wealth_cockpitr   r   len)r   rj   rk   r   r   s      @@r   Gtest_cockpit_keeps_planning_separate_and_quality_dimensions_independentr    s   u~~^(KK'8xPP =vNN'9OO	
 " G& "&&+!'
 

 RHHI&2<NZ_``a D !24O4O4O4OPPP!68H8HIII!9;Z;Z[[[!>@\@\@\@\]]]!24N4NOOO'	
 	
   !5  8V  8V  W  W  W%hh   (5befffE)'))EcfgggFF?????01Y>>>>&+#	! !      !34EEEE !89\IIII !56*DDDDuV}""""uW~!######r   c                H   |                      t          dd            dt          d          ddddd	dd
dddddgd}t          j        t	                      |          }|d         dk    sJ |d         dddk    sJ t          d |d         D                       sJ d S )Nactive_policyc           	     ,    ddddddddd	d
dddgddS )NTr	  r   r   302040)asset_class
target_pct	lower_pct	upper_pctr   706080)r   monthly_contributionallocations)r   policyr   r   s    r   r   zhtest_existing_versioned_policy_supports_contribution_orientation_without_schema_change.<locals>.<lambda>b  sF    (0$*$T`dee$,Dtbfgg  

 

 r   Tr6   r   r   r   r   r   r   r   r   rT   r   r   r   r	  r   r   z6000.00)monthly_target_chfannual_target_chfc              3  .   K   | ]}|d          dk    V  dS )rY   within_rangeNr   r   s     r   r   zitest_existing_versioned_policy_supports_contribution_orientation_without_schema_change.<locals>.<genexpr>~  s+      II3s8}.IIIIIIr   r   )r   rF   r   r   r   r   )r   r   r  s      r   Vtest_existing_versioned_policy_supports_contribution_orientation_without_schema_changer"  ^  s    
	
 
	
    22844 v66622	
	 	G '		7;;F)!!!!.!&&& &     II&.IIIIIIIIIIr   c            	     D   t                      } t          j        | dt          j        ddd                    t          j        ddd          t          j        ddd          fk    sJ t          j        | dt          j        ddd                    t          j        ddd          t          j        ddd	          fk    sJ t          j        | d
t          j        ddd                    t          j        ddd          t          j        ddd          fk    sJ d S )Nr   r   r   r   r   r   previous_yeari        12m)r   rF   period_boundsr   r   s    r   ?test_period_boundaries_cover_year_change_and_last_twelve_monthsr*    s;   99D e7<aQR;S;STTTT1a  T1a  Y      oW\RVXY[\E]E]^^^T1a  T2r""c      e7<aQR;S;STTTT1a  T1a  Y      r   c                 h   t                      } t          j        | t          j        ddd                    }t	          d |d         D                       }t	          d |d         D                       }|d	         J t	          d
 |d         D                       d	         	 J t	          d |d         D                       d	         	 J |d         J |d         dk    sJ |d         dk    sJ t          d |d         D                       sJ |d         dk    sJ |d         du sJ d S )Nr   r   r   r   c              3  2   K   | ]}|d          dk    |V  dS )r   r   Nr   r   s     r   r   zStest_cash_account_without_snapshot_or_import_is_missing_not_zero.<locals>.<genexpr>  s0      SSCc%jF>R>RC>R>R>R>RSSr   r   c              3  2   K   | ]}|d          dk    |V  dS )r    r   Nr   r   s     r   r   zStest_cash_account_without_snapshot_or_import_is_missing_not_zero.<locals>.<genexpr>  s0      ZZsCK><Y<Ys<Y<Y<Y<YZZr   r   r   c              3  2   K   | ]}|d          dk    |V  dS )r   r   Nr   r   s     r   r   zStest_cash_account_without_snapshot_or_import_is_missing_not_zero.<locals>.<genexpr>  0      QQ#e*:P:P:P:P:P:PQQr   c              3  2   K   | ]}|d          dk    |V  dS r   r   r   s     r   r   zStest_cash_account_without_snapshot_or_import_is_missing_not_zero.<locals>.<genexpr>  r/  r   current_value_chfcurrent_value_status	not_readyr   r   c              3  .   K   | ]}|d          dk    V  dS )r   zInvestment accountNr   )r   rQ   s     r   r   zStest_cash_account_without_snapshot_or_import_is_missing_not_zero.<locals>.<genexpr>  s,      XX6vg"66XXXXXXr   r   rT   F)r   rF   r   r   r   r   )r   r   cash_rowbank_sources       r   @test_cash_account_without_snapshot_or_import_is_missing_not_zeror7    s   99D%d',tQ2J2JKKKGSS7>#:SSSSSHZZgi&8ZZZZZKK (((QQw~6QQQQQ	   QQw~6QQQQQ	   *+333-.+====./3CCCCCXXWYEWXXXXXXXX'(A----:%''''''r   c                    t                      } dD ],\  }}t          | t          dd||dd| d                     -dt          d          d	d
dddddd ddddgd}t	          j        | t	          j        ddd          t	          j        ddd          |t	          j        ddd                    \  }}|ddddd
dgk    sJ d|v sJ d S )N))r=   r   )r   120.00r4   manual_balance	syntheticzpreview-T)r   snapshot_typebalance_daterE   rR   
preview_idconfirm120r   r9  r   r   r   r   r   r  r   r   r   r@   rA   r   r   r=   r   r   r   r      nicht ergänzt)r   r   r	   r   rF   _household_historyr   )r   dayr.   r   pointsreasons         r   Rtest_household_history_uses_only_complete_exact_stichtags_and_supports_year_changerH    sU   99DJ 
 

U&#.   +c++  	
 	
 	
 	
 22622 t44622	
	 	G /,tQ**T1a((l4A&&  NFF (33(33     v%%%%%%r   c                    t                      } |                     d           t          | dddddt                     t	          | dd	d
dd           t	          | ddddd           t          j        | t          j        ddd          t          j        ddd          dt          d          dd ddd ddd ddddgdt          j        ddd                    \  }}|d	dddddgk    sJ d |v sJ d S )!Nz9UPDATE accounts SET is_active=0 WHERE account_id='bank-a'r1   TrL   rM   zsynthetic classified accountrN   zfx-openr=   r   rv   2r*   zfx-closer   r@  r   r   r   F240r   r   r   r   r   z240.00r  rA  r   rB  rC  )	r   r   r   r   r2   rF   rD  r   r   )r   rF  rG  s      r   Ctest_household_history_uses_canonical_snapshot_value_and_fx_columnsrL    si   99DLLLMMM(.+    $	<3OOOO$
L%%CPPPP/,tQ**T1a((U^^T22 t44$488 x88		
 	
 l4A&&  NFF" (33(33     v%%%%%%r   c                   dd l }d }|                     |j         d|           t                      }|j        }t	          dd|          }t          |d                   dk    sJ |d	         d
u sJ |d         d         du sJ t          j        |          }|j        j	        j
        j        dv sJ |j        |k    sJ d S )Nr   c                      t          d          )Nz:normal wealth rendering must not open a network connection)AssertionErrorr   s     r   reject_provider_callz\test_normal_cockpit_get_is_read_only_and_uses_only_stored_data.<locals>.reject_provider_call  s    YZZZr   connectr   r   )r   r   r   r  r  not_net_worthTr   r  F>   readypartialr3  )socketr   r   total_changeswealth_cockpit_endpointr  r
   model_validate	readiness
dimensionscurrent_valuerY   )r   rU  rP  r   beforepayload	validateds          r   >test_normal_cockpit_get_is_read_only_and_uses_only_stored_datar_    s   MMM[ [ [ y2FGGG99DF%Lt  G wv1$$$$?#t++++:34====%4W==I)7> C    
 ''''''r   c                    t                      }i t          j        d d dfd
}|                     t          d|           t          j        |dd           dddk    sJ d S )	Nr@   rA   c               N                         ||            | ||          S )Nra  )update)r   r@   rA   observedoriginals      r   capture_coveragezRtest_previous_year_coverage_uses_the_selected_period_end.<locals>.capture_coverage  s0    )W===x	7CCCCr   build_performance_coverager%  
2026-08-02r$  z
2025-01-01z
2025-12-31)r   rF   rg  r   r
  )r   r   rf  rd  re  s      @@r   8test_previous_year_coverage_uses_the_selected_period_endri    s    99D&(H1H,0$ D D D D D D D D !=?OPPP     \lKKKKKKKKr   c                 f   ddddddddd d	d
dgd} dd dD             i}t          j        | |ddidddddddddid g d	  	        }|d         }|d         d         dk    sJ |d         d         dk    sJ |d         d         d	k    sJ |d          d         dk    sJ |d         d!         d         d"k    sJ t          d# |d$         D                       d         dk    sJ t          d% |d$         D                       }|d         dk    sJ |d&         g d'k    sJ |d(         g k    sJ d S ))NFr   zKnown sourcer   rS  r   )r   r1  r2  r   zMissing sourcer3  r{   )rT   r   r   r   c           	          g | ]}|d d d d d dS )rT   )scopettwror_statusxirr_statusattribution_statusscope_classification_statuscashflow_coverage_statusr   )r   rl  s     r   r   zWtest_current_value_performance_and_policy_readiness_are_independent.<locals>.<listcomp>6  sC     

 

 

  !+)&0/9,6 

 

 

r   )postfinancer   r   r   r   r=   rh  presetfromto10.005.00)rf   rg   rY   rT   r   )	r   coverager  r   re   ttwror_qualityhousehold_changehistory_pointsr   rZ  r[  rT  	freshnessreconciliationperformancer  not_applicablec              3  2   K   | ]}|d          dk    |V  dS )r   rp   Nr   r   s     r   r   zVtest_current_value_performance_and_policy_readiness_are_independent.<locals>.<genexpr>W  s0      NNs5zX7M7M7M7M7M7MNNr   metricsc              3  2   K   | ]}|d          dk    |V  dS )r   net_contributionsNr   r   s     r   r   zVtest_current_value_performance_and_policy_readiness_are_independent.<locals>.<genexpr>Z  s1      XXsc%jDW6W6Ws6W6W6W6WXXr   included_sources)PostFinancer   r   missing_sources)rF   _build_readinessr   )r   ry  rY  rZ  nets        r   Ctest_current_value_performance_and_policy_readiness_are_independentr  "  s   " (%-(/$+	  *%)(3$1	 
 G& 	 

 

 A

 

 

H (e$\JJ&-!'
 
 !*-*  I <(Jo&x0I====k"8,	9999&'1[@@@@m$X.'9999\"8,X6:JJJJJNNy3NNNNN	    XXi	2XXX
X
XCx=G####!"&X&X&XXXXX !R''''''r   c                 B    t          j        dddd          dk    sJ d S )NrT   r{   )rm  rn  ro  rT  )rF   _performance_scope_statusr   r   r   Jtest_source_performance_status_is_partial_when_only_some_metrics_are_readyr  `  sH    ,'("/	
 	
  
     r   c            	        ddddd dddddd ddddd	d
ddgi} ddddgddddgddd dgdgi}t          j        | |ddidddd          }d |D             }t          |          t          |          k    sJ t          d |D                       dk    sJ t	          d |D                       }|d         dgk    sJ t          d  |D                       sJ d S )!Nr   AKB HaushaltskontoAKBr   r{   )r   provider_labelr    r1  r      AKB Rückstellungenr   Anlagerx  r   r   rr  z
2026-05-01!external_cashflow_history_missing)rl  valuation_fromrq   r   z
2026-06-01r   r   Fr   r=   rh  rs  )r   ry  r  r   c                V    h | ]&}|d          t          |d                   |d         f'S )	dimensionaffected_sourcesreason_code)tupler   s     r   	<setcomp>zVtest_diagnostics_name_sources_deduplicate_and_limit_prominent_hints.<locals>.<setcomp>  sG        
[	5%7!8993};MN  r   c              3  &   K   | ]}|d          V  dS )	prominentNr   r   s     r   r   zVtest_diagnostics_name_sources_deduplicate_and_limit_prominent_hints.<locals>.<genexpr>  s'      77Cs;777777r   r	  c              3  2   K   | ]}|d          dk    |V  dS )r  current_bank_balance_missingNr   r   s     r   r   zVtest_diagnostics_name_sources_deduplicate_and_limit_prominent_hints.<locals>.<genexpr>  s2      ccc-.@Db.b.b.b.b.b.bccr   r  c              3  >   K   | ]}|d          p|d         dk    V  dS )r  r  r  Nr   r   s     r   r   zVtest_diagnostics_name_sources_deduplicate_and_limit_prominent_hints.<locals>.<genexpr>  s7      ^^3s%&F#k*:h*F^^^^^^r   )rF   _build_diagnosticsr  r   r   r   )r   ry  diagnostics
identitiesbanks        r   Ctest_diagnostics_name_sources_deduplicate_and_limit_prominent_hintsr  j  s   -"'&%)$1  /"'&%)$1  ,"4 %+$+ 
G4 	&".!D E  &".!D E  ""&!D E 
H& ,e$\JJ	  K   J z??c+......77;777771<<<<cc{cccccD"#w....^^R]^^^^^^^^^^r   c                   t          ddddd dd          t          ddddd dd          t          dd	d
dd dd          g|                     t          dfd           |                     t          dd            |                     t          dd            |                     t          dd            |                     t          dd            t          j        t	                      t          j        ddd                    }d |d         D             }d |D             dd	gk    sJ |d         d         dk    sJ |d         d         d k    sJ t          d! |D                       sJ d S )"Nr  r  rw  r   r   r   )r   account_labelrE   r   r   rY   balance_modez2.00r  z3.00r   c                &    t          d          S )Nz15.00r   r   )r   r   s    r   r   zQtest_cash_sources_group_currencies_by_real_account_not_provider.<locals>.<lambda>  s    _gKKK r   r   c                (    t          dddd           S Nr   Tr   r   r   r   s    r   r   zQtest_cash_sources_group_currencies_by_real_account_not_provider.<locals>.<lambda>  !    _%" 	
 
 
 r   r   c                    g S r   r   r   s    r   r   zQtest_cash_sources_group_currencies_by_real_account_not_provider.<locals>.<lambda>  s    r r   r   c                    dS N)NNr   r   s    r   r   zQtest_cash_sources_group_currencies_by_real_account_not_provider.<locals>.<lambda>      \ r   r   c                $    t          d          g fS N0r   r   s    r   r   zQtest_cash_sources_group_currencies_by_real_account_not_provider.<locals>.<lambda>      WS\\SUDV r   r   r      r   c                *    g | ]}|d          dk    |S )r    r   r   r   s     r   r   zStest_cash_sources_group_currencies_by_real_account_not_provider.<locals>.<listcomp>  s&    WWWCV9V9VC9V9V9Vr   r   c                    g | ]
}|d          S )r   r   r   s     r   r   zStest_cash_sources_group_currencies_by_real_account_not_provider.<locals>.<listcomp>  s    111SCL111r   r   r1  z12.00r2  rS  c              3  .   K   | ]}|d          dk    V  dS )source_roler0   Nr   r   s     r   r   zRtest_cash_sources_group_currencies_by_real_account_not_provider.<locals>.<genexpr>  s,      GG3s=!Y.GGGGGGr   )r   r   rF   r   r   r   r   )r   r   bank_sourcesr   s      @r   ?test_cash_sources_group_currencies_by_real_account_not_providerr    s   .'3"&$	
 	
 	
 	.'3"&$	
 	
 	
 	/'3"&$	
 	
 	
'I: KKKK  
 	
 	
	 	 	 !8//JJJ0I0IJJJ!57V7VWWW%giiw|D!Q7O7OPPPGWW79#5WWWL11L1116     ?./7::::?12g====GG,GGGGGGGGGGr   c                B   |                      t          dd            |                      t          dd            |                      t          dd            |                      t          dd            |                      t          d	d
            t          j        t                      t          j        ddd                    }t          d |d         D                       }|d         dk    sJ |d         dk    sJ |d         dk    sJ |d         dk    sJ d S )Nr   c                $    t          dg           S )Nr   r   r   r   s    r   r   zRtest_known_stale_crypto_value_remains_visible_with_business_date.<locals>.<lambda>  s    _fCCC r   r   c                (    t          dddd           S r  r   r   s    r   r   zRtest_known_stale_crypto_value_remains_visible_with_business_date.<locals>.<lambda>  r  r   r   c                &    t          dd          gS )Nr   2026-05-15T12:00:00+00:00r   r   r   s    r   r   zRtest_known_stale_crypto_value_remains_visible_with_business_date.<locals>.<lambda>  s!    !("=  
 r   r   c                    dS r  r   r   s    r   r   zRtest_known_stale_crypto_value_remains_visible_with_business_date.<locals>.<lambda>   r  r   r   c                $    t          d          g fS r  r   r   s    r   r   zRtest_known_stale_crypto_value_remains_visible_with_business_date.<locals>.<lambda>  r  r   r   r   r  r   c              3  2   K   | ]}|d          dk    |V  dS r   r   r   s     r   r   zStest_known_stale_crypto_value_remains_visible_with_business_date.<locals>.<genexpr>  s0      NN#s5zX7M7M#7M7M7M7MNNr   r   r1  r   r2  rS  r   r  r   r   )r   rF   r   r   r   r   )r   r   r   s      r   @test_known_stale_crypto_value_remains_visible_with_business_dater    s^   CC  
 	
 	
	 	 	 	
 	
	 	 	 0I0IJJJ!57V7VWWW%giiw|D!Q7O7OPPPGNN!3NNNNNF%&'1111()W4444'?99999$%000000r   )r   r   r   r   r    r   r!   r   r   r"   r   r   )
r-   r   r   r   r.   r   r+   r   r,   r"   )0
__future__r   decimalr   typesr   #jarvis_finance.api.routers.overviewr   rW  $jarvis_finance.api.schemas.positionsr	   )jarvis_finance.api.schemas.wealth_cockpitr
   jarvis_finance.servicesrF   $jarvis_finance.services.cash_servicer   )jarvis_finance.services.performance_scoper   r   -jarvis_finance.services.portfolio_performancer   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r   r)   r2   rJ   rl   rt   r|   r   r  r"  r*  r7  rH  rL  r_  ri  r  r  r  r  r  r   r   r   <module>r     s   " " " " " "       ! ! ! ! ! ! Y Y Y Y Y Y K K K K K K K K K K K K = = = = = = F F F F F F        V U U U U U : : : : : : > > > > > >!  0 dhs      "      <  :$= $= $=NV V V<7L 7L 7Lt& & &R?$ ?$ ?$D J  J  JF   ( ( ((&& && &&R$& $& $&N( ( (2L L L(;( ;( ;(|  <_ <_ <_~:H :H :Hz#1 #1 #1 #1 #1r   