
    qj                    n   d dl mZ d dlZd dlmc mZ d dlZd dl	Z	d dl
mZ d dlmZ d dlmZ d dlZd dlmZmZmZ d dlmZmZmZmZmZmZmZ d dl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) d dl*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 dZ2dZ3d Z4d Z5	 d&d'dZ6d&d(dZ7d Z8d Z9d  Z:d! Z;d" Z<d# Z=d$ Z>d% Z?dS ))    )annotationsN)replace)Decimal)sha256)get_cash_overviewget_command_center_summaryget_positions)PFBundle
PFDocumentPFEvent
PFSnapshotPFSnapshotCashPFSnapshotPosition_reconcile_cash_components)postfinance_service)get_cash_position_detailget_cash_summary)get_equity_summary) latest_official_postfinance_cash%latest_official_postfinance_positions)confirmed_canonical_positions)build_portfolio_reconciliation)get_overview)connect_memory)apply_migrationsaccount_pf_depot_testaccount_pf_trading_cash_testc                 2   t          t          dt          d          t          d          t          d                    t          dt          d          t          d          t          d                    gt          d                    } d | D             }t          d          t          d	          g}||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          |          }t          ||          }	d}
t          |
          }|	|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        t                    rt          j        t                    ndt          j        |          t          j        |          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}x}	x}x}
}d S )NEURz-1001USD20z-80.01c                    g | ]	}|j         
S  source_value_chf.0items     Y/home/agent/.hermes/worktrees/FinanceManager-sprint20e/tests/test_postfinance_sprint13.py
<listcomp>zRtest_cash_component_reconciliation_preserves_negative_balances.<locals>.<listcomp>2   s    999dD!999    z-100.01z20.00==z%(py1)s == %(py4)spy1py4assert %(py6)spy6c              3  $   K   | ]}|j         V  d S Nr%   r'   s     r*   	<genexpr>zQtest_cash_component_reconciliation_preserves_negative_balances.<locals>.<genexpr>6   s%      ==$%======r,   0zy%(py9)s
{%(py9)s = %(py0)s(%(py2)s, %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
})
} == %(py15)s
{%(py15)s = %(py11)s(%(py13)s)
}sumr   	py0py2py3py5py7py9py11py13py15assert %(py17)spy17)r   r   r   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr:   @py_builtinslocals_should_repr_global_name)
reconciled@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert1@py_assert4@py_assert6@py_assert8@py_assert12@py_assert14@py_assert10@py_format16@py_format18s                  r*   >test_cash_component_reconciliation_preserves_negative_balancesr^   *   s   +5'&//73<<QQ5'$--wt}}MM	
 	 J :9j999 	> 9 >        9 >     :   >                          >=*=== s ws|| 3=|LL PWQ Q L Q        L Q                     >         @G     @G      HK    @L    M         QX     QX      	  Q                                   r,   c                    t                      } t          |            |                     d           |                     dt          f           |                     dt          f           t          d          D ]s}d|d}d|dz   d}|                     d	||d
|dd|d|dk     rdndddf           |                     dd| dt          d|ddddddd|dk     rdndddf           t|                                  | S )NzINSERT INTO platforms(platform_id,name,platform_type,country,default_currency,is_active,created_at) VALUES('pf','PostFinance','bank','CH','CHF',1,'2026-01-01')zINSERT INTO accounts(account_id,platform_id,account_name,account_type,currency,performance_included,is_active,created_at,portfolio_bucket) VALUES(?,'pf','PostFinance E-Trading','brokerage','CHF',0,1,'2026-01-01','postfinance')zINSERT INTO accounts(account_id,platform_id,account_name,account_type,currency,performance_included,is_active,created_at,portfolio_bucket) VALUES(?,'pf','PostFinance Cash-Konto','cash','CHF',0,1,'2026-01-01','cash')   instrument_pf_02dSynthetic Asset    zyINSERT INTO instruments(instrument_id,name,ticker,isin,asset_class,currency,is_active,created_at) VALUES(?,?,?,?,?,?,1,?)SCH010d   equityetfCHFz
2026-01-01a;  INSERT INTO positions_snapshot(position_snapshot_id,snapshot_date,account_id,platform_id,instrument_id,quantity,average_cost_original,cost_basis_original,market_price_original,market_value_original,market_fx_rate_to_chf,market_value_chf,category,data_quality_status,created_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)	baseline_z
2026-06-30pfr    5090completez2026-06-30T00:00:00Z)r   r   executeDEPOTCASHrangecommit)connindex
instrumentlabels       r*   	make_connrz   ;   s   DTLL 	j   	LL 	m	   	LL 	b	   r "
 "
1e111
2519222 HE!U!!!!BJJE	
 	
 	
 	 J#E##!BJJE&	
 	
 	
 	
( 	KKMMMKr,      synthetic-zip   %PDF-synthetic-overviewzip_rawbytesoverview_rawreturnr
   c                   t          |                                           }t          |                                          }d}t          t          |                                          t          d                                          ddt          d                                          dt          d                                          dd	|d
          }t          t          d                                          |j        |j        dddddddt          d          t          d          t          d          t          d          t          d          t          d          dt          d          d dd          }t          t          d                                          |j        ddddddd d d d t          d          t          d          t          d          t          d          dt          d          ddd           }t          t          d!                                          |j        dddddd"d d d d t          d          t          d          t          d          t          d          dt          d          ddd           }t          d# t          d$          D                       }	t          |d%d&|	t          d't          d(          t          d          t          d(                    t          d)t          d(          t          d          t          d(                    ft          d*          t          d+          t          d,          t          d-          t          d-          d.          }
t          ||t          ||z                                                                             |f|||f|
d/d          S )0Ns   %PDF-synthetic-trades	   trade.pdftrade_confirmationzsynthetic-references   semanticz
2026-07-01s   accountetrading_cashrd   	synthetics   eventbuyz
2026-07-03outzSynthetic Asset 01CH0000000000r    rn   r8   51rk   rp   r$   s   transfer-outztransfer-referenceinternal_transferefinancez
2026-07-0210synthetic-transfer-grouppartial)'internal_transfer_not_income_or_expenses   transfer-ininc              3    K   | ]}t          t          d |                                                                           dd         d|dz   dd|dz   d|dk     rdnd	t	          d
          t	          d          t	          d          t	          d          dt	          d          t	          d                    V  dS )zrow-N    rc   rd   rb   zsynthetic asset rh   stockrj   r    rn   100rk   z4.17)r   r   encode	hexdigestr   )r(   rw   s     r*   r7   zbundle.<locals>.<genexpr>   s          	>%>>((**++5577<.uqy....uqy...rzzGGuCLLDMMDMMENNENNFOO	
 	
     r,   r`      2026-07-27T09:14:30+02:00r   r   r!   220020024001100r   )r   )r   r   r   r   document_hashsemantic_referencer   tuplert   r   r   r
   r   )r}   r   zip_hashoverview_hashdoc_rawdocumenteventtransfer_outtransfer_in	positionssnapshots              r*   bundler   p   s~    g((**H<((2244M%Gw!!##|&&(({%%''z$$&&	 H x""$$#
+ E. ))++"4+ L. ~((**"4+ K.    2YY    I  	#5'%..'#,,OO5'%..'#,,OO	
 		 H  =(002233==??		k*%
	 	 	r,   c                    ddt          j        |                                           t          j        |                                          dS )Nzdocuments.zipzoverview.pdf)zip_file_nameoverview_file_namezip_content_base64overview_content_base64)base64	b64encodedecoder}   r   s     r*   requestr      sK    (,$.w77>>@@#)#3L#A#A#H#H#J#J	  r,   c                +  1 t                      }g 1|                     dt          |                     |                     t          d1fd           t                      }|j        }t	          j        ||          }|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         }
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	          j        |i ||d         |d         dd          }t	          j        ||          }t	          j        |i ||d         |d         dd          }t#          1          }d}||k    }|st          j	        d|fd||f          dt          j                    v st          j        t"                    rt          j        t"                    nddt          j                    v st          j        1          rt          j        1          ndt          j        |          t          j        |          dz  }	dd|	iz  }t          t          j        |                    d x}x}}g }|d         }d}||u }|}
|r|d         }d}||u }|}
|
st          j	        d|fd||f          t          j        |          t          j        |          dz  }	d d|	iz  }|                    |           |r`t          j	        d|fd!||f          t          j        |          t          j        |          d"z  }d#d$|iz  }|                    |           t          j        |d%          i z  }d&d'|iz  }t          t          j        |                    d x}
x}x}x}x}x}x}}t	          j        |          }t          |          }g }d(}||v}|}
|rd)}||v}|}
|
sXt          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  }|                    |           |rt          j	        d*|fd0||f          t          j        |          d,t          j                    v st          j        |          rt          j        |          nd,d1z  }d2d3|iz  }|                    |           t          j        |d%          i z  } d4d5| iz  }t          t          j        |                    d x}
x}x}x}x}}d6}
|d7         }|
|v}|slt          j	        d*|fd8|
|f          t          j        |
          t          j        |          dz  }d	d
|iz  }	t          t          j        |	                    d x}
x}}d9}
|d:         d%         }|
|v}|slt          j	        d*|fd8|
|f          t          j        |
          t          j        |          dz  }d	d
|iz  }	t          t          j        |	                    d x}
x}}d;}
|d<         d%         }|
|v}|slt          j	        d*|fd8|
|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>}|
|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}}|                    dA                                          d%         }
dB}|
|k    }|slt          j	        d|fd|
|f          t          j        |
          t          j        |          dz  }d	d
