
    t ojJ1                        d dl mZ d dlZd dlmc mZ d dl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 d dlmZ d dlmZ d d	lmZ d d
lmZ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&d"dZ'd"dZ(dS )#    )annotationsN)confirm_create_budget_account)confirm_create_category)%seed_credit_card_candidates_from_rows)confirm_annual_budget_planget_annual_budget_assistantget_budget_planning_matrixpreview_annual_budget_plan&preview_budget_planning_excel_template)calculate_annual_and_reserveconfirm_budget_transaction)connect_memory)apply_migrationsget_schema_versionc                 @    t                      } t          |            | S )N)r   r   )conns    S/home/agent/.hermes/repos/FinanceManager/tests/unit/test_sprint17d_annual_budget.pydbr      s     DTK    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_idWohnenexpense)r   category_typeLohnincome)r   r   )r   accountr    r#   s       r   setupr%      sr    +D:Waot2u2uvv  xC  DG%dXPY,Z,Z[[\ghG$TFX+V+VWWXcdFGV##r   r    
2026-05-12r$   strcategorypayeeamounttx_typedatec                6    t          | ||||||d|dd	          S )Nr   manual)	
account_idtransaction_typetransaction_datedescriptionr)   amount_originalcurrency_originalcategory_idsource_typer   )r   r$   r(   r)   r*   r+   r,   s          r   bookr7   $   sW    %d7X_uy  KP  [`  u{  RW  hp  AI  -J  -J  K  K  Kr   returnNonec            	     F   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             }d | 
                    d          D             }h 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}}h 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}}| j
        }d} ||          }|j        } |            }|sddt	          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          t          j        |          t          j        |          d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py6zassert %(py8)spy8c                    h | ]
}|d          S r    .0rows     r   	<setcomp>zWtest_migration_49_is_additive_and_supports_immutable_budget_versions.<locals>.<setcomp>+   s    mmmVmmmr   z,PRAGMA table_info(budget_recurring_payments)c                    h | ]
}|d          S rD   rE   rF   s     r   rI   zWtest_migration_49_is_additive_and_supports_immutable_budget_versions.<locals>.<setcomp>,   s    ```CCK```r   z$PRAGMA table_info(budget_plan_items)>   data_versionplanning_typedue_months_jsonplanning_cadence)<=)z%(py1)s <= %(py3)srecurring_columnsr?   r@   assert %(py5)spy5>   	item_typemanual_overriderN   calculation_basisplan_columnszQSELECT name FROM sqlite_master WHERE type='table' AND name='budget_plan_versions'zassert %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.execute
}(%(py4)s)
}.fetchone
}()
})r>   py2py4rA   rB   py10)r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationexecutefetchone)r   @py_assert2@py_assert5@py_assert4@py_format7@py_format9rP   rW   @py_assert0@py_format4@py_format6@py_assert1@py_assert3@py_assert7@py_assert9@py_format11s                   r   Dtest_migration_49_is_additive_and_supports_immutable_budget_versionsrr   (   s   44Dd##)r)#r))))))))))#r))))))))))))))))))))))))))))))d)))))d))))))#))))r)))))))))))))))))))))))))))mm=k0l0lmmm``4<<8^+_+_```LSSShSWhhhhhhhhhhhSWhhhhhhShhhhhhhhhhhWhhhhhhWhhhhhhhhhhhhhhhhhhhhhhhhhhhhTTTdTXdddddddddddTXddddddTdddddddddddXddddddXdddddddddddddddddddddddddddd<wkw<<kllwluwuuwwwwwwwwwwwwwww4wwwww4wwwwww<wwwwkwwwwlwwwwuwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwr   c            
        ddl m}  d} | |          }d}t          ||          } | d           | d          f}||k    }|s+t          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        |          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}x}x}x}}d} | |          }d}t          ||          } | d           | d          f}||k    }|s+t          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        |          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}x}x}x}}d S )Nr   )Decimal1298.75	quarterly5195.00z432.9166666666666666666666667r<   )zX%(py9)s
{%(py9)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py3)s)
}, %(py7)s)
} == %(py12)sr   rt   )r>   r?   r@   rS   py7py9py12zassert %(py14)spy14z120.00yearlyz10.00)decimalrt   r   r[   r\   r]   r^   r_   r`   ra   rb   )	rt   re   rg   @py_assert6@py_assert8@py_assert11@py_assert10@py_format13@py_format15s	            r   Atest_quarterly_and_yearly_payments_are_never_multiplied_by_twelver   2   s   09  K	(:(:  KK  K'(:KHH  KWWU^M_M_ahah  jI  bJ  bJ  MK  KH  MK  K  K  K  K  K  K  K  K  K  KH  MK  K  K  K  K  K  K  K  K  K  K  K  K'  K  K  K  K  K'  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K	  K  K  K  K(:  K  K  K  KK  K  K  K  KH  K  K  K  K  MK  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K08m(9(9m8m'(98DDmQYIZIZ\c\cdk\l\lHmmDHmmmmmmmmmmmDHmmmmmmmmmmmmm'mmmmm'mmmmmmmmmmmmmmmmmmmmmmmmmmmm(9mmmm8mmmmDmmmmHmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmr   c            	        t          t                      i           } | 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
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         D             }ddh}||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productive_mutationFisz%(py1)s is %(py4)sr?   rY   assert %(py6)srA   confirm_availablecontrolsz	114569.39z	148775.40z34206.01z2850.50ru   rw   z432.92z1984.67)annual_expenses_chfannual_income_chfannual_surplus_chfmonthly_surplus_chfmortgage_payment_chfmortgage_annual_chfmortgage_monthly_reserve_chfsource_monthly_rest_chfr<   z%(py1)s == %(py4)sc                    h | ]
}|d          S )coderE   )rG   items     r   rI   z\test_xls_control_calculation_corrects_quarterly_mortgage_and_monthly_rest.<locals>.<setcomp>B   s    :::TDL:::r   	conflictsquarterly_as_monthlymonthly_rest_wrong)r   r   r[   r\   r`   ra   rb   )previewrj   rn   re   @py_format5rh   s         r   Itest_xls_control_calculation_corrects_quarterly_mortgage_and_monthly_restr   8   sV   4RTT2>>G()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: *( ))(0Y	# #  #     
    #    
    
#              
            ;:W[%9:::l?UWk>ll:>lllllllllll:>llllll:llll>llllllllllllllllllllllllllllllr   c            
        t                      } t          |           \  }}dd|ddg ddddd	d
