
    xj7                       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Zd dl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%d&dZd'dZd(dZd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d  Z'd! Z(d" Z)d# Z*d$ Z+dS ))    )annotationsN)Decimal)sha256)TrueWealthCashTrueWealthPositionTrueWealthStatementparse_truewealth_text)truewealth_service)connect_memory)apply_migrationsaccount_truewealth_testc                    t                      } t          |            |                     d           |                     dt          f           |                     dt          f           |                                  | S )NzINSERT INTO platforms(platform_id,name,platform_type,country,default_currency,is_active,created_at) VALUES('p','True Wealth','robo','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(?,'p','Manual Portfolio','managed_portfolio','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,notes,created_at)
           VALUES('legacy_manual',?,'2026-06-30','10000','CHF','manual_total_value','ok','historical','2026-06-30T12:00:00Z'))r   r   executeTEST_ACCOUNT_IDcommit)conns    b/home/agent/.hermes/worktrees/FinanceManager-sprint20h1-followup/tests/test_truewealth_sprint12.py	make_connr      s    DTLL 	i   	LL	g	  
 	LL	A	  
 	KKMMMK    
2026-07-2712000rawbytesdatestrtotalreturnr   c                   t          |d|t          |          t          dddt          d          dt          d          t          d                    t          d	d
dt          d          dt          d          t          d                    ft          ddt          d          d t          d                    ft	          |                                           d          S )Nz
2026-01-01zposition:CH0000000001zSynthetic ETF ACH0000000001100CHF505000zposition:US0000000002zSynthetic ETF BUS0000000002202004000zcash:CHF3000   )statement_dateperiod_from	period_tosource_total_chf	positionscashfile_sha256
page_count)r   r   r   r   r   	hexdigest)r   r   r   s      r   	statementr3   *   s     68I>[bch[i[ikpryz~rr  BI  JP  BQ  BQ  R  R68I>[bcg[h[hjoqxy~qq  BI  JP  BQ  BQ  R  R
 ZwvWWY3KK))++   r   dict[str, str]c                `    t           dt          j        |                                           dS )Nzofficial.pdf)
account_id	file_namecontent_base64)r   base64	b64encodedecode)r   s    r   import_requestr<   :   s1    %# *3//6688  r   c                    t          |          }t          j        | |          }t          j        | i ||d         |d         dd          S )N
preview_idconfirmation_idTr>   r?   confirm)r<   servicepreview_truewealth_importconfirm_truewealth_import)r   r   requestpreviews       r   confirm_importrG   B   s\    S!!G/g>>G,x7x',"7GTeLfswxxx  r   c                 	   d} t          | dd          }|j        }d}||k    }|st          j        d|fd||f          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}}|j
        }d}t          |          }||k    }|st          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        t                    rt          j        t                    ndt          j        |          t          j        |          dz  }	dd|	iz  }
t          t          j	        |
                    d x}x}x}}|j        d         }|j        }d}||k    }|st          j        d|fd||f          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }	t          t          j	        |	                    d x}x}x}}|j        d         }|j        }d}t          |          }||k    }|st          j        d|fd||f          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}}|j        }d}t          |          }||k    }|st          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        t                    rt          j        t                    ndt          j        |          t          j        |          dz  }	dd|	iz  }
t          t          j	        |
                    d x}x}x}}d S )Nuy  
True Wealth AG
Periode 01.01.2026 - 27.07.2026
Steuerauszug in CHF 27.07.2026
Total Steuerwert der A, B, DA-1 und USA-Werte am 27.07.2026
12’000 0 0 0
CHF (Synthetic Custodian AG)
27.07.2026 Steuerwert / Ertrag CHF 7’000.00 7’000.00 0.00
0000000 CH0000000001 - Synthetic ETF A, CH
27.07.2026 Bestand / Steuerwert / Ertrag 100.00 CHF 50.00 5’000.00 0.00
True Wealth AG
	synthetic   )r0   r1   r   ==)z6%(py2)s
{%(py2)s = %(py0)s.statement_date
} == %(py5)sparsed)py0py2py5zassert %(py7)spy7r   )zV%(py2)s
{%(py2)s = %(py0)s.source_total_chf
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}r   )rN   rO   py4py6py8assert %(py10)spy10r   r   )z,%(py3)s
{%(py3)s = %(py1)s.isin
} == %(py6)s)py1py3rS   assert %(py8)srT   z7000.00)zU%(py3)s
{%(py3)s = %(py1)s.amount_original
} == %(py9)s
{%(py9)s = %(py5)s(%(py7)s)
})rW   rX   rP   rQ   py9zassert %(py11)spy1112000.00)zZ%(py2)s
{%(py2)s = %(py0)s.components_total_chf
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
})r	   r*   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr-   r   r.   isinr/   amount_originalcomponents_total_chf)textrM   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert5@py_assert7@py_format9@py_format11@py_assert0@py_assert2@py_format7@py_assert6@py_assert8@py_format10@py_format12s                     r   @test_text_parser_extracts_official_rows_without_inventing_valuesry   K   sr   D #4[QOOOF 0L0 L0000000000 L0000000000006000006000000 0000L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"6g6gg&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6g66666g666666g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A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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5;q>?>)?Y?WY-?-??)-???????????)-??????>????)???????????W?????W??????Y????-????????????????????????????????&=*='**=*==&*===========&*=============6=====6======&==========='====='======*====*================================r   c                    t                      } t          j        |           }|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         }d	}||u }|slt          j        d
|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d}|d         }|j        } |            }||v }|st          j        d|fd||f          t          j        |          t          j        |          t          j        |          t          j        |          dz  }	dd|	iz  }
t          t          j        |
                    d x}x}x}x}}|d         }d}||u }|slt          j        d
|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}t          j	        | ddd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}}d |d         D             }t          |          }|sddt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          dz  }t          t          j        |                    d x}}d S )Ncurrent_source_typemanual_total_valuerK   z%(py1)s == %(py4)srW   rR   assert %(py6)srS   current_is_manual_provisionalTisz%(py1)s is %(py4)smanuellcurrent_label)in)zD%(py1)s in %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.lower
}()
})rW   rR   rS   rT   rU   rV   allocation_performance_usableFlegacy_manual
reversibleactivenoterA   current_value_chfc              3  F   K   | ]}|d          dk    o|d         dk    V  dS )snapshot_idr   	is_activer   N ).0rows     r   	<genexpr>zItest_legacy_manual_value_is_never_labelled_as_official.<locals>.<genexpr>j   s<      nnSVs=!_4N[9IQ9Nnnnnnnr   history,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyrN   rO   rR   )r   rB   get_truewealth_summaryr]   r^   rb   rc   rd   lower"set_manual_truewealth_value_activer   r_   r`   ra   )r   summaryrr   rk   rs   @py_format5rt   rn   ro   rp   rq   disabledri   s                r   6test_legacy_manual_value_is_never_labelled_as_officialr   `   s   ;;D,T22G()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AAAAAAAAAAAAAAAAAAAAA23;t;3t;;;;;;;;;;3t;;;;;3;;;;t;;;;;;;;;;;;;;;;;;;;;;;;;;;80806866888988888888888988888898888088886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888888823<u<3u<<<<<<<<<<3u<<<<<3<<<<u<<<<<<<<<<<<<<<<<<<<<<<<<<<.t_QV`ly}F~F~-d33H'(0D0(D0000000000(D00000(0000D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nnZbclZmnnnn3nnnnnnnnnnnnnnnn3nnnnn3nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnr   c                P   t                      }|                    d           |                    d           |                                 d}|                     t          dd            t	          j        |t          |                    }|d         }d}||k    }|slt          j        d|fd	||f          t          j	        |          t          j	        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}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}}d S )Nz<UPDATE platforms SET name='TrueWealth' WHERE platform_id='p'z#DELETE FROM account_value_snapshotss   %PDF-synthetic-bootstrapparse_truewealth_tax_statementc                     t          |           S Nr3   values    r   <lambda>zRtest_platform_spelling_without_space_and_empty_account_bootstrap.<locals>.<lambda>s       QZ[`QaQa r   reconciliation_statusmatchedrK   r}   r~   r   rS   r   r   r   )r   r   r   setattrrB   rC   r<   r]   r^   rb   rc   rd   r   )	monkeypatchr   r   rF   rr   rk   rs   r   rt   s	            r   @test_platform_spelling_without_space_and_empty_account_bootstrapr   m   s   ;;DLLOPPPLL6777KKMMM
%C!ACaCabbb/nS6I6IJJG*+8y8+y8888888888+y88888+8888y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)$//0CDLLDLLLLLLLLLLDLLLLLD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Lr   c           	     B   t                      }d}|                     dt          |                     |                     t          dd            t          ||          }t          ||          }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}	}|d         }d}||u }	|	slt          j        d|	fd||f          t          j	        |          t          j	        |          d	z  }
d
d|
iz  }t          t          j        |                    d x}x}	}|d         }|d         }||k    }	|	slt          j        d|	fd||f          t          j	        |          t          j	        |          d	z  }
d
d|
iz  }t          t          j        |                    d x}x}	}|d         }d}||k    }	|	slt          j        d|	fd||f          t          j	        |          t          j	        |          d	z  }
d
d|
iz  }t          t          j        |                    d x}x}	}|d         }d}||k    }	|	slt          j        d|	fd||f          t          j	        |          t          j	        |          d	z  }
d
d|
iz  }t          t          j        |                    d x}x}	}|d         }d}||u }	|	slt          j        d|	fd||f          t          j	        |          t          j	        |          d	z  }
d
d|
iz  }t          t          j        |                    d x}x}	}|d         }t          |          }d}||k    }|st          j        d|fd||f          dt          j                    v st          j        t                    rt          j	        t                    ndt          j	        |          t          j	        |          t          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}}|                    d                                          d         }d}||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 t$          f                                          }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$          f                                          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  d*z  d+z  t)          |                                           d,z  }|j        } |            }||k    }|st          j        d|fd-||f          d.t          j                    v st          j        |          rt          j	        |          nd.t          j	        |          t          j	        |          d/t          j                    v st          j        |          rt          j	        |          nd/d0z  }d&d'|iz  }t          t          j        |                    d x}x}}|j        } |            }|j        }d1}||z  }d2}||k    }|st          j        d|fd3||f          d.t          j                    v st          j        |          rt          j	        |          nd.t          j	        |          t          j	        |          t          j	        |          t          j	        |          t          j	        |          d4z  }d5d6|iz  }t          t          j        |                    d x}x}x}x}x}x}}d S )7Ns   %PDF-1.7 official-aJARVIS_FINANCE_RUNTIME_DIRr   c                     t          |           S r   r   r   s    r   r   zStest_official_confirm_is_idempotent_preserves_legacy_and_archives.<locals>.<lambda>}   r   r   
idempotentFr   r   r~   r   rS   Tbatch_idrK   r}   r   r\   r{   truewealth_official_importr   r.      z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slenrN   rO   rR   rQ   assert %(py9)srZ   zNSELECT COUNT(*) FROM account_value_snapshots WHERE snapshot_id='legacy_manual'r   rJ   .SELECT COUNT(*) FROM truewealth_import_batcheszySELECT included,classification_role,decision_version
           FROM performance_scope_classifications WHERE account_id=?)rJ    canonical_truewealth_total_valueinvestment_performance_scope_v1)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)stupleclassification)rN   rW   rX   rS   rY   rT   znSELECT COUNT(*) FROM audit_log
           WHERE entity_type='performance_scope_classification' AND entity_id=?imports
