
    %fj                       d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZ h dZe G d	 d
                      Ze G d d                      Zd.d/dZd0dZd1dZd2dZddddddd3d)Zd4d,Zd5d-ZdS )6    )annotations)	dataclassfield)Decimal)
Connection)record_audit_event)	stable_idutc_now)create_alert>   staleverified	estimated
unverifiedc                      e Zd ZU ded<   ded<    ed          Zded<   dZded	<   d
Zded<   d
Zded<   d
Z	ded<   d
Z
ded<    ee          Zded<   d
S )CryptoHolding
str | None	wallet_idstrasset_id0r   quantityr   verification_statusNlast_verified_atDecimal | Nonelegacy_snapshot_value_originallegacy_snapshot_value_chfcurrent_value_chfdefault_factoryz	list[str]quality_warnings)__name__
__module____qualname____annotations__r   r   r   r   r   r   r   r   listr         m/home/agent/.hermes/worktrees/FinanceManager-sprint10-portfolio-go-live/src/jarvis_finance/crypto/holdings.pyr   r      s         MMMH$$$$+++++#'''''59"9999044444(,,,,,"'%"="="=======r'   r   c                  T    e Zd ZU  ee          Zded<    ee          Zded<   dS )CryptoHoldingsResultr   z$dict[tuple[str, str], CryptoHolding]wallet_holdingszdict[str, CryptoHolding]total_by_assetN)r!   r"   r#   r   dictr+   r$   r,   r&   r'   r(   r*   r*      sO         <AERV<W<W<WOWWWW/4uT/J/J/JNJJJJJJr'   r*   r   valueobjectdefaultr   returnr   c                    | %t          |                                           dk    rt          |          S t          t          |                     S )N )r   stripr   )r.   r0   s     r(   _dr5   !   sE    }E

((**b00w3u::r'   r   r   c                *    | t          | d          nd S )Nf)format)r.   s    r(   _dsr9   '   s    !&!26%<r'   resultr   r   c                Z    | j                             ||ft          ||                    S N)r   r   )r+   
setdefaultr   )r:   r   r   s      r(   _ensure_holdingr>   +   s/    !,,i-BM\epxDyDyDyzzzr'   c                V    | j                             |t          d |                    S r<   )r,   r=   r   )r:   r   s     r(   _ensure_totalr@   /   s)     ++Hmd]e6f6f6fgggr'   N)r   r   r   legacy_snapshot_currencylegacy_snapshot_dateconnr   r   r   noter   r   r   rA   rB   c       
           |dk     rt          d          |t          vrt          d          |                                st          d          t                      }t	          d||          }|                     d|||t          |          ||t          |          t          |          |	|
||||f           t          | ddd	|||t          |          |d
|dd	  	         |                                  |S )Nr   z%initial holding quantity must be >= 0zinvalid verification_statusz(initial holding snapshot requires a notecryptoholdinga  
        INSERT OR REPLACE INTO crypto_holdings(
            crypto_holding_id, asset_id, wallet_id, quantity, acquisition_source,
            last_verified_at, verification_status, legacy_snapshot_value_original,
            legacy_snapshot_value_chf, legacy_snapshot_currency, legacy_snapshot_date,
            notes, created_at, updated_at
        ) VALUES (?, ?, ?, ?, 'initial_snapshot', ?, ?, ?, ?, ?, ?, ?,
                  COALESCE((SELECT created_at FROM crypto_holdings WHERE crypto_holding_id=?), ?), ?)
        crypto_holdingsinitial_crypto_holding_snapshotcrypto_holding)r   r   r   r   Tsystem)sourceactionentity_type	entity_id
new_valuesuser_text_note	confirmed
created_by)	
ValueErrorVALID_VERIFICATION_STATUSr4   r
   r	   executer9   r   commit)rC   r   r   r   r   rD   r   r   r   rA   rB   now
