
    pj                        d dl mZ d dlZd dlmc mZ d dl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mZmZ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 Z!d Z"d Z#ddZ$ddZ%ddZ&dS )    )annotationsN)HTTPException)confirm_create_budget_account)confirm_create_categoryimport_budget_csv_text)$classify_swisslos_internal_transfersconfirm_transaction_candidatelist_transaction_candidates preview_batch_confirm_candidates)get_budget_status_by_category)list_budget_transactionslist_budget_transfers)list_transfer_pairs)connect_memory)apply_migrationsc                 @    t                      } t          |            | S )N)r   r   conns    i/home/agent/.hermes/worktrees/FinanceManager-sprint20d/tests/unit/test_budget_internal_transfer_hotfix.pydbr      s     DTK    c                    t          | dddd          d         }t          | dddd          d         }t          | ddd	          d         }|||fS )
N
RaiffeisencashCHF)nameaccount_typecurrency	entity_idAKB HaushaltskontozEssen & Haushaltexpense)r   category_type)r   r   )r   raifakbfoods       r   
setup_baser'      s    (v5II  D (%v5QQ  C ##i@@  D d?r   c                V    t          | dddd           t          | dddd           d S )	Nraiffeisen_bankzAccount;Booked At;Text;Credit/Debit Amount;Balance;Valuta Date
OWN-RAIFFEISEN;2026-01-26;Einkauf TWINT SWISSLOS E-COMMERCE;-100.00;0;2026-01-26
zsynthetic-raiffeisen-runFsource_file_labeldry_runakb_banku   Buchung;Valuta;Buchungstext;Belastung;Gutschrift;Saldo CHF;Konto
26.01.2026;26.01.2026;Eigener Kontoübertrag;;100.00;0;OWN-AKB
zsynthetic-akb-runr   r   s    r   seed_swisslosr.   /   s`    	]4    	K-     r   returnNonec                 	   t                      } t          |            t          |            t          |           }t	          d t          |           D                       }t          | 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}||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             }	t          |	          }|sddt          j                    v st          j        t                    rt          j	        t                    ndt          j	        |	          t          j	        |          dz  }t          t          j        |                    d x}	}|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}||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}||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         }||v }|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 )Nc              3  2   K   | ]}|d          dk    |V  dS )statusproposedN .0items     r   	<genexpr>zJtest_legacy_reclassify_entry_point_uses_generic_pairing.<locals>.<genexpr>H   s1      [[d8nPZ>Z>Z>Z>Z>Z>Z[[r   2026)budget_yearmatcher_versiontransfer_pairing_v2==z%(py1)s == %(py4)spy1py4assert %(py6)spy6matched_count   c              3  *   K   | ]}d |d         vV  dS )SWISSLOSdescriptionNr5   r7   rows     r   r9   zJtest_legacy_reclassify_entry_point_uses_generic_pairing.<locals>.<genexpr>M   s,      FFz]!33FFFFFFr   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}all)py0py2rC   source_account_namer   target_account_namer!   budget_effect_chf0merchant_text_not_decisivereason_codes)in)z%(py1)s in %(py4)sz^SELECT COUNT(*) FROM budget_import_rules WHERE rule_id='rule_raiffeisen_swisslos_akb_transfer'r   )r   r'   r.   r	   nextr   r   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationrM   @py_builtinslocals_should_repr_global_nameexecutefetchone)
r   resultpairnormal@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert1s
             r   7test_legacy_reclassify_entry_point_uses_generic_pairingrk   B   sV   44Dt$1$77F[[!4T!:!:[[[[[D(6BBBF#$=(==$(===========$(======$====(============================/"'a'"a''''''''''"a'''''"''''a'''''''''''''''''''''''''''FFvFFFF3FFFFFFFFFFFFFFFF3FFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF%&6,6&,6666666666&,66666&6666,666666666666666666666666666%&>*>>&*>>>>>>>>>>>&*>>>>>>&>>>>*>>>>>>>>>>>>>>>>>>>>>>>>>>>>#$++$++++++++++$+++++$+++++++++++++++++++++++++++++++'?4+??'+???????????'+??????'????+????????????????????????????<<h hjj                q                          r   c                    t                      } t          |           \  }}}t          |            t          d t	          | ddd          D                       }t          j        t                    5 }t          | |d         g|d           d d d            n# 1 swxY w Y   |j	        j
        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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}||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#          | |          }t%          |          }d}||k    }|s`t          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        t"                    rt          j        t"                    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 }t-          | ||!          }g }||k    }|st          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t          j        |          t          j        |          t          j        |          t          j        |          d$z  }d%d&|iz  }t          t          j        |                    d x}x}x}x}}d}d'}t-          | ||!          }g }||k    }|st          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t          j        |          t          j        |          t          j        |          t          j        |          d$z  }d%d&|iz  }t          t          j        |                    d x}x}x}x}}d}d}t-          | ||!          }t%          |          }d(}||k    }|sst          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        t,                    rt          j        t,                    nd#dt'          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          t          j        |          t          j        |          d*z  }d+d,|iz  }t          t          j        |                    d x}x}x}x}x}}d}t/          | |          }g }||k    }|st          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t          j        |          t          j        |          t          j        |          d/z  }d0d1|iz  }t          t          j        |                    d x}x}x}}|                     d2                                          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 )3Nc              3  2   K   | ]}|d          dk    |V  dS )source_typer)   Nr5   rK   s     r   r9   zWtest_candidate_confirm_uses_pair_and_never_creates_income_or_expense.<locals>.<genexpr>[   sC       	 	 }!222 	 3222	 	r   r:   	transfersT)r;   tabinclude_referencetransaction_candidate_id)candidate_ids