|iz  }	t          t          j        |	                    d x}
x}}t/          |                    dC                    }!|!dD         }
|
t0          k    }|st          j	        d|fdE|
t0          f          t          j        |
          dFt          j                    v st          j        t0                    rt          j        t0                    ndFdGz  }"dHdI|"iz  }t          t          j        |                    d x}
}|!dJ         }
|
t2          k    }|st          j	        d|fdE|
t2          f          t          j        |
          dKt          j                    v st          j        t2                    rt          j        t2                    ndKdGz  }"dHdI|"iz  }t          t          j        |                    d x}
}|!dL         }
t0          t2          h}|
|v}|slt          j	        d*|fd8|
|f          t          j        |
          t          j        |          dz  }d	d
|iz  }	t          t          j        |	                    d x}
x}}|!j        } |            }t7          |          }#t#          |#          }dB}||k    }|sst          j	        d|fdM||f          dt          j                    v st          j        t"                    rt          j        t"                    nddNt          j                    v st          j        t6                    rt          j        t6                    ndNdOt          j                    v st          j        |!          rt          j        |!          ndOt          j        |          t          j        |          t          j        |#          t          j        |          t          j        |          dPz  }$dQdR|$iz  } t          t          j        |                     d x}x}x}#x}x}}dS |                    dT          D             }%|%t0                   }
dU}|
|k    }|slt          j	        d|fd|
|f          t          j        |
          t          j        |          dz  }d	d
|iz  }	t          t          j        |	                    d x}
x}}|%t2                   }
dV}|
|k    }|slt          j	        d|fd|
|f          t          j        |
          t          j        |          dz  }d	d
|iz  }	t          t          j        |	                    d x}
x}}|%|!dL                  }
dW}|
|k    }|slt          j	        d|fd|
|f          t          j        |
          t          j        |          dz  }d	d
|iz  }	t          t          j        |	                    d x}
x}}|                    dX                                          d%         }
dB}|
|k    }|slt          j	        d|fd|
|f          t          j        |
          t          j        |          dz  }d	d
|iz  }	t          t          j        |	                    d x}
x}}|                    dY|!dL         f                                          d%         }
dZ}|
|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             }
|!dL         t2          h}|
|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^h}|
|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<}||z  }da}'||'z  }(db}|(|z  }|j        }dc}) ||)          }*t=          |*          }+t#          |+          },dB}-|,|-k    }.|.st          j	        d|.fdd|,|-f          dt          j                    v st          j        t"                    rt          j        t"                    nddet          j                    v st          j        t<                    rt          j        t<                    ndedft          j                    v st          j        |          rt          j        |          ndft          j        |          t          j        |'          t          j        |          t          j        |          t          j        |)          t          j        |*          t          j        |+          t          j        |,          t          j        |-          dgz  }/dhdi|/iz  }0t          t          j        |0                    d x}x}x}'x}(x}x}x}x})x}*x}+x},x}.}-d S )jNJARVIS_FINANCE_RUNTIME_DIRparse_postfinance_bundlec                R                         | |f          pt          | |          S r6   )appendr   )r}   r   callss     r*   <lambda>z`test_preview_confirm_and_reparse_are_atomic_idempotent_and_keep_roles_separate.<locals>.<lambda>  s+    LL'<011RVG\5R5R r,   r-   z5%(py2)s
{%(py2)s = %(py0)s.total_changes
} == %(py4)srv   beforer<   r=   r2   r3   r4   mapped_position_countr`   r/   r0   
preview_idconfirmation_idTr   r   confirm   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slenr   r<   r1   r>   r4   assert %(py8)spy8
idempotentFisz%(py3)s is %(py6)sr>   r4   %(py8)sz%(py11)s is %(py14)srB   py14%(py16)spy16r   assert %(py19)spy19account_pf_r   )not in)z%(py3)s not in %(py5)s
serialized)r>   r?   z%(py7)sr@   )z%(py10)s not in %(py12)s)py10py12z%(py14)sr   rE   rF   snapshot_idlatest_snapshot)z%(py1)s not in %(py4)sinstrument_idr   batch_idimports/SELECT COUNT(*) FROM postfinance_import_batchesrd   z*SELECT COUNT(*) FROM postfinance_snapshotsz3SELECT COUNT(*) FROM postfinance_snapshot_positionsz.SELECT COUNT(*) FROM postfinance_account_roles   z5SELECT role,account_id FROM postfinance_account_rolesetrading_depot)z%(py1)s == %(py3)srr   )r1   r>   zassert %(py5)sr?   r   rs   r   )z%(py10)s
{%(py10)s = %(py0)s(%(py8)s
{%(py8)s = %(py1)s(%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.values
}()
})
})
} == %(py13)ssetroles)r<   r1   r=   r2   r4   r   r   rC   zassert %(py15)srD   c                <    i | ]}|d          |d         |d         fS )
account_idincludedclassification_roler$   r(   rows     r*   
<dictcomp>zbtest_preview_confirm_and_reparse_are_atomic_idempotent_and_keep_roles_separate.<locals>.<dictcomp>3  s>        	LC
OS1F-GH  r,   zUSELECT account_id,included,classification_role FROM performance_scope_classifications)rd   postfinance_etrading_depot)rd   postfinance_etrading_cash)r   postfinance_efinance_controlzSSELECT COUNT(*) FROM audit_log WHERE entity_type='performance_scope_classification'z4SELECT account_name FROM accounts WHERE account_id=?zPostFinance E-FinancezSELECT account_id,activity_kind FROM transactions WHERE internal_transfer_group_id='synthetic-transfer-group' ORDER BY account_idc                    h | ]
}|d          S r   r$   r   s     r*   	<setcomp>zatest_preview_confirm_and_reparse_are_atomic_idempotent_and_keep_roles_separate.<locals>.<setcomp>H  s    777#C777r,   c                    h | ]
}|d          S )activity_kindr$   r   s     r*   r   zatest_preview_confirm_and_reparse_are_atomic_idempotent_and_keep_roles_separate.<locals>.<setcomp>I  s    :::SC :::r,   r   zVSELECT activity_kind FROM transactions WHERE source_type='postfinance_official_import'tradepostfinancearchive*)z%(py21)s
{%(py21)s = %(py0)s(%(py19)s
{%(py19)s = %(py1)s(%(py17)s
{%(py17)s = %(py13)s
{%(py13)s = (((%(py2)s / %(py4)s) / %(py7)s) / %(py10)s).glob
}(%(py15)s)
})
})
} == %(py24)slisttmp_path)r<   r1   r=   r2   r@   r   rC   rD   rF   r   py21py24zassert %(py26)spy26)rz   setenvstrsetattrservicer   total_changespreview_postfinance_importrG   rH   rL   rM   rN   rI   rJ   rK   confirm_postfinance_importr   r   _format_boolopget_postfinance_summaryrq   fetchonedictrr   rs   valuesr   fetchallglobr   )2monkeypatchr   rv   payloadr   previewrU   rQ   rS   rT   rP   rR   firstagain_previewsecond@py_assert5rV   @py_format9r[   @py_assert13rY   @py_format15@py_format17r]   @py_format20safe_summaryr   @py_assert9@py_assert11@py_format6@py_format8@py_format13r\   r   @py_format4@py_assert7@py_format14classificationstransfer_rowsrW   rX   rZ   @py_assert16@py_assert18@py_assert20@py_assert23@py_assert22@py_format25@py_format27r   s2                                                    @r*   Ntest_preview_confirm_and_reparse_are_atomic_idempotent_and_keep_roles_separater(     s    ;;DE3S]]CCC"	
 	
 	
 	
   iiGF0w??G'''''''''''''''''''''''4'''''4'''''''''''''''''''''''''''''''''''''''''''''''''*+1r1+r1111111111+r11111+1111r111111111111111111111111111.	
	
!,/&'89		
 	
 	
 E 6tWEEM/	
	
'5,->?		
 	
 	
 F u:::?:33uu:HH5H%H%'HHHHHF<,@HDH,@D,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HHHHHHHHHHHHHHHHH,@DHHHHH,@HHHHD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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2488L\""JOO=O=
*OOOOO~O~Z/OOOOOOOOOOOO=
OOOOO=OOOOOOOOOOO
OOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOO~ZOOOOO~OOOOOOOOOOOZOOOOOZOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO?-> ??= ???????????= ??????=???? ????????????????????????????>,{";A">>?">>>>>>>>>>>?">>>>>>?>>>>">>>>>>>>>>>>>>>>>>>>>>>>>>>>7\)4Q77:77777777777:777777:77777777777777777777777777777777<<IJJSSUUVWX]\]]X\]]]]]]]]]]]X\]]]]]]X]]]]\]]]]]]]]]]]]]]]]]]]]]]]]]]]]<<DEENNPPQRSXWXXSWXXXXXXXXXXXSWXXXXXXSXXXXWXXXXXXXXXXXXXXXXXXXXXXXXXXXX<<MNNWWYYZ[\b`bb\`bbbbbbbbbbb\`bbbbbb\bbbb`bbbbbbbbbbbbbbbbbbbbbbbbbbbb<<HIIRRTTUVW\[\\W[\\\\\\\\\\\W[\\\\\\W\\\\[\\\\\\\\\\\\\\\\\\\\\\\\\\\\UVVWWE!"+"e++++++++++"e+++++"+++++++++++e+++++e+++++++++++++++++++++++++++!)!T))))))))))!T)))))!)))))))))))T)))))T)))))))))))))))))))))))))))1UDM1M1111111111M111111111M111111111111111111111111111<(<<>>(s>""(3"##(q(#q((((((((((#q((((((((((((3(((((3(((((((((((((s(((((s(((((((((((((5(((((5((((((<((((>(((("((((#((((q((((((((((((((((((((((((((((((((( <<c
 
  O 5!F%FF!%FFFFFFFFFFF!%FFFFFF!FFFF%FFFFFFFFFFFFFFFFFFFFFFFFFFFF4 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DDDDDDDDDDDDDDDDDDDDD5,-T1TT-1TTTTTTTTTTT-1TTTTTT-TTTT1TTTTTTTTTTTTTTTTTTTTTTTTTTTT<<] hjj                q                         	BU:EVDX	
 	

(**Q	 #		 #	#   
   	 #	   
		  
 #	             
            LL 	L hjj  87777TE*<Mt;TT7;TTTTTTTTTTT7;TTTTTT7TTTT;TTTTTTTTTTTTTTTTTTTTTTTTTTTT::M:::S?R>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SSSSSSSSSSSSSSSSSSd	
 	

(**Q	 		 	   
   	 	   
		  
 	             
            !*WX	)WMW)M9WIW9IEWEKWCWKKCPPWtPQQW3QRRWVWWRVWWWWWWWWWWWRVWWWWWWWWWWWWW3WWWWW3WWWWWWWWWWWWWtWWWWWtWWWWWWWWWWWWWXWWWWWXWWWWWW	WWWWMWWWWIWWWWKWWWWCWWWWPWWWWQWWWWRWWWWVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWr,   c                L   t                      }|                     dt          |                     |                     t          dd            t                      }t	          j        ||          }t	          j        |i ||d         |d         dd           |                    d          	                                }g }|d	         }d
}||k    }	|	}
|	r&|d         }d}||k    }|}
|r|d         }d}||k    }|}
|
sdt          j        d|	fd||f          t          j        |          t          j        |          dz  }dd|iz  }|                    |           |	rt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }|                    |           |r`t          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }|                    |           t          j        |d	          i z  }dd|iz  }t          t          j        |                    d x}
x}x}x}	x}x}x}x}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 S )#Nr   r   c                "    t          | |          S r6   r   r   s     r*   r   zDtest_provider_and_computed_cost_basis_are_separate.<locals>.<lambda>Y      fWl&C&C r,   r   r   Tr   zSELECT provider_cost_total_original,computed_cost_basis_original,computed_cost_basis_status FROM postfinance_snapshot_positions WHERE computed_cost_basis_original IS NOT NULLr   rn   rd   r      rp   r-   )z%(py3)s == %(py6)sr   r   r   )z%(py11)s == %(py14)sr   r   r   )z%(py19)s == %(py22)s)r   py22z%(py24)sr   zassert %(py27)spy27z0SELECT COUNT(*) FROM postfinance_cost_basis_lotsr/   r0   r3   r4   )rz   r   r   r   r   r   r  r  rq   r  rG   rH   rI   r   r  rJ   rK   )r
  r   rv   r  r  r  rU   rR   r  rV   rP   r[   r  rY   r"  @py_assert21r#  rT   r  r  r  @py_format23r&  @py_format26@py_format28rQ   rS   s                              r*   2test_provider_and_computed_cost_basis_are_separater4  S  s   ;;D3S]]CCC"CC  
 iiG0w??G&	
	
!,/&'89		
 	
 	
   LL 	y hjj 
 LK58KtK8tKKKKKaKDKD 0KKKKKU1XKKX5KKKKKKKKKKKK8tKKKKK8KKKKt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DKKKKKKKKKD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KXKKKKKX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KKKKKKKKKKKKKKKKK<<JKKTTVVWXY^]^^Y]^^^^^^^^^^^Y]^^^^^^Y^^^^]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^r,   c                   t                      }|                     dt          |                     t                      }t	          |j        d         t          d          t          d          t          d                    }t	          |t          d                                          dd	d
t          d          t          d          t          d          t          d          t          d          
  
        }t	          |||g|j        dd          R           | 	                    t          dfd           t                      }t          j        ||          }t          j        |i ||d         |d         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dt'          j                    v st#          j        |          rt#          j        |          ndt#          j        |	          t#          j        |
          dz  }dd|iz  }t/          t#          j        |                    d x}	x}}
|                    d                                           }t!          |          }	d!}
|	|
k    }|st#          j        d|fd|	|
f          dt'          j                    v st#          j        t                     rt#          j        t                     ndd"t'          j                    v st#          j        |          rt#          j        |          nd"t#          j        |	          t#          j        |
          dz  }dd|iz  }t/          t#          j        |                    d x}	x}}
d S )#Nr   r   2r   101)quantitygross_originalnet_originals
   sell-eventsellz
2026-07-10r   r    6059)	event_fingerprint
event_typeoccurred_on	directionr8  price_originalr9  fee_originalr:  rd   )eventsr   c                    S r6   r$   )_zip	_overviewfifo_bundles     r*   r   zVtest_sell_consumes_documented_fifo_lot_before_cost_basis_persistence.<locals>.<lambda>  s    U` r,   r   r   Tr   zLSELECT quantity_acquired,quantity_remaining FROM postfinance_cost_basis_lots)r6  r    r-   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   lotr   r   r   zSELECT computed_cost_basis_original,computed_cost_basis_status FROM postfinance_snapshot_positions WHERE computed_cost_basis_original IS NOT NULL)z50.5rp   computed)rz   r   r   r   r   rD  r   r   r   r   r   r   r  r  rq   r  r   rG   rH   rL   rM   rN   rI   rJ   rK   )r
  r   rv   originalr   r;  r  r  rI  rR   r  rV   rT   r  rJ  rH  s                  @r*   Dtest_sell_consumes_documented_fifo_lot_before_cost_basis_persistencerL  m  s   ;;D3S]]CCCxxH