truewealtharchivez.pdf)zI%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.read_bytes
}()
} == %(py6)sarchivedr   )rN   rO   rR   rS   i  i  )zm(%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.stat
}()
}.st_mode
} & %(py8)s) == %(py12)s)rN   rO   rR   rS   rT   py12zassert %(py14)spy14)r   setenvr   r   rB   rG   r   r]   r^   rb   rc   rd   r   r_   r`   ra   r   fetchoner   r   r   r2   
read_bytesstatst_mode)r   tmp_pathr   r   firstsecondr   rr   rk   rs   r   rt   ri   ru   rn   rm   rw   r   rj   rp   r   ro   @py_assert9@py_assert11@py_assert10@py_format13@py_format15s                              r   Atest_official_confirm_is_idempotent_preserves_legacy_and_archivesr   y   sJ   ;;D
 C3S]]CCC!ACaCabbb4%%ED#&&F,T22G'%'%''''''''''%'''''''''%''''''''''''''''''''''''''','4'4''''''''''4'''''''''4'''''''''''''''''''''''''''*2z!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&'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555555555555555555555()I-II)-IIIIIIIIIII)-IIIIII)IIII-IIIIIIIIIIIIIIIIIIIIIIIIIIII23;t;3t;;;;;;;;;;3t;;;;;3;;;;t;;;;;;;;;;;;;;;;;;;;;;;;;;;{#)3#$$))$))))))))))$))))))))))))3)))))3))))))#))))$)))))))))))))))))))))))))))))))))<<hiirrttuvw|{||w{|||||||||||w{||||||w||||{||||||||||||||||||||||||||||<<HIIRRTTUVW\[\\W[\\\\\\\\\\\W[\\\\\\W\\\\[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	H	  hjj	 
   n$nn $nnnnnnnnnnn $nnnnnnnnnnnnn5nnnnn5nnnnnnnnnnnnnnnnnnnnnnnn nnnn$nnnnnnnnnnnnnnnnnnnnnnnnnnnn<<	S	  hjj	  	  	     	     	    	    q	              	           
 )#l2Y>F3KKDYDYD[D[AaAaAaaH'  ' C'''''''''' C''''''''''''8'''''8'''''''''' '''''''''''C'''''C'''''''''''''''''''''''''''''=3==??3?"3U3"U*3e3*e3333333333*e3333333333338333338333333=3333?3333"3333U3333e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3r   c                   t                      }d}|                     dt          |                     |                     t          dd            t          ||           dddd}t	          j        ||          }t	          j        |i ||d	         |d
         dd          t	          j        |          }|d         }d}||k    }	|	slt          j
        d|	fd||f          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j        |                    d x}x}	}|d         }d}||u }	|	slt          j
        d|	fd||f          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j        |                    d x}x}	}|d         }d}||k    }	|	slt          j
        d|	fd||f          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j        |                    d x}x}	}|d         }d}||u }	|	slt          j
        d|	fd||f          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j        |                    d x}x}	}|d         }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         }t          |          }d}||k    }|st          j
        d|fd||f          dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |          d z  }d!d"|iz  }t          t          j        |                    d x}x}x}}t	          j        |d#         dd$dd%           t	          j        |          }|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}	}fd)|d*         D             }t'          |          }|sd+d,t          j                    v st          j        t&                    rt          j        t&                    nd,t          j        |          t          j        |          d-z  }
t          t          j        |
                    d x}}t	          j        |d#         dd.dd%           t	          j        |          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 )/Ns   %PDF-1.7 official-br   r   c                     t          |           S r   r   r   s    r   r   z]test_newer_manual_value_wins_without_changing_positions_and_can_be_reversed.<locals>.<lambda>   r   r   125002026-07-28T08:00:00Zzportal viewtotal_value_chfvaluation_atr   r>   r?   Tr@   r   12500.00rK   r}   r~   r   rS   r   r   r   positions_snapshot_dater   mixed_as_ofr   Fr.   r   r   r   r   r   rZ   r   revertr   r\   r{   r   c              3  T   K   | ]"}|d          d          k    o|d         dk    V  #dS )r   r   r   Nr   )r   r   results     r   r   z^test_newer_manual_value_wins_without_changing_positions_and_can_be_reversed.<locals>.<genexpr>   sC      ttY\s=!VM%::Ts;?OST?Tttttttr   r   r   r   r   
reactivate)r   r   r   r   rB   rG   preview_manual_truewealth_valueconfirm_manual_truewealth_valuer   r]   r^   rb   rc   rd   r   r_   r`   ra   r   r   )r   r   r   r   payloadrF   r   rr   rk   rs   r   rt   ri   ru   rn   rm   rw   restoredr   s                     @r   Ktest_newer_manual_value_wins_without_changing_positions_and_can_be_reversedr      sy   ;;D
 C3S]]CCC!ACaCabbb4");Q[hiiG5dGDDG4x7x',"7GTeLfswxxx F ,T22G&'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55555555555555555555523;t;3t;;;;;;;;;;3t;;;;;3;;;;t;;;;;;;;;;;;;;;;;;;;;;;;;;;,-==-==========-=====-================================!)T)!T))))))))))!T)))))!))))T)))))))))))))))))))))))))))23<u<3u<<<<<<<<<<3u<<<<<3<<<<u<<<<<<<<<<<<<<<<<<<<<<<<<<<{#)3#$$))$))))))))))$))))))))))))3)))))3))))))#))))$))))))))))))))))))))))))))))))))).tVM5JW\fn{  MA  MA  B  B  B-d33H'(6J6(J6666666666(J66666(6666J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)*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tttt`hir`stttt3tttttttttttttttt3ttttt3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.tVM5JW[eq  C  MD  MD  E  E  E)$//0CDR
RD
RRRRRRRRRRD
RRRRRD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                   t                      }|                     dt          |                     dd}|                     t          dfd           t          |           dddd	}t	          j        ||          }t	          j        |i ||d
         |d         dd           t          ||           t	          j        |          }|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 S )Nr   s   %PDF-1.7 official-news   %PDF-1.7 official-oldr   c                4    t          | | k    rdnd          S )Nr   z
