
    #fnjD                       d dl mZ d dlZd dlmc 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d,dZ dddd-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S ).    )annotationsNDecimalSimpleNamespace)wealth_cockpit)CashSnapshotConfirmRequest)confirm_cash_snapshot)!set_performance_cashflow_coverage$set_performance_scope_classification)build_portfolio_performance)connect_memory)apply_migrationsz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    M/home/agent/.hermes/repos/FinanceManager/tests/unit/test_wealth_cockpit_v1.pybase_dbr      s    DTLLi	   	LLo	   	LL	J	  
 	LL	T	  
 K    
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_valuationr0   8   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    }|st          j        d|fd||f          dt          j                    v st          j	        |          rt          j
        |          ndt          j
        |          dz  }dd|iz  }t          t          j        |                    d x}}dddd g}||k    }|st          j        d|fd||f          d!t          j                    v st          j	        |          rt          j
        |          nd!t          j
        |          dz  }dd|iz  }t          t          j        |                    d x}}d S )"Nzbank-legbank-ainternal_transferz-1000zpair-1)r   z	depot-legr/   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_cutoff==z%(py0)s == %(py3)s	householdpy0py3assert %(py5)spy5r   external_deposit1000.00)r   r   
amount_chfinvestments)r   r'   cockpitscope_cashflowsr   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)r   rD   rM   @py_assert2@py_assert1@py_format4@py_format6s          r   dtest_scope_boundary_keeps_household_transfer_neutral_but_counts_portfolio_deposit_and_ignores_tradesr\   V   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 9?999%7yQQ ;         ;                                              r   c            
     Z   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    }|st          j        d|fd||f          dt          j
                    v st          j        |          rt          j        |          nddt          j
                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j        |                    d }|d          d!         }d}||k    }|slt          j        d|fd"||f          t          j        |          t          j        |          d#z  }d$d%|iz  }	t          t          j        |	                    d x}x}}|d          d&         }d'}||k    }|slt          j        d|fd"||f          t          j        |          t          j        |          d#z  }d$d%|iz  }	t          t          j        |	                    d x}x}}|d          d(         }d }||u}|slt          j        d)|fd*||f          t          j        |          t          j        |          d#z  }d$d%|iz  }	t          t          j        |	                    d x}x}}d S )+Nr/   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statusrc   rd   recorded_atopen10000boundaryr   11000close13000depositrJ   r4   r6   twrr>   r?   methodr@   rA   z%(py0)s == %(py2)sfirstsecondrF   py2assert %(py4)spy4summarynet_external_cashflowsz%(py1)s == %(py4)spy1r}   assert %(py6)spy6investment_result2000ttwror_cumulative)is not)z%(py1)s is not %(py4)s)r   r   r   r   r0   r'   r   rP   rQ   rR   rS   rT   rU   rV   rW   )
r   rx   ry   rY   @py_format3@py_format5@py_assert0@py_assert3rX   @py_format7s
             r   `test_canonical_performance_engine_adjusts_investment_result_for_net_deposit_and_is_deterministicr   s   s   99D(.+    &" )	 	 	 	 $g666$
L':::$w777y'+=v,WWWW'l5VY  E )l5VY  F F?5F55FF45??5??????????5?????5???????????????????????????????/0:F:0F::::::::::0F:::::0::::F:::::::::::::::::::::::::::/0<<0<<<<<<<<<<0<<<<<0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<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 }||u }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}}|d         d         }d }||u }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}}d}|d         d         d         }||v }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}}d S )Nr/   Tr^   r_   zsynthetic incomplete portfolior`   r;   r<   rf   rg   rh   rq   rr   rt   ru   r~   r   isz%(py1)s is %(py4)sr   r   r   r   missing_opening_valuationqualityttwrorreason_codesinz%(py1)s in %(py4)sr   r   r   r   r0   r   rP   rQ   rU   rV   rW   )r   resultr   r   rX   r   r   s          r   5test_missing_opening_value_never_creates_false_returnr      s   99D(.-    &" )	 	 	 	 $w777(l5VY  F )019T91T99999999991T9999919999T999999999999999999999999999)019T91T99999999991T9999919999T999999999999999999999999999&U&*;H*En*UU&*UUUUUUUUUUU&*UUUUUU&UUUU*UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUr   c            
     z   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    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}}|d         d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}}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 }||u }|slt          j        d$|fd%||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}}d&}|d'         d(         d)         }||v }|slt          j        d*|fd+||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}}d S ),Nr/   Tr^   r_   zsynthetic FX portfolior`   r;   r<   rf   rg   rh   zeur-openrn   EURz0.9r(   z	eur-closerp   z1.0rt   ru   r~   opening_valuez9000.0rA   r   r   r   r   closing_valuez11000.0zsynthetic missing FX portfoliozmissing-openzmissing-closer   r   r   
