
    ܴ
jI                        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mZ d dlmZmZmZmZmZ d dlmZmZ d dlmZ d dlmZmZmZmZmZ d d	lmZm Z 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dZ+dS )    )annotationsN)confirm_create_budget_account)confirm_create_categoryupdate_category)confirm_transaction_candidatelist_transaction_candidatespreview_transaction_candidate)seed_transaction_candidates_from_csv_text%seed_transaction_candidates_from_rows)get_budget_status_by_categoryget_income_status)confirm_budget_plan_item)convert_unclean_rangeignore_seed_candidatelist_seed_candidatesreopen_seed_candidate seed_budget_candidates_from_rows)confirm_budget_transactionlist_budget_transactionsupdate_budget_transaction)connect_memory)apply_migrationsc                 @    t                      } t          |            | S )N)r   r   )conns    S/home/agent/.hermes/repos/FinanceManager/tests/unit/test_budget_phase14_workview.pydbr      s     DTK    returnNonec                    t                      } t          | dddd          d         }|                     d                                          d         }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    }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }
dd|
iz  }t          t          j	        |                    d x}}t          |           d         }|d         }|s:ddt          j        |          iz  }t          t          j	        |                    d }t          | |d         |dd          }|d         d         }||k    }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }
dd|
iz  }t          t          j	        |                    d x}}d S ) NBudget KontocashCHFnameaccount_typecurrency	entity_id(SELECT COUNT(*) FROM budget_transactionsr   zFDatum;Filiale;Artikel;Umsatz
13.05.2026;M Windisch;Test Einkauf;12.30
zmigros_test.csvsource_file_labelcandidate_count   ==z%(py1)s == %(py4)spy1py4assert %(py6)spy6)z%(py1)s == %(py3)sbefore)r2   py3zassert %(py5)spy5proposed_category_nameassert %(py1)sr2   transaction_candidate_idexpense)
account_idtransaction_typepayloadr=   account)r   r   executefetchoner
   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanation@py_builtinslocals_should_repr_global_namer   r	   )r   r@   r6   csv_textstats@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_format4@py_format6	candidate@py_format2previews                  r   Otest_phase14_transaction_candidate_schema_and_csv_dry_run_no_productive_bookingrW      sm   44D+D>[aot2u2uvv  xC  DG\\DEENNPPQRSFYH5dHXijjjE"#(q(#q((((((((((#q(((((#((((q(((((((((((((((((((((((((((<<BCCLLNNqQ[QU[[[[[[[[[[[QU[[[[[[Q[[[[[[[[[[[U[[[[[[U[[[[[[[[[[[[[[[[[[[[[[[[[[[[+D11!4I-.........................+D)<V2Who  FO  ZP  ZP  Q  QG9l+6+w6666666666+w66666+66666666666w66666w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6r   c                    t                      } t          | dddd          d         }t          | ddd          d         }t          | d	d
ddgd           t	          |           d         }t          | |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         }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 )Nr!   r"   r#   r$   r(   Essenr<   r%   category_typez
13.05.2026zMigros Einkaufz12.30)DatumArtikelUmsatzz
migros.csvr*   r   r;   )r=   category_idr>   status	confirmedr.   r0   r1   r4   r5   r)   r-   zOSELECT COUNT(*) FROM audit_log WHERE entity_type='budget_transaction_candidate')r   r   r   r   r   r   rC   rD   rE   rF   rG   rA   rB   )
r   r@   catrT   resultrM   rN   rO   rP   rQ   s
             r   Gtest_phase14_confirm_transaction_candidate_writes_transaction_and_auditrd   "   s   44D+D>[aot2u2uvv  xC  DG
