
    pj                        d dl mZ d dlZd dlmc 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 d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlm Z  d Z!ddZ"ddZ#ddZ$ddZ%dS )    )annotationsN)Decimal)Path)create_crypto_asset)calculate_crypto_holdingscreate_initial_holding_snapshot)create_wallet)import_cash_balances_csv)import_crypto_holdings_csv)import_crypto_transactions_csv)import_crypto_wallets_csv)import_watchlist_csv)connect_memory)apply_migrationsc                     t                      } t          |            |                     d           |                     d           |                                  | S )NzINSERT INTO platforms(platform_id,name,platform_type,default_currency,created_at) VALUES('p1','Synthetic Broker','Bank/Broker','CHF','now')zINSERT INTO accounts(account_id,platform_id,account_name,account_type,currency,created_at) VALUES('a1','p1','Synthetic Cash','cash','CHF','now'))r   r   executecommit)cs    `/home/agent/.hermes/worktrees/FinanceManager-sprint20d/tests/unit/test_csv_importers_extended.py
setup_connr      sj    A(+++II  \  ]  ]  ]II  a  b  b  bHHJJJq    tmp_pathr   namestrtextreturnc                >    | |z  }|                     |d           |S )Nzutf-8)encoding)
write_text)r   r   r   ps       r   	write_csvr!      s$    4AdW===axr   Nonec           
        t                      }t          | dd          }d}t          |||          }|j        }d}||k    }|sVt	          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	d
t          j                    v st	          j        |          rt	          j	        |          nd
t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }	t          t	          j        |	                    d x}x}x}x}}t          ||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}}d}t          |||          }|j        }d}||k    }|sVt	          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	d
t          j                    v st	          j        |          rt	          j	        |          nd
t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }	t          t	          j        |	                    d x}x}x}x}}t          | dd          }t          ||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}}t          |          }|                    d                                          d         }|                    d                                          d         }|j        ||f         }|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}}|                    d"                                          }g }|d#         }d}||k    }|}|r|d$         }d%}||k    }|}|st	          j        d|fd&||f          t	          j	        |          t	          j	        |          d'z  }d(d)|iz  }|                    |           |r`t	          j        d|fd*||f          t	          j	        |          t	          j	        |          d+z  }d,d-|iz  }|                    |           t	          j        |d.          i z  }d/d0|iz  } t          t	          j        |                     d x}x}x}x}x}x}x}}g }|d1         }d2}||k    }|}|r|d3         }d%}||k    }|}|st	          j        d|fd&||f          t	          j	        |          t	          j	        |          d'z  }d(d)|iz  }|                    |           |r`t	          j        d|fd*||f          t	          j	        |          t	          j	        |          d+z  }d,d-|iz  }|                    |           t	          j        |d.          i z  }d/d0|iz  } t          t	          j        |                     d x}x}x}x}x}x}x}}d S )4Nzwallets.csvzGwallet_name,wallet_type,notes
Synthetic Cold,Hardware Wallet,synthetic
Fr   
dry_run_ok==)zf%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py0)s(%(py1)s, %(py2)s, commit=%(py4)s)
}.status
} == %(py11)sr   r   walletspy0py1py2py4py6py8py11assert %(py13)spy13T   )z0%(py2)s
{%(py2)s = %(py0)s.rows_new
} == %(py5)sresr*   r,   py5assert %(py7)spy7)zm%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py0)s(%(py1)s, %(py2)s, commit=%(py4)s)
}.rows_existing
} == %(py11)szholdings.csvzwallet_name,coin_name,symbol,coingecko_id,quantity,verification_status,last_verified_at,legacy_snapshot_value_chf
Synthetic Cold,Synthetic Bitcoin,BTC,bitcoin,0.00000001,verified,2026-01-01T00:00:00Z,999.99
z5SELECT asset_id FROM crypto_assets WHERE symbol='BTC'asset_idzGSELECT wallet_id FROM crypto_wallets WHERE wallet_name='Synthetic Cold'	wallet_id
0.00000001zN%(py3)s
{%(py3)s = %(py1)s.quantity
} == %(py9)s
{%(py9)s = %(py5)s(%(py7)s)
}r   r+   py3r6   r8   py9assert %(py11)sr0   ztSELECT quantity, typeof(quantity), legacy_snapshot_value_chf, typeof(legacy_snapshot_value_chf) FROM crypto_holdingsquantityztypeof(quantity)r   )z%(py3)s == %(py6)s)r>   r.   z%(py8)sr/   )z%(py11)s == %(py14)s)r0   py14z%(py16)spy16r   zassert %(py19)spy19legacy_snapshot_value_chfz999.99z!typeof(legacy_snapshot_value_chf))r   r!   r   status
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationrows_newrows_existingr   r   r   fetchonewallet_holdingsrA   r   append_format_boolop)!r   r   r(   @py_assert3@py_assert5@py_assert7@py_assert10@py_assert9@py_format12@py_format14r4   @py_assert1@py_assert4@py_format6@py_format8holdingshaidwid@py_assert0@py_assert2@py_assert6@py_assert8@py_format10row@py_assert13@py_assert12@py_format7@py_format9@py_format15@py_format17@py_format18@py_format20s!                                    r   Ktest_crypto_wallet_and_holding_import_dry_run_commit_existing_and_precisionrr      ss
   llAh}-xyyG6;S$Qwe<<<S<CS|SC|SSSSSSSSSSC|SSSSSSSSSSSS$SSSSS$SSSSSSSSSSSSSQSSSSSQSSSSSSSSSSSSSwSSSSSwSSSSSSeSSSS<SSSSCSSSS|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS!!G4888C:RQR:RQRAR:R:R:R:R:R:R:R:R:RQR: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:RQR: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:R6:N$Qwd;;;N;INQNIQNNNNNNNNNNIQ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NQNNNNNQNNNNNNNNNNNNNwNNNNNwNNNNNNdNNNN;NNNNINNNNQ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x  0C  D  DH"1XT:::C3<<TST<T<STCT<T<T<T<T<T<T<T<T<T<ST<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<TST<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""A			IJJSSUUV`aC			[\\eegghstCc#Y'I'0ILIGL4I4II04IIIIIIIIIII04IIIIII'IIII0IIIIIIIIIIIGIIIIIGIIIIIILIIII4I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  	J  	J  	S  	S  	U  	UCPP3z?PlP?l*PPPPPs3E/FP&P/F&/PPPPPPPPPPPP?lPPPPP?PPPPlPPPPPPPPPPPPPPPPPPPPPPPPPPP/F&PPPPP/FPPPP&PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPnn3*+nxn+x7nnnnnC@c<dnhnn<dhn<nnnnnnnnnnnn+xnnnnn+nnnnx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<dhnnnnnn<dnnnnhn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nnnnnr   c                	   t                      }t          |dd          }t          |dd          }t          |ddd	          }t          |||t	          d
          dd           t          | dd          }t          ||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}	}t!          |          }|j        ||f         }|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        ||f         }|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}}|                    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 S )'NzSynthetic AzHardware Wallet)wallet_namewallet_typezSynthetic BzSoftware WalletzSynthetic BitcoinBTCbitcoin)	coin_namesymbolcoingecko_idz
