
    ?mjd                        d dl mZ d dlZd dlmc 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mZmZmZ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ZddZ ddZ!ddZ"ddZ#ddZ$dS )    )annotationsN)HTTPException)confirm_create_budget_account)confirm_create_category)confirm_budget_planning_batchconfirm_category_budget_values"get_budget_planning_audit_timelineget_budget_planning_matrixpreview_budget_planning_batch&preview_budget_planning_excel_templatepreview_category_budget_valuesconfirm_budget_transaction)connect_memory)apply_migrationsc                 @    t                      } t          |            | S )N)r   r   )conns    X/home/agent/.hermes/repos/FinanceManager/tests/unit/test_budget_planning_usability_v2.pydbr      s    D-d333D[    c                    t          | dddd          d         }t          | 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_typezEssen & Haushalt)r   r   )r   
account_idmediafoods       r   setup_two_categoriesr$      su    .tjZdrw5x5xyy  {F  GJ#D3I\e*f*fgghstE"42DW`)a)abbcnoDud""r   r!   strcategory_idamountc                6    t          | |ddd|d|d           d S )Nr   z
2026-02-10	confirmedr   )r!   transaction_typetransaction_datedescriptionamount_originalcurrency_originalr&   r   )r   r!   r&   r'   s       r   book_expenser/   !   sU    tJT]s  Q\  qw  NS  do  &p  &p  q  q  q  q  qr   returnNonec                 t   t                      } t          |           \  }}}t          | |t          | |dddd          d                    t          | |t          | |dddd	d
d          d                    t	          | |          }|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         }	t          |	          }
d}|
|k    }|st          j        d|fd|
|f          dt          j	                    v st          j
        t                    rt          j        t                    ndt          j        |	          t          j        |
          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}	x}
x}}|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             }	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             }	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)}
||
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-         }
||
v }|slt          j        d.|fd/||
f          t          j        |          t          j        |
          dz  }d d!|iz  }t          t          j        |                    d x}x}}
