
    Ggj@                        d dl mZ d dlZd dlmc m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mZmZmZ d dlmZ d dlmZ d d	lmZ d
ZdZd Z 	 dddZ!dddZ"d Z#d Z$d Z%d Z&d Z'd Z(dS )    )annotationsN)replace)Decimal)sha256)PFBundle
PFDocumentPFEvent
PFSnapshotPFSnapshotCashPFSnapshotPosition)postfinance_service)connect_memory)apply_migrationsaccount_pf_depot_testaccount_pf_trading_cash_testc                    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',1,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',1,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pf15090completez2026-06-30T00:00:00Z)r   r   executeDEPOTCASHrangecommit)connindex
instrumentlabels       [/home/agent/.hermes/worktrees/FinanceManager-main-deploy/tests/test_postfinance_sprint13.py	make_connr/      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K       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_cashr   	synthetics   eventbuyz
2026-07-03outzSynthetic Asset 01CH0000000000r!   r"   051r   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    r   r   r   zsynthetic asset r   stockr   r!   r"   100r   z4.17)r   r   encode	hexdigestr   ).0r+   s     r.   	<genexpr>zbundle.<locals>.<genexpr>   s          	>%>>((**++5577<.uqy....uqy...rzzGGuCLLDMMDMMENNENNFOO	
 	
     r0   r      z2026-07-27T09:14:30+02:00EURrK   USD220020024001100r   )rD   )r   rM   r   r	   document_hashsemantic_referencer   tupler(   r
   r   r   rL   )r3   r5   zip_hashoverview_hashdoc_rawdocumenteventtransfer_outtransfer_in	positionssnapshots              r.   bundlerc   O   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*%
	 	 	r0   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r3   r5   s     r.   requestrm      sK    (,$.w77>>@@#)#3L#A#A#H#H#J#J	  r0   c                D&  0 t                      }g 0|                     dt          |                     |                     t          d0f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#          0          }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        0          rt          j        0          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|!dL         f                                          d%         }
dT}|
|k    }|slt          j	        d|fd|
|f          t          j        |
          t          j        |          dz  }d	d
|iz  }	t          t          j        |	                    d x}
x}}|                    dU                                          }%dV |%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}}dW |%D             }
dXh}|
|k    }|slt          j	        d|fd|
|f          t          j        |
          t          j        |          dz  }d	d
|iz  }	t          t          j        |	                    d x}
x}}|                    dY                                          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<}||z  }d[}&||&z  }'d\}|'|z  }|j        }d]}( ||(          })t=          |)          }*t#          |*          }+dB},|+|,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        t<                    rt          j        t<                    nd_d`t          j                    v st          j        |          rt          j        |          nd`t          j        |          t          j        |&          t          j        |          t          j        |          t          j        |(          t          j        |)          t          j        |*          t          j        |+          t          j        |,          daz  }.dbdc|.iz  }/t          t          j        |/                    d x}x}x}&x}'x}x}x}x}(x})x}*x}+x}-},d S )dNJARVIS_FINANCE_RUNTIME_DIRparse_postfinance_bundlec                R                         | |f          pt          | |          S N)appendrc   )r3   r5   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 r0   ==)z5%(py2)s
{%(py2)s = %(py0)s.total_changes
} == %(py4)sr*   before)py0py2py4assert %(py6)spy6mapped_position_countr   z%(py1)s == %(py4)spy1r{   
preview_idconfirmation_idTr   r   confirm   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slenrt   ry   r   py3r}   assert %(py8)spy8
idempotentFis)z%(py3)s is %(py6)sr   r}   %(py8)s)z%(py11)s is %(py14)spy11py14%(py16)spy16r   zassert %(py19)spy19account_pf_r=   )not in)z%(py3)s not in %(py5)s
serialized)r   py5z%(py7)spy7)z%(py10)s not in %(py12)s)py10py12z%(py14)sr   zassert %(py17)spy17snapshot_idlatest_snapshot)z%(py1)s not in %(py4)sinstrument_idra   batch_idimports/SELECT COUNT(*) FROM postfinance_import_batchesr   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)sr&   )r   r   zassert %(py5)sr   r9   r'   rB   )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)ry   r   rz   r{   r}   r   r   py13zassert %(py15)spy15z4SELECT 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 )
account_idr@   rN   rows     r.   	<setcomp>zatest_preview_confirm_and_reparse_are_atomic_idempotent_and_keep_roles_separate.<locals>.<setcomp>  s    777#C777r0   c                    h | ]
}|d          S )activity_kindr@   r   s     r.   r   zatest_preview_confirm_and_reparse_are_atomic_idempotent_and_keep_roles_separate.<locals>.<setcomp>  s    :::SC :::r0   rA   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)ry   r   rz   r{   r   r   r   r   r   r   py21py24zassert %(py26)spy26)r/   setenvstrsetattrservicerm   total_changespreview_postfinance_import
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationconfirm_postfinance_importr   rs   _format_boolopget_postfinance_summaryr%   fetchonedictr&   r'   valuesr   fetchallglobr   )1monkeypatchr   r*   payloadrx   preview@py_assert1@py_assert3@py_format5@py_format7@py_assert0@py_assert2firstagain_previewsecond@py_assert5@py_assert4@py_format9@py_assert10@py_assert13@py_assert12@py_format15@py_format17@py_format18@py_format20safe_summaryr   @py_assert9@py_assert11@py_format6@py_format8@py_format13@py_format16r   @py_format4@py_assert7@py_format14transfer_rows@py_assert6@py_assert8@py_assert14@py_assert16@py_assert18@py_assert20@py_assert23@py_assert22@py_format25@py_format27rt   s1                                                   @r.   Ntest_preview_confirm_and_reparse_are_atomic_idempotent_and_keep_roles_separater      s6    ;;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(((((((((((((((((((((((((((((((((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Wr0   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 )#Nro   rp   c                "    t          | |          S rr   rc   rl   s     r.   ru   zDtest_provider_and_computed_cost_basis_are_separate.<locals>.<lambda>,      fWl&C&C r0   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   r"   r   r?      r$   rv   )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   r   r|   r}   )r/   r   r   r   r   rm   r   r   r%   r   r   r   r   rs   r   r   r   )r   r   r*   r   r   r   r   r   r   r   r   r   r   r   r   @py_assert21r   r   r   r   r   @py_format23r   @py_format26@py_format28r   r   s                              r.   2test_provider_and_computed_cost_basis_are_separater	  &  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^^^^]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^r0   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 )#Nro   r   2rK   101)quantitygross_originalnet_originals
   sell-eventsellz
