
    pj                        d dl mZ d dlmZ d dlmZmZ d dlmZm	Z	 d dl
mZ d dlmZ d Zdd	d
d
d d d
dddd
dZddZddZddZddZddZddZddZddZy
)    )annotations)Decimal)apply_manual_cash_correctioncalculate_cash_balances)calculate_positionssave_position_snapshots)connect_memory)apply_migrationsc                     t               } t        |        | j                  d       | j                  d       | j                  d       | j                  d       | S )NzINSERT INTO platforms(platform_id,name,platform_type,default_currency,created_at) VALUES('p1','Demo Broker','broker','CHF','now')zINSERT INTO accounts(account_id,platform_id,account_name,account_type,currency,created_at) VALUES('a1','p1','Main','brokerage','CHF','now')zINSERT INTO instruments(instrument_id,asset_class,name,ticker,isin,currency,created_at) VALUES('i1','equity','Demo AG','DAG','CH0001','CHF','now')zINSERT INTO instruments(instrument_id,asset_class,name,ticker,isin,currency,created_at) VALUES('u1','equity','USD Demo Inc','UDI','US0001','USD','now'))r	   r
   execute)conns    ,tests/unit/test_ledger_cash_wac_positions.py
setup_connr      sc    DTLL  U  VLL  _  `LL  f  gLL  k  lK    i1
2026-01-01NCHF   	synthetic)

instrumentdateqtygrossfeetaxnetcurrencyfxnotec       
           | j                  d||d|||t        |      nd d |t        |      nd t        |      t        |      |	t        |	      nd |
|t        |      nd |dnd|4|2t        t        t        |            t        t        |            z        nd |2t        t        t        |            t        t        |            z        nd |2t        t        t        |            t        t        |            z        nd |	4|2t        t        t        |	            t        t        |            z        nd dd|dnd|df       y )	Na  INSERT INTO transactions(
            transaction_id, transaction_type, account_id, instrument_id, trade_date,
            quantity, price_original, gross_amount_original, fee_original, tax_original,
            net_amount_original, currency_original, fx_rate_to_chf, fx_status,
            gross_amount_chf, fee_chf, tax_chf, net_amount_chf,
            source_type, is_confirmed, quality_status, notes, created_at
        ) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)a1okmissingr   r   
incompletenow)r   strr   )r   tidttyper   r   r   r   r   r   r   r   r   r   s                r   txr)      s'   LL	C j$COCQUW[+CJs3xSWZWf3s8lpc"gT2>4W`9>9Jr~CE
#GCG$445cg79~CC!'#b'"223479~CC!'#b'"22347:2>CC!'#b'"223_cBNDdE		
r   c            
        t               } t        | ddd dd       t        | dddddd	
       t        | ddddddd       t        | ddd ddd       t        | ddd dd       t        | ddd dd       t        |       }d}|j                  |   j                  t        d      k(  sJ |j                  |   j                  t        d      k(  sJ |j                  g k(  sJ y ) Nc0initial_cash_snapshot  r   r   r   b1buy   i  i  r   r   r   r   s1partial_sell   i  r   i  )r   r   r   r   r   d1dividend         r   r   r   r   f1r      t1r      r!   r   758)r   r)   r   balancesamount_originalr   
amount_chfnegative_cash_warnings)r   resultkeys      r   Qtest_initial_cash_snapshot_is_start_truth_and_buy_sell_dividend_fee_tax_move_cashrH   +   s    <DtT*t4TRtT5ass;tT>qsKtT:4rqbAtT5T:tT5T:$T*F
C??3//75>AAA??3**gen<<<((B...r   c            	     0   t               } t        | ddd dd       t        | ddddd	d
       t        |       }|j                  d   j                  t        d      k(  sJ |j                  sJ | j                  d      j                         }|d   dk(  sJ y )Nr+   r,   d   r.   r/   r0   r5      r   r2   r@   z-100zBSELECT priority, rule_id FROM alerts WHERE rule_id='negative_cash'prioritywarnung)	r   r)   r   rB   rC   r   rE   r   fetchone)r   rF   alerts      r   1test_cash_negative_creates_warning_not_correctionrP   <   s    <DtT*t3CPtT5ass;$T*F??=)99WV_LLL((((LL]^ggiE	)))r   c                 4   t               } 	 t        | ddt        d      d       t        d      # t        $ r}dt        |      v sJ Y d }~nd }~ww xY wt        | ddt        d      d      }|sJ | j                  d	      j                         d
   dk(  sJ y )Nr!   r   10 )
