
    mj0                        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mZ d dlmZ d dlmZmZ d ZddZddZddZddZddZddZddZddZddZddZddZddZdS )    )annotations)
TestClient)get_db)
create_app)confirm_seed_candidateignore_seed_candidatelist_seed_candidatespreview_seed_candidate seed_budget_candidates_from_rows)connect_memory)apply_migrationsget_schema_versionc                 @    t                      } t          |            | S N)r   r   conns    -tests/unit/test_budget_phase12_seed_review.pydbr      s     DTK    returndict[str, list[list[str]]]c                 *    ddggg dg dg dg dgdS )NAltWert	KategoriePositionJanFebJahrTyp)WohnenMiete100.00r$   1200.00	Fixkosten)EssenHaushaltz50.00z60.00z660.00variabel) zUnklar ohne Betragr*   r*   r*   r*   )Archiv2026 r-   r   r   synthetic_workbookr.      sD    6?#BBBKKKIII666	
  r   Nonec                     t                      } t          |           dk    sJ d |                     d          D             }h d                    |          sJ |d                                         dk    sJ d S )N1   c                ,    i | ]}|d          |d         S )nametyper-   ).0rows     r   
<dictcomp>zRtest_phase12_schema_has_requested_budget_seed_candidates_table.<locals>.<dictcomp>'   s"    jjjCKVjjjr   z)PRAGMA table_info(budget_seed_candidates)>   notesstatuscurrency
confidence
created_at
updated_atsource_labelsource_sheetproposed_namecandidate_typerequires_reviewseed_candidate_idsource_file_labelsource_row_or_rangeproposed_amount_textproposed_category_idproposed_period_typeproposed_parent_labelrF   TEXT)r   r   executeissubsetupper)r   colss     r   >test_phase12_schema_has_requested_budget_seed_candidates_tablerO   $   s    44Dd##r))))jj=h0i0ijjjD  & htnn'  ( &'--//6999999r   c                    t                      } |                     d                                          d         }t          | t	                      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 t          |           }d |D             h dk    sJ t          d |D                       sJ t          d |D                       sJ |                     d                                          d         dk    sJ d S )N&SELECT COUNT(*) FROM budget_plan_itemsr   synthetic budget workbookrD   current_budget_sheetr,   category_candidate_count   budget_plan_candidate_countrecurring_candidate_count   unclean_range_countc                    h | ]
}|d          S )rA   r-   r5   cs     r   	<setcomp>z^test_excel_dry_run_persists_seed_candidates_without_productive_budget_plans.<locals>.<setcomp>K   s    444AA444r   >   categorybudget_planunclean_rangerecurring_candidatec              3  *   K   | ]}|d          dv V  dS )r9   >   pendingneeds_reviewNr-   r\   s     r   	<genexpr>z^test_excel_dry_run_persists_seed_candidates_without_productive_budget_plans.<locals>.<genexpr>L   s,      NNaq{99NNNNNNr   c              3  F   K   | ]}|d          dk    o|d         dk    V  dS )rF   r$   rA   r`   Nr-   r\   s     r   rf   z^test_excel_dry_run_persists_seed_candidates_without_productive_budget_plans.<locals>.<genexpr>M   s?      rrbcq'(H4];K9LP]9]rrrrrrr   znSELECT typeof(proposed_amount_text) FROM budget_seed_candidates WHERE proposed_amount_text IS NOT NULL LIMIT 1text)r   rK   fetchoner   r.   r	   allany)r   before_planssummaryafter_plans
candidatess        r   Ktest_excel_dry_run_persists_seed_candidates_without_productive_budget_plansrp   ?   s   44D<< HIIRRTTUVWL.t5G5I5I]xyyyG,,GHHQQSSTUVK,&&&&)*f4444-.!333301Q6666./14444()Q....%d++J444448{8{8{{{{{NN:NNNNNNNNrrgqrrrrrrrr<<  I  J  J  S  S  U  U  VW  X  \b  b  b  b  b  b  br   c                    t                      } t          | t                      d           t          |           }t	          d |D                       }t	          d |D                       }t	          d |D                       }t          | |d         i           }|d         dk    sJ t          | |d         |d	                   }|d
         dk    sJ t          | |d         ddi          }|d         dk    sJ t          | |d         |d	                   }|d
         dk    sJ |                     d|d         f                                          }	t          |	          dk    sJ t          | |d         d          }
|
d
         dk    sJ |                     d                                          d         dk    sJ d S )NrR   rS   c              3  J   K   | ]}|d          dk    |d         dk    |V  dS )rA   r_   r@   r"   Nr-   r\   s     r   rf   zTtest_seed_candidate_category_budget_plan_ignore_confirm_and_audit.<locals>.<genexpr>U   sD      ||Aq9I7Jj7X7X]^_n]os{]{]{a]{]{]{]{||r   c              3  J   K   | ]}|d          dk    |d         dk    |V  dS )rA   r`   r@   r#   Nr-   r\   s     r   rf   zTtest_seed_candidate_category_budget_plan_ignore_confirm_and_audit.<locals>.<genexpr>V   sD      zz15E3F-3W3W\]^m\nry\y\y!\y\y\y\yzzr   c              3  2   K   | ]}|d          dk    |V  dS rA   ra   Nr-   r\   s     r   rf   zTtest_seed_candidate_category_budget_plan_ignore_confirm_and_audit.<locals>.<genexpr>W   s2      ]]1a8H6I_6\6\Q6\6\6\6\]]r   rC   actionaccept_categorypayloadr9   	confirmedrH   monthlyaccept_budget_planzZSELECT source_type, typeof(monthly_amount_chf) FROM budget_plan_items WHERE plan_item_id=?	entity_id)excel_seed_dry_runrh   zsynthetic ignorenoteignoredzrSELECT COUNT(*) FROM audit_log WHERE entity_type IN ('budget_seed_candidate','budget_category','budget_plan_item')r      )r   r   r.   r	   nextr
   r   rK   ri   tupler   )r   ro   category_candidateplan_candidateunclean_candidatecategory_previewcategory_resultplan_previewplan_resultr6   r   s              r   Atest_seed_candidate_category_budget_plan_ignore_confirm_and_auditr   Q   sY   44D$T+=+?+?Snoooo%d++J|||||||zzZzzzzzN]]
]]]]]-d4FGZ4[]_``H%):::::,T3EFY3Z\lmv\wxxO8$3333)$?R0SVlnwUxyyL!%99999(~>Q/RT`ajTkllKx K////
,,s  wB  CN  wO  vQ  R  R  [  [  ]  ]C::77777#D*;<O*PWijjjG8	))))<<  M  N  N  W  W  Y  Y  Z[  \  `a  a  a  a  a  a  ar   c                 0  
 t                      
t                      } 
fd}|| j        t          <   t	          |           }|                    ddt                      d          }|j        dk    sJ |                                d         dk    sJ |	                    d	                                          }t          |          d
k    sJ t          d |D                       }|                    d| dddi          }|j        dk    sJ |                    d| d|                                d                   }|j        dk    sJ t          d |D                       }|                    d| dddi          }	|	j        dk    sJ d S )Nc               3     K    V  d S r   r-   r   s   r   override_dbzTtest_budget_seed_review_api_lists_previews_confirms_and_ignores.<locals>.override_dbn   s      