2026-07-10rG   r!   6059)	event_fingerprint
event_typeoccurred_on	directionr  price_originalr  fee_originalr  r   )eventsrp   c                    S rr   r@   )_zip	_overviewfifo_bundles     r.   ru   zVtest_sell_consumes_documented_fifo_lot_before_cost_basis_persistence.<locals>.<lambda>W  s    U` r0   r   r   Tr   zLSELECT quantity_acquired,quantity_remaining FROM postfinance_cost_basis_lots)r  r!   rv   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srY   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.5r$   computed)r/   r   r   rc   r   r  r   r   rM   r   r   rm   r   r   r%   r   rY   r   r   r   r   r   r   r   r   )r   r   r*   originalr;   r  r   r   r  r   r   r   r   r   r  r  s                  @r.   Dtest_sell_consumes_documented_fifo_lot_before_cost_basis_persistencer!  @  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2r0   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 )Nro   rp   c                "    t          | |          S rr   r   rl   s     r.   ru   zNtest_same_snapshot_with_different_original_source_is_blocked.<locals>.<lambda>s  r  r0   r   r   Tr   s   synthetic-zip-revisions    %PDF-synthetic-overview-revisionconflictr   z%(py1)s is %(py4)sr   r|   r}   matchr   r   r   rv   r   )r/   r   r   r   r   rm   r   r   r   r   r   r   r   pytestraises
ValueErrorr%   r   )r   r   r*   r   r   	alternater$  r   r   r   r   r   s               r.   <test_same_snapshot_with_different_original_source_is_blockedr,  m  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')rp   c                    t                      S rr   r   )r  r  s     r.   ru   zWtest_existing_same_day_canonical_projection_is_blocked_during_preview.<locals>.<lambda>  s    U[U]U] r0   r$  Tr   r%  r   r|   r}   conflicting_batch_id"canonical_projection_date_conflictrv   r   )r/   r%   r&   r)   r   r   r   rm   r   r   r   r   r   )r   r*   r   r   r   r   r   r   s           r.   Etest_existing_same_day_canonical_projection_is_blocked_during_previewr1    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Rr0   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 )Nro   rp   c                "    t          | |          S rr   r   rl   s     r.   ru   zEtest_immutable_postfinance_source_and_snapshot_rows.<locals>.<lambda>  r  r0   r   r   Tr   	immutabler&  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 )r/   r   r   r   r   rm   r   r   r(  r)  	Exceptionr%   items)r   r   r*   r   r   resultimmutable_columnstable
assignmentcanonical_tables	predicates              r.   3test_immutable_postfinance_source_and_snapshot_rowsrD    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)	)r1   r2   )r3   r4   r5   r4   r6   r   )r3   r4   r5   r4   ))
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   ri   dataclassesr   decimalr   hashlibr   r(  ,jarvis_finance.imports.postfinance_documentsr   r   r	   r
   r   r   jarvis_finance.servicesr   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r&   r'   r/   rc   rm   r   r	  r!  r,  r1  rD  r@   r0   r.   <module>rQ     s   " " " " " "                                                 C B B B B B : : : : : : > > > > > >%2 2 2l >XA A A A AH    GX GX GXT_ _ _4*3 *3 *3Z ^  ^  ^FS S S0C 0C 0C 0C 0Cr0   