
    jq!                        d dl mZ d dlmZ d dlZd dlmZ d dlmZm	Z	m
Z
mZ d dlmZmZmZmZmZ d dl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 Zd Z d Z!d Z"y)    )annotations)DecimalN)HTTPException)AccountValueConfirmRequestAccountValuePreviewRequestCashSnapshotConfirmRequestCashSnapshotPreviewRequest)CANONICAL_CASH_ACCOUNTSconfirm_cash_snapshotensure_canonical_cash_accountsget_cash_summarypreview_cash_snapshot)confirm_account_valuepreview_account_valuepreview_position)get_overview)connect_memory)apply_migrationsc                 0    t               } t        |        | S )N)r   r   )conns    -tests/unit/test_cash_truewealth_management.pydbr      s    DTK    c                 
   t               } t        | d      }|d   dk(  sJ |d   g k(  sJ | j                  d      j                         }|D ci c]  }|d   |
 }}t	        |      t
        D ch c]  }|d   	 c}k(  sJ |d   d	   d
k(  sJ |d   d	   d
k(  sJ |d   d	   dk(  sJ |d   d   dk(  sJ t        d |D              sJ | j                  d      j                         }t        |      dk(  sJ y c c}w c c}w )Ntest)
created_bycreated   
duplicatesz
        SELECT a.account_name, a.account_type, a.currency, a.balance_mode, p.name AS platform
        FROM accounts a JOIN platforms p ON p.platform_id=a.platform_id
        WHERE a.account_type='cash'
        ORDER BY a.account_name
        account_name
Raiffeisenbalance_modecsv_calculatedzAKB HaushaltskontoPostFinance Cash-KontomanualplatformzPostFinance Cashc              3  ,   K   | ]  }|d    dk(    yw)currencyCHFN ).0rows     r   	<genexpr>zYtest_canonical_cash_accounts_are_present_with_expected_modes_and_audit.<locals>.<genexpr>6   s     8Cs:%'8s   zESELECT action FROM audit_log WHERE action='cash_account_seed_confirm')r   r   executefetchallsetr
   alllen)r   resultrowsr,   by_nameitemauditss          r   Ftest_canonical_cash_accounts_are_present_with_expected_modes_and_auditr8   !   sH   4D+DVDF)!!!,2%%%<<	 hj 	 488Cs>"C'8G8w<=TUTD0UUUU< 04DDDD'(8<LLLL+,^<HHH+,Z8<NNNN848888\\abkkmFv;! 9Us   C;0D c                 $   t               } t        |        | j                  d       | j                  d       | j                          t        |       }|d   dk(  sJ |d   dgk(  sJ | j                  d      j	                         d   }|dk(  sJ y )	NzINSERT INTO platforms(platform_id, name, platform_type, default_currency, created_at) VALUES ('plat_pf_duplicate', 'PostFinance Duplicate', 'bank', 'CHF', '2026-01-01')zINSERT INTO accounts(account_id, platform_id, account_name, account_type, currency, balance_mode, created_at) VALUES ('acct_dup_pf_cash', 'plat_pf_duplicate', 'PostFinance Cash-Konto', 'cash', 'CHF', 'manual', '2026-01-01')r   r   r   r$   zISELECT COUNT(*) FROM accounts WHERE account_name='PostFinance Cash-Konto'   )r   r   r.   commitfetchone)r   r3   counts      r   Ntest_duplicate_cash_accounts_return_consolidation_preview_without_silent_merger>   ;   s    4D"4(LL  |  }LL 	j 	KKM+D1F)!!!,$<#====LLdennpqrsEA::r   c                    t               } t        |        | j                  d      j                         d   }t	        | t        |dddd            }|j                  dk(  sJ |j                  dk(  sJ t        | t        |dddd|j                  d	
            }|j                  dk(  sJ |j                  j                  d      sJ t        |       }t        d |j                   D              }|j"                  dk(  sJ |j$                  dk(  sJ |j&                  dk(  sJ |j(                  dk(  sJ |j*                  dk(  sJ |j,                  dk(  sJ y )NzKSELECT account_id FROM accounts WHERE account_name='PostFinance Cash-Konto'r   manual_balance
