
    ܴ
j!                        d dl mZ d dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZmZ d dlmZmZ d dlmZ d dlmZ d	 Zd
 ZddZddZddZddZddZy)    )annotations)confirm_create_budget_account)confirm_create_categorylist_category_tree_groupedpreview_category_merges)get_budget_status_by_category)confirm_budget_transactionlist_budget_transactions)get_category_analysisget_monthly_comparison)connect_memory)apply_migrationsc                 0    t               } t        |        | S )N)r   r   )conns    tests/unit/test_budget_ux_v2.pydbr      s    DTK    c           	         t        | dddd      d   }t        | dddd	d
d      d   }t        | dddddd      d   }t        | ddddd
d      d   }||||fS )NHaushaltcheckingCHF)nameaccount_typecurrency	entity_idEssen & Haushaltexpense#22c55ebasket
   )r   category_typecoloricon
sort_orderzGesundheit / Medizinz#ef4444heart   Lohn Marcelincomez#38bdf8wallet)r   r   )r   accountfoodhealthsalarys        r   	seed_baser.      s    +D:Waot2uv  xC  DG"42DW`kt  G  WY  *Z  [  \g  hD$T4J]fqz  EL  \^  ,_  `  al  mF$TMT\gp  {C  SU  ,V  W  Xc  dFD&&((r   c                    t               } t        |       \  }}}}| j                  d      }t        | |dddddd|dgd		      d
   }t        | |ddddd|d       t        | |ddddd|d       | j                  d       t	        | ddddd      }|D cg c]  }|d   	 c}|gk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   d   dgk(  sJ |d   d   dk(  sJ y c c}w ) NzINSERT INTO budget_tags(tag_id, name, color, is_active, created_at, updated_at) VALUES ('tag_food', 'Haushalt', '#22c55e', 1, '2026-01-01', '2026-01-01')r   z
2026-05-03zRohbeschreibung 123Migrosz42.00r   r   )	
account_idtransaction_typetransaction_datedescriptionpayeeamount_originalcurrency_originalcategory_id	tag_namesr   r(   z
2026-05-04Lohn100.00r1   r2   r3   r4   r6   r7   r8   z
2025-05-03Alt999.00zEUPDATE budget_transactions SET status='draft' WHERE description='Alt'2026	confirmed)yearr2   statustagmerchantbudget_transaction_idr   merchant_display_namecategory_iconr   category_colorr   r9   transaction_date_group)r   r.   executer	   r
   )	r   r*   r+   r,   r-   rC   r   rowsrs	            r   Vtest_effective_expenses_returns_confirmed_expenses_only_with_display_metadata_and_tagsrM      s   4D4.$