account_idr   amountr   zexpected note validationr   zSynthetic reconciliationzISELECT COUNT(*) AS n FROM audit_log WHERE action='manual_cash_correction'nr   )r   r   r   AssertionError
ValueErrorr&   r   rN   )r   excaudit_ids      r   3test_manual_cash_correction_requires_note_and_auditr[   I   s    <D9$TdUSZ[_S`gij 788  "S!!!"
 ,DTEZabfZg  oI  JHO8<<cdmmopstxyyyys   0 	AAAc                    t               } t        | dddddddddd	
       t        | dddddddddd
       t        | dddddddddd
       t        |       }|j                  d   }|j                  t        d      k(  sJ |j                  t        d      k(  sJ |j                  t        d      k(  sJ |j                  t        d      k(  sJ |j                  t        d      k(  sJ |j                  t        d      k(  sJ y ) Nr/   r0   u1r   
   r-   i  USDz0.90)r   r   r   r   r   r   r   r   b2
2026-01-02i     i  z0.80r3   r4   z
2026-01-03r1   i  r9   i  z0.85)r!   r]   15z1666.5z1408.95z111.1z119.40z24.55)r   r)   r   	positionsquantityr   cost_basis_originalcost_basis_chfaverage_cost_originalrealized_pnl_chffees_chf)r   rd   poss      r   Gtest_weighted_average_cost_buy_fee_usd_fx_and_partial_sell_realized_pnlrl   W   s   <DtT5T"DVX^bmrw}~tT5T"DVX^bmrw}~tT>d1TW]^dgrw  }C  D#D)I


l
+C<<74=(((""gh&7777!3333$$(888878#4444<<77++++r   c            	     ,   t               } t        | dddddd       t        | dddd	dd	       t        |       j                  d
   }|j                  t        d      k(  sJ |j                  t        d      k(  sJ |j                  t        d      k(  sJ y )Nr/   r0   r=   i,  r   r2   r3   	full_selliJ  r!   r   030)r   r)   r   rd   re   r   rg   ri   r   rk   s     r   Gtest_full_sell_sets_quantity_zero_and_keeps_historical_position_visiblers   h   s    <DtT5ass;tT;ASaSA
d
#
-
-l
;C<<73<'''---74=000r   c            	     `   t               } t        | dddddd       t        | ddd d	d
d       t        |       j                  d   }|j                  t        d      k(  sJ |j                  t        d      k(  sJ |j                  t        d      k(  sJ |j                  t        d      k(  sJ y )Nr/   r0   r?   i  i  r2   r6   r7   (         r;   ro   44042614)	r   r)   r   rd   re   r   rg   
income_chf	taxes_chfrr   s     r   7test_dividend_changes_income_not_quantity_or_cost_basisr~   t   s    <DtT5ass;tT:4rrrB
d
#
-
-l
;C<<73<'''///>>WT]***==GDM)))r   c            
     >   t               } t        | ddddddd        t        |       }|j                  d   }|j                  dk(  sJ d	|j
                  v sJ d
|j
                  v sJ |j                  J | j                  d      j                         d   dk\  sJ y )Nr/   r0   r5   rK   r   )r   r   r   r   r   ro   r$   missing_market_price
missing_fxzWSELECT COUNT(*) AS n FROM alerts WHERE rule_id IN ('missing_market_price','missing_fx')rV   )	r   r)   r   rd   data_quality_statusquality_warningstotal_return_chfr   rN   r   rF   rk   s      r   Jtest_missing_market_price_warns_and_missing_fx_blocks_precise_total_returnr      s    <DtT5asstD &F


<
(C""l222!S%9%99993/////'''<<qr{{}  B  C  GH  H  H  Hr   c            	        t               } t        | dddddd       | j                  d       t        | d	      }|j                  d
   }|j
                  t        d      k(  sJ |j                  t        d      k(  sJ |j                  t        d      k(  sJ t        | |d       | j                  d      j                         d   dk(  sJ | j                  d      j                         d   dk(  sJ y )Nr/   r0   r5   rK   r   r2   zINSERT INTO market_prices(market_price_id,instrument_id,price_date,close,currency,provider,quality_status,created_at) VALUES('mp1','i1','2026-01-02',120,'CHF','synthetic','ok','now')ra   )
as_of_datero   24040zSynthetic calculated snapshot)r   z,SELECT COUNT(*) AS n FROM positions_snapshotrV   r   zNSELECT COUNT(*) AS n FROM audit_log WHERE action='calculate_position_snapshot')r   r)   r   r   rd   market_value_chfr   unrealized_pnl_chfr   r   rN   r   s      r   Htest_market_price_enables_unrealized_pnl_total_return_and_snapshot_auditr      s    <DtT5ass;LL  J  K ,?F


<
(C75>111!!WT]22274=000D&/NO<<FGPPRSVW[\\\\<<hirrtuxy}~~~~r   )returnNone)
__future__r   decimalr   jarvis_finance.ledger.cashr   r   jarvis_finance.ledger.positionsr   r   jarvis_finance.storage.databaser	   !jarvis_finance.storage.migrationsr
   r   r)   rH   rP   r[   rl   rs   r~   r   r    r   r   <module>r      sr    "  \ X : > (,,DPTZ[abhlw|  BC  JU ,/"
*z,"	1
*Hr   