missing_fxr   r   r   r   r   r   )	r   r   r   r   rX   r   r   missingunavailables	            r   Otest_fx_uses_stored_canonical_rate_at_each_stichtag_and_missing_fx_fails_closedr      sH   99D(.%    &" )	 	 	 	 $
L'EeTTTT$\7UuUUUU(l5VY  F )_-99-9999999999-99999-9999999999999999999999999999999)_-::-::::::::::-:::::-:::::::::::::::::::::::::::::::iiG(.-    &" )	 	 	 	 '><5UYZZZZ'?L'EVZ[[[[-<eY\  K y!"56>$>6$>>>>>>>>>>6$>>>>>6>>>>$>>>>>>>>>>>>>>>>>>>>>>>>>>>K;y1(;NKK<KKKKKKKKKKK<KKKKKK<KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKr   c                4   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         }d}t          |          }||k    }|st          j        d|fd||f          t          j	        |          dt          j                    v st          j        t                    rt          j	        t                    ndt          j	        |          t          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}}|d         }d}t          |          }||k    }|st          j        d|fd||f          t          j	        |          dt          j                    v st          j        t                    rt          j	        t                    ndt          j	        |          t          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}}d |d         D             }t          |          }	|d         }|	|k    }
|
st          j        d|
fd |	|f          d!t          j                    v st          j        t                    rt          j	        t                    nd!t          j	        |          t          j	        |	          t          j	        |          d"z  }dd|iz  }t          t          j        |                    d x}x}	x}
}d# |d         D             }|j        }d$} ||          }d}||k    }|st          j        d|fd%||f          t          j	        |          t          j	        |          t          j	        |          t          j	        |          t          j	        |          d&z  }d'd(|iz  }t          t          j        |                    d x}x}x}x}x}}d) |d         D             }t#          |          }	|	sd*d+t          j                    v st          j        t"                    rt          j	        t"                    nd+t          j	        |          t          j	        |	          d,z  }t          t          j        |                    d x}}	d- |d.         D             }t%          |          }	|	sd*d/t          j                    v st          j        t$                    rt          j	        t$                    nd/t          j	        |          t          j	        |	          d,z  }t          t          j        |                    d x}}	d S )0N
Raiffeisen100.00
2026-07-31Aktuell)platformrL   last_manual_reconciliationlast_imported_bookingrk   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 )Nz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 )Nz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    owR^___` r   _truewealthc                $    t          d          dfS )Nr8   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.00rA   )z0%(py1)s == %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
}r   )r   rG   rI   py7assert %(py9)spy9rM   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   distributionz0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)ssumrF   r{   r}   r   c                    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   
truewealth)zL%(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.count
}(%(py5)s)
} == %(py10)s)r   rG   rI   r   py10zassert %(py12)spy12c              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   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyrF   r{   r}   c              3  B   K   | ]}|d          dv |d         dk    V  dS )r   >   postfinance-investmentscryptor   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   sourcesall)r   setattrrN   _current_valuesr   dater   rP   rQ   rU   rR   rS   rT   rV   rW   r   countr   r   )monkeypatchcurrentr   @py_assert4@py_assert6rX   @py_format8@py_format10rY   r   @py_assert5@py_assert9@py_assert8@py_format11@py_format13r   r   s                   @r   Xtest_current_distribution_counts_truewealth_once_keeps_unassigned_visible_and_reconcilesr      s>   ##/"  M !35555  A  A  A 	D  	D  
 ``  
 0[0[\\\||   %giiw|D!Q7O7OPPPG70x0wx0000000000000000000000000000000w00000w000000x0000000000000000000000000000000000=!6X6WX%6%66!%66666666666!%666666!66666666666W66666W666666X6666%666666666666666666666666666666LLGN4KLLL`3LLL`PWX_P``LP```````````LP`````````````3`````3``````L````L````P``````````````````````````````::'."9:::S:@SS@@NNSRSSNRSSSSSSSSSSSNRSSSSSS:SSSS@SSSSSSSSNSSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSShhPWXfPghhhh3hhhhhhhhhhhhhhhh3hhhhh3hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh 9%   3         	    	     	      	   	        	           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    }|st          j        d2|fd3||f          d4t          j	                    v st          j
        |          rt          j        |          nd4d5t          j	                    v st          j
        |          rt          j        |          nd5d6z  }d7d8|iz  }t          t          j        |                    d }|d9         d:         }d;}||k    }|slt          j        d2|fd<||f          t          j        |          t          j        |          d=z  }d>d?|iz  }	t          t          j        |	                    d x}x}}|d@         }dAddBdCdD}||k    }|slt          j        d2|fd<||f          t          j        |          t          j        |          d=z  }d>d?|iz  }	t          t          j        |	                    d x}x}}|dE         dF         }dG}||k    }|slt          j        d2|fd<||f          t          j        |          t          j        |          d=z  }d>d?|iz  }	t          t          j        |	                    d x}x}}|dE         dH         }dI}||k    }|slt          j        d2|fd<||f          t          j        |          t          j        |          d=z  }d>d?|iz  }	t          t          j        |	                    d x}x}}|dE         dJ         }d}||k    }|slt          j        d2|fd<||f          t          j        |          t          j        |          d=z  }d>d?|iz  }	t          t          j        |	                    d x}x}}|dK         }t          |          }dL}