0.00000003verified	synthetic)r9   r:   rA   verification_statusnotezcrypto_tx.csva\  transaction_type,asset_symbol,quantity,from_wallet_name,to_wallet_name,account_name,gross_amount_original,currency_original,fee_quantity,fee_original,fee_currency,fx_rate_to_chf,notes
transfer,BTC,0.00000001,Synthetic A,Synthetic B,,,,0.00000001,,,,synthetic transfer
buy,BTC,0.00000002,,Synthetic B,Synthetic Cash,10,CHF,,0.50,CHF,1,synthetic buy
Tr$   	committedr&   )z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)sr4   r5   r7   r8   r;   r<   r   r=   r@   r0   zASELECT COUNT(*) AS c FROM transactions WHERE source_type='crypto'r      z%(py1)s == %(py4)sr+   r-   assert %(py6)sr.   zTSELECT COUNT(*) AS c FROM audit_log WHERE action IN ('crypto_transfer','crypto_buy'))r   r	   r   r   r   r!   r   rF   rG   rH   rI   rJ   rK   rL   rM   rN   r   rR   rA   r   rQ   )r   r   w1w2rb   csvr4   r\   r]   rU   r^   r_   ra   rd   re   rf   rg   rh   rZ   @py_format5rl   s                        r   Stest_crypto_transactions_import_transfer_and_buy_create_audit_and_no_float_roundingr   -   sk   llA}Q=M^___Bdqrs  AN  [l  em  em  emac  sF  GH  Sf  ns  AJ  sK  sK  sK  or#AsRQ]I^I^s}  DO  P  P  P  P(?  ,M  	N  	NC&qD999C:$$:$$$$$$$$$$:$$$$$$$$$$$$3$$$$$3$$$$$$:$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$""AbX&H&/H<H7<3H3HH/3HHHHHHHHHHH/3HHHHHH&HHHH/HHHHHHHHHHH7HHHHH7HHHHHH<HHHH3HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHbX&H&/H<H7<3H3HH/3HHHHHHHHHHH/3HHHHHH&HHHH/HHHHHHHHHHH7HHHHH7HHHHHH<HHHH3HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH99XYYbbddehinmnnimnnnnnnnnnnnimnnnnnninnnnmn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99klluuwwx{|  B  AB  B|  AB  B  B  B  B  B  B  B  B  B  B|  AB  B  B  B  B  B|  B  B  B  B  AB  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  Br   c           
        t                      }t          | dd          }d}t          |||          }|j        }d}||k    }|sVt	          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	d