,,  s  tC(g[d  {G  Xm  x@  U\  sx  IM  ]g  \h  0i  j  kv  wGtGQYo{  MS  hp  GL  ]c  &d  etGQZp|  NS  hp  GL  ]c  &d  eLLXY#Dv	Zeku  AI  JD0451A%&5'BBB7*+x7777?#x///7#$	1117;J<///7+,<<< 6s   C,c                    t               } t        |       \  }}}t        | |dddddd       t        | |dddd	d|d       t        | |d
dddd|d       | j                  d       t	        | dd      }|d   dk(  sJ |d   dk(  sJ t        fd|d   D              }|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ d|d   v sJ dt        |      vsJ y )Nr   
2026-01-10r0   z80.00r   r<   z
2026-01-11Apothekez20.00r(   z
2026-01-12r:   z1000.00a&  INSERT INTO budget_transaction_candidates(transaction_candidate_id, source_type, source_file_label, transaction_date, description, amount_original, currency_original, status, created_at, updated_at) VALUES ('cand1','csv','x','2026-01-12','candidate only','999.00','CHF','pending','2026','2026')r?   )rA   tx_type	total_chfr;   modec              3  4   K   | ]  }|d    k(  s|  ywr8   N .0rL   r+   s     r   	<genexpr>zitest_category_analysis_uses_confirmed_transactions_only_and_calculates_share_and_links.<locals>.<genexpr>3   s     P!q7G47OAP   
categories
amount_chfshare_percenttransaction_count   z /planning/budget/expenses/actualtransactions_url999)r   r.   r	   rJ   r   nextstr)r   r*   r,   r-   resultfood_rowr+   s         @r   Vtest_category_analysis_uses_confirmed_transactions_only_and_calculates_share_and_linksrf   *   su   4D4.$tGQZp|  NV  kr  IN  _c  &d  etGQZp|  NX  mt  KP  ag  &h  itGQYo{  MS  hq  HM  ^d  &e  fLL  z  {"4fiHF+(***&>Y&&&Pvl3PPHL!W,,,O$///'(A----:L1MMMMF###r   c                    t               } t        |       \  }}}}t        | |ddddd|d       t        | |ddd	d	d
d|d       t        | |ddddd|d       t        | d      }|d   dk(  sJ t	        |d         dk(  sJ t        d |d   D              }|d   dk(  sJ |d   d
k(  sJ |d   dk(  sJ |d   d   d   dk(  sJ |d   d   d   d	k(  sJ |d   j                  d       sJ y )!Nr(   z
2026-02-25r:   z300.00r   r<   r   z
2026-02-10r0   z120.00)r1   r2   r3   r4   r5   r6   r7   r8   z
2025-02-10r=   r>   r?   rA   rA   months   c              3  2   K   | ]  }|d    dk(  s|  yw)monthz2026-02NrV   )rX   ms     r   rY   zatest_monthly_comparison_returns_2026_income_expense_net_and_drilldown_metadata.<locals>.<genexpr>C   s     FQajI.EqFs   
income_chfexpense_chfnet_cashflow_chfz180.00top_categoriesr   categoryr   top_merchantsrD   r`   zmonth=2026-02)r   r.   r	   r   lenrb   endswith)r   r*   r+   _healthr-   rd   febs          r   Ntest_monthly_comparison_returns_2026_income_expense_net_and_drilldown_metadatarx   ;   s   4D)D//$tGQYo{  MS  hp  GL  ]c  &d  etGQZp|  NV  ai  ~F  ]b  sw  &x  ytGQZp|  NS  hp  GL  ]a  &b  c#Dv6F&>V###vh B&&&
F&*F
FC|(((})))!"h... #J/3EEEE":.(:::!"++O<<<r   c                    t               } t        |       \  }}}| j                  df       t        | |dddddd       | j                  df       t	        fd	t        | d
      D              }|d   dk(  sJ dt        |      vsJ y )Na!  INSERT INTO budget_plan_items(plan_item_id, category_id, name, plan_month, monthly_amount_chf, annual_amount_chf, cadence, is_fixed_cost, source_type, is_active, created_at, updated_at) VALUES ('p_food', ?, 'Food plan', '2026-01', '100.00', NULL, 'monthly', 0, 'manual', 1, '2026', '2026')r   rO   	Confirmedz50.00r   r<   a>  INSERT INTO budget_transaction_candidates(transaction_candidate_id, source_type, source_file_label, transaction_date, description, amount_original, currency_original, proposed_category_id, status, created_at, updated_at) VALUES ('cand1','csv','x','2026-01-12','candidate only','999.00','CHF',?,'pending','2026','2026')c              3  4   K   | ]  }|d    k(  s|  ywrU   rV   rW   s     r   rY   zYtest_budget_vs_actual_still_uses_confirmed_transactions_not_candidates.<locals>.<genexpr>Q   s     gQaP]N^bfNfqgrZ   r?   rh   actual_year_to_datera   )r   r.   rJ   r	   rb   r   rc   )r   r*   rv   _salaryrowr+   s        @r   Ftest_budget_vs_actual_still_uses_confirmed_transactions_not_candidatesr   L   s    4D9T?0$LL  u  x|  w~  tGQZp|  NY  nu  LQ  bf  &g  hLL  R  UY  T[  \
g76Jg
gC$%000C   r   c                    t               } t        |       \  }}}}| j                  d       | j                  d       t        |       }|D cg c]  }|d   	 c}ddgk(  sJ t	        d |d   d   D              sJ t	        d	 |d
   d   D              sJ t        |       }|d   sJ | j                  d      j                         d   dk\  sJ y c c}w )NzINSERT INTO budget_categories(category_id, parent_category_id, name, category_type, color, icon, is_active, sort_order, created_at, updated_at) VALUES ('dup_vers_a', NULL, 'Versicherungen', 'expense', NULL, NULL, 1, 900, '2026', '2026')zINSERT INTO budget_categories(category_id, parent_category_id, name, category_type, color, icon, is_active, sort_order, created_at, updated_at) VALUES ('dup_vers_b', NULL, 'versicherungen', 'expense', NULL, NULL, 1, 901, '2026', '2026')r   	EinnahmenAusgabenc              3  ,   K   | ]  }|d    dk(    yw)r   r'   NrV   rX   cs     r   rY   zftest_category_buckets_and_merge_preview_detect_duplicate_like_names_without_merging.<locals>.<genexpr>\   s     GaqyM)G   r   childrenc              3  ,   K   | ]  }|d    dk(    yw)r   VersicherungenNrV   r   s     r   rY   zftest_category_buckets_and_merge_preview_detect_duplicate_like_names_without_merging.<locals>.<genexpr>]   s     Jqy,,Jr   r_   suggestionszeSELECT COUNT(*) AS c FROM budget_categories WHERE lower(name)=lower('versicherungen') AND is_active=1r      )r   r.   rJ   r   anyr   fetchone)r   _account_foodrv   r}   treebpreviews           r   Stest_category_buckets_and_merge_preview_detect_duplicate_like_names_without_mergingr   V   s   4DYt_25'7LL  @  ALL  @  A%d+D#$!AfI$j(AAAAG47:3FGGGGJd1gj6IJJJJ%d+G=!!!<<  A  J  J  L  MP  Q  UV  V  V  V %s   CN)returnNone)
__future__r   'jarvis_finance.services.budget_accountsr   )jarvis_finance.services.budget_categoriesr   r   r   'jarvis_finance.services.budget_overviewr   +jarvis_finance.services.budget_transactionsr	   r
   (jarvis_finance.services.budget_analyticsr   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r.   rM   rf   rx   r   r   rV   r   r   <module>r      sJ    " Q C  C Q l b : >)= $"="!
Vr   