
    mj0                        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 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 )    )annotationsN)
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    V/home/agent/.hermes/repos/FinanceManager/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                 x   t                      } t          |           }d}||k    }|st          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        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}d	 | 
                    d
          D             }h d}|j        } ||          }|sdt          j        |          t          j        |          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }t          t          j	        |                    d x}x}}|d         }|j        } |            }d}||k    }	|	st          j        d|	fd||f          t          j        |          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }
t          t          j	        |
                    d x}x}x}x}	}d S )N1   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   r   py0py1py3py6assert %(py8)spy8c                ,    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_labelzJassert %(py6)s
{%(py6)s = %(py3)s
{%(py3)s = %(py1)s.issubset
}(%(py4)s)
}cols)r7   r8   py4r9   rP   TEXT)zD%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.upper
}()
} == %(py8)s)r7   r8   py5r;   zassert %(py10)spy10)r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationexecuteissubsetupper)r   @py_assert2@py_assert5@py_assert4@py_format7@py_format9rT   @py_assert0@py_assert7@py_assert6@py_format11s              r   >test_phase12_schema_has_requested_budget_seed_candidates_tablerm   $   s   44Dd##)r)#r))))))))))#r))))))))))))))))))))))))))))))d)))))d))))))#))))r)))))))))))))))))))))))))))jj=h0i0ijjjD    & '  & '      & '   & '    & '    &t'   & t'    & '        & '           ( &'9'-9--//969/69999999999/699999'9999-9999/99996999999999999999999999999999999999r   c                 .   t                      } |                     d                                          d         }t          | t	                      d          }|                     d                                          d         }||k    }|st          j        d|fd||f          dt          j                    v st          j	        |          rt          j
        |          nddt          j                    v st          j	        |          rt          j
        |          ndd	z  }d