!$9(U(U
V
VWb
cC)$<Tdpw1x1x0y  NZ  [  [  [  [+D11!4I*4;U1Vgn  @C  Yb  Yc  Yc  d  dF(*{*{**********{*********{***************************<<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<<ijjssuuvwx}|}}x|}}}}}}}}}}}x|}}}}}}x}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}r   c                    t                      } t          | dddd          d         }t          | ddd          d         t          | d	d
d          d         t          | dddddd           t          | dddddd           t	          | |dddddd           t	          | |d
ddddd           t          | d          }t          fd|D                       }t          f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%         }h 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}||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%         }h d)}||v }|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*         }|s:d+d,t          j	        |          iz  }t          t          j        |                    d }d S )-Nr!   r"   r#   r$   r(   Haushaltr<   rZ   Lohnincomez2026-01zHaushalt Planz100.00monthlymanual)
plan_monthr_   r%   monthly_amount_chfcadencesource_typez	Lohn Planz1200.00annual)rk   r_   r%   annual_amount_chfrm   rn   
2026-01-10zHaushalt Istz95.00r=   r>   transaction_datedescriptionamount_originalcurrency_originalr_   zLohn Ist2026)yearc              3  4   K   | ]}|d          k    |V  dS r_   N ).0rexpense_cats     r   	<genexpr>zktest_phase14_budget_status_month_year_forecast_and_traffic_lights_for_expense_and_income.<locals>.<genexpr>8   s2      FFa&6+&E&E1&E&E&E&EFFr   c              3  4   K   | ]}|d          k    |V  dS rz   r{   )r|   r}   
income_cats     r   r   zktest_phase14_budget_status_month_year_forecast_and_traffic_lights_for_expense_and_income.<locals>.<genexpr>9   s2      DDQ}%5%C%C!%C%C%C%CDDr   budget_monthr.   r0   r1   r4   r5   budget_yearr`   >   RotGelbKritisch   Grünin)z%(py1)s in %(py4)s>   r   r   r   
categoriesr:   r2   )r   r   r   r   r   r   nextrC   rD   rE   rF   rG   r   )r   r@   rowsr<   rh   rM   rN   rO   rP   rQ   summaryrU   r~   r   s               @@r   Xtest_phase14_budget_status_month_year_forecast_and_traffic_lights_for_expense_and_incomer   .   sE   44D+D>[aot2u2uvv  xC  DG)$V_0`0`aabmnK(QY/Z/Z[[\ghJT)Kap  IQ  ^g  x@  $A  $A  B  B  BT)J`k  CL  Ya  rz  ${  ${  |  |  |tGQZp|  N\  qx  OT  ep  &q  &q  r  r  rtGQYo{  MW  lt  KP  ak  &l  &l  m  m  m(F;;;DFFFFdFFFFFGDDDDTDDDDDF>".h."h.........."h....."....h...........................=!.Y.!Y..........!Y.....!....Y...........................8D D D DD DDDDDDDDDDD DDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDD.!-X-!X----------!X-----!----X---------------------------- -I- I---------- I----- ----I---------------------------(7777777777777777777777777777777777777777777777777777776222G<                           r   c                 4   t                      } t          | dddd          d         }t          | ddd          d         }t          | d	dd          d         }t          | |dd
ddd|d          d         }t	          | |          }|sd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	        |          dz  }t          t          j        |                    d }t          | ||ddg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	          | |          }| }|sd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	        |          dz  }t          t          j        |                    d x}}d }t	          | ||!          }|s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d#t          j                    v st          j        |          rt          j	        |          nd#t          j	        |          t          j	        |          d$z  }
t          t          j        |
                    d 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}	}	 t          | |d(d)i           t          d*          # t           $ r}g }d+}	t#          |          }|j        } |            }|	|v }|}|s(d,}t#          |          }|j        } |            }||v }|}|s[t          j        d-|fd.|	|f          t          j	        |	          d/t          j                    v st          j        t"                    rt          j	        t"                    nd/d0t          j                    v st          j        |          rt          j	        |          nd0t          j	        |          t          j	        |          t          j	        |          d1z  }d2d3|iz  }|                    |           |st          j        d-|fd4||f          t          j	        |          d/t          j                    v st          j        t"                    rt          j	        t"                    nd/d0t          j                    v st          j        |          rt          j	        |          nd0t          j	        |          t          j	        |          t          j	        |          d5z  }d6d7|iz  }|                    |           t          j        |d'          i z  }d8d9|iz  }t          t          j        |                    d x}x}x}	x}x}x}x}x}x}x}x}}Y d }~d S d }~ww xY w):Nr!   r"   r#   r$   r(   Altr<   rZ   Neurq   z