||
k    }|st          j        d2|fdM||
f          dNt          j	                    v st          j
        t                    rt          j        t                    ndNt          j        |          t          j        |          t          j        |
          dOz  }dPdQ|iz  }t          t          j        |                    d x}x}x}}
|dR         }t          |          }dS}
||
k    }|st          j        dT|fdU||
f          dNt          j	                    v st          j
        t                    rt          j        t                    ndNt          j        |          t          j        |          t          j        |
          dOz  }dPdQ|iz  }t          t          j        |                    d x}x}x}}
d S )VNr4   700r8   TcashBankguthaben300.00)r   r   r   equityzAktien und ETFs700.00r   zTrue Wealth0.00r   u   Kryptowährungenr   r   )
r   rM   r   rf   r   r   
data_as_ofunpriced_countmissing_cash_countunassigned_itemsr:   100z0.05)r   r   r   r   rf   )rk   r   r   rJ   )r   r   r   )r~   r   external_cashflowsr   c                    S Nr   )r   r   r   s     r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>5  s     r   _latest_data_cutoffc                    t           S r  )r   r   s    r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>6  s    S r   _latest_valuation_datec                    |S r  r   )r   fallbacks     r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>7  s    RZ r   r   c                     S r  r   )argskwargsperfs     r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>8  s    X\ r   rO   c                     g S r  r   r  r  s     r   r   zYtest_cockpit_keeps_planning_separate_and_quality_dimensions_independent.<locals>.<lambda>9  s    B r   build_reconciliation_snapshotc                    dddigg dS )Nstalerk   
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>C  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>G  s    :N]e2f2f1g h r   ytd
2026-08-01)periodr   r@   rA   rw   rx   ry   rz   r|   r}   totalscaptured_wealth_chfrK   r   r   r   r   planningr&  z/planning/budget/planningF)free_plannable_chf	availablelinkincluded_in_wealthdata_qualityfreshness_statusr  r   r  performance_statuskpis   r   lenr   r   r   hints   )<=)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} <= %(py7)s)r   r   rN   build_wealth_cockpitr   r   rP   rQ   rR   rS   rT   rU   rV   rW   r7  )r   rx   ry   rY   r   r   r   r   rX   r   r   r   r   r   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?5F55FF?01>Y>1Y>>>>>>>>>>1Y>>>>>1>>>>Y>>>>>>>>>>>>>>>>>>>>>>>>>>> &+#	! !  !     
    !    
    
!              
             !34??4??????????4?????4??????????????????????????????? !89I\I9\IIIIIIIIII9\IIIII9IIII\IIIIIIIIIIIIIIIIIIIIIIIIIII !56D*D6*DDDDDDDDDD6*DDDDD6DDDD*DDDDDDDDDDDDDDDDDDDDDDDDDDDV}"3}""""""""""""""""""""""""3"""""3""""""}"""""""""""""""""""""""""""""""""""""W~#3~#!#!##########!############3#####3######~########!###############################r   c                V   |                      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    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}|d         }ddd}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}d |d         D             }t          |          }|sddt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          dz  }t          t          j	        |                    d x}}d S )Nactive_policyc           	     ,    ddddddddd	d