account_idr;   	conflictsr   reasontransfer_candidate_blockedr>   r@   rA   rD   rE   transferfrom_account_idto_account_idtransaction_typer;   r3   	confirmedrR   rS   )yearrG   )z]%(py8)s
{%(py8)s = %(py0)s(%(py6)s
{%(py6)s = %(py1)s(%(py2)s, year=%(py4)s)
})
} == %(py11)slenr   r   )rN   rB   rO   rC   rE   py8py11zassert %(py13)spy13r"   )r~   r|   )zY%(py7)s
{%(py7)s = %(py0)s(%(py1)s, year=%(py3)s, transaction_type=%(py5)s)
} == %(py10)sr   )rN   rB   py3py5py7py10zassert %(py12)spy12income   )zy%(py10)s
{%(py10)s = %(py0)s(%(py8)s
{%(py8)s = %(py1)s(%(py2)s, year=%(py4)s, transaction_type=%(py6)s)
})
} == %(py13)s)rN   rB   rO   rC   rE   r   r   r   zassert %(py15)spy15)z>%(py5)s
{%(py5)s = %(py0)s(%(py1)s, year=%(py3)s)
} == %(py8)sr   )rN   rB   r   r   r   zassert %(py10)sr   zESELECT COUNT(*) FROM audit_log WHERE action='transfer_pair_confirmed')r   r'   r.   rW   r   pytestraisesr   r   valuedetailrX   rY   rZ   r[   r\   r
   r   r   r]   r^   r_   r   r   r`   ra   )r   r$   r%   _food	candidateblockedre   rf   rg   rh   ri   rb   @py_assert5@py_assert7@py_assert10@py_assert9@py_format12@py_format14@py_assert4@py_assert6@py_assert8@py_format11@py_format13@py_assert12@py_assert11@py_format16@py_format9s                              r   Dtest_candidate_confirm_uses_pair_and_never_creates_income_or_expenser   W   s   44D!$''D#u$ 	 	."	
 
 
	 	 	 	 	I 
}	%	% 
($%?@A		
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 =,Q/9Y=YY9=YYYYYYYYYYY9=YYYYYY9YYYY=YYYYYYYYYYYYYYYYYYYYYYYYYYYY*,-#  *!		
 	
	 	F (*{*{**********{*********{***************************%&-#-&#----------&#-----&----#---------------------------06=$T777=3788=A=8A==========8A============3=====3=============$=====$=============T=====T==========7====8====A===============================/5X	X#Dv	RRRXVXXRVXXXXXXXXXXXRVXXXXXXXXXXXXX#XXXXX#XXXXXXXXXXXXXDXXXXXDXXXXXXvXXXX	XXXXRXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/5WW#DvQQQWUWWQUWWWWWWWWWWWQUWWWWWWWWWWWWW#WWWWW#WWWWWWWWWWWWWDWWWWWDWWWWWWvWWWWWWWWQWWWWUWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW39]J]'6JWWW]3WXX]\]]X\]]]]]]]]]]]X\]]]]]]]]]]]]]3]]]]]3]]]]]]]]]]]]]']]]]]']]]]]]]]]]]]]]]]]]]]]]]]6]]]]J]]]]W]]]]X]]]]\]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]4:A(F;;;ArA;rAAAAAAAAAA;r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AFAAAA;AAAAr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<<O hjj                q                          s   4BB"Bc            
     n   t                      } t          |           \  }}}t          | dddd           t          d t	          |           D                       }|d         }d }||u }|slt          j        d|fd	||f          t          j        |          t          j        |          d
z  }dd|iz  }	t          t          j	        |	                    d x}x}}|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          j        t                    5 }
t          | |d         ||ddd           d d d            n# 1 swxY w Y   |
j        }|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        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d 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 S )Nr)   zAccount;Booked At;Text;Credit/Debit Amount;Balance;Valuta Date
OWN-RAIFFEISEN;2026-05-13;Einkauf TWINT SWISSLOS E-COMMERCE;-100.00;0;2026-05-13
zsynthetic-raiffeisen-onlyFr*   c              3  2   K   | ]}|d          dk    |V  dS )r3   	unmatchedNr5   r6   s     r   r9   zUtest_unmatched_swisslos_candidate_cannot_be_productively_confirmed.<locals>.<genexpr>   s1      \\d8nP[>[>[>[>[>[>[\\r   target_candidate_id)is)z%(py1)s is %(py4)srA   rD   rE   quality_statusr   r>   r@   source_candidate_idrx   r:   ry   i  )zN%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.value
}.status_code
} == %(py7)sr   )rN   rO   rC   r   zassert %(py9)spy9z(SELECT COUNT(*) FROM budget_transactionsr   )r   r'   r   rW   r   rX   rY   rZ   r[   r\   r   r   r   r
   r   status_coder]   r^   r_   r`   ra   )r   r$   r%   r   rc   re   rf   rg   rh   ri   r   rj   r   r   @py_format8@py_format10s                   r   Btest_unmatched_swisslos_candidate_cannot_be_productively_confirmedr      s#   44D!$''D#u	]5    \\!4T!:!:\\\\\D%&.$.&$..........&$.....&....$........................... !0[0![0000000000![00000!0000[000000000000000000000000000	}	%	% 

%&'#'!$$.%	 		
 		
 		


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 =+=$++$++++++++++$++++++++++++7+++++7++++++=++++$+++++++++++++++++++++++++++++++++<<BCCLLNNqQVUVVQUVVVVVVVVVVVQUVVVVVVQVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVs   ;F$$F(+F()r/   r0   )'
__future__r   builtinsr]   _pytest.assertion.rewrite	assertionrewriterX   r   fastapir   'jarvis_finance.services.budget_accountsr   )jarvis_finance.services.budget_categoriesr   *jarvis_finance.services.budget_csv_importsr   &jarvis_finance.services.budget_importsr	   r
   r   r   'jarvis_finance.services.budget_overviewr   +jarvis_finance.services.budget_transactionsr   r   (jarvis_finance.services.transfer_pairingr   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r'   r.   rk   r   r   r5   r   r   <module>r      s   " " " " " "               ! ! ! ! ! ! Q Q Q Q Q Q M M M M M M M M M M M M            R Q Q Q Q Q        I H H H H H : : : : : : > > > > > >       &   *+ + + +\W W W W W Wr   