
    |j%                        d dl mZ d dl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 d d	lmZ d d
lmZ d dlmZ d Zd ZdddZddZddZddZddZddZy)    )annotations)DecimalN)HTTPException)confirm_create_budget_account)confirm_create_category)%seed_credit_card_candidates_from_rows)confirm_category_budget_valuesget_budget_planning_matrixpreview_category_budget_valuesconfirm_budget_transaction)connect_memory)apply_migrationsc                 0    t               } t        |        | S )N)r   r   )conns    .tests/unit/test_budget_planning_forecast_v1.pydbr      s    DTK    c                T    t        | dddd      d   }t        | ddd      d   }||fS )	NHaushaltcheckingCHF)nameaccount_typecurrency	entity_idzElektronische Medienexpenser   category_type)r   r   )r   
account_idcategory_ids      r   setup_categoryr"      sH    .tjZdrw5xy  {F  GJ)$9Obk0lmnyzK{""r   c                .    t        | |||dd|d|dd	      S )Nzconfirmed bookingProviderr   manual)	r    transaction_typetransaction_datedescriptionpayeeamount_originalcurrency_originalr!   source_typer   )r   r    r!   dateamounttx_types         r   book_expenser0   !   s1    %d # *!""
- 
 
r   c                    t               } t        |       \  }}t        | |ddddddd      }|d   d	   dk(  sJ |d   d
   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   g k(  sJ t        | ||d         }|d   dk(  sJ | j	                  d|f      j                         }|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ | j	                  d|f      j                         }t        |      dk(  sJ |D ch c]  }|d   	 c}dhk(  sJ |D ch c]  }|d   	 c}dhk(  sJ | j	                  d      j                         d   dk\  sJ y c c}w c c}w )N2026120.00monthlyz600.00Tzplanning v1)yearmonthly_budget_chfbudget_cadenceprevious_year_total_chfdistribute_previous_year_totalnotesreviewbudget_month_chfbudget_year_chfz1440.00r8   !previous_year_monthly_average_chf50.00warningspayloadstatus	confirmedz`SELECT monthly_amount_chf, annual_amount_chf, cadence FROM budget_plan_items WHERE category_id=?monthly_amount_chfannual_amount_chfcadencezsSELECT amount_text, baseline_type FROM budget_category_baselines WHERE category_id=? AND year='2025' ORDER BY month   amount_textbaseline_typeactual_previous_yearzfSELECT COUNT(*) FROM audit_log WHERE action IN ('budget_planning_preview','budget_planning_confirmed')r      )r   r"   r   r	   executefetchonefetchalllen)r   _account_idr!   previewresultplan	baselinesrows           r   Mtest_preview_and_confirm_budget_values_store_decimal_text_baselines_and_auditrV   /   s%   4D-d3K,T;&##+*.A G 8/0H<<<8./9<<<8678CCC8@AWLLL:"$$$+D+wy?QRF({***<<z  ~I  }K  L  U  U  WD$%111#$	111	?i'''  S  Va  Uc  d  m  m  oIy>R*343C4	AAA,56SC 6;Q:RRRR<<  A  B  K  K  M  NO  P  TU  U  U  U 56s   9EEc            	        t               } t        |       \  }}t        dd      D ci c]  }|dt        |       }}t	        | |ddd|d      }|d   d	   d
k(  sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ y c c}w )N      02dr2   1200.00annual)r5   annual_budget_chfr7   previous_year_monthsr;   r<   100.00r=   r8   z78.00r>   z6.50)r   r"   rangestrr   )r   rP   r!   idxmonthly_2025rQ   s         r   Itest_yearly_budget_derives_monthly_and_monthly_previous_year_sums_to_yearrd   O   s    4D-d3K6;ArlCss3i#c(*CLC,T;&" ,	A G 8/0H<<<8./9<<<8677BBB8@AVKKK Ds   Bc                 P   t               } t        | ddd      d   }t        j                  t              5  t        | |ddd       d d d        t        |       \  }}t        j                  t              5  t        | |ddd       d d d        y # 1 sw Y   JxY w# 1 sw Y   y xY w)	NLohnincomer   r   r2   r_   )r5   r6   z-1.00)r   r   pytestraisesr   r   r"   )r   income_categoryrP   expense_categorys       r   Btest_negative_budget_values_and_non_expense_categories_are_blockedrl   a   s    4D-dVV^4_`almO	}	% p&t_vem>nop$24$8!K!	}	% p&t-=fm?nop pp pp ps   B6BBB%c                    t               } t        |       \  }t        | t        | dddddd      d          t	        | |dd	       t	        | |d
d       t	        | |ddd       t        | ddddgdd       t        | dd      }t        fd|d   D              }|d   dk(  sJ |d   d   d	k(  sJ |d   d   dk(  sJ |d   dk(  sJ |d    d!k(  sJ |d"   d#k(  sJ |d$   d#k(  sJ |d%   d&k(  sJ |d'   d(k(  sJ |d)   d*k(  sJ |d+   j                  d,       sJ |d-   j                  d,       sJ y ).Nr2   r_   z80.00r3   )0102)r5   r6   r^   rA   z
2026-01-10r?   z
2026-02-10z150.00z
2026-02-11z999.00transfer)r/   z
2026-02-12zcandidate only)DatumBeschreibungBetragzvisa.csvF)source_file_labelmigros_coveredz2026-02r5   current_monthc              3  4   K   | ]  }|d    k(  s|  ywr!   N .0itemr!   s     r   	<genexpr>zjtest_forecast_matrix_uses_confirmed_expenses_only_and_excludes_candidates_and_transfers.<locals>.<genexpr>y        U$}2E2TtU   rowsactual_year_to_date_chfz200.00actual_months_2026rn   ro   r8   r>   z16.67linear_forecast_chfr[   budget_adjusted_forecast_chfforecast_vs_budget_chfz0.00forecast_vs_previous_year_chfz1000.00rB   Gelbdata_explorer_urlzcategory_id=effective_expenses_url)	r   r"   r	   r   r0   r   r
   nextendswithr   r    matrixrU   r!   s       @r   Wtest_forecast_matrix_uses_confirmed_expenses_only_and_excludes_candidates_and_transfersr   k   s   4D,T2J"46TUY[f&'.h ?i 7 	7 
 z;gFz;hGz;hPZ[)$<Yiu}1~0  T^  ot  u'6SF