dddgddS )NTr9  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>`  sF    (0$*$T`dee$,Dtbfgg  

 

 r   Tr4   r   r   r'  r   r   r   r   r   rf   r   r   r  r9  rA   r   r   r   r   r!  r&  z6000.00)monthly_target_chfannual_target_chfc              3  .   K   | ]}|d          dk    V  dS )rk   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   r   r   )r   rN   r   r  r   rP   rQ   rU   rV   rW   r   rR   rS   rT   )	r   r   rL  r   r   rX   r   r   rY   s	            r   Vtest_existing_versioned_policy_supports_contribution_orientation_without_schema_changerR  \  s   
	
 
	
    22844 v66622	
	 	G '		7;;F)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.! &&& & ! &        ! &     "   &                          JI&.IIII3IIIIIIIIIIIIIIII3IIIII3IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIr   c                    t                      } t          j        }d}t          j        }d}d}d} ||||          } || ||          }t          j        ddd          t          j        ddd          f}	||	k    }
|
st	          j        d|
fd||	f          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          d	t          j                    v st	          j        |           rt	          j	        |           nd	t	          j	        |          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |	          d
z  }dd|iz  }t          t	          j        |                    d x}x}x}x}x}x}x}x}x}
}	t          j        }d}t          j        }d}d}d} ||||          } || ||          }t          j        ddd          t          j        ddd          f}	||	k    }
|
st	          j        d|
fd||	f          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          d	t          j                    v st	          j        |           rt	          j	        |           nd	t	          j	        |          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |	          d
z  }dd|iz  }t          t	          j        |                    d x}x}x}x}x}x}x}x}x}
}	t          j        }d}t          j        }d}d}d} ||||          } || ||          }t          j        ddd          t          j        ddd          f}	||	k    }
|
st	          j        d|
fd||	f          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          d	t          j                    v st	          j        |           rt	          j	        |           nd	t	          j	        |          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |	          d
z  }dd|iz  }t          t	          j        |                    d x}x}x}x}x}x}x}x}x}
}	d S )Nr(  r   r   r   )r*  r   rA   )z%(py18)s
{%(py18)s = %(py2)s
{%(py2)s = %(py0)s.period_bounds
}(%(py3)s, period=%(py5)s, as_of=%(py16)s
{%(py16)s = %(py8)s
{%(py8)s = %(py6)s.date
}(%(py10)s, %(py12)s, %(py14)s)
})
} == %(py21)srN   r   )rF   r{   rG   rI   r   py8r   r   py14py16py18py21zassert %(py23)spy23previous_yeari        12m)r   rN   period_boundsr   rP   rQ   rR   rS   rT   rU   rV   rW   )r   rY   r   @py_assert7r   @py_assert11@py_assert13@py_assert15@py_assert17@py_assert20@py_assert19@py_format22@py_format24s                r   ?test_period_boundaries_cover_year_change_and_last_twelve_monthsrh    s
   99D  e 7<  a QR <<aQR;S;S   e;STTT T1a  T1a  Y T Y        T Y                     !         "&     "&      /4         <C     <C      <H    IM    OP    RS    <T    U   Y                                          o W\ RV XY [\ \\RVXY[\E]E]   oE]^^^ T1a  T2r""c ^ c        ^ c                     !         "&     "&      />         FM     FM      FR    SW    YZ    \]    F^    _   c                                          e 7<  a QR <<aQR;S;S   e;STTT T1a  T1a  Y T Y        T Y                     !         "&     "&      /4         <C     <C      <H    IM    OP    RS    <T    U   Y                                         r   c                    t                      } t          j        | t          j        ddd                    }t	          d |d         D                       }t	          d |d         D                       }|d	         }d }||u }|slt          j        d