d S )0N100.00z960.00initial)monthly_budget_chfprevious_year_total_chfnotespayload120.00z90.00z110.00)0102changed)r5   previous_year_monthsr7   r&   ==)z%(py1)s == %(py3)sr"   py1py3assert %(py5)spy5entries   )>=)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)slen)py0py2py4py7zassert %(py9)spy9r   action_labelzBudgetplanung gespeichertz%(py1)s == %(py4)srA   rK   assert %(py6)spy6c              3  F   K   | ]}|d          dk    o|d         dk    V  dS )field_labelzBudget Monat	new_valuer9   N .0changes     r   	<genexpr>z`test_audit_timeline_shows_readable_field_changes_for_budget_and_previous_year.<locals>.<genexpr>0   s=      {{_evm$6Z6+;NRZ;Z{{{{{{r   changesz,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)rI   rJ   rK   c              3  .   K   | ]}|d          dk    V  dS )rT   zVorjahr MonatswerteNrV   rW   s     r   rZ   z`test_audit_timeline_shows_readable_field_changes_for_budget_and_previous_year.<locals>.<genexpr>1   s-      ^^&vm$(==^^^^^^r   sourcevue_dashboard
created_byuseraudit_id	technicalinz%(py1)s in %(py4)s)r   r$   r   r   r	   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanationrH   r\   )r   _accountr"   _foodtimeline@py_assert0@py_assert2@py_format4@py_format6@py_assert1@py_assert3@py_assert6@py_assert5@py_format8@py_format10latest@py_format5@py_format7s                     r   Mtest_audit_timeline_shows_readable_field_changes_for_budget_and_previous_yearr   %   s   44D*>t*D*D'5%"40NtUZs{  Ya  lu  ]v  ]v  1w  1w  xA  1B  C  C  C"40NtUZs{  ]d  lt  Vu  Vu  @I  ]J  ]J  1K  1K  LU  1V  W  W  W1$>>HM"+"e++++++++++"e+++++"+++++++++++e+++++e+++++++++++++++++++++++++++	"(3"##(q(#q((((((((((#q((((((((((((3(((((3(((((("((((#((((q(((((((((((((((((((((((((((((i #F.!@%@@!%@@@@@@@@@@@!%@@@@@@!@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@{{iopyiz{{{{3{{{{{{{{{{{{{{{{3{{{{{3{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{^^FS\L]^^^^3^^^^^^^^^^^^^^^^3^^^^^3^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^(................................................,)6)6))))))))))6)))))))))6))))))))))))))))))))))))))),,,:,,,,,,,,,,,:,,,,,,:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r   c                 
   t                      } t          |           \  }}}t          | d|ddd|ddddd	g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}}|d         }d}||u }|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}||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}||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}}|
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             }||         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[   z50.00monthly)r&   r5   budget_cadencez1200.00annual1000.00T)r&   annual_budget_chfr   r6   distribute_previous_year_totalcountrF   r>   rO   rP   rQ   rR   requires_explicit_confirmisz%(py1)s is %(py4)sr   reviewbudget_year_chfz600.00   budget_month_chfr3   r8   statusr)   confirmed_count20262026-02yearcurrent_monthrowsc                     i | ]}|d          |S )r&   rV   )rX   rows     r   
<dictcomp>z]test_batch_preview_and_confirm_collect_multiple_budget_changes_with_audit.<locals>.<dictcomp>H   s    555S555r   r6   zMSELECT COUNT(*) FROM audit_log WHERE action='budget_planning_batch_confirmed')r   r$   r   rg   rh   ri   rm   rn   r   r
   executefetchone)r   ro   r"   r#   previewrr   rw   rs   r}   r~   resultr   by_ids                r   Itest_batch_preview_and_confirm_collect_multiple_budget_changes_with_auditr   7   s   44D)=d)C)C&5$+D9WPYZZ9PXu~  cg  	h  	h? 3  G
 7 q q          q         q                           ./747/47777777777/477777/77774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9a *+<=II=IIIIIIIIII=IIIII=IIIIIIIIIIIIIIIIIIIIIIIIIIIIIII9a *+=>J(J>(JJJJJJJJJJ>(JJJJJ>JJJJ(JJJJJJJJJJJJJJJJJJJJJJJJJJJ*41CDDF(*{*{**********{*********{***************************#$))$))))))))))$)))))$)))))))))))))))))))))))))))))))%dyQQQRXYD55555E<)*6h6*h6666666666*h66666*6666h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;01>Y>1Y>>>>>>>>>>1Y>>>>>1>>>>Y>>>>>>>>>>>>>>>>>>>>>>>>>>><<ghhqqsstuv{z{{vz{{{{{{{{{{{vz{{{{{{v{{{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{r   c                     t                      } t          |           \  }}}t          j        t                    5  t          | d|ddgi           d d d            d S # 1 swxY w Y   d S )Nr[   z-1.00)r&   r5   )r   r$   pytestraisesr   r   )r   ro   r"   rp   s       r   @test_batch_preview_blocks_invalid_negative_values_before_confirmr   N   s    44D*>t*D*D'5%	}	%	% r r%dYfm9n9n8o,pqqqr r r r r r r r r r r r r r r r r rs   AA#&A#c                 X   t                      } t          |           \  }}t          | t          | ddd          d                    t	          | |d           t          fdt          | dd	          d
         D                       }d                    d |d         D                       }d |d         D             }d}||v }|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}||v }|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}||v }|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}}g }
d}||v }|}|rd}||v }|}|sXt          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  }|
                    |           |rt          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          j        |