2026-07-20r   )r   
newest_raws    r   r   zItest_older_official_import_cannot_displace_newer_manual.<locals>.<lambda>   s>    QZ[`rw  |F  sF  sFbnbn  LX  RY  RY r   r   r   znewer manualr   r>   r?   Tr@   r   r   rK   r}   r~   r   rS   r   r   )r   r   r   r   rB   rG   r   r   r   r]   r^   rb   rc   rd   )r   r   r   old_rawr   rF   r   rr   rk   rs   r   rt   r   s               @r   7test_older_official_import_cannot_displace_newer_manualr      sv   ;;D3S]]CCC)J&G!A  DY  DY  DY  DY  Z  Z  Z4$$$");Q[ijjG5dGDDG+D  3cW  3cGT`Lav}  P  wQ  ^b  3c  3c  3c  d  d  d4!!!,T22G&'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555555555555555555555,-==-==========-=====-=================================r   c                z   t                      }|                     dt          |                     dddd}t          j        ||          }t          j        |i ||d         |d         dd	           d
}|                     t          dd            t          ||           t          j        |          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   11500z2026-07-27T22:00:00Zzsame dayr   r>   r?   Tr@   s   %PDF-1.7 same-dayr   c                     t          |           S r   r   r   s    r   r   zAtest_same_day_official_has_priority_over_manual.<locals>.<lambda>   r   r   r{   r   rK   r}   r~   r   rS   )r   r   r   rB   r   r   r   rG   r   r]   r^   rb   rc   rd   )r   r   r   r   rF   r   rr   rk   rs   r   rt   s              r   /test_same_day_official_has_priority_over_manualr      s   ;;D3S]]CCC");Q[effG5dGDDG+D  3cW  3cGT`Lav}  P  wQ  ^b  3c  3c  3c  d  d  d
C!ACaCabbb4)$//0EFfJffFJfffffffffffFJffffffFffffJf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fr   c                   t                      }d}|                     t          dd            |j        }t          j        |t          |                     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 S )Ns   %PDF-1.7 preview-onlyr   c                     t          |           S r   r   r   s    r   r   z;test_preview_and_get_are_side_effect_free.<locals>.<lambda>   r   r   rK   )z5%(py2)s
{%(py2)s = %(py0)s.total_changes
} == %(py4)sr   beforer   r   rS   )r   r   rB   total_changesrC   r<   r   r]   r^   r_   r`   ra   rb   rc   rd   )r   r   r   r   ri   rk   r   rt   s           r   )test_preview_and_get_are_side_effect_freer      si   ;;D
"C!ACaCabbbF%dN3,?,?@@@"4((('''''''''''''''''''''''4'''''4'''''''''''''''''''''''''''''''''''''''''''''''''''r   c                   t                      }d}|                     dt          |                     |                     t          dd            t          ||          }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            d S # 1 swxY w Y   d S )Ns   %PDF-1.7 immutabler   r   c                     t          |           S r   r   r   s    r   r   zGtest_immutable_source_tables_reject_update_and_delete.<locals>.<lambda>   r   r   	immutablematchzHUPDATE truewealth_snapshots SET source_total_chf='0' WHERE snapshot_id=?r   cannot be deletedz4DELETE FROM truewealth_snapshots WHERE snapshot_id=?)
r   r   r   r   rB   rG   pytestraises	Exceptionr   )r   r   r   r   r   s        r   5test_immutable_source_tables_reject_update_and_deleter      s   ;;D
C3S]]CCC!ACaCabbbD#&&F	y	4	4	4 { {_bhivbwayzzz{ { { { { { { { { { { { { { {	y(;	<	<	< g gKfUbNcMefffg g g g g g g g g g g g g g g g g gs$   <B&&B*-B*C77C;>C;c                4   t                      }|                     dt          |                     d|                     t          dfd           t                    }t	          j        ||          }|                    d           t          j	        t          d          5  t	          j        |i ||d         |d	         d
d           d d d            n# 1 swxY w Y   d}||z  }d}||z  }d}	||	z  }
|
j        }d} ||          }t          |          }| }|s2d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        |          d	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   s   %PDF-synthetic-rollbackr   c                "    t                    S r   r   )_rawr   s    r   r   z;test_confirm_rollback_removes_new_archive.<locals>.<lambda>   s    PYZ]P^P^ r   z{CREATE TRIGGER force_truewealth_failure BEFORE INSERT ON truewealth_import_batches BEGIN SELECT RAISE(ABORT, 'forced'); END
conflictedr   r>   r?   Tr@   r   r   r   z*.pdfzassert not %(py18)s
{%(py18)s = %(py0)s(%(py16)s
{%(py16)s = %(py12)s
{%(py12)s = (((%(py1)s / %(py3)s) / %(py6)s) / %(py9)s).glob
}(%(py14)s)
})
}listr   )	rN   rW   rX   rS   rZ   r   r   py16py18r   r   rK   r}   r~   r   rS   )r   r   r   r   rB   r<   rC   r   r   r   
ValueErrorrD   globr  r_   r`   r]   ra   rb   rc   rd   r   r^   )r   r   r   rE   rF   rs   rj   rn   ro   rv   r   r   @py_assert13@py_assert15@py_assert17@py_assert19@py_format20rr   rk   r   rt   r   s                        @r   )test_confirm_rollback_removes_new_archiver     s   ;;D3S]]CCC
$C!AC^C^C^C^___S!!G/g>>GLL	3   
z	6	6	6 
 
)|w|gl&;PWXiPjw{|||	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 !*TX	)TLT)L8T9T89DTDJT7TJJ7SSTtSTTTTTTTTTTTTTTTTTTtTTTTTtTTTTTTTTTTTTTXTTTTTXTTTTTT	TTTTLTTTT9TTTTJTTTT7TTTTS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TTTTTTTTTT<<HIIRRTTUVW\[\\W[\\\\\\\\\\\W[\\\\\\W\\\\[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\s   (*CC"%C"c           	        t                      }|                     dt          |                     |                     t          dd            t          |d           t          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 r   r   r   s    r   r   zEtest_same_date_different_official_source_is_blocked.<locals>.<lambda>  r   r   s   %PDF-1.7 source-ones   %PDF-1.7 source-twoconflictTr   r   r~   r   rS   z$different official TrueWealth sourcer   r>   r?   r@   r   r   rJ   rK   r}   )r   r   r   r   rB   rG   r<   rC   r]   r^   rb   rc   rd   r   r   r  rD   r   r   )
r   r   r   r   rF   rr   rk   rs   r   rt   s
             r   3test_same_date_different_official_source_is_blockedr     s   ;;D3S]]CCC!ACaCabbb4/000233F/f==G:&$&$&&&&&&&&&&$&&&&&&&&&$&&&&&&&&&&&&&&&&&&&&&&&&&&&	z)O	P	P	P 
 
){v{W\%:wWhOivz{{{	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 <<HIIRRTTUVW\[\\W[\\\\\\\\\\\W[\\\\\\W\\\\[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\s    *EEEc            	         t                      } dD ]N}t          j        t          d          5  t	          j        | |ddd           d d d            n# 1 swxY w Y   Od S )N)NaNInfinityz	-Infinityzpositive finiter   r    r   )r   r   r   r  rB   r   )r   r   s     r   *test_manual_non_finite_values_are_rejectedr    s    ;;D1  ]:->??? 	 	3$);Q[]^^  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 s   AA	A	c                    t                      } dddd}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            d S # 1 swxY w Y   d S )Nr   r   zimmutable valuer   r>   r?   Tr@   zfields are immutabler   zJUPDATE account_value_snapshots SET total_value_chf='1' WHERE snapshot_id=?r   r   z7DELETE FROM account_value_snapshots WHERE snapshot_id=?)r   rB   r   r   r   r   r   r   )r   r   rF   r   s       r   4test_manual_value_is_not_hard_deleted_or_overwrittenr    s   ;;D");Q[lmmG5dGDDG4x7x',"7GTeLfswxxx F 
y(>	?	?	? } }adjkxdyc{|||} } } } } } } } } } } } } } }	y(;	<	<	< j jNQWXeQfPhiiij j j j j j j j j j j j j j j j j js$   .BBB>C))C-0C-)r   r   )r   r   r   r   r   r   r   r   )r   r   r   r4   )r   r   ),
__future__r   builtinsr_   _pytest.assertion.rewrite	assertionrewriter]   r9   decimalr   hashlibr   r   /jarvis_finance.imports.truewealth_tax_statementr   r   r   r	   jarvis_finance.servicesr
   rB   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r   r3   r<   rG   ry   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r   <module>r"     s   " " " " " "                                       B A A A A A : : : : : : > > > > > >+  (           > > >*
o 
o 
o	M 	M 	M 4  4  4FS S S<> > > 	g 	g 	g( ( (	g 	g 	g] ] ](] ] ]   j j j j jr   