u~~U^^	  C  //99;; t}}t}}S\\T]]  D (C+L8K+L+LMMMK!;=`=`=`=`aaaiiG0w??G&	
	
!,/&'89		
 	
 	
   ,,V hjj  ::##:##########:############5#####5########################:###############################|| 	\ hjj  ??222?22222222222?22222222222225222225222222222222222222222222?2222222222222222222222222222222222r,   c           	        t                      }|                     dt          |                     |                     t          dd            t                      }t	          j        ||          }t	          j        |i ||d         |d         dd           t          dd	          }t	          j        ||          }|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}	}t          j        t          d
          5  t	          j        |i ||d         |d         dd           d d d            n# 1 swxY w Y   |                    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 S )Nr   r   c                "    t          | |          S r6   r+  r   s     r*   r   zNtest_same_snapshot_with_different_original_source_is_blocked.<locals>.<lambda>  r,  r,   r   r   Tr   s   synthetic-zip-revisions    %PDF-synthetic-overview-revisionconflictr   z%(py1)s is %(py4)sr0   r3   r4   matchr   r   rd   r-   r/   )rz   r   r   r   r   r   r  r  rG   rH   rI   rJ   rK   pytestraises
ValueErrorrq   r  )r
  r   rv   r  r  	alternaterO  rP   rQ   rR   rS   rT   s               r*   <test_same_snapshot_with_different_original_source_is_blockedrW    s    ;;D3S]]CCC"CC  
 iiG0w??G&	
	