g dddddddddgddddddg ddg}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}}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}}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}}t          j
        t          j                  5  |                     d(|
d'         f           d d d            n# 1 swxY w Y   |                     d)|
d'         f                                          }t          j
        t          j                  5  |                     d*|d+         f           d d d            n# 1 swxY w Y   t          j
        t          j                  5  |                     d,|d+         f           d d d            n# 1 swxY w Y   t          j
        t          j                  5  |                     d-|
d'         f           d d d            n# 1 swxY w Y   t          j
        t          j                  5  |                     d.|
d/         f           d d d            n# 1 swxY w Y   t          | ||d0ddd12           t          | |dd	d34           t!          | dd56          }|d7         d8         }d}||k    }|slt          j        d|fd ||f          t          j        |          t          j        |          d!z  }d"d#|iz  }	t          t          j        |	                    d x}x}}|d9         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 }||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 }||u }|slt          j        d<|fd=||f          t          j        |          t          j        |          d!z  }d"d#|iz  }	t          t          j        |	                    d x}x}}t#          | dd56          }t%          fd?|d@         D                       }|dA         }d }||u }|slt          j        d<|fd=||f          t          j        |          t          j        |          d!z  }d"d#|iz  }	t          t          j        |	                    d x}x}}|dB         }dC}||k    }|slt          j        d|fd ||f          t          j        |          t          j        |          d!z  }d"d#|iz  }	t          t          j        |	                    d x}x}}|dD         }|j        }dE} ||          }|ssdFt          j        |          t          j        |          t          j        |          t          j        |          dGz  }t          t          j        |                    d x}x}x}}|dH         }t)          |          }dI}||k    }|st          j        d|fdJ||f          dKt+          j                    v st          j        t(                    rt          j        t(                    ndKt          j        |          t          j        |          t          j        |          dLz  }dMdN|iz  }t          t          j        |                    d x}x}x}}|dO         }g }||k    }|slt          j        d|fd ||f          t          j        |          t          j        |          d!z  }d"d#|iz  }	t          t          j        |	                    d x}x}}dP}||v}|st          j        dQ|fdR||f          t          j        |          dSt+          j                    v st          j        |          rt          j        |          ndSdTz  }dUdV|iz  }t          t          j        |                    d x}}dW}||v}|st          j        dQ|fdR||f          t          j        |          dSt+          j                    v st          j        |          rt          j        |          ndSdTz  }dUdV|iz  }t          t          j        |                    d x}}|dX         }g }||k    }|slt          j        d|fd ||f          t          j        |          t          j        |          d!z  }d"d#|iz  }	t          t          j        |	                    d x}x}}|dY         dY         }d5}||k    }|slt          j        d|fd ||f          t          j        |          t          j        |          d!z  }d"d#|iz  }	t          t          j        |	                    d x}x}}|dZ         }i }||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"   r#   z10000.00monthlysafe)r   position_typer5   payment_amount_chfcadence
due_months	certaintyHypothek
fixed_costru   rv   )      	      T)r   r   r5   r   r   r   r   rU   Ferienone_time_seasonalz5000.00one_time   variableETFsavings_investmentz500.00)r   r   r   r   r   r   2026)year	positionsreviewz	120000.00z16195.00z	103805.00)planned_income_chfplanned_expense_chfplanned_surplus_chfr<   r   r   r   rA   payloadversion_number   r   zCUPDATE budget_plan_versions SET version_number=2 WHERE version_id=?zPSELECT version_item_id FROM budget_plan_version_items WHERE version_id=? LIMIT 1zKUPDATE budget_plan_version_items SET name='changed' WHERE version_item_id=?version_item_idz=DELETE FROM budget_plan_version_items WHERE version_item_id=?a  INSERT INTO budget_plan_version_items(
                 version_item_id,version_id,position_type,name,payment_amount_text,cadence,
                 due_months_json,annual_amount_text,monthly_reserve_text,calculation_basis,
                 certainty,manual_override,created_at)
               VALUES ('extra',?,'fixed_cost','extra','1.00','yearly','[]','1.00','0.08',
                       'not allowed','safe',0,'2026-01-01')z6UPDATE audit_log SET action='changed' WHERE audit_id=?audit_idArbeitgeberz