r   z$/api/budget/seed-candidates/generate	synthetic)rD   workbook_rows)json   rW   rV   z/api/budget/seed-candidatesrY   c              3  >   K   | ]}|d          dk    |d         V  dS )rA   r`   rC   Nr-   r\   s     r   rf   zRtest_budget_seed_review_api_lists_previews_confirms_and_ignores.<locals>.<genexpr>x   s9      bbaQ?O=PTa=a=a1()=a=a=a=abbr   z/api/budget/seed-candidates/z/previewrH   rz   z/confirmrx   c              3  >   K   | ]}|d          dk    |d         V  dS )rA   ra   rC   Nr-   r\   s     r   rf   zRtest_budget_seed_review_api_lists_previews_confirms_and_ignores.<locals>.<genexpr>}   s9      ggBR@SWf@f@fa+,@f@f@f@fggr   z/ignorer   znot suitable)r   r   dependency_overridesr   r   postr.   status_coder   getlenr   )appr   clientgeneratelistedplan_idpreviewconfirm
unclean_idr   r   s             @r   ?test_budget_seed_review_api_lists_previews_confirms_and_ignoresr   j   s   44D
,,C     (3CV$__F{{A^i  }O  }Q  }Q  IR  IR{  S  SH3&&&&==??89Q>>>>ZZ566;;==Fv;;!bb6bbbbbGkkJJJJRhjsQtkuuG#%%%%kkJJJJQXQ]Q]Q_Q_`iQjkkkG#%%%%ggfgggggJkkLLLLTZ\jSkkllG#%%%%%%r   c                 n    g dg} | d t          d          D             z  } | g dg dg dg dgz  } d| iS )	Nr   c                    g | ]}g d S ))r*   r*   r*   r*   r*   r*   r-   )r5   _s     r   
<listcomp>z#income_workbook.<locals>.<listcomp>   s    999!%%%999r   #   )r*   Lohn Marcelr$   r*   r*   r*   )r*   Lohn Melaniez110.00r*   r*   r*   )r*   Gratifikationr*   r*   r%   r*   )r*   Sonstige Einnahmenz25.00r*   r*   r*   r,   )range)rowss    r   income_workbookr      sn    BBBCD99uRyy9999D111222444777	 D D>r   c                    ddl m}  t                      }t          |t	                      d           t          d t          |          D                       }t          ||d         d            | ||d                   }|d	         d
k    sJ |                    d|d         f          	                                d         d
k    sJ |                    d|d         f          	                                d         dk    sJ d S )Nr   )reopen_seed_candidaterR   rS   c              3  2   K   | ]}|d          dk    |V  dS ru   r-   r\   s     r   rf   zEtest_ignored_candidate_can_be_reopened_and_audited.<locals>.<genexpr>   s3      ee1a@P>QUd>d>dQ>d>d>d>deer   rC   mistaker~   r9   rd   zCSELECT status FROM budget_seed_candidates WHERE seed_candidate_id=?zKSELECT COUNT(*) FROM audit_log WHERE action='status_change' AND entity_id=?rY   )
*jarvis_finance.services.budget_seed_reviewr   r   r   r.   r   r	   r   rK   ri   )r   r   	candidateresults       r   2test_ignored_candidate_can_be_reopened_and_auditedr      s   PPPPPP44D$T+=+?+?Snooooee 4T : :eeeeeI$	*= >YOOOO""43F)GHHF(y((((<<]`ij}`~  `A  B  B  K  K  M  M  NO  P  T]  ]  ]  ]  ]<<ehq  sF  iG  hI  J  J  S  S  U  U  VW  X  \]  ]  ]  ]  ]  ]  ]r   c                    ddl m}  t                      }t          |t	                      d           t          d t          |          D                       } | ||d         ddd	i           | ||d         d
ddd          d         dk    sJ d         dk    sJ t          |          }t          fd|D                       sJ t          fd|D                       sJ d S )Nr   )convert_unclean_rangerR   rS   c              3  2   K   | ]}|d          dk    |V  dS ru   r-   r\   s     r   rf   z]test_unclean_range_can_be_converted_to_category_and_budget_plan_candidates.<locals>.<genexpr>   s3      ccA>N<OSb<b<b1<b<b<b<bccr   rC   r_   r@   
Sonderfallr`   Sonderbudgetz42.00)r@   rF   r9   createdc              3  T   K   | ]"}|d          d         k    o|d         dk    V  #dS )rC   r|   rA   r_   Nr-   )r5   r]   cats     r   rf   z]test_unclean_range_can_be_converted_to_category_and_budget_plan_candidates.<locals>.<genexpr>   sE      qqdeq$%[)99_a@P>QU_>_qqqqqqr   c              3  T   K   | ]"}|d          d         k    o|d         dk    V  #dS )rC   r|   rA   r`   Nr-   )r5   r]   plans     r   rf   z]test_unclean_range_can_be_converted_to_category_and_budget_plan_candidates.<locals>.<genexpr>   sE      uuhiq$%k)::cqAQ?RVc?cuuuuuur   )r   r   r   r   r.   r   r	   rk   )r   r   uncleanr   r   r   s       @@r   Jtest_unclean_range_can_be_converted_to_category_and_budget_plan_candidatesr      sM   PPPPPP44D$T+=+?+?Snoooocc2488cccccG

g.A&BJQ`bnPo
p
pC  w/B'C]ft  OV  UW  UW  X  XDx=I%%%%>Y&&&&"4((Gqqqqipqqqqqqqquuuumtuuuuuuuuuur   c                 8   t                      } t          | t                      d          }t          |           }d |D             }|d         dk    sJ t	          |          dk    sJ d |D             h dk    sJ t          d |D                       sJ d S )	Nzincome synthetic workbookrS   c                \    g | ])}|d          dk    d|                     d          pdv '|*S )rA   r`   ztype:incomer8   r*   )r   r\   s     r   r   zGtest_income_candidates_from_2026_sheet_are_detected.<locals>.<listcomp>   sI    xxxAq)9':m'K'KP]bcbgbghobpbpbvtvPwPwaPwPwPwr   income_candidate_count   c                    h | ]
}|d          S )r@   r-   r\   s     r   r^   zFtest_income_candidates_from_2026_sheet_are_detected.<locals>.<setcomp>   s    ///1Ao///r   >   r   r   r   r   c              3  >   K   | ]}|d          dk    |d         V  dS )r@   r   rB   Nr-   r\   s     r   rf   zFtest_income_candidates_from_2026_sheet_are_detected.<locals>.<genexpr>   s8      bbq7IMa7a7aq"#7a7a7a7abbr   )r   r   r   r	   r   rk   )r   rm   ro   incomes       r   3test_income_candidates_from_2026_sheet_are_detectedr      s    44D.t_5F5FZuvvvG%d++JxxxxxF+,1111v;;!/////3y3y3yyyyybbVbbbbbbbbbbr   c                 4   ddl m} m}m}m} t                      }t          |t                      d            ||          }|d         dk    sJ  ||          }|d         dk    sJ  ||          }|d         dk    sJ  | |          }|                    d          	                                d         }	 | |          }
|                    d          	                                d         }|d         dk    sJ |
d	         dk    sJ ||	k    sJ d S )
Nr   )confirm_budget_plan_takeoverconfirm_clear_category_takeoverpreview_budget_plan_takeoverpreview_clear_category_takeoverrR   rS   countrV   confirmed_countrQ   skipped_count)
r   r   r   r   r   r   r   r.   rK   ri   )r   r   r   r   r   cat_preview
cat_resultr   result1beforeresult2afters               r   Etest_clear_categories_and_budget_plans_can_be_taken_over_idempotentlyr      s    x  x  x  x  x  x  x  x  x  x  x  x44D$T+=+?+?Snoooo11$77Kw1$$$$0066J'(A----//55L A%%%%**400G\\BCCLLNNqQF**400GLLABBKKMMaPE$%****?#q((((F??????r   c                    ddl m}  ddlm} t	                      }t          |t                      d            ||            | |d          }|d         dk    sJ |d	         d
k    sJ |d         dk    sJ |d         dk    sJ d S )Nr   get_budget_overview)r   rR   rS   2026-01planned_budget_chf0actual_expense_chfz0.00actuals_labelznoch keine Buchungenbudget_status
no_actuals)'jarvis_finance.services.budget_overviewr   r   r   r   r   r.   )r   r   r   overviews       r   Btest_budget_overview_shows_plan_values_without_actual_transactionsr      s    KKKKKKWWWWWW44D$T+=+?+?Snoooo  &&&""433H()S0000()V3333O$(>>>>>O$444444r   c                 ,   ddl m}  ddlm} ddlm} t                      } | |dddd          d	         }|                    d
                                          d         }|                    d                                          d         } |||ddddd|d            |||ddddd|d            ||d          }|d         dk    sJ |d         dk    sJ |                    d                                          d         dk    sJ d S )Nr   )confirm_create_budget_accountr   )confirm_budget_transactionz	UAT KontocashCHF)r3   account_typer:   r|   z@SELECT category_id FROM budget_categories WHERE name='Einnahmen'z=SELECT category_id FROM budget_categories WHERE name='Wohnen'r   z