!,/&'89		
 	
 	
   13VWWI1$	BBHJ'4'4''''''''''4'''''''''4'''''''''''''''''''''''''''	z	4	4	4 	
 	
*&|4#+,=#>	  	
 	
 	
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 <<IJJSSUUVWX]\]]X\]]]]]]]]]]]X\]]]]]]X]]]]\]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]s   *FFFc                
   t                      }|                    dt          f           |                                 |                     t
          dd            t          j        |t                                }|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 S )Na  INSERT INTO positions_snapshot(position_snapshot_id,snapshot_date,account_id,platform_id,
               instrument_id,quantity,market_value_chf,data_quality_status,created_at)
           VALUES('same-day','2026-07-27',?,'pf','instrument_pf_00','1','100','complete','2026-07-27')r   c                    t                      S r6   r+  rF  rG  s     r*   r   zWtest_existing_same_day_canonical_projection_is_blocked_during_preview.<locals>.<lambda>      U[U]U] r,   rO  Tr   rP  r0   r3   r4   conflicting_batch_id"canonical_projection_date_conflictr-   r/   )rz   rq   rr   ru   r   r   r  r   rG   rH   rI   rJ   rK   )r
  rv   r  rP   rQ   rR   rS   rT   s           r*   Etest_existing_same_day_canonical_projection_is_blocked_during_previewr^    s   ;;DLL	j 
	   	KKMMM!;=]=]^^^0wyyAAG:&$&$&&&&&&&&&&$&&&&&&&&&$&&&&&&&&&&&&&&&&&&&&&&&&&&&)*R.RR*.RRRRRRRRRRR*.RRRRRR*RRRR.RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRr,   c                f   t                      }|                     dt          |                     |                     t          dd            t                      }t	          j        ||          }t	          j        |i ||d         |d         dd          }t          j	        t          d	          5  |                    d
|d         f           d d d            n# 1 swxY w Y   t          j	        t          d	          5  |                    d|d         f           d d d            n# 1 swxY w Y   ddddd}|                                D ]\  }}t          j	        t          d	          5  |                    d| d|            d d d            n# 1 swxY w Y   t          j	        t          d	          5  |                    d|            d d d            n# 1 swxY w Y   dddd}	|	                                D ]\  }}
t          j	        t          d	          5  |                    d| d|
            d d d            n# 1 swxY w Y   t          j	        t          d	          5  |                    d| d|
            d d d            n# 1 swxY w Y   d S )Nr   r   c                "    t          | |          S r6   r+  r   s     r*   r   zEtest_immutable_postfinance_source_and_snapshot_rows.<locals>.<lambda>  r,  r,   r   r   Tr   	immutablerQ  zBUPDATE postfinance_snapshots SET total_chf='0' WHERE snapshot_id=?r   zcannot be deletedz5DELETE FROM postfinance_snapshots WHERE snapshot_id=?zdocument_hash=document_hashzcreated_at=created_at)postfinance_batch_documentspostfinance_snapshot_positionspostfinance_snapshot_cashpostfinance_event_componentszUPDATE z SET zDELETE FROM z)source_type='postfinance_official_import')positions_snapshotcash_balancestransactionsz! SET created_at=created_at WHERE z WHERE )rz   r   r   r   r   r   r  r  rS  rT  	Exceptionrq   items)r
  r   rv   r  r  resultimmutable_columnstable
assignmentcanonical_tables	predicates              r*   3test_immutable_postfinance_source_and_snapshot_rowsrq    s   ;;D3S]]CCC"CC  
 iiG0w??G/	
	
!,/&'89		
 	
 	
 F 
y	4	4	4 
 
PM"$	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
y(;	<	<	< 
 
Cf]F[E]	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 (E*A%<(?	  /4466 1 1z]9K888 	= 	=LL;5;;z;;<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=]9,?@@@ 	1 	1LL///000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 JDC 
 -2244 C Cy]9K888 	X 	XLLV5VV9VVWWW	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X]9,?@@@ 	C 	CLLAAAiAABBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	CC Csl   6C  C$'C$D00D47D46FF"	%F"	G))G-	0G-	/II	I	=J%%J)	,J)	c                B/  9 t                      }|                     dt          |                     t                      }t	          d          }t	          d          }dd} ||           ||          z   }t          d	 t          |j        j        |d
          D                       }t          |t          |j        |t          dt	          d          t	          d          t	          d                    t          dt	          d          t	          d          t	          d                    ft	          d          t	          d          t	          d          ||                    9|                     t          d9fd           |                    dt          f           |                    d           |                    d           |                    d           |                                 t!                      }	t          j        ||	          }
t          j        |i |	|
d         |
d          d
d!           |j        }t)          |          }t+          |          }t-          |          }t/          |          }t1          |d"#          }t3          |          }|j        }||k    }|st5          j        d$|fd%||f          d&t9          j                    v st5          j        |          rt5          j        |          nd&t5          j        |          d't9          j                    v st5          j        |          rt5          j        |          nd'd(z  }d)d*|iz  }tA          t5          j!        |                    d+x}}|j"        }d}||k    }|st5          j        d$|fd,||f          d-t9          j                    v st5          j        |          rt5          j        |          nd-t5          j        |          t5          j        |          d.z  }d/d0|iz  }tA          t5          j!        |                    d+x}x}}d1 |j        D             }tG          |          }d}t	          |          }||k    }|s"t5          j        d$|fd2||f          d3t9          j                    v st5          j        tF                    rt5          j        tF                    nd3t5          j        |          t5          j        |          dt9          j                    v st5          j        t                    rt5          j        t                    ndt5          j        |          t5          j        |          d4z  }d5d6|iz  }tA          t5          j!        |                    d+x}x}x}x}}tI          d7 |j        D                       }|j%        }tM          ||          }|j'        }d}||k    }|sVt5          j        d$|fd8||f          d9t9          j                    v st5          j        tL                    rt5          j        tL                    nd9d&t9          j                    v st5          j        |          rt5          j        |          nd&d:t9          j                    v st5          j        |          rt5          j        |          nd:t5          j        |          t5          j        |          t5          j        |          t5          j        |          d;z  } d<d=| iz  }!tA          t5          j!        |!                    d+x}x}x}x}}|j(        }d}||k    }|st5          j        d$|fd>||f          d?t9          j                    v st5          j        |          rt5          j        |          nd?t5          j        |          t5          j        |          d.z  }d/d0|iz  }tA          t5          j!        |                    d+x}x}}|j)        }d@}||k    }|st5          j        d$|fdA||f          d?t9          j                    v st5          j        |          rt5          j        |          nd?t5          j        |          t5          j        |          d.z  }d/d0|iz  }tA          t5          j!        |                    d+x}x}}dB |D             }tG          |          }d}t	          |          }||k    }|s"t5          j        d$|fd2||f          d3t9          j                    v st5          j        tF                    rt5          j        tF                    nd3t5          j        |          t5          j        |          dt9          j                    v st5          j        t                    rt5          j        t                    ndt5          j        |          t5          j        |          d4z  }d5d6|iz  }tA          t5          j!        |                    d+x}x}x}x}}dC |D             }"|" }#|#s:dDdEt5          j        |"          iz  }$tA          t5          j!        |$                    d+x}"}#|j"        }#t	          |#          }|j(        }%t	          |%          }||z   }&d}'t	          |'          }(|&|(k    })|)st5          j        d$|)fdF|&|(f          dt9          j                    v st5          j        t                    rt5          j        t                    ndd-t9          j                    v st5          j        |          rt5          j        |          nd-t5          j        |#          t5          j        |          dt9          j                    v st5          j        t                    rt5          j        t                    ndd?t9          j                    v st5          j        |          rt5          j        |          nd?t5          j        |%          t5          j        |          dt9          j                    v st5          j        t                    rt5          j        t                    ndt5          j        |'          t5          j        |(          dGz  }*dHdI|*iz  }+tA          t5          j!        |+                    d+x}#x}x}%x}x}&x})x}'}(|j*        }dJ}||k    }|st5          j        d$|fdK||f          dLt9          j                    v st5          j        |          rt5          j        |          ndLt5          j        |          t5          j        |          d.z  }d/d0|iz  }tA          t5          j!        |                    d+x}x}}|dM         }"d}|"|k    }#|#slt5          j        d$|#fdN|"|f          t5          j        |"          t5          j        |          dOz  }d)d*|iz  }tA          t5          j!        |                    d+x}"x}#}tI          dP |dQ         D                       },|,dR         }"d}|"|k    }#|#slt5          j        d$|#fdN|"|f          t5          j        |"          t5          j        |          dOz  }d)d*|iz  }tA          t5          j!        |                    d+x}"x}#}|,dS         }"dT}|"|k    }#|#slt5          j        d$|#fdN|"|f          t5          j        |"          t5          j        |          dOz  }d)d*|iz  }tA          t5          j!        |                    d+x}"x}#}|                    dU          +                                dV         }"d}|"|k    }#|#slt5          j        d$|#fdN|"|f          t5          j        |"          t5          j        |          dOz  }d)d*|iz  }tA          t5          j!        |                    d+x}"x}#}|                    dW          +                                dV         }"dX}|"|k    }#|#slt5          j        d$|#fdN|"|f          t5          j        |"          t5          j        |          dOz  }d)d*|iz  }tA          t5          j!        |                    d+x}"x}#}g }-t          dY |D              |t	          dZ                     |t	          d[                    z   d
          D ]G\  }.}/|-,                    tZ          |.d\         d]t          |/          t          |/          d^d_d`           H|                    da           |                    dbt]          j/        dc|-i          f           |                                 t+          |          }0|0j(        }dd}||k    }|st5          j        d$|fd>||f          det9          j                    v st5          j        |0          rt5          j        |0          ndet5          j        |          t5          j        |          d.z  }d/d0|iz  }tA          t5          j!        |                    d+x}x}}|0j)        }df}||k    }|st5          j        d$|fdA||f          det9          j                    v st5          j        |0          rt5          j        |0          ndet5          j        |          t5          j        |          d.z  }d/d0|iz  }tA          t5          j!        |                    d+x}x}}t)          |          }#|#j"        }d}||k    }1|1st5          j        d$|1fdg||f          dht9          j                    v st5          j        t(                    rt5          j        t(                    ndhd&t9          j                    v st5          j        |          rt5          j        |          nd&t5          j        |#          t5          j        |          t5          j        |          diz  }2djdk|2iz  }tA          t5          j!        |                    d+x}#x}x}1}t          j0        |          dl         dm         }"d}|"|k    }#|#slt5          j        d$|#fdN|"|f          t5          j        |"          t5          j        |          dOz  }d)d*|iz  }tA          t5          j!        |                    d+x}"x}#}t          j        ||	          }3t          j        |i |	|3d         |3d          d
d!          }4g }|3dn         }#d
}|#|u }|}"|r|3do         }dp})||)u }&|&}"|"st5          j        dq|fdr|#|f          t5          j        |#          t5          j        |          dsz  }dtdu|iz  }2|,                    |2           |r`t5          j        dq|&fdv||)f          t5          j        |          t5          j        |)          dwz  }5dxdy|5iz  }6|,                    |6           t5          j1        |dV          i z  }7dzd{|7iz  }8tA          t5          j!        |8                    d+x}"x}x}#x}x}x}x}&})|4d|         }"d
}|"|u }#|#slt5          j        dq|#fd}|"|f          t5          j        |"          t5          j        |          dOz  }d)d*|iz  }tA          t5          j!        |                    d+x}"x}#}|                    d~          +                                dV         }"d}|"|k    }#|#slt5          j        d$|#fdN|"|f          t5          j        |"          t5          j        |          dOz  }d)d*|iz  }tA          t5          j!        |                    d+x}"x}#}d+S )zLReproduce the production placeholder/exposure/settlement-position collision.r   z	255791.97z37673.19totalr   r   list[Decimal]c           
           fdt          d          D             }|dxx          t          |t          d                    z
  z  cc<   |S )Nc                t    g | ]4}t          d           z                      t          d                    5S )11z0.01)r   quantize)r(   _rs  s     r*   r+   zktest_global_read_model_counts_official_postfinance_components_once.<locals>.split_total.<locals>.<listcomp>  s8    WWW574==(2276??CCWWWr,   rh   r8   )rt   r:   r   )rs  r  s   ` r*   split_totalzWtest_global_read_model_counts_official_postfinance_components_once.<locals>.split_total  sS    WWWWUSUYYWWWr


ec&'#,,7777


r,   c              3  \   K   | ]'\  }}t          |t          d           ||          V  (dS )r    )r8  market_price_originalmarket_value_chfN)r   r   )r(   r)   values      r*   r7   zUtest_global_read_model_counts_official_postfinance_components_once.<locals>.<genexpr>  sR        D% 	ws||5[`aaa     r,   T)strictr   z21693.27z0.9293z71623.09r!   z9235.55z0.8146z	249526.14z	293465.16z27684.07	321149.23)r   cashsecurities_total_chfcash_total_chftotal_value_chfstock_total_chfetf_total_chf)r   r   c                    S r6   r$   )rF  rG  	realistics     r*   r   zTtest_global_read_model_counts_official_postfinance_components_once.<locals>.<lambda>!  s    U^ r,   a  INSERT INTO cash_account_snapshots(snapshot_id,account_id,snapshot_type,balance_date,
               amount_original,currency,amount_chf,source,note,created_at,created_by)
           VALUES('legacy-total',?,'manual_balance','2026-07-26','321149.23','CHF',
                  '321149.23','manual','historical depot total placeholder',
                  '2026-07-26T00:00:00Z','synthetic')zINSERT INTO platforms(platform_id,name,platform_type,country,default_currency,is_active,created_at) VALUES('tw','True Wealth','wealth','CH','CHF',1,'2026-01-01')zINSERT INTO accounts(account_id,platform_id,account_name,account_type,currency,
               performance_included,is_active,created_at,portfolio_bucket)
           VALUES('account_tw','tw','True Wealth','brokerage','CHF',0,1,'2026-01-01','truewealth')a;  INSERT INTO account_value_snapshots(snapshot_id,account_id,valuation_date,
               total_value_chf,currency,source_type,quality_status,created_at,is_active)
           VALUES('tw-value','account_tw','2026-07-27','152845.00','CHF',
                  'synthetic_truewealth','complete','2026-07-27T00:00:00Z',1)r   r   r   
2026-07-27as_ofr-   r   rv   before_getsr   r3   r4   N)z0%(py2)s
{%(py2)s = %(py0)s.cash_chf
} == %(py5)sr  )r<   r=   r?   zassert %(py7)sr@   c              3  ^   K   | ](}|j         t          k    t          |j                  V  )d S r6   r   rs   r   used_value_chfr'   s     r*   r7   zUtest_global_read_model_counts_official_postfinance_components_once.<locals>.<genexpr>K  s:      bb$/]aJaJawt*++JaJaJaJabbr,   )zP%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}r:   )r<   r=   r2   r4   r   r   assert %(py12)sr   c              3  P   K   | ]!}|j         t          k    |j        d k    |V  "dS r!   N)r   rs   currencyr'   s     r*   r7   zUtest_global_read_model_counts_official_postfinance_components_once.<locals>.<genexpr>L  s=      nn4?d;R;RW[WdhmWmWmWmWmWmWmnnr,   )zp%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py0)s(%(py1)s, %(py4)s
{%(py4)s = %(py2)s.id
})
}.currency
} == %(py11)sr   usd_position)r<   r1   r=   r2   r4   r   rB   assert %(py13)srC   )z8%(py2)s
{%(py2)s = %(py0)s.equity_value_chf
} == %(py5)sri   r   )z-%(py2)s
{%(py2)s = %(py0)s.as_of
} == %(py5)sc              3  b   K   | ]*}|d          t           k    t          |d                   V  +dS )r   r~  N)rr   r   r   s     r*   r7   zUtest_global_read_model_counts_official_postfinance_components_once.<locals>.<genexpr>P  s@      ^^C3|CTX]C]C]ws-.//C]C]C]C]^^r,   c                H    g | ]}|d          t           k    |d         dv | S )r   asset_class>   rj   r   ri   )rs   r   s     r*   r+   zVtest_global_read_model_counts_official_postfinance_components_once.<locals>.<listcomp>Q  s7    vvvs<'8D'@'@SEW[uEuEuEuEuEur,   zassert not %(py1)sr1   )z(%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.cash_chf
})
} + %(py11)s
{%(py11)s = %(py6)s(%(py9)s
{%(py9)s = %(py7)s.equity_value_chf
})
}) == %(py18)s
{%(py18)s = %(py14)s(%(py16)s)
})r<   r1   r>   r?   r4   r@   rA   rB   r   r   py18zassert %(py20)spy20z	152845.00)z<%(py2)s
{%(py2)s = %(py0)s.truewealth_value_chf
} == %(py5)soverviewr  r/   r0   c              3  2   K   | ]}|d          dk    |V  dS )reported_totalr  Nr$   r'   s     r*   r7   zUtest_global_read_model_counts_official_postfinance_components_once.<locals>.<genexpr>U  s?         ![00 	0000 r,   account_totalsderived_totalstatusmatchedzNSELECT amount_chf FROM cash_account_snapshots WHERE snapshot_id='legacy-total'r   zNSELECT COUNT(*) FROM transactions WHERE internal_transfer_group_id IS NOT NULLr-  c                4    g | ]}|d          t           k    |S r   )rr   r   s     r*   r+   zVtest_global_read_model_counts_official_postfinance_components_once.<locals>.<listcomp>`  s'    ;;;L 1U : : : : :r,   160000140000r   freshrk   zsynthetic-market)r   r   quality_status	value_chfcloser  providera  INSERT INTO market_data_runs(run_id,source_key,as_of,input_fingerprint,status,
               started_at,completed_at,price_total,price_stored,fx_total,fx_stored,
               benchmark_total,benchmark_stored,valuation_stored,missing_instruments_json,
               reason_codes_json)
           VALUES('newer-run','synthetic','2026-07-28','fp','complete','2026-07-28T00:00:00Z',
                  '2026-07-28T00:01:00Z',22,22,0,0,0,0,22,'[]','[]')a  INSERT INTO portfolio_analysis_snapshots(analysis_snapshot_id,run_id,as_of,
               base_currency,total_value_chf,price_coverage_pct,fx_coverage_pct,
               benchmark_coverage_pct,quality_status,reason_codes_json,summary_json,created_at)
           VALUES('newer-analysis','newer-run','2026-07-28','CHF','300000','100','100','0',
                  'complete','[]',?,'2026-07-28T00:01:00Z')r   z	300000.00newerz
2026-07-28)zN%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}.cash_chf
} == %(py8)sr   )r<   r1   r>   r?   r   zassert %(py10)sr   r   	total_chf	duplicaterO  Fr   r   r   r   r   r   r   r   r   r   r   r   rP  r   rd   )rs  r   r   rt  )2rz   r   r   r   r   r   zipr   r   r   r   r   r   rq   rs   ru   r   r  r  r   r   r   r   r   r   r	   rG   rH   rL   rM   rN   rI   rJ   rK   cash_chfr:   nextidr   r  equity_value_chfr  truewealth_value_chfr  r   rr   jsondumpsr  r  ):r
  r   rv   rK  stock_total	etf_totalr{  source_valuesr   r  r  r  r  ri   r  commandreconciliationrowsrU   rQ   rS   rT   rV   r  r  r  r  r  @py_format11r  r  r[   @py_format12r  rP   rR   @py_format3rX   rY   @py_assert15@py_assert17r  @py_format19@py_format21pf_reconciliationmarket_positionsr   r  r  rW   r  r  r  r  r  r]   r  r  s:                                                            @r*   Btest_global_read_model_counts_official_postfinance_components_oncer    s   ;;D3S]]CCCxxH+&&K
##I   
  K,,{{9/E/EEM  x0:MRVWWW    I ugj&9&978;L;LgV`NaNabbugi&8&8'(:K:KWU`MaMabb ")!5!5":..#K00'#
 
 
  I  !;=^=^=^=^___LL	9
 
   	LL 	l   	LL	f  
 	LL	Q   	KKMMMiiG0w??G&	I7 	I',"7#$564	I 	I 	I  
 $KD!!D%%FD!!H(..G3DMMMND,,,,,,,,,,,,,,,,,,,,,,,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,=&J&=J&&&&&&&&&&=J&&&&&&&&&&&&4&&&&&4&&&&&&=&&&&J&&&&&&&&&&&&&&&&&&&&&&&&&&&bbbbby3bbbynxyfmnxfyfyybfyyyyyyyyyyybfyyyyyyyyyyyyy3yyyyy3yyyyyybyyyybyyyyyyyyyyyfmyyyyyfmyyyyyynxyyyyfyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyynnnnnnnL*6/L#D/::L:CLuLCuLLLLLLLLLLCuLLLLLLLLLLLL#LLLLL#LLLLLLLLLLLLLDLLLLLDLLLLLLLLLLLLL,LLLLL,LLLLLL/LLLL:LLLLCLLLLuLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL"1k1"k1111111111"k1111111111116111116111111"1111k111111111111111111111111111<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66666666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6666^^4^^^v3^^^vjuvbijubvbvv^bvvvvvvvvvvv^bvvvvvvvvvvvvv3vvvvv3vvvvvv^vvvv^vvvvvvvvvvvbivvvvvbivvvvvvjuvvvvbvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvtvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv=\7=!!\F,C\G,C$D$D\!$DD\P[\P[H\H\\DH\\\\\\\\\\\DH\\\\\\\\\\\\\7\\\\\7\\\\\\\\\\\\\4\\\\\4\\\\\\=\\\\!\\\\\\\\\\\G\\\\\G\\\\\\\\\\\\\F\\\\\F\\\\\\,C\\\\$D\\\\\\\\\\\\\\\\\\\\\\P[\\\\H\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\(7K7(K7777777777(K7777777777778777778777777(7777K777777777777777777777777777#$2
2$
2222222222$
22222$2222
222222222222222222222222222  '(89     _-<<-<<<<<<<<<<-<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<X&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333333333333333333333<<hiirrttuvw  G  |G  Gw  |G  G  G  G  G  G  G  G  G  G  Gw  |G  G  G  G  G  Gw  G  G  G  G  |G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G<<hiirrttuvw|{||w{|||||||||||w{||||||w||||{||||||||||||||||||||||||||||;;;;;GH%%&&WX5F5F)G)GG   	 	
U
 	#o2F%CJJU+=!
 !
 	 	 	 	
 	LL	H   	LL	?
 
["23	4	46   	KKMMMt$$E!0[0![0000000000![0000000000005000005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000;&,&;,&&&&&&&&&&;,&&&&&&&&&&&&5&&&&&5&&&&&&;&&&&,&&&&&&&&&&&&&&&&&&&&&&&&&&&D!!8!*8j8*j8888888888*j888888888888888888888888888888D88888D888888!8888*8888j88888888888888888888888888888*4001BCKP_T__PT___________PT______P____T____________________________24AAI/	K7 	K)L"9%&78T	K 	K 	K F
 ML9[!LTL!T)LLLLLi
.CLuL.Cu.LLLLLLLLLLLL!TLLLLL!LLLLTLLLLLLLLLLLLLLLLLLLLLLLLLLL.CuLLLLL.CLLLLuLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,'4'4''''''''''4'''''''''4'''''''''''''''''''''''''''<<IJJSSUUVWX]\]]X\]]]]]]]]]]]X\]]]]]]X]]]]\]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]r,   c                @  ./0 t                      }|                     dt          |                     |                     t          dd            |                     t          dd            t                      }t	          j        ||          }t	          j        |i ||d         |d         dd	           t          d
 t          |          D             t          d                    }t          d t          |                                          D             t          d                    }|                    dt          f           d t          |          j        D             }d}t          |          }	t          ||	          }
|
|k    }|s`t#          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        t                    rt#          j        t                    ndt#          j        |          t#          j        |	          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}x}x}	x}
}|                    dt          f                                          d         }|                    d|f           |                    d           |                    d           |                    d           d t5          |          D             }d |D             }h d}||k    }|slt#          j        d|fd ||f          t#          j        |          t#          j        |          d!z  }d"d#|iz  }t/          t#          j        |                    d x}x}}t7          d$ |D                       }t7          d% |D                       }t7          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*}||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,}||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.}||k    }|slt#          j        d|fd ||f          t#          j        |          t#          j        |          d!z  }d"d#|iz  }t/          t#          j        |                    d x}x}}|                    d/           |                    d0           |                    d1           d2 t5          |          D             }d3 |D             }d4g}||k    }|slt#          j        d|fd ||f          t#          j        |          t#          j        |          d!z  }d"d#|iz  }t/          t#          j        |                    d x}x}}t9          |                    d5                                                    ..                    d6t=          d7                                          d8d9:           tA          .          }|                    d;d<!                    |           d=d<!                    d> |D                        d?.fd@|D                        t9          |                    dA                                                    00                    dBd6dCdDdEdFd(dGdDdHd9I           tA          0          }|                    dJd<!                    |           d=d<!                    dK |D                        d?0fdL|D                        |                    dM           |                    dN           |"                                 dO t          |          D             }d}t          |          }	t          ||	          }
dF}t          |          }|
|k    }|st#          j        d|fdP|
|f          dt'          j                    v st#          j        t                    rt#          j        t                    ndt#          j        |          dt'          j                    v st#          j        t                    rt#          j        t                    ndt#          j        |          t#          j        |	          t#          j        |
          dt'          j                    v st#          j        t                    rt#          j        t                    ndt#          j        |          t#          j        |          dQ	z  }dRdS|iz  }t/          t#          j        |                    d x}x}x}	x}
x}x}}t          |dTU          }dV |D             }d}t          |          }	t          ||	          }
|
|k    }|s`t#          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        t                    rt#          j        t                    ndt#          j        |          t#          j        |	          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}x}x}	x}
}t          |dWU          }dX |D             }d}t          |          }	t          ||	          }
|
|k    }|s`t#          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        t                    rt#          j        t                    ndt#          j        |          t#          j        |	          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}x}x}	x}
}t          |dYdZ[          } d\ | D             }d}t          |          }	t          ||	          }
|
|k    }|s`t#          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        t                    rt#          j        t                    ndt#          j        |          t#          j        |	          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}x}x}	x}
}t          |dTU          }!d] |!                                D             }d}t          |          }	t          ||	          }
|
|k    }|s`t#          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        t                    rt#          j        t                    ndt#          j        |          t#          j        |	          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}x}x}	x}
}d_ |!                                D             }d`h}||k    }|slt#          j        d|fd ||f          t#          j        |          t#          j        |          d!z  }d"d#|iz  }t/          t#          j        |                    d x}x}}t          |dWU          }"da |"                                D             }d}t          |          }	t          ||	          }
|
|k    }|s`t#          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        t                    rt#          j        t                    ndt#          j        |          t#          j        |	          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}x}x}	x}
}t          |          }#db |#                                D             }d}t          |          }	t          ||	          }
dE}t          |          }|
|k    }|st#          j        d|fdP|
|f          dt'          j                    v st#          j        t                    rt#          j        t                    ndt#          j        |          dt'          j                    v st#          j        t                    rt#          j        t                    ndt#          j        |          t#          j        |	          t#          j        |
          dt'          j                    v st#          j        t                    rt#          j        t                    ndt#          j        |          t#          j        |          dQ	z  }dRdS|iz  }t/          t#          j        |                    d x}x}x}	x}
x}x}}dc |#                                D             }dCh}||k    }|slt#          j        d|fd ||f          t#          j        |          t#          j        |          d!z  }d"d#|iz  }t/          t#          j        |                    d x}x}}t7          tG          |#                                                    //j$        }$|                    ddt          /j%        t=          de                                          f           |                    dft          f           |                    dgt          /j%        f           |                    dht          f           |"                                 di t          |          j        D             }%dj |%D             }d}t          |          }	t          ||	          }
dk}t          |          }|
|k    }|st#          j        d|fdP|
|f          dt'          j                    v st#          j        t                    rt#          j        t                    ndt#          j        |          dt'          j                    v st#          j        t                    rt#          j        t                    ndt#          j        |          t#          j        |	          t#          j        |
          dt'          j                    v st#          j        t                    rt#          j        t                    ndt#          j        |          t#          j        |          dQ	z  }dRdS|iz  }t/          t#          j        |                    d x}x}x}	x}
x}x}}dl |%D             }t7          |          }|j&        }&dm}
|&|
k    }'|'st#          j        d|'fdn|&|
f          dot'          j                    v st#          j        t6                    rt#          j        t6                    ndot#          j        |          t#          j        |          t#          j        |&          t#          j        |
          dpz  }(dqdr|(iz  }t/          t#          j        |                    d x}x}x}&x}'}
ds |%D             }t7          |          }|j&        }&dt}
|&|
k    }'|'st#          j        d|'fdn|&|
f          dot'          j                    v st#          j        t6                    rt#          j        t6                    ndot#          j        |          t#          j        |          t#          j        |&          t#          j        |
          dpz  }(dqdr|(iz  }t/          t#          j        |                    d x}x}x}&x}'}
t7          /fdutO          |          D                       })|)dv         }t          |          }dw}
t          |
          }|$|z   }||k    }&|&s`t#          j        d|&fdx||f          dt'          j                    v st#          j        t                    rt#          j        t                    ndt#          j        |          t#          j        |          dyt'          j                    v st#          j        |$          rt#          j        |$          ndydt'          j                    v st#          j        t                    rt#          j        t                    ndt#          j        |
          t#          j        |          dzz  }*d{d||*iz  }+t/          t#          j        |+                    d x}x}x}&x}
x}}t7          /fd}tQ          |d~U          D                       },|,j$        }dw}	t          |	          }
|$|
z   }||k    }|sCt#          j        d|fd||f          dt'          j                    v st#          j        |,          rt#          j        |,          ndt#          j        |          dyt'          j                    v st#          j        |$          rt#          j        |$          ndydt'          j                    v st#          j        t                    rt#          j        t                    ndt#          j        |	          t#          j        |
          dz  }-dd|-iz  }*t/          t#          j        |*                    d x}x}x}	x}
}d S )Nr   _nowc                     dS )Nz2026-07-27T10:00:00Zr$   r$   r,   r*   r   zTtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<lambda>  s    1G r,   r   c                    t                      S r6   r+  rZ  s     r*   r   zTtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<lambda>  r[  r,   r   r   Tr   c              3  $   K   | ]}|j         V  d S r6   
amount_chfr'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>  s$      LLTLLLLLLr,   r8   c              3  $   K   | ]}|j         V  d S r6   r~  r'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>  s9       	
 	
 !	
 	
 	
 	
 	
 	
r,   z>UPDATE accounts SET account_type='checking' WHERE account_id=?c              3  ^   K   | ](}|j         t          k    t          |j                  V  )d S r6   r  r'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>  sF       	
 	
$&& D'((&&&&	
 	
r,   r-   )zX%(py9)s
{%(py9)s = %(py0)s(%(py2)s, %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
})
} == %(py11)sr:   r   original_cash_total)r<   r=   r>   r?   r@   rA   rB   r  rC   z3SELECT platform_id FROM accounts WHERE account_id=?platform_ida4  INSERT INTO accounts(
               account_id,platform_id,account_name,account_type,currency,balance_mode,
               portfolio_bucket,is_active,created_at)
           VALUES('generic-usd-cash',?,'Generic Multi-Currency','cash','CHF','csv_calculated',
                  'cash',1,'2026-07-27T10:00:00Z')a  INSERT INTO transactions(
               transaction_id,transaction_type,account_id,trade_date,gross_amount_original,
               net_amount_original,currency_original,fx_rate_to_chf,fx_status,source_type,
               source_id,is_confirmed,quality_status,created_at)
           VALUES('generic-usd-deposit','cash_deposit','generic-usd-cash','2026-07-27',
                  '100','100','USD','0.9','ok','csv_import','generic-usd-deposit',1,
                  'ok','2026-07-27T10:00:00Z')a  INSERT INTO transactions(
               transaction_id,transaction_type,account_id,trade_date,gross_amount_original,
               net_amount_original,currency_original,fx_rate_to_chf,fx_status,source_type,
               source_id,is_confirmed,quality_status,created_at)
           VALUES('generic-eur-deposit','cash_deposit','generic-usd-cash','2026-07-27',
                  '50','50','EUR','1.1','ok','csv_import','generic-eur-deposit',1,
                  'ok','2026-07-27T10:00:01Z')a`  INSERT INTO cash_balances(
               cash_balance_id,account_id,balance_date,currency,amount_original,
               fx_rate_to_chf,amount_chf,source_type,quality_status,created_at)
           VALUES('generic-gbp-dividend','generic-usd-cash','2026-07-27','GBP','10',
                  '1.1','11','vue_equity_dividend','ok','2026-07-27T10:00:02Z')c                *    g | ]}|d          dk    |S r   zgeneric-usd-cashr$   r   s     r*   r+   zVtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<listcomp>  s/       #l2CGY2Y2Y2Y2Y2Yr,   c                    h | ]
}|d          S r  r$   r   s     r*   r   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<setcomp>  s    444C
O444r,   >   r   GBPr!   r/   r0   r3   r4   c              3  2   K   | ]}|d          dk    |V  dS )r  r!   Nr$   r   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>  0      OOsc*o6N6Ns6N6N6N6NOOr,   c              3  2   K   | ]}|d          dk    |V  dS )r  r   Nr$   r   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>  r  r,   c              3  2   K   | ]}|d          dk    |V  dS )r  r  Nr$   r   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>  r  r,   amount_originalz100.00r  z90.00z50.00z55.00z10.00z11.00zMUPDATE accounts SET balance_mode='manual' WHERE account_id='generic-usd-cash'a_  INSERT INTO cash_account_snapshots(
               snapshot_id,account_id,snapshot_type,balance_date,amount_original,currency,
               amount_chf,source,created_at,created_by)
           VALUES('generic-manual-total','generic-usd-cash','manual_balance','2026-07-27',
                  '1000','CHF','1000','manual','2026-07-27T10:01:00Z','user')a_  INSERT INTO cash_balances(
               cash_balance_id,account_id,balance_date,currency,amount_original,
               fx_rate_to_chf,amount_chf,source_type,quality_status,created_at)
           VALUES('generic-missing-fx','generic-usd-cash','2026-07-27','GBP','10',
                  NULL,NULL,'manual_import','missing_fx','2026-07-27T10:01:01Z')c                *    g | ]}|d          dk    |S r  r$   r   s     r*   r+   zVtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<listcomp>  s/       #l2CGY2Y2Y2Y2Y2Yr,   c                .    g | ]}|d          |d         fS )r  r  r$   r   s     r*   r+   zVtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<listcomp>  s&    LLLSS_c,/0LLLr,   )rk   z1000.00z0SELECT * FROM postfinance_import_batches LIMIT 1zfuture-batchs   future-bundlez2026-08-01T09:14:30+02:00z2026-08-01T10:00:00Z)r   bundle_sha256snapshot_atconfirmed_atz'INSERT INTO postfinance_import_batches(,z	) VALUES(c              3     K   | ]}d V  dS ?Nr$   r(   ry  s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>  s$      VlVl_`WZVlVlVlVlVlVlr,   )c                     g | ]
}|         S r$   r$   )r(   columnbatchs     r*   r+   zVtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<listcomp>  s    ---6v---r,   z+SELECT * FROM postfinance_snapshots LIMIT 1zfuture-snapshotz2026-08-01T00:30:00+02:00z1299.00z300.00z999.00z200.00z0.00)r   r   r  r  securities_chfr  
stocks_chfetfs_chfcomponent_total_chfdifference_chf
created_atz"INSERT INTO postfinance_snapshots(c              3     K   | ]}d V  dS r  r$   r  s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>  s$      QgQgZ[RUQgQgQgQgQgQgr,   c                     g | ]
}|         S r$   r$   )r(   r  source_snapshots     r*   r+   zVtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<listcomp>  s    777V	 777r,   aq  INSERT INTO postfinance_snapshot_positions(
               snapshot_position_id,snapshot_id,source_row_reference,instrument_id,asset_class,
               quantity,provider_average_cost_original,provider_cost_total_original,
               price_original,price_currency,value_chf,weight_pct,computed_cost_basis_original,
               computed_cost_basis_status,provenance_json,created_at)
           SELECT 'future-'||snapshot_position_id,'future-snapshot',source_row_reference,
                  instrument_id,asset_class,quantity,provider_average_cost_original,
                  provider_cost_total_original,price_original,price_currency,value_chf,weight_pct,
                  computed_cost_basis_original,computed_cost_basis_status,provenance_json,
                  '2026-08-01T10:00:00Z'
           FROM postfinance_snapshot_positions WHERE snapshot_id<> 'future-snapshot'a|  INSERT INTO postfinance_snapshot_cash(
               snapshot_cash_id,snapshot_id,currency,amount_original,fx_rate_to_chf,value_chf,created_at)
           SELECT 'future-'||snapshot_cash_id,'future-snapshot',currency,amount_original,
                  fx_rate_to_chf,value_chf,'2026-08-01T10:00:00Z'
           FROM postfinance_snapshot_cash WHERE snapshot_id<> 'future-snapshot'c              3  $   K   | ]}|j         V  d S r6   r  r'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>(  s$      SSDSSSSSSr,   r9   r;   rE   rF   r  r  c              3  $   K   | ]}|j         V  d S r6   r  r'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>*  s$      <<D<<<<<<r,   z
2026-07-31c              3  $   K   | ]}|j         V  d S r6   r  r'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>-  s$      ::T::::::r,   z
2026-08-01z2026-07-31T23:59:59Z)r  data_cutoffc              3  $   K   | ]}|j         V  d S r6   r  r'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>4  s$      88D888888r,   c              3  $   K   | ]}|j         V  d S r6   r  r'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>7  s%      II4	IIIIIIr,   original_position_totalc                    h | ]	}|j         
S r$   valuation_atr'   s     r*   r   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<setcomp>9  s    HHH$DHHHr,   r   c              3  $   K   | ]}|j         V  d S r6   r  r'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>>  s%      NN4	NNNNNNr,   c              3  $   K   | ]}|j         V  d S r6   r  r'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>B  s%      MM$%MMMMMMr,   c                    h | ]	}|j         
S r$   r  r'   s     r*   r   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<setcomp>C  s    EEE$DEEEr,   a1  INSERT INTO transactions(
               transaction_id,transaction_type,account_id,instrument_id,trade_date,
               settlement_date,quantity,currency_original,source_type,source_id,
               external_transaction_id,row_hash,is_confirmed,quality_status,created_at,
               updated_at,is_voided)
           VALUES('post-snapshot-buy','buy',?,?, '2026-08-02','2026-08-02','2',
                  'CHF','manual_confirmed_trade','post-snapshot-buy','post-snapshot-buy',?,
                  1,'ok','2026-08-02T10:00:00Z','2026-08-02T10:00:00Z',0)s   post-snapshot-buya  INSERT INTO transactions(
               transaction_id,transaction_type,account_id,trade_date,gross_amount_original,
               net_amount_original,currency_original,fx_rate_to_chf,fx_status,source_type,
               source_id,is_confirmed,quality_status,created_at,is_voided)
           VALUES('post-snapshot-cash','cash_deposit',?,'2026-08-02','10','10','USD',
                  '0.8','ok','manual_confirmed_cash','post-snapshot-cash',1,'ok',
                  '2026-08-02T10:01:00Z',0)a3  INSERT INTO transactions(
               transaction_id,transaction_type,account_id,instrument_id,trade_date,
               settlement_date,quantity,gross_amount_original,net_amount_original,
               currency_original,fx_rate_to_chf,fx_status,source_type,source_id,
               is_confirmed,quality_status,created_at,is_voided)
           VALUES('post-snapshot-sell','sell',?,?, '2026-08-02','2026-08-02','1',
                  '20','20','USD','0.8','ok','manual_confirmed_trade',
                  'post-snapshot-sell',1,'ok','2026-08-02T10:02:00Z',0)aR  INSERT INTO cash_balances(
               cash_balance_id,account_id,balance_date,currency,amount_original,
               fx_rate_to_chf,amount_chf,source_type,quality_status,created_at)
           VALUES('post-snapshot-dividend-cash',?,'2026-08-02','EUR','5','1','5',
                  'vue_equity_dividend','ok','2026-08-02T10:03:00Z')c                2    g | ]}|j         t          k    |S r$   )r   rs   r'   s     r*   r+   zVtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<listcomp>p  s,       T_PT=T=T=T=T=Tr,   c              3  >   K   | ]}t          |j                  V  d S r6   )r   r  r'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>t  s-      EE$$	%	%EEEEEEr,   z1028.00c              3  0   K   | ]}|j         d k    |V  dS r  r  r'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>v  .      NNt}7M7M7M7M7M7MNNr,   z130.00)zL%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}.amount
} == %(py9)sr  )r<   r=   r2   r4   rA   zassert %(py11)srB   c              3  0   K   | ]}|j         d k    |V  dS )r   Nr  r'   s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>w  r  r,   z105.00c              3  `   K   | ](}|d          t           k    |d         j        k    $|V  )dS )r   r   N)rr   r   )r(   r   selecteds     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>x  sQ        |%%#o*>(BX*X*X 	*X*X*X*X r,   r8  r    )z\%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == (%(py6)s + %(py11)s
{%(py11)s = %(py7)s(%(py9)s)
})baseline_quantity)r<   r=   r2   r4   r@   rA   rB   zassert %(py14)sr   c              3  \   K   | ]&}|j         t          k    |j        j        k    "|V  'd S r6   )r   rr   r   )r(   r)   r  s     r*   r7   zUtest_official_snapshot_resolvers_honor_historical_as_of_and_cutoff.<locals>.<genexpr>~  sL        ?e##(:h>T(T(T 	(T(T(T(T r,   z
2026-08-02)zZ%(py2)s
{%(py2)s = %(py0)s.quantity
} == (%(py4)s + %(py9)s
{%(py9)s = %(py5)s(%(py7)s)
})canonical_position)r<   r=   r2   r?   r@   rA   r  r   ))rz   r   r   r   r   r   r  r  r:   r   r   r   r  rq   rs   r   r   rG   rH   rL   rM   rN   rI   rJ   rK   r  r   r  r  updater   r   r   joinru   iterr8  r   amountr	   r   )1r
  r   rv   r  r  r  r  rU   rV   rW   rX   r[   r  r  r  generic_rowsrP   rQ   rR   rS   rT   generic_usdgeneric_eurgeneric_gbpcontrolled_rowscolumnsrY   rZ   r\   r]   historical_cashprior_local_day_cashcutoff_cashhistorical_positionsprior_local_day_positionscurrent_positionsr  post_snapshot_cashr  r  @py_format10dashboard_positionr  r  r	  r  r  r  r  s1                                                 @@@r*   Btest_official_snapshot_resolvers_honor_historical_as_of_and_cutoffr    sE)   ;;D3S]]CCC)G)GHHH!;=]=]^^^iiG0w??G&	I7 	I',"7#$564	I 	I 	I  
 LL%Ed%K%KLLLgVYll  "	
 	
=dCCJJLL	
 	
 	
 	  	LLQTXSZ[[[	
 	
(..8	
 	
 	
  	3	

 	    
          
                       	
          	     	          	             	    	                
                ,,=w hjj K 	LL	6
 
   	LL	2   	LL	2   	LL	S   (..  L 54|444M8M8M8MM48MMMMMMMMMMM48MMMMMM4MMMM8MMMMMMMMMMMMMMMMMMMMMMMMMMMMOOlOOOOOKOOlOOOOOKOOlOOOOOK()5X5)X5555555555)X55555)5555X555555555555555555555555555|$//$//////////$/////$///////////////////////////////()4W4)W4444444444)W44444)4444W444444444444444444444444444|$//$//////////$/////$///////////////////////////////()4W4)W4444444444)W44444)4444W444444444444444444444444444|$//$//////////$/////$///////////////////////////////LLW   	LL	Q   	LL	T   (..  O MLOLLL Q L Q        L Q     M   Q                          PQQZZ\\]]E	LL-..88::/+	     5kkGLLo#((72C2CoochhVlVldkVlVlVlNlNlooo----W---   4<<(UVV__aabbO%/%)     ?##GLLjSXXg->->jjQgQg_fQgQgQgIgIgjjj7777w777   	LL
	X   	LL	S   	KKMMMSS,LT,R,RSSSw]`wU\]`UaUaw3SUabbwnvwfmnvfwfwwbfwwwwwwwwwwwbfwwwwwwwwwwwww3wwwww3wwwwwwSwwwwwwwwwwwU\wwwwwU\wwwwww]`wwwwUawwwwbwwwwwwwwwwwfmwwwwwfmwwwwwwnvwwwwfwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww6t<PPPO<<O<<<bcbgcllb3<lKKbKObbbbbbbbbbbKObbbbbbbbbbbbb3bbbbb3bbbbbb<bbbbbbbbbbbgbbbbbgbbbbbbcbbbblbbbbKbbbbbbbbbbbObbbbbbObbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;DUUU::%9:::DG<CCLL3:L   	        	                    	;        =D    =D     EH   =I          	   	               	                3*  K
 98K888^#^'#,,^38,GG^GK^^^^^^^^^^^GK^^^^^^^^^^^^^3^^^^^3^^^^^^8^^^^^^^^^^^'^^^^^'^^^^^^#^^^^,^^^^G^^^^^^^^^^^K^^^^^^K^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@\ZZZII+?+F+F+H+HIII!SV!KRSV<<!3I<  ! 	 ! ! ! ! ! ! ! ! ! 	 ! ! ! ! ! ! ! ! ! !   ! ! ! !   ! ! ! ! !  	J! ! ! ! ! ! ! ! !  LS! ! ! !  LS! ! ! ! !  TW! ! !  LX! ! !  ! ! ! ! ! ! ! ! ! 	 ! ! ! ! 	 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! IH*>*E*E*G*GHHHiMhLiiHLiiiiiiiiiiiHLiiiiiiHiiiiLi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 EL! ! ! 	ON+D+K+K+M+MNNN!!!3N  !  
!! ! ! ! ! !! ! ! !  
!! ! ! ! ! !! ! ! ! ! 	!  ! ! ! ! !  ! ! ! ! ! ! 	O! ! ! ! !! ! ! ! ! 	! 	! ! ! ! ! 	! ! ! ! ! ! ! ! ! ! 	! ! ! ! ! ! ! ! !! ! ! ! ! 	!	 ! ! ! ! !	 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! >dCCMM2C2J2J2L2LMMMqWZqwWZ||q3M|\\qhpq`ghp`q`qq\`qqqqqqqqqqq\`qqqqqqqqqqqqq3qqqqq3qqqqqqMqqqqqqqqqqqwqqqqqwqqqqqqWZqqqq|qqqq\qqqqqqqqqqq`gqqqqq`gqqqqqqhpqqqq`qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqEE*;*B*B*D*DEEEfJeIffEIfffffffffffEIffffffEffffIffffffffffffffffffffffffffffD*11334455H )LL	M 
x%v.B'C'C'M'M'O'OP
 
 
 	LL	/ 
	 	 	 	LL	K 
x%&
 
 
 	LL	H
 
   	KKMMM )$//9   	FE2DEEEORGNs||3E|  			 	    
    	                    	F        HO    HO     PS   HT                   	                                 ON!3NNNa4NNNaNUaYaaUYaaaaaaaaaaaUYaaaaaaaaaaaaa4aaaaa4aaaaaaNaaaaNaaaaUaaaaYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNN!3NNNa4NNNaNUaYaaUYaaaaaaaaaaaUYaaaaaaaaaaaaa4aaaaa4aaaaaaNaaaaNaaaaUaaaaYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa     &&    
 &j1V7122VRUV'RU,,V6G,6VV26VVVVVVVVVVV26VVVVVVVVVVVVV7VVVVV7VVVVVV1VVVV2VVVVVVVVVVV6GVVVVV6GVVVVVVVVVVVVV'VVVVV'VVVVVVRUVVVV,VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV    1$lKKK    
 &JcJgcllJ*;l*JJ&*JJJJJJJJJJJ&*JJJJJJJJJJJJJJJJJJJJJJJJ&JJJJJJJJJJJ*;JJJJJ*;JJJJJJJJJJJJJgJJJJJgJJJJJJcJJJJlJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJr,   )r{   r|   )r}   r~   r   r~   r   r
   )r}   r~   r   r~   )@
__future__r   builtinsrL   _pytest.assertion.rewrite	assertionrewriterG   r   r  dataclassesr   decimalr   hashlibr   rS  jarvis_finance.dashboard.datar   r   r	   ,jarvis_finance.imports.postfinance_documentsr
   r   r   r   r   r   r   jarvis_finance.servicesr   r   $jarvis_finance.services.cash_servicer   r   &jarvis_finance.services.equity_servicer   -jarvis_finance.services.portfolio_aggregationr   r   +jarvis_finance.services.portfolio_analyticsr   &jarvis_finance.services.portfolio_datar   )jarvis_finance.services.portfolio_servicer   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   rr   rs   r^   rz   r   r   r(  r4  rL  rW  r^  rq  r  r  r$   r,   r*   <module>r1     s   " " " " " "                                           
                  C B B B B B [ [ [ [ [ [ [ [ E E E E E E        V U U U U U Q Q Q Q Q Q B B B B B B : : : : : : > > > > > >%  "2 2 2l >XA A A A AH    SX SX SXl_ _ _4*3 *3 *3Z ^  ^  ^FS S S0C 0C 0CfI^ I^ I^XxK xK xK xK xKr,   