2026-01-25)r+   r,   z
2026-03-31r,   z2026-03r   current_monthplanr   actual
income_chfforecastr   r   expense_chfc              3  4   K   | ]}|d          k    |V  dS )r5   NrE   )rG   rH   r    s     r   	<genexpr>zctest_plan_actual_and_forecast_are_separate_and_confirm_creates_immutable_version.<locals>.<genexpr>x   s2      RR3C4F'4Q4Q34Q4Q4Q4QRRr   rowsforecast_display_chfbudget_year_chfz10195.00forecast_basisu   Noch nicht verlässlichzLassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
})r?   r@   rS   rx   summary_kpisr   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slen)r>   rX   rY   rx   zassert %(py9)sry   planning_stepsmonthly_close)not in)z%(py1)s not in %(py3)s	assistantrQ   rR   rS   closingoptimization_hintsmonthsections)r   r%   r
   r[   r\   r`   ra   rb   r   pytestraisessqlite3IntegrityErrorrc   rd   r7   r   r	   next
startswithr   r]   r^   r_   )r   r$   r#   r   r   rj   rn   re   r   rh   resultagainversion_itemr   matrixhousingrg   r~   @py_format8rm   rf   @py_format10rk   rl   r    s                           @r   Ptest_plan_actual_and_forecast_are_separate_and_confirm_creates_immutable_versionr   E   sr   44D$T{{GWf(6ak  yB  RT  ci  	j  	jl7js  AL  \i  \i  \i  x~  SW  	X  	X,?PWox  FP  ab  `c  r|  	}  	})=U]js  DF  U[  	\  	\	I )Y/W/WXXG8  K{[e  J  !K  !K  K  !K  K  K  K  K  K  K  K  K  K  K  !K  K  K  K  K  K  K  K  K  K  !K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K'gi.@AAF"#(q(#q((((((((((#q(((((#((((q(((((((((((((((((((((((((((&tWY-?@@E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444	w-	.	. t tZ]cdo]p\rssst t t t t t t t t t t t t t t<<Z		  hjj  
w-	.	. 
 
Y+,.	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
w-	.	. 
 
K+,.	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
w-	.	. 	
 	
? K "	
 	
 	
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
w-	.	. f fMPVWaPbOdeeef f f f f f f f f f f f f f fwz8R^____wY\JJJJ+DvYWWWIV12AkA2kAAAAAAAAAA2kAAAAA2AAAAk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X|,:
:,
::::::::::,
:::::,::::
:::::::::::::::::::::::::::Z .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666666666666666666666Z /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'6SSSFRRRR&.RRRRRG)*2d2*d2222222222*d22222*2222d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$%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#$J$/J0IJ//0IJJJJJJJJ$JJJJ/JJJJ0I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(.3()).Q.)Q..........)Q............3.....3......(....)....Q.............................%&,",&",,,,,,,,,,&",,,,,&,,,,",,,,,,,,,,,,,,,,,,,,,,,,,,,+?)++++++++++?)+++++?+++++++++++)+++++)+++++++++++++++++++++++++++%9I%%%%%%%%%%9I%%%%%9%%%%%%%%%%%I%%%%%I%%%%%%%%%%%%%%%%%%%%%%%%%%%)*0b0*b0000000000*b00000*0000b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Wg&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Z &B& B&&&&&&&&&& B&&&&& &&&&B&&&&&&&&&&&&&&&&&&&&&&&&&&&&&sZ   ?I))I-0I-K++K/2K/L>>MM'NNN:O$$O(+O(c            	     H	   t                      } t          |           \  }}}t          d          D ]}t          | ||dd           t          d          D ]}t          | ||ddd           |                     d	           |                     d
           |                     d           |                     dd           |                                  t          | d|ddd           t          | ddddgdd           |                     d                                          }|                     d|d         f           |                                  t          | dd          }|d         d          }g }||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         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 }||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 }||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}||u }	|	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   Applez20.00   Netflixz22.90z