2026-05-20z1234.56Abgleich)
account_idsnapshot_typebalance_date
amount_chfnote
not_neededTrC   rD   rE   rF   rG   
preview_idconfirm	confirmedaudit_c              3  @   K   | ]  }|j                   d k(  s|  yw)r$   Naccount_labelr+   r6   s     r   r-   zitest_manual_cash_snapshot_preview_confirm_audit_and_dashboard_value_for_manual_account.<locals>.<genexpr>Z   s     dT5G5GKc5ctd   r%   0.00)r   r   r.   r<   r   r	   rF   	fx_statusr   r   rJ   statusaudit_id
startswithr   next	positionsr"   manual_balance_chfused_value_chfcalculated_balance_chfdifference_chflast_manual_reconciliation)r   rC   previewrL   summaryr,   s         r   Vtest_manual_cash_snapshot_preview_confirm_audit_and_dashboard_value_for_manual_accountra   L   s   4D"4(kluuwxyzJ#D*DPZjz  JV  cl  s}  +~  G***,,,%d,FR\l|  LX  en  u  LS  L^  L^  hl  -m  nI{***((222t$G
d 1 1d
dCx'''!!Y...***%%///***))\999r   c                 @   t               } t        |        | j                  d      j                         d   }t	        | t        |dddddd	             | j                  d
|f       t	        | t        |dddddd	             t        d t        |       j                  D              }|j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ y )Nz?SELECT account_id FROM accounts WHERE account_name='Raiffeisen'r   csv_anchor_balance
2026-05-01z1000.00StartpTrI   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, gross_amount_chf, net_amount_chf, source_type, is_confirmed, quality_status, created_at) VALUES ('tx_csv_1', 'csv_import', ?, '2026-05-05', '250.00', '250.00', 'CHF', '1', 'ok', '250.00', '250.00', 'csv_import', 1, 'ok', '2026-05-05')r@   rA   z1300.00	Kontrollec              3  @   K   | ]  }|j                   d k(  s|  yw)r!   NrO   rQ   s     r   r-   zetest_csv_calculated_account_uses_calculated_value_and_manual_as_control_difference.<locals>.<genexpr>n   s     gDDVDVZfDftgrR   r#   z1250.00z50.00zAbgleich offen)r   r   r.   r<   r   r   rX   r   rY   r"   csv_anchor_balance_chfr\   rZ   r[   r]   rU   )r   rC   r,   s      r   Rtest_csv_calculated_account_uses_calculated_value_and_manual_as_control_differencerj   c   sh   4D"4(_`iiklmnJ$ :j`t  DP  ]f  mt  AD  NR  !S  TLL 	b	 $ :j`p  @L  Yb  it  AD  NR  !S  T
g 0 6 @ @g
gC////%%222%%222!!Y...***(((::))))r   c                    t               } d}d}| j                  d|f       | j                  d||f       | j                  d       | j                          t        | |t	        ddd	            }|j
                  dk(  sJ t        | |t        ddd|j                  d
            }|j                  j                  d      sJ t        |       }|j                  dk(  sJ |j                  dk(  sJ t        j                  t               5 }t#        |  t%        dd|dddddd d d d ddd                    d d d        dj&                  j(                  v sJ y # 1 sw Y   $xY w)Nplat_truewealthacct_truewealthzINSERT INTO platforms(platform_id, name, platform_type, default_currency, created_at) VALUES (?, 'TrueWealth', 'roboadvisor', 'CHF', '2026-01-01')zINSERT INTO accounts(account_id, platform_id, account_name, account_type, currency, created_at) VALUES (?, ?, 'TrueWealth Gesamtwert', 'managed_portfolio', 'CHF', '2026-01-01')zINSERT INTO instruments(instrument_id, asset_class, name, currency, created_at) VALUES ('inst_vti', 'etf', 'Do not allow', 'USD', '2026-01-01')rA   z55555.55Monat)valuation_datetotal_value_chfrG   T)ro   rp   rG   rJ   rK   rM   Reqr*   1USDetfinst_vtibuy)rC   quantityr(   
trade_dateasset_classinstrument_idcandidate_idnametickerisincost_basis_originaltransaction_typeEinzelpositionen)r   r.   r;   r   r   rF   r   r   rJ   rV   rW   r   truewealth_value_chfrp   pytestraisesr   r   typevaluedetail)r   platform_idrC   r_   rL   overviewexcs          r   7test_truewealth_manual_value_history_and_position_blockr   y   s   4D#K"JLL  f  it  hv  wLL  D  GQ  S^  F_  `LL  c  dKKM#D*6P`l  I  PW  7X  YG+++%dJ8Rbn  AK  RY  fm  fx  fx  BF  9G  HI((222D!H((J666##z111	}	% z   wtE2jVYgl  }I  Z_  r|  NR  \`  lp  z~  WZ  pu  0v   w   y  	zz!1!1111z zs   	*EEc                    t               } t        |        | j                  d      j                         d   }| j                  d      j                         d   }t	        | t        |dddddd	
             t	        | t        |dddddd	
             t        |       }|j                  dk(  sJ |j                  dk(  sJ t        |j                        t        d      k\  sJ y )NzJSELECT account_id FROM accounts WHERE account_name='AKB gemeinsames Konto'r   zGSELECT account_id FROM accounts WHERE account_name='AKB Haushaltskonto'r@   rA   z2000.00 rf   TrI   rc   rd   z3000.00z5000.00rS   )r   r   r.   r<   r   r   r   cash_value_chfr   r   rp   )r   	manual_idcsv_idr   s       r   Itest_portfolio_uses_cash_balance_modes_without_double_counting_truewealthr      s   4D"4(ijssuvwxI\\cdmmopqrF$ :i_o  K  Xa  hj  wz  DH  !I  J$ :f\p  @L  Yb  ik  x{  EI  !J  KD!H""i///((F2228++,	0BBBBr   )#
__future__r   decimalr   r   fastapir   $jarvis_finance.api.schemas.positionsr   r   r   r	   $jarvis_finance.services.cash_servicer
   r   r   r   r   ,jarvis_finance.services.manual_entry_servicer   r   r   )jarvis_finance.services.portfolio_servicer   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r8   r>   ra   rj   r   r   r*   r   r   <module>r      s[    "   !   x w B : >4":.*,2,Cr   