Merchant Az20.00rr   )r_   zAassert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, category_id=%(py2)s)
}r   r   cat1)py0r2   py2r3   z
Merchant BReviewtest)r_   rt   	tag_nameschange_noter`   updatedr.   r0   r1   r4   r5   zEassert not %(py4)s
{%(py4)s = %(py0)s(%(py1)s, category_id=%(py2)s)
}Merchant)r_   merchantzSassert %(py6)s
{%(py6)s = %(py0)s(%(py1)s, category_id=%(py2)s, merchant=%(py4)s)
}cat2)r   r2   r   r3   r5   zYSELECT COUNT(*) FROM audit_log WHERE entity_type='budget_transaction' AND action='update'r   r-   ru   z99.00z!amount overwrite must be rejected
adjustmentreversalr   )zf%(py3)s in %(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}.lower
}()
}strexc)r7   r8   r5   py8py10py12z%(py14)spy14)zk%(py17)s in %(py26)s
{%(py26)s = %(py24)s
{%(py24)s = %(py22)s
{%(py22)s = %(py19)s(%(py20)s)
}.lower
}()
})py17py19py20py22py24py26z%(py28)spy28zassert %(py31)spy31)r   r   r   r   r   rH   rI   rC   rJ   rE   rF   rG   r   rD   rA   rB   	Exceptionr   lowerappend_format_boolop)r   r@   r   r   txrN   rP   rc   rM   rO   rQ   @py_assert5rS   r   @py_assert1@py_assert7@py_assert9@py_assert11@py_assert4@py_assert16@py_assert21@py_assert23@py_assert25@py_assert18@py_format13@py_format15@py_format27@py_format29@py_format30@py_format32s                                 r   Wtest_phase14_row_click_backing_filters_and_transaction_update_audit_no_amount_overwriter   D   s	   44D+D>[aot2u2uvv  xC  DG"4%))T)TUUVabD"4%))T)TUUVabD	#DV_  vB  S_  t{  RW  hl  +m  +m  
n  
n  oz  
{B#Dd;;;;;;;;;;;;;;;;#;;;;;#;;;;;;;;;;;;;D;;;;;D;;;;;;;;;;;;;d;;;;;d;;;;;;;;;;;;;;;;;;;;;;;;&tRVbrzq{  MS  2T  2T  U  UF((y(y((((((((((y(((((((((y((((((((((((((((((((((((((('$???????????????????'?????'???????????????????????????????$?????$??????????????????????????EOP#DdZ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PDPPPPPDPPPPPPPPPPPPPdPPPPPdPPPPPPZPPPPPPPPPPPPPPPPPPPPPPPP<<stt}}  AB  C  H  GH  H  C  GH  H  H  H  H  H  H  H  H  H  H  C  GH  H  H  H  H  H  C  H  H  H  H  G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!$->,HIII @AAA  R R RQQ|Qs3xxQx~Q~~//Q|//QQQQQ:QSQQAQAQQ:AQ3QQQQQQQQQQQQ|/QQQQQ|QQQQQQQQQQQsQQQQQsQQQQQQQQQQQQQ3QQQQQ3QQQQQQxQQQQ~QQQQ/QQQQQQQQQQQQQQQQQQQQQQQQQQQ:AQQQQQQ:QQQQQQQQQQQQQQQQQQQQQQQQQQQQQSQQQQQSQQQQQQQQQQQQQQAQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRs   T7 7`K
``c            	        t                      } t          | ddd          d         }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|f          	                                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g dg dgi}t          | |d           t          d t          |           D                       }	t          | |	d         dddd          }
t          | |	d         d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}}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}}t          | |	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 S )*NOriginalr<   rZ   r(   	Umbenanntneutral   )r%   r[   
sort_orderr`   r   r.   r0   r1   r4   r5   zESELECT name, category_type FROM budget_categories WHERE category_id=?r   rw   )	KategoriePositionJanJahr) Unklarr   r   zunclean.xlsxr*   c              3  2   K   | ]}|d          dk    |V  dS )candidate_typeunclean_rangeNr{   )r|   cs     r   r   zjtest_phase14_category_update_and_unclean_conversion_to_income_and_transaction_candidate.<locals>.<genexpr>`   s3      ccA>N<OSb<b<b1<b<b<b<bccr   seed_candidate_idrh   zSonstige Einnahmenz10.00)proposed_nameproposed_amount_texttransaction_candidateMigrosz
2026-01-01)rt   amountrs   createdr,   r-   pendingdonezHSELECT COUNT(*) FROM audit_log WHERE entity_type='budget_seed_candidate'   )>=)z%(py1)s >= %(py4)s)r   r   r   rC   rD   rE   rF   rG   rA   rB   r   r   r   r   r   r   )r   rb   rc   rM   rN   rO   rP   rQ   workbookuncleanrh   txcandreopeneds                r   Wtest_phase14_category_update_and_unclean_conversion_to_income_and_transaction_candidater   X   s   44D
!$i(X(X
Y
YZe
fCT3yhi(j(jkkF((y(y((((((((((y(((((((((y(((((((((((((((((((((((((((<<_beaghhqqsstuv  F  {F  Fv  {F  F  F  F  F  F  F  F  F  F  Fv  {F  F  F  F  F  Fv  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  FAAACYCYCYZ[H$T8~VVVVcc2488cccccG"41D)Excw  RY  RZ  RZ  [  [F"41D)EG^px  EL  bn  ao  ao  p  pF((y(y((((((((((y(((((((((y(((((((((((((((((((((((((((#$))$))))))))))$)))))$)))))))))))))))))))))))))))))))$T73F+GHHHH************************************************$(; <fEEE<<bccllnnop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vr   )r   r   ),
__future__r   builtinsrH   _pytest.assertion.rewrite	assertionrewriterC   'jarvis_finance.services.budget_accountsr   )jarvis_finance.services.budget_categoriesr   r   &jarvis_finance.services.budget_importsr   r   r	   r
   r   'jarvis_finance.services.budget_overviewr   r   $jarvis_finance.services.budget_plansr   *jarvis_finance.services.budget_seed_reviewr   r   r   r   r   +jarvis_finance.services.budget_transactionsr   r   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   rW   rd   r   r   r   r{   r   r   <module>r      s   " " " " " "               Q Q Q Q Q Q ^ ^ ^ ^ ^ ^ ^ ^ _  _  _  _  _  _  _  _  _  _  _  _  _  _ d d d d d d d d I I I I I I s  s  s  s  s  s  s  s  s  s  s  s  s  s H  H  H  H  H  H  H  H  H  H : : : : : : > > > > > >  7 7 7 7	~ 	~ 	~ 	~! ! ! !,B B B B(w w w w w wr   