2026-05-09r   zINSERT INTO platforms(platform_id,name,platform_type,created_at) VALUES ('synthetic-card-platform','Synthetic','bank','2026-01-01')a
  INSERT INTO accounts(
             account_id,platform_id,account_name,account_type,currency,portfolio_bucket,created_at)
           VALUES ('synthetic-card','synthetic-card-platform','Synthetic card','credit_card',
                   'CHF','liability','2026-01-01')a  INSERT INTO budget_accounts(
             budget_account_id,linked_account_id,name,account_type,currency,created_at,updated_at)
           VALUES ('synthetic-card','synthetic-card','Synthetic card','credit_card','CHF',
                   '2026-01-01','2026-01-01')a  INSERT INTO household_account_source_mappings(
             mapping_id,contract_version,source_type,source_reference_hash,budget_account_id,
             canonical_account_id,reference_hint,is_active,created_at,updated_at)
           VALUES ('synthetic-card-map','household_import_v1','visa_credit_card',?,
                   'synthetic-card','synthetic-card','synthetic',1,'2026-01-01','2026-01-01'))@1111111111111111111111111111111111111111111111111111111111111111zsynthetic-cardzCard purchasesz4348.40z
2026-07-10z
2026-07-20zVISECA Zahlungz-3238.20)DatumBeschreibungBetragzcard.csvF)source_file_labelmigros_coveredzsSELECT transaction_candidate_id FROM budget_transaction_candidates WHERE lower(description) LIKE '%viseca%' LIMIT 1zUPDATE budget_transaction_candidates SET classification='credit_card_payment',status='needs_review',merchant='VISECA' WHERE transaction_candidate_id=?transaction_candidate_idr   2026-05r   coveragegapsr<   r   r   r   rA   statuspartialfree_investable_availabler   r   r   free_plannable_chfr   is_estimate)r   r%   ranger7   rc   commitr   rd   r   r[   r\   r`   ra   rb   )r   r$   r    _income_	candidater   rj   rn   re   r   rh   s               r   9test_recurring_hints_do_not_block_the_household_year_restr      s   44D %dGWg1XX 7 7T7GWg66661XX L LT7GYlKKKKKLL	M   	LL	6   	LL	1   	LL	a
 	   	KKMMM*:ILYYYY)$<Yiu  2A  2A  1B  V`  qv  w  w  w  w  S  T  T  ]  ]  _  _ILL  j  mv  wQ  mR  lT  U  U  UKKMMM+DvYWWWIZ (.B.(B..........(B.....(....B...........................Z *7i7*i7777777777*i77777*7777i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Z !<=FF=FFFFFFFFFF=FFFFF=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFZ !56>$>6$>>>>>>>>>>6$>>>>>6>>>>$>>>>>>>>>>>>>>>>>>>>>>>>>>>Z /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Z /858/58888888888/588888/8888588888888888888888888888888888r   c                    t                      } t          |           \  }}}t          dd          D ]}t          | ||ddd|dd           t	          | |d	d