2026-01-10z
UAT incomer$   )
account_idtransaction_typetransaction_datedescriptionamount_originalcurrency_originalcategory_idexpensez
2026-01-11zUAT expensez20.00r   actual_income_chfr   zESELECT COUNT(*) FROM audit_log WHERE entity_type='budget_transaction'rV   )	'jarvis_finance.services.budget_accountsr   r   r   +jarvis_finance.services.budget_transactionsr   r   rK   ri   )r   r   r   r   account
income_catexpense_catr   s           r   =test_manual_income_and_expense_update_actual_values_and_auditr      s   UUUUUUKKKKKKVVVVVV44D++D;X^lq2r2rsst  AG`aajjllmnoJ,,^__hhjjklmKtGQYo{  MY  nv  MR  cm  &n  &n  o  o  otGQZp|  N[  pw  NS  do  &p  &p  q  q  q""433H'(H4444()W4444<<_``iikklmnrsssssssr   N)r   r   )r   r/   ) 
__future__r   fastapi.testclientr   jarvis_finance.api.dependenciesr   jarvis_finance.api.mainr   r   r   r   r	   r
   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r   r.   rO   rp   r   r   r   r   r   r   r   r   r   r-   r   r   <module>r     s   " " " " " " ) ) ) ) ) ) 2 2 2 2 2 2 . . . . . .              ; : : : : : R R R R R R R R  	 	 	 	: : : :6b b b b$a a a a2& & & &0	 	 	 	
] 
] 
] 
]v v v vc c c c   (5 5 5 5t t t t t tr   