d|iz  }t          t          j        |                    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}||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}	}t          |           }d |D             }h 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             }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         }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&SELECT COUNT(*) FROM budget_plan_itemsr   synthetic budget workbookrN   r2   z%(py0)s == %(py2)safter_plansbefore_plansr6   py2assert %(py4)srU   current_budget_sheetr,   z%(py1)s == %(py4)sr7   rU   assert %(py6)sr9   category_candidate_count   budget_plan_candidate_countrecurring_candidate_count   unclean_range_countc                    h | ]
}|d          S )rK   r-   r?   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_candidate>=z%(py1)s >= %(py4)sc              3  *   K   | ]}|d          dv V  dS )rC   >   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   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}allr6   rv   rU   c              3  F   K   | ]}|d          dk    o|d         dk    V  dS )rP   r$   rK   r   Nr-   r   s     r   r   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   anyznSELECT typeof(proposed_amount_text) FROM budget_seed_candidates WHERE proposed_amount_text IS NOT NULL LIMIT 1text)r   ra   fetchoner   r.   rY   rZ   r[   r\   r]   r^   r_   r`   r	   r   r   )r   rt   summaryrs   @py_assert1@py_format3@py_format5ri   @py_assert3rd   rg   
candidatess               r   Ktest_excel_dry_run_persists_seed_candidates_without_productive_budget_plansr   ?   sr   44D<< HIIRRTTUVWL.t5G5I5I]xyyyG,,GHHQQSSTUVK,&&&&&&&&&&;,&&&&&&&&&&&&;&&&&&;&&&&&&&&&&&&&,&&&&&,&&&&&&&&&&&&&&&&&&&&&&&&&)*4f4*f4444444444*f44444*4444f444444444444444444444444444-.3!3.!3333333333.!33333.3333!333333333333333333333333333016Q61Q66666666661Q6666616666Q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./414/14444444444/144444/44441444444444444444444444444444().Q.)Q..........)Q.....)....Q...........................%d++J44444{8{8{8{{48{{{{{{{{{{{48{{{{{{4{{{{8{{{{{{{{{{{{{{{{{{{{{{{{{{{{NN:NNNN3NNNNNNNNNNNNNNNN3NNNNN3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNrrgqrrrr3rrrrrrrrrrrrrrrr3rrrrr3rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr<<  I  J  J  S  S  U  U  VW  X  b  \b  b  X  \b  b  b  b  b  b  b  b  b  b  b  X  \b  b  b  b  b  b  X  b  b  b  b  \b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  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    }|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}||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i          }|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}||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         f                                          }t          |          }d}||k    }|st          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        |          dz  }
dd|
iz  }t          t          j
        |                    d x}x}}t%          | |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 S )%Nrp   rq   c              3  J   K   | ]}|d          dk    |d         dk    |V  dS )rK   r   rJ   r"   Nr-   r   s     r   r   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 )rK   r   rJ   r#   Nr-   r   s     r   r   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 rK   r   Nr-   r   s     r   r   zTtest_seed_candidate_category_budget_plan_ignore_confirm_and_audit.<locals>.<genexpr>W   s2      ]]1a8H6I_6\6\Q6\6\6\6\]]r   rM   actionaccept_categoryr2   ry   rz   r{   r9   payloadrC   	confirmedrR   monthlyaccept_budget_planzZSELECT source_type, typeof(monthly_amount_chf) FROM budget_plan_items WHERE plan_item_id=?	entity_id)excel_seed_dry_runr   r4   tupler@   r5   r:   r;   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   r.   r	   nextr
   rY   rZ   r^   r_   r`   r   ra   r   r   r[   r\   r]   r   )r   r   category_candidateplan_candidateunclean_candidatecategory_previewri   r   rd   r   rg   category_resultplan_previewplan_resultr@   re   rf   rh   r   s                      r   Atest_seed_candidate_category_budget_plan_ignore_confirm_and_auditr   Q   st   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33333333$33333$3333333333333333333333333333333)$?R0SVlnwUxyyL!9%99!%99999999999!%999999!9999%9999999999999999999999999999(~>Q/RT`ajTkllKx /K/ K////////// K///// ////K///////////////////////////
,,s  wB  CN  wO  vQ  R  R  [  [  ]  ]C::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75777775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77#D*;<O*PWijjjG8)	)	))))))))))	)))))))))	)))))))))))))))))))))))))))<<  M  N  N  W  W  Y  Y  Z[  \  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  a  a  a  a  a  a  a  a  a  a  a  a  a  ar   c                    t                      t                      } fd}|| j        t          <   t	          |           }|                    ddt                      d          }|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        |          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%          |          }
d}|
|k    }|st          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        |          dz  }dd|iz  }t          t          j        |                    d x}
x}}t'          d |D                       }|                    d| ddd i          }|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        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}|                    d| d"|                                d#                   }|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        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}t'          d% |D                       }|                    d| d&d'd(i          }|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        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}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)rN   workbook_rows)json   r2   )z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sgenerate)r6   rv   rW   zassert %(py7)spy7r~   r}   ry   rz   r{   r9   z/api/budget/seed-candidatesr   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slenlistedr5   r:   r;   c              3  >   K   | ]}|d          dk    |d         V  dS )rK   r   rM   Nr-   r   s     r   r   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/previewrR   r   previewz/confirmr   confirmc              3  >   K   | ]}|d          dk    |d         V  dS )rK   r   rM   Nr-   r   s     r   r   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 suitabler   )r   r   dependency_overridesr   r   postr.   status_coderY   rZ   r[   r\   r]   r^   r_   r`   r   getr   r   )appr   clientr   r   rf   r   @py_format6@py_format8ri   rd   r   rg   r   re   rh   plan_idr   r   
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&3&&&&&&&&&&3&&&&&&&&&&&&8&&&&&8&&&&&&&&&&3&&&&&&&&&&&&&&&&&&&&&&&&&&&==??89>Q>9Q>>>>>>>>>>9Q>>>>>9>>>>Q>>>>>>>>>>>>>>>>>>>>>>>>>>>ZZ566;;==Fv;;!;!;!33vv;!bb6bbbbbGkkJJJJRhjsQtkuuG%#%#%%%%%%%%%%#%%%%%%%%%%%%7%%%%%7%%%%%%%%%%#%%%%%%%%%%%%%%%%%%%%%%%%%%%kkJJJJQXQ]Q]Q_Q_`iQjkkkG%#%#%%%%%%%%%%#%%%%%%%%%%%%7%%%%%7%%%%%%%%%%#%%%%%%%%%%%%%%%%%%%%%%%%%%%ggfgggggJkkLLLLTZ\jSkkllG%#%#%%%%%%%%%%#%%%%%%%%%%%%7%%%%%7%%%%%%%%%%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%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-   )r?   _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    }|slt          j	        d|fd||f          t          j
        |          t          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|                    d|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|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 S )Nr   )reopen_seed_candidaterp   rq   c              3  2   K   | ]}|d          dk    |V  dS r   r-   r   s     r   r   zEtest_ignored_candidate_can_be_reopened_and_audited.<locals>.<genexpr>   s3      ee1a@P>QUd>d>dQ>d>d>d>deer   rM   mistaker   rC   r   r2   ry   rz   r{   r9   zCSELECT status FROM budget_seed_candidates WHERE seed_candidate_id=?zKSELECT COUNT(*) FROM audit_log WHERE action='status_change' AND entity_id=?r   )*jarvis_finance.services.budget_seed_reviewr   r   r   r.   r   r	   r   rY   rZ   r^   r_   r`   ra   r   )	r   r   	candidateresultri   r   rd   r   rg   s	            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(y((((((((((y(((((((((y(((((((((((((((((((((((((((<<]`ij}`~  `A  B  B  K  K  M  M  NO  P  ]  T]  ]  P  T]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  P  T]  ]  ]  ]  ]  ]  P  ]  ]  ]  ]  T]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]<<ehq  sF  iG  hI  J  J  S  S  U  U  VW  X  ]  \]  ]  X  \]  ]  ]  ]  ]  ]  ]  ]  ]  ]  ]  X  \]  ]  ]  ]  ]  ]  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    }|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          |          }