|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}|d         }d }||u }|slt          j        d
|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}|d         }d}||u }|slt          j        d
|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}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   r   r   r   r   r   current_value_chfr   r   rA   r   r  rf   F)
r   rN   r   r   nextrP   rQ   rU   rV   rW   )	r   r   cash_rowbank_sourcer   r   rX   r   r   s	            r   @test_cash_account_without_snapshot_or_import_is_missing_not_zerorp    s   99D%d',tQ2J2JKKKGSS7>#:SSSSSHZZgi&8ZZZZZKK (D( D(((((((((( D((((( ((((D(((((((((((((((((((((((((((*+3t3+t3333333333+t33333+3333t333333333333333333333333333./C3CC/3CCCCCCCCCCC/3CCCCCC/CCCC3CCCCCCCCCCCCCCCCCCCCCCCCCCCC'(-A-(A----------(A-----(----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    }|st          j        d|fd||f          dt          j
                    v st          j        |          rt          j        |          ndt          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}}d}
|
|v }|st          j        d |fd!|
|f          t          j        |
          d"t          j
                    v st          j        |          rt          j        |          nd"d#z  }dd|iz  }	t          t          j        |	                    d x}
}d S )$N))r;   r   )r)  120.00r2   manual_balance	syntheticzpreview-T)r   snapshot_typebalance_daterL   rd   
preview_idconfirm120r   rr  r'  r   r   r   r   rM  r   r   r   )r>   r?   r   r   r;   r   )r   r   r)  rA   rC   pointsrE   rH   rI   u   nicht ergänztr   )z%(py1)s in %(py3)sreason)r   rG   )r   r
   r	   r   rN   _household_historyr   rP   rQ   rR   rS   rT   rU   rV   rW   )r   dayr,   r   rz  r{  rX   rY   rZ   r[   r   s              r   Rtest_household_history_uses_only_complete_exact_stichtags_and_supports_year_changer~    s$   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 6         6                                             %v%%%%%%%%%%v%%%%%%%%%%%%%%%%v%%%%%v%%%%%%%%%%%%%%%%%%%%%%%%%%%%%r   c                    t                      } | j        }t          dd|           }|d         }t          |          }d}||k    }|st	          j        d|fd||f          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          t	          j	        |          t	          j	        |          d	z  }d
d|iz  }t          t	          j        |                    d x}x}x}}|d         }	d}|	|u }
|
slt	          j        d|
fd|	|f          t	          j	        |	          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}	x}
}|d         d         }	d}|	|u }
|
slt	          j        d|
fd|	|f          t	          j	        |	          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}	x}
}| j        }||k    }|st	          j        d|fd||f          dt          j                    v st	          j        |           rt	          j	        |           ndt	          j	        |          dt          j                    v st	          j        |          rt	          j	        |          nddz  }dd|iz  }t          t	          j        |                    d x}}d S )Nr(  r)  )r*  r   r   r5  r6  rA   r   r7  r   r   r   not_net_worthTr   r   r   r   r   r-  r1  F)z5%(py2)s
{%(py2)s = %(py0)s.total_changes
} == %(py4)sr   beforer   )r   total_changeswealth_cockpit_endpointr7  rP   rQ   rR   rS   rT   rU   rV   rW   )r   r  payloadrY   r   r   r   r   r   r   rX   r   r   s                r   >test_normal_cockpit_get_is_read_only_and_uses_only_stored_datar    s   99DF%Lt  G v$3$1$1$$$$$$$$$$1$$$$$$$$$$$$3$$$$$3$$$$$$$$$$$$$$1$$$$$$$$$$$$$$$$$$$$$$$$$$$$$?#+t+#t++++++++++#t+++++#++++t+++++++++++++++++++++++++++:34==4==========4=====4==============================='''''''''''''''''''''''4'''''4'''''''''''''''''''''''''''''''''''''''''''''''''''r   )r   r   r   r   r   r   r   r   r   r    r   r   )
r+   r   r   r   r,   r   r)   r   r*   r    )-
__future__r   builtinsrR   _pytest.assertion.rewrite	assertionrewriterP   decimalr   typesr   #jarvis_finance.api.routers.overviewr   r  $jarvis_finance.api.schemas.positionsr	   jarvis_finance.servicesrN   $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'   r0   r\   r   r   r   r   r<  rR  rh  rp  r~  r  r   r   r   <module>r     s   " " " " " "                     ! ! ! ! ! ! Y Y Y Y Y Y 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% % %P?$ ?$ ?$D J  J  JF   	( 	( 	(&& && &&R
( 
( 
( 
( 
(r   