dddddd           t          | dd          }|d         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 }||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}||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         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(g}||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}}d S )-Nr   r   Categorizedz50.00z2026-02dz-20r   r    z
2026-04-10Uncategorizedz100.00r   r.   )r/   r0   r1   r2   r)   r3   r4   r6   r   z2026-04r   r   reliableFr   r   r   r   rA   r   r   r   r   r<   r   quality_label	teilweisecategory_coverage_percentz60.00r    uncategorized_confirmed_expensesuG   Bestätigte Ausgaben sind noch keiner kanonischen Kategorie zugeordnet.)r   message
amount_chfdata_qualitymaterial_gapsr   r   )r   r%   r   r7   r   r   r[   r\   r`   ra   rb   )r   r$   r    r   r   r   rj   rn   re   r   rh   s              r   Btest_uncategorized_confirmed_expense_is_reported_as_a_coverage_gapr     s   44D %dGWgq! Z ZT7G]GBX%BXBXBXBXYYYYY! ) ,*$'!&#		
 		
   ,DvYWWWIZ ,55,5555555555,55555,5555555555555555555555555555555Z /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Z *7i7*i7777777777*i77777*7777i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Z 1@[@1[@@@@@@@@@@1[@@@@@1@@@@[@@@@@@@@@@@@@@@@@@@@@@@@@@@Z !<=HH=HHHHHHHHHH=HHHHH=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHZ ( 6`"	
 	
- ( -        ( -     )   -                          ^$_5a8@fDff@Dfffffffffff@Dffffff@ffffDffffffffffffffffffffffffffffffr   c                    t                      } t          |           \  }}}|                     d||f           |                                  t	          | dd          }|d         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 }||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}||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         }|s:ddt          j        |          iz  }
t          t          j	        |
                    d }d S )Nu  INSERT INTO budget_transactions(
             budget_transaction_id,account_id,category_id,transaction_date,transaction_type,
             description,amount_original,currency_original,amount_chf,fx_status,status,source_type,
             created_at,updated_at)
           VALUES ('missing-fx',?,?, '2026-05-12','expense','Fremdwährung ohne CHF',
                   '500.00','USD',NULL,'missing','confirmed','import_candidate',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)r   r   r   r   r  Fr   r   r   r   rA   r   r  labelu#   Noch nicht verlässlich berechenbarr<   r   r  zassert %(py1)sr?   )
r   r%   rc   r   r   r[   r\   r`   ra   rb   )r   r$   r    r   r   rj   rn   re   r   rh   @py_format2s              r   ?test_material_chf_import_gap_returns_understandable_uncertaintyr     s   44D %dGWgLL	x 
'   	KKMMM+DvYWWWIZ ,55,5555555555,55555,5555555555555555555555555555555Z !56>$>6$>>>>>>>>>>6$>>>>>6>>>>$>>>>>>>>>>>>>>>>>>>>>>>>>>>^$W-V1VV-1VVVVVVVVVVV-1VVVVVV-VVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVV^$_555555555555555555555555555r   )r    r&   )r$   r'   r(   r'   r)   r'   r*   r'   r+   r'   r,   r'   )r8   r9   ))
__future__r   builtinsr]   _pytest.assertion.rewrite	assertionrewriter[   r   r   'jarvis_finance.services.budget_accountsr   )jarvis_finance.services.budget_categoriesr   &jarvis_finance.services.budget_importsr   'jarvis_finance.services.budget_planningr   r   r	   r
   r   (jarvis_finance.services.budget_recurringr   +jarvis_finance.services.budget_transactionsr   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r   r%   r7   rr   r   r   r   r   r  r  rE   r   r   <module>r      s   " " " " " "                Q Q Q Q Q Q M M M M M M X X X X X X              R Q Q Q Q Q R R R R R R : : : : : : R R R R R R R R  $ $ $K K K K Kx x x xn n n n
m 
m 
m 
m=' =' =' ='@+9 +9 +9 +9\!g !g !g !gH6 6 6 6 6 6r   