
    hjP                        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 e G d d	                      Ze G d
 d                      Zd'd(dZd)dZdddd*dZdd d+d&ZdS ),    )annotations)	dataclassfield)Decimal)
Connection)record_audit_event)	stable_idutc_now)create_alertc                  r    e Zd ZU ded<   ded<    ed          Zded<    ed          Zded<   d	Zded
<   dS )CashBalancestr
account_idcurrency0r   amount_originalzDecimal | None
amount_chfokquality_statusN)__name__
__module____qualname____annotations__r   r   r   r        /home/agent/.hermes/worktrees/FinanceManager-sprint16-smart-household-inbox-real-data-onboarding-v2/src/jarvis_finance/ledger/cash.pyr   r      sg         OOOMMM&ws||O++++!(J----Nr   r   c                  T    e Zd ZU  ee          Zded<    ee          Zded<   dS )CashCalculationResult)default_factoryz"dict[tuple[str, str], CashBalance]balancesz	list[str]negative_cash_warningsN)	r   r   r   r   dictr    r   listr!   r   r   r   r   r      sO         3853N3N3NHNNNN(-d(C(C(CCCCCCCr   r   r   valueobjectdefaultr   returnr   c                    | %t          |                                           dk    rt          |          S t          t          |                     S )N )r   stripr   )r$   r&   s     r   _dr+      sE    }E

((**b00w3u::r   tuple[Decimal, Decimal | None]c                V   | d         }t          | d                   }| d         t          | d                   nd }t          | d                   }t          | d                   }| d         t          | d         d          nd }|dk    r||n|}n|d	k    r||n|}n}|d
k    r||n| }no|dk    r||n||z   |z    }n[|dv r||n||z
  |z
  }nJ|dv r||n||z
  |z
  }n9|dv r||n|p|p| }n)|dk    r||n|}n|dk    r||n|}nt          d          }|||z  nd }||fS )Ntransaction_typegross_amount_originalnet_amount_originalfee_originaltax_originalfx_rate_to_chf1initial_cash_snapshotcash_depositcash_withdrawalbuy>   sell	full_sellpartial_sell>   dividendetf_distribution>   feetaxfx_conversionmanual_cash_correctionr   )r+   r   )	rowtgrossnetr>   r?   fxoriginalchfs	            r   _signed_cash_deltarI   !   s   As*+,,E,/0E,F,R"S&'
(
(
(X\C
S 
!
!C
S 
!
!C+./?+@+LC !3	'	'	'RVB###/33u	
n		/33u	
		OSS7	
eOSSs1BC	
3	3	3/33us{S/@	
.	.	./33us{S/@	
n		OSS1D#1DE	
o		/33u	
&	&	&/33u3<<>(R--tCS=r   NT)
as_of_datepersist_alertsconnr   rJ   
str | NonerK   boolc                  t                      }d}d}|r|dz  }|f}|                     d| d|                                          }|D ]}|d         }|d         }	||	f}
|j                            |
t          ||	                    }t          |          \  }}|xj        |z  c_        |d |_        d|_	        r|j        |xj        |z  c_        |j        
                                D ]|\  }
}|j        d	k     rld
|j         d|j         d|j         }|j                            |           |r6t          | ddd|j        d||j        t!          |j                  d           }|r|                                  |S )Nr   z WHERE COALESCE(is_voided, 0) = 0z AND trade_date <= ?z,
        SELECT * FROM transactions
        z`
        ORDER BY account_id, currency_original, trade_date, created_at, transaction_id
        r   currency_original
incompleter   z"Negative cash balance for account=z
 currency=z: warnungcashaccountnegative_cash)r   r   )prioritycategoryentity_type	entity_idrule_idmessageevidence)r   executefetchallr    
setdefaultr   rI   r   r   r   itemsr   r   r!   appendr   r   commit)rL   rJ   rK   resultparamswhererowsrB   r   r   keybalancerG   rH   msgs                  r   calculate_cash_balancesrj   A   s    #$$F!#F.E ''<<			 	 	
 	  hjj 	  & &&
*+8$/,,S+j(2S2STT*3//#8+;!%G%1G""+#%--//  W"Q&& Cw7I  C  CU\Ue  C  Cip  jA  C  CC)00555 
&# )%0+*1*:sSZSjOkOkll	 	 	 	  Mr   )
trade_dater   r   amountnoterk   c                  |                                 st          d          t                      }|p	|d d         }t          d|||||          }|                                dk    rt          d          nd }|                     d|||t          |          t          |          |                                |t          |          nd |dnd|t          ||z            nd |t          ||z            nd |dnd	||f           t          | d
d
d|||                                t          |          d|dd	  	        }	| 	                                 |	S )Nz&manual cash correction requires a note
   cashcorrCHFr4   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, notes, created_at
        ) VALUES (?, 'manual_cash_correction', ?, ?, ?, ?, ?, ?, ?, ?, ?, 'manual', 1, ?, ?, ?)
        r   missingrQ   rA   transaction)r   r   rl   Tsystem)sourceactionrX   rY   
new_valuesuser_text_note	confirmed
created_by)
r*   
ValueErrorr
   r	   upperr   r]   r   r   rb   )
rL   r   r   rl   rm   rk   nowtransaction_idfx_rateaudit_ids
             r   apply_manual_cash_correctionr   r   s    ::<< CABBB
))C's3B3xJz:xVUYZZN&nn..%77gclllTGLL	 J
CKKVhnnN^N^#/CLLLT'DDY%,%8C !!!d%,%8C !!!d'DD\		
  ( "''! ",(..:J:JVYZ`VaVabb
 
 
H 	KKMMMOr   )r   )r$   r%   r&   r   r'   r   )r'   r,   )rL   r   rJ   rM   rK   rN   r'   r   )rL   r   r   r   r   r   rl   r   rm   r   rk   rM   r'   r   )
__future__r   dataclassesr   r   decimalr   sqlite3r   jarvis_finance.audit.logr   jarvis_finance.imports.commonr	   r
   jarvis_finance.quality.alertsr   r   r   r+   rI   rj   r   r   r   r   <module>r      s   " " " " " " ( ( ( ( ( ( ( (             7 7 7 7 7 7 < < < < < < < < 6 6 6 6 6 6         D D D D D D D D
       B 37t. . . . . .p "/ / / / / / / /r   