UvU
UC()X555#$T*g555#$T*h666()X55523w>>>$%222-.);;;'(F222./9<<<x=F""""#,,|K=-IJJJ'(11L2NOOOr   c                     t               } t        |       \  }t        | |dd       t        | dd      }t	        fd|d   D              }|d   d	u sJ |d
   d	u sJ |d   dk(  sJ |d   v sJ |d   v sJ y )Nz
2026-03-01z42.00r2   z2026-03rv   c              3  4   K   | ]  }|d    k(  s|  ywry   rz   r{   s     r   r~   zYtest_categories_without_budget_or_previous_year_are_explicitly_visible.<locals>.<genexpr>   r   r   r   
has_budgetFhas_previous_yearrB   zBudget fehltcategories_without_budget categories_without_previous_year)r   r"   r0   r
   r   r   s       @r   Ftest_categories_without_budget_or_previous_year_are_explicitly_visibler      s    4D,T2Jz;gF'6SF
UvU
UC|%%%"#u,,,x=N***&!<====&!CDDDDr   )r   )
r    ra   r!   ra   r-   ra   r.   ra   r/   ra   )returnNone)
__future__r   decimalr   rh   fastapir   'jarvis_finance.services.budget_accountsr   )jarvis_finance.services.budget_categoriesr   &jarvis_finance.services.budget_importsr   'jarvis_finance.services.budget_planningr	   r
   r   +jarvis_finance.services.budget_transactionsr   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r"   r0   rV   rd   rl   r   r   rz   r   r   <module>r      s^    "   ! Q M X 
 S : >#U@L$pP<Er   