holding_ids                r(   create_initial_holding_snapshotrY   3   s6    !||@AAA";;;6777::<< ECDDD
))C?Hi@@JLL	 )S]]<LNa.//)**$&:D*cSV		
  "  0$ (ycRZmm  uH  I  I
 
 
 
 	KKMMMr'   deltaNonec                    t          | ||          }|xj        |z  c_        t          | |          }|xj        |z  c_        d S )N)r>   r   r@   )r:   r   r   rZ   holdingtotals         r(   _apply_deltar_   i   sJ    fi::G&(++E	NNeNNNNr'   c                0   t                      }|                     d                                          D ]}t          ||d         |d                   }|xj        t          |d                   z  c_        |d         |_        |d         |_        |d         t          |d                   nd |_        |d         t          |d                   nd |_	        t          ||d                   }|xj        t          |d                   z  c_        |                     d	                                          }|D ]&}|d         }t          |d                   }t          |d
                   }|d         }	|	dk    r5t          ||d         |||z               t          ||d         ||           x|	dk    rt          ||d         |||z
             |	dk    rt          ||d         |||z               |	dk    rt          ||d         ||            |	dk    rC|d         rt          ||d         ||           |d         rt          ||d         ||            (|                     d                                          D ]td         sjd}
fd|j                                        D             D ]}|j                            d           t!          | dddd         d|
dd         id	  	         u|                                  |S )Nz:SELECT * FROM crypto_holdings ORDER BY wallet_id, asset_idr   r   r   r   r   r   r   zbSELECT * FROM crypto_transactions ORDER BY transaction_datetime, created_at, crypto_transaction_idfee_quantitytransaction_typetransferfrom_wallet_idto_wallet_idbuysellfeemanual_adjustmentz8SELECT asset_id, symbol, coingecko_id FROM crypto_assetscoingecko_idzCCrypto asset has no CoinGecko ID; current valuation is unavailable.c                6    g | ]}|j         d          k    |S r   rl   ).0hassets     r(   
<listcomp>z-calculate_crypto_holdings.<locals>.<listcomp>   s,    jjj!!*X]^hXiJiJiAJiJiJir'   missing_coingecko_idwarnungcryptocrypto_assetsymbol)prioritycategoryrM   rN   rule_idmessageevidencefingerprint)r*   rU   fetchallr>   r   r5   r   r   r   r   r@   r_   r+   valuesr    appendr   rV   )rC   r:   rowr]   r^   rowsr   qtyfee_qtytmsgro   s              @r(   calculate_crypto_holdingsr   p   s   !##F||XYYbbdd . .!&#k*:C
OLLBs:///&)*?&@##&'9#: ^a  cC  _D  _PC8X4Y1Z1Z1Z  VZ.TWXsTt  UABs3N/O,P,P,P  GK)fc*o66"S_---<<|}}  G  G  I  ID L Lz?Z!!S())"#
??%5!6C'MBRSSS^!4hDDDD%ZZ^!4hgNNNN&[[%5!6C'MBRSSSS%ZZ%5!67(KKKK%%%>" LVS%8(CHHHH%& LVS)9%:HsdKKKXYYbbdd  ^$ 	WCjjjjv'='D'D'F'Fjjj H H(//0FGGGG"!*
+."E(O42
 
 
 
 	KKMMMMr'   )r   )r.   r/   r0   r   r1   r   )r.   r   r1   r   )r:   r*   r   r   r   r   r1   r   )r:   r*   r   r   r1   r   )rC   r   r   r   r   r   r   r   r   r   rD   r   r   r   r   r   r   r   rA   r   rB   r   r1   r   )
r:   r*   r   r   r   r   rZ   r   r1   r[   )rC   r   r1   r*   )
__future__r   dataclassesr   r   decimalr   sqlite3r   jarvis_finance.audit.logr   jarvis_finance.imports.commonr	   r
   jarvis_finance.quality.alertsr   rT   r   r*   r5   r9   r>   r@   rY   r_   r   r&   r'   r(   <module>r      s   " " " " " " ( ( ( ( ( ( ( (             7 7 7 7 7 7 < < < < < < < < 6 6 6 6 6 6LLL  	> 	> 	> 	> 	> 	> 	> 	> K K K K K K K K
    = = = ={ { { {h h h h $(5904+/'+3 3 3 3 3 3l   0 0 0 0 0 0r'   