
    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d
S )    )annotations)Decimal)apply_manual_cash_correctioncalculate_cash_balances)calculate_positionssave_position_snapshots)connect_memory)apply_migrationsc                     t                      } t          |            |                     d           |                     d           |                     d           |                     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      s    DTLL  U  V  V  VLL  _  `  `  `LL  f  g  g  gLL  k  l  l  lK    i1
2026-01-01NCHF   	synthetic)

instrumentdateqtygrossfeetaxnetcurrencyfxnotec       
        t   |                      d||d|||t          |          nd d |t          |          nd t          |          t          |          |	t          |	          nd |
|t          |          nd |dnd|H|Ft          t          t          |                    t          t          |                    z            nd |Ft          t          t          |                    t          t          |                    z            nd |Ft          t          t          |                    t          t          |                    z            nd |	H|Ft          t          t          |	                    t          t          |                    z            nd dd|dnd|df           d S )	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JJJs3xxSWZWf3s888lpc"gggT2>44W`9>9Jr~CE

##GCGG$4$44555cg79~CC!!'#b''"2"22333479~CC!!'#b''"2"2233347:2>CC!!'#b''"2"22333_cBNDDdE		
    r   returnNonec            
        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 d S ) 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_cashrJ   +   s$   <<DtT*t4TRRRRtT5ass;;;;tT>qsKKKKtT:4rqbAAAAtT5T::::tT5T::::$T**F
C?3/75>>AAAA?3*genn<<<<(B......r   c            	     \   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 |                     d                                          }|d         dk    sJ d S )Nr-   r.   d   r0   r1   r2   r7      r   r4   rB   z-100zBSELECT priority, rule_id FROM alerts WHERE rule_id='negative_cash'prioritywarnung)	r   r)   r   rD   rE   r   rG   r   fetchone)r   rH   alerts      r   1test_cash_negative_creates_warning_not_correctionrR   <   s    <<DtT*t3CPPPPtT5ass;;;;$T**F?=)9WV__LLLL((((LL]^^ggiiE	))))))r   c                    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 |                     d	                                          d
         dk    sJ d S )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   rP   )r   excaudit_ids      r   3test_manual_cash_correction_requires_note_and_auditr]   I   s    <<D9$TdUSZ[_S`S`gijjjj 7888  " " "S!!!!!!!!!"
 ,DTEZabfZgZg  oI  J  J  JHOO8<<cddmmoopstxyyyyyyys   !A   
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 d S ) Nr1   r2   u1r   
   r/   i  USDz0.90)r   r   r   r   r   r   r   r   b2
2026-01-02i     i  z0.80r5   r6   z
2026-01-03r3   i  r;   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   rf   poss      r   Gtest_weighted_average_cost_buy_fee_usd_fx_and_partial_sell_realized_pnlrn   W   s[   <<DtT5T"DVX^bmrw}~~~~tT5T"DVX^bmrw}~~~~tT>d1TW]^dgrw  }C  D  D  D  D#D))I

l
+C<74==(((("gh&7&77777!3!33333$(8(8888878#4#44444<77++++++++r   c            	     J   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 d S )Nr1   r2   r?   i,  r   r4   r5   	full_selliJ  r!   r   030)r   r)   r   rf   rg   r   ri   rk   r   rm   s     r   Gtest_full_sell_sets_quantity_zero_and_keeps_historical_position_visibleru   h   s    <<DtT5ass;;;;tT;ASaSAAAA
d
#
#
-l
;C<73<<''''----74==000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 d S )Nr1   r2   rA   i  i  r4   r8   r9   (         r=   rq   44042614)	r   r)   r   rf   rg   r   ri   
income_chf	taxes_chfrt   s     r   7test_dividend_changes_income_not_quantity_or_cost_basisr   t   s    <<DtT5ass;;;;tT:4rrrBBBB
d
#
#
-l
;C<73<<''''////>WT]]****=GDMM))))))r   c            
     F   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 |                     d                                          d         dk    sJ d S )Nr1   r2   r7   rM   r   )r   r   r   r   r   rq   r$   missing_market_price
missing_fxzWSELECT COUNT(*) AS n FROM alerts WHERE rule_id IN ('missing_market_price','missing_fx')rX   )	r   r)   r   rf   data_quality_statusquality_warningstotal_return_chfr   rP   r   rH   rm   s      r   Jtest_missing_market_price_warns_and_missing_fx_blocks_precise_total_returnr      s    <<DtT5asstDDDD &&F

<
(C"l2222!S%999993/////'''<<qrr{{}}  B  C  GH  H  H  H  H  H  Hr   c            	     @   t                      } t          | dddddd           |                     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           |                     d          
                                d         dk    sJ |                     d          
                                d         dk    sJ d S )Nr1   r2   r7   rM   r   r4   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')rc   )
as_of_daterq   24040zSynthetic calculated snapshot)r   z,SELECT COUNT(*) AS n FROM positions_snapshotrX   r   zNSELECT COUNT(*) AS n FROM audit_log WHERE action='calculate_position_snapshot')r   r)   r   r   rf   market_value_chfr   unrealized_pnl_chfr   r   rP   r   s      r   Htest_market_price_enables_unrealized_pnl_total_return_and_snapshot_auditr      s2   <<DtT5ass;;;;LL  J  K  K  K ,???F

<
(C75>>1111!WT]]222274==0000D&/NOOOO<<FGGPPRRSVW[\\\\\<<hiirrttuxy}~~~~~~~r   )r*   r+   )
__future__r   decimalr   jarvis_finance.ledger.cashr   r   jarvis_finance.ledger.positionsr   r   jarvis_finance.storage.databaser	   !jarvis_finance.storage.migrationsr
   r   r)   rJ   rR   r]   rn   ru   r   r   r    r   r   <module>r      s   " " " " " "       \ \ \ \ \ \ \ \ X X X X X X X X : : : : : : > > > > > >   (,,DPTZ[abhlw|  BC  JU     ,/ / / /"
* 
* 
* 
*z z z z, , , ,"	1 	1 	1 	1
* 
* 
* 
*H H H H     r   