t          j                    v st	          j        |          rt	          j	        |          nd
t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }	t          t	          j        |	                    d x}x}x}x}}|                    d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}}t          | dd          }d}t          |||          }|j        }d}||k    }|sVt	          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	dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }	t          t	          j        |	                    d 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         }t          |          }d}t          |          }||k    }|s"t	          j        d|fd||f          d t          j                    v st	          j        t                    rt	          j	        t                    nd 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}}d S )$Nz	watch.csvzname,asset_class,reason,status,target_entry_price,target_entry_currency,investment_case,bear_case
Synthetic Idea,Crypto,synthetic reason,active,123.45,CHF,case,bear
Tr$   r3   r&   )zh%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py0)s(%(py1)s, %(py2)s, commit=%(py4)s)
}.rows_new
} == %(py11)sr   r   watchr)   r1   r2   z)SELECT reason FROM watchlist WHERE name=?)zSynthetic Ideareasonzsynthetic reasonr   r   r   r.   zcash.csvzaccount_name,balance_date,currency,amount_original,fx_rate_to_chf,notes
Synthetic Cash,2026-01-01,CHF,1000,1,synthetic cash snapshot
r
   cashzmSELECT transaction_type, net_amount_original FROM transactions WHERE transaction_type='initial_cash_snapshot'transaction_typeinitial_cash_snapshotnet_amount_original1000)zP%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}r   )r*   r,   r-   r.   r/   py10zassert %(py12)spy12)r   r!   r   rO   rG   rH   rI   rJ   rK   rL   rM   rN   r   rQ   r
   r   )r   r   r   rU   rV   rW   rX   rY   rZ   r[   rd   re   r   rl   r   ri   r\   @py_format11@py_format13s                      r   )test_watchlist_and_cash_balance_importersr   :   s(   llA
H[  *S  T  TE/3B%t444B4=BB=BBBBBBBBBB=BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB%BBBBB%BBBBBBtBBBB4BBBB=BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99@ATUU^^``aij  A  oA  Aj  oA  A  A  A  A  A  A  A  A  A  Aj  oA  A  A  A  A  Aj  A  A  A  A  o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	8J  (q  
r  
rD26E#Ad$777E7@EAE@AEEEEEEEEEE@AEEEEEEEEEEEE#EEEEE#EEEEEEEEEEEEEAEEEEEAEEEEEEEEEEEEEdEEEEEdEEEEEE$EEEE7EEEE@EEEEAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE			  B  	C  	C  	L  	L  	N  	NC!"=&=="&==========="&======"====&============================,-A7-..A&A'&//A./AAAAAAAAAA./AAAAAAAAAAAA7AAAAA7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AAAAAAAAAAAAAAAAAr   )r   r   r   r   r   r   r   r   )r   r   r   r"   )&
__future__r   builtinsrI   _pytest.assertion.rewrite	assertionrewriterG   decimalr   pathlibr   jarvis_finance.crypto.assetsr   jarvis_finance.crypto.holdingsr   r   jarvis_finance.crypto.walletsr	   -jarvis_finance.imports.cash_balances_importerr
   /jarvis_finance.imports.crypto_holdings_importerr   3jarvis_finance.imports.crypto_transactions_importerr   .jarvis_finance.imports.crypto_wallets_importerr   )jarvis_finance.imports.watchlist_importerr   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r!   rr   r   r    r   r   <module>r      s   " " " " " "                           < < < < < < e e e e e e e e 7 7 7 7 7 7 R R R R R R V V V V V V ^ ^ ^ ^ ^ ^ T T T T T T J J J J J J : : : : : : > > > > > >  H H H Ho o o o"
B 
B 
B 
B	B 	B 	B 	B 	B 	Br   