f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}	}f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 S )Nr   )convert_unclean_rangerp   rq   c              3  2   K   | ]}|d          dk    |V  dS r   r-   r   s     r   r   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   rM   r   rJ   
Sonderfallr   Sonderbudgetz42.00)rJ   rP   rC   createdr2   ry   rz   r{   r9   c              3  T   K   | ]"}|d          d         k    o|d         dk    V  #dS )rM   r   rK   r   Nr-   )r?   r   cats     r   r   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   r   r   r   c              3  T   K   | ]"}|d          d         k    o|d         dk    V  #dS )rM   r   rK   r   Nr-   )r?   r   plans     r   r   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	   rY   rZ   r^   r_   r`   r   r[   r\   r]   )r   r   uncleanri   r   rd   r   rg   r   r   r   r   s             @@r   Jtest_unclean_range_can_be_converted_to_category_and_budget_plan_candidatesr      s   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%=I%%%%%%%%%%=I%%%%%=%%%%I%%%%%%%%%%%%%%%%%%%%%%%%%%%>&Y&>Y&&&&&&&&&&>Y&&&&&>&&&&Y&&&&&&&&&&&&&&&&&&&&&&&&&&&"4((Gqqqqipqqqq3qqqqqqqqqqqqqqqq3qqqqq3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uuuumtuuuu3uuuuuuuuuuuuuuuu3uuuuu3uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuur   c                 >   t                      } t          | t                      d          }t          |           }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}	||	k    }
|
st	          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        |	          dz  }dd|iz  }t          t	          j        |                    d x}x}
}	d |D             }h 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 S )Nzincome synthetic workbookrq   c                \    g | ])}|d          dk    d|                     d          pdv '|*S )rK   r   ztype:incomerB   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   r2   ry   rz   r{   r9   r4   r   incomer5   r:   r;   c                    h | ]
}|d          S )rJ   r-   r   s     r   r   zFtest_income_candidates_from_2026_sheet_are_detected.<locals>.<setcomp>   s    ///1Ao///r   >   r   r   r   r   r   r   c              3  >   K   | ]}|d          dk    |d         V  dS )rJ   r   rL   Nr-   r   s     r   r   zFtest_income_candidates_from_2026_sheet_are_detected.<locals>.<genexpr>   s8      bbq7IMa7a7aq"#7a7a7a7abbr   r   r   r   )r   r   r   r	   rY   rZ   r^   r_   r`   r   r[   r\   r]   r   )r   r   r   r   ri   r   rd   r   rg   re   rf   rh   r   s                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11111111,11111,1111111111111111111111111111111v;;!;!;!33vv;!/////y3y3y3yy/3yyyyyyyyyyy/3yyyyyy/yyyy3y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bbVbbbb3bbbbbbbbbbbbbbbb3bbbbb3bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbr   c                 X   ddl m} m}m}m} t                      }t          |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}||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                                          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}}||k    }|st          j	        d|fd||f          dt          j                    v st          j        |          rt          j
        |          nddt          j                    v st          j        |          rt          j
        |          nddz  }dd|iz  }	t          t          j        |	                    d }d S )Nr   )confirm_budget_plan_takeoverconfirm_clear_category_takeoverpreview_budget_plan_takeoverpreview_clear_category_takeoverrp   rq   countr}   r2   ry   rz   r{   r9   confirmed_countr   r   ro   skipped_countrr   afterbeforeru   rw   rU   )r   r   r   r   r   r   r   r.   rY   rZ   r^   r_   r`   ra   r   r[   r\   r]   )r   r   r   r   r   cat_previewri   r   rd   r   rg   
cat_resultr   result1r  result2r  r   r   s                      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$1$$$$$$$$$$1$$$$$$$$$1$$$$$$$$$$$$$$$$$$$$$$$$$$$0066J'(-A-(A----------(A-----(----A---------------------------//55L %A% A%%%%%%%%%% A%%%%% %%%%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(#q((((((((((#q(((((#((((q(((((((((((((((((((((((((((F?5F55FFr   c                    ddl m}  ddlm} t	                      }t          |t                      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         }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 S )Nr   get_budget_overview)r   rp   rq   2026-01planned_budget_chf0)!=)z%(py1)s != %(py4)srz   r{   r9   actual_expense_chfz0.00r2   ry   actuals_labelznoch keine Buchungenbudget_status
no_actuals)'jarvis_finance.services.budget_overviewr  r   r   r   r   r.   rY   rZ   r^   r_   r`   )	r  r   r   overviewri   r   rd   r   rg   s	            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()0S0)S0000000000)S00000)0000S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()3V3)V3333333333)V33333)3333V333333333333333333333333333O$>(>>$(>>>>>>>>>>>$(>>>>>>$>>>>(>>>>>>>>>>>>>>>>>>>>>>>>>>>>O$44$4444444444$44444$444444444444444444444444444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    }
|
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         }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   )confirm_create_budget_accountr  )confirm_budget_transactionz	UAT KontocashCHF)r=   account_typerD   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_chfr2   ry   rz   r{   r9   r  zESELECT COUNT(*) FROM audit_log WHERE entity_type='budget_transaction'r}   )'jarvis_finance.services.budget_accountsr  r  r  +jarvis_finance.services.budget_transactionsr  r   ra   r   rY   rZ   r^   r_   r`   )r  r  r  r   account
income_catexpense_catr  ri   r   rd   r   rg   s                r   =test_manual_income_and_expense_update_actual_values_and_auditr-     sw   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'(4H4(H4444444444(H44444(4444H444444444444444444444444444()4W4)W4444444444)W44444)4444W444444444444444444444444444<<_``iikklmnsrssnrsssssssssssnrssssssnssssrssssssssssssssssssssssssssssssr   )r   r   )r   r/   )&
__future__r   builtinsr[   _pytest.assertion.rewrite	assertionrewriterY   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.   rm   r   r   r   r   r   r   r   r
  r  r-  r-   r   r   <module>r8     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   