d#          i z  }d$d%|iz  }t          t          j        |                    d x}x}
x}x}x}}d S )&Nr3   r   )r   r6   r8   z150.00c              3  4   K   | ]}|d          k    |V  dS )r&   NrV   )rX   rr"   s     r   rZ   zetest_plausibility_checks_surface_budget_vs_previous_year_actual_and_forecast_risks.<locals>.<genexpr>Y   s]        G  GQlmn{l|  AF  mF  mFq  mF  mF  mF  mF  G  Gr   r   r   r   r    c              3  &   K   | ]}|d          V  dS )messageNrV   rX   items     r   rZ   zetest_plausibility_checks_surface_budget_vs_previous_year_actual_and_forecast_risks.<locals>.<genexpr>[   s&      OODYOOOOOOr   plausibility_checksc                    h | ]
}|d          S )severityrV   r   s     r   	<setcomp>zetest_plausibility_checks_surface_budget_vs_previous_year_actual_and_forecast_risks.<locals>.<setcomp>\   s    JJJt$z"JJJr   zmehr als 20% unter Vorjahrrd   )z%(py1)s in %(py3)smessagesr@   rC   rD   u#   Ist 2026 liegt bereits über Budgetu$   Forecast liegt kritisch über Budgetwarningcritical)z%(py3)s in %(py5)s
severities)rB   rD   z%(py7)srL   )z%(py10)s in %(py12)s)py10py12z%(py14)spy14r   zassert %(py17)spy17)r   r$   r   r   r/   nextr
   joinrg   rh   ri   rj   rk   rl   rm   rn   append_format_boolop)r   accountrp   r   r   r   rr   rs   rt   ru   rv   @py_assert4@py_assert9@py_assert11rz   @py_format13@py_format15@py_format16@py_format18r"   s                      @r   Rtest_plausibility_checks_surface_budget_vs_previous_year_actual_and_forecast_risksr   T   sP   44D)=d)C)C&%"40NtUZrz  Xa  ]b  ]b  1c  1c  dm  1n  o  o  owx000
  G  G  G  G4TV_```agh  G  G  G  G  GCxxOOC8M4NOOOOOHJJs3H/IJJJJ'3'83333333333'833333'333333333338333338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<0H<<<<<<<<<<0H<<<<<0<<<<<<<<<<<H<<<<<H<<<<<<<<<<<<<<<<<<<<<<<<<<<1=1X==========1X=====1===========X=====X===========================??9?9
"?????z?zZ'????????????9
?????9???????????
?????
?????????????????????????????zZ?????z???????????Z?????Z???????????????????????????????????????????????????????????r   c                    t                      } t          |           \  }}}|                     d                                          d         }t	          | ddi          }|                     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}||u }	|	slt          j        d|	fd||f          t          j        |          t          j        |          d	z  }
d
d|
iz  }t          t          j	        |                    d x}x}	}|d         }d}||u }	|	slt          j        d|	fd||f          t          j        |          t          j        |          d	z  }
d
d|
iz  }t          t          j	        |                    d x}x}	}d}|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         }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 )Nz&SELECT COUNT(*) FROM budget_plan_itemsr   r   r   r   profiledr>   rO   rP   rQ   rR   productive_mutationFr   r   confirm_availableu   Aus bisheriger XLS übernehmentitlerd   rf   controlsmonthly_surplus_chfz2850.50)z%(py0)s == %(py2)sbefore_plansafter_plans)rI   rJ   zassert %(py4)srK   )r   r$   r   r   r   rg   rh   ri   rm   rn   rj   rk   rl   )r   ro   _mediarp   r   r   r   rr   rw   rs   r}   r~   rv   @py_format3s                 r   Ctest_excel_template_preview_is_prepared_without_productive_mutationr   c   s   44D+?+E+E(65<< HIIRRTTUVWL4TFF;KLLG,,GHHQQSSTUVK8*
*
**********
*********
***************************()2U2)U2222222222)U22222)2222U222222222222222222222222222&'050'50000000000'500000'00005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+?ww/??+/???????????+/??????+????/????????????????????????????:45BB5BBBBBBBBBB5BBBBB5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   )r!   r%   r&   r%   r'   r%   )r0   r1   )%
__future__r   builtinsrj   _pytest.assertion.rewrite	assertionrewriterg   r   fastapir   'jarvis_finance.services.budget_accountsr   )jarvis_finance.services.budget_categoriesr   'jarvis_finance.services.budget_planningr   r   r	   r
   r   r   r   +jarvis_finance.services.budget_transactionsr   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r$   r/   r   r   r   r   r   rV   r   r   <module>r      s   " " " " " "               ! ! ! ! ! ! Q Q Q Q Q Q M M M M M M                  S R R R R R : : : : : : > > > > > >A A A# # #q q q q- - - -$| | | |.r r r r@ @ @ @' ' ' ' ' 'r   