
    mjm                        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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 ZdddZddZddZddZdS )    )annotationsN)confirm_create_category)%apply_user_budget_rules_to_candidatescreate_candidate_splitlist_transaction_candidates%seed_credit_card_candidates_from_rows seed_migros_candidates_from_rows%update_transaction_candidate_category)connect_memory)apply_migrationsget_schema_versionc                 @    t                      } t          |            | S )N)r   r   )conns    U/home/agent/.hermes/repos/FinanceManager/tests/unit/test_budget_phase16_user_rules.pydbr      s     DTK    c                v    g d}i }t          |          D ]"\  }}t          | |d|d          d         ||<   #|S )N)Essen & Haushalt   Hausrat / Möbel & Garten   Freizeit / Ausflüge / AbosGesundheit / MedizinAuto / Transportz Shopping / Kleidung & Elektronik	HaustiereSonstiges / Administrationexpense)namecategory_type
sort_order	entity_id)	enumerater   )r   namesidsidxr   s        r   add_categoriesr$      sc    	 	 	E Cu%% ~ ~	T+D4R[kn2o2oppq|}D		Jr   12.00
2026-02-03descriptionstramountdatereturndict[str, str]c                    || |dS )N)DatumBeschreibungBetrag )r'   r)   r*   s      r   rowr2   '   s    ;&IIIr   c                T    |                      d|f                                          S )Nz`SELECT * FROM budget_transaction_candidates WHERE description=? ORDER BY created_at DESC LIMIT 1)executefetchone)r   r'   s     r   	candidater6   +   s+    <<j	  hjjr   Nonec                    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}}t          |           }t          | t          d	          t          d
          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          gd|d                    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 ]{}t          | |          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-}	||	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.         }|s:d/d0t          j        |          iz  }t          t          j	        |                    d }}t          | d          d,         }d1}	||	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          d2         }d3}	||	k    }|slt          j        d|fd$||	f          t          j        |          t          j        |	          d%z  }
d&d'|
iz  }t          t          j	        |                    d x}x}}	d4D ]}t          | |          d+         }d5}	||	k    }|slt          j        d|fd$||	f          t          j        |          t          j        |	          d%z  }
d&d'|
iz  }t          t          j	        |                    d x}x}}	d6D ]}t          | |          d+         }d7}	||	k    }|slt          j        d|fd$||	f          t          j        |          t          j        |	          d%z  }
d&d'|
iz  }t          t          j	        |                    d x}x}}	d8D ]}t          | |          d+         }d9}	||	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          | |          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 ]}t          | |          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?}	t          | |	@          }t!          |          }d)}||k    }|s`t          j        d|fdA||f          dBt	          j                    v st          j        t                     rt          j        t                     ndBdCt	          j                    v st          j        t                    rt          j        t                    ndCdt	          j                    v st          j        |           rt          j        |           ndt          j        |	          t          j        |          t          j        |          t          j        |          dDz  }dEdF|iz  }t          t          j	        |                    d x}	x}x}x}}dG}	t          | |	@          }t!          |          }dH}||k    }|s`t          j        d|fdA||f          dBt	          j                    v st          j        t                     rt          j        t                     ndBdCt	          j                    v st          j        t                    rt          j        t                    ndCdt	          j                    v st          j        |           rt          j        |           ndt          j        |	          t          j        |          t          j        |          t          j        |          dDz  }dEdF|iz  }t          t          j	        |                    d x}	x}x}x}}dI}	t          | |	@          }t!          |          }dJ}||k    }|s`t          j        d|fdA||f          dBt	          j                    v st          j        t                     rt          j        t                     ndBdCt	          j                    v st          j        t                    rt          j        t                    ndCdt	          j                    v st          j        |           rt          j        |           ndt          j        |	          t          j        |          t          j        |          t          j        |          dDz  }dEdF|iz  }t          t          j	        |                    d x}	x}x}x}}dK}	t          | |	@          }t!          |          }dJ}||k    }|s`t          j        d|fdA||f          dBt	          j                    v st          j        t                     rt          j        t                     ndBdCt	          j                    v st          j        t                    rt          j        t                    ndCdt	          j                    v st          j        |           rt          j        |           ndt          j        |	          t          j        |          t          j        |          t          j        |          dDz  }dEdF|iz  }t          t          j	        |                    d x}	x}x}x}}d S )LN1   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   r   py0py1py3py6assert %(py8)spy8	Apple.comGoogleAmazon PrimeNetflixDisney PluszDigitec Galaxus AGKantonsspital BadenApotheke Suessbach AGAgrola TankstelleEasyParkSBB CFF FFSIKEAJUMBOLandiQUALIPET	FressnapfKleintierpraxis TimDropboxGemeinde Windischz
McDonald'sphase16_card.csvr   )source_file_labelsubscription_category_id2026yearproductive_confirmed_countr   z%(py1)s == %(py4)sr?   py4assert %(py6)srA   subscription_count   )rD   rE   rF   rG   rH   proposed_category_namestatusauto_categorized	rule_namezassert %(py1)sr?   needs_reviewreview_reasonu3   Galaxus/Digitec bitte manuell prüfen oder splitten)rI   rJ   r   )rK   rL   rM   r   )rN   rO   rP   r   )rQ   rR   rS   r   )rT   rU   r   r   subscriptionstabz\%(py8)s
{%(py8)s = %(py0)s(%(py6)s
{%(py6)s = %(py1)s(%(py2)s, tab=%(py4)s)
})
} == %(py11)slenr   r>   r?   py2r_   rA   rC   py11assert %(py13)spy13health   auto_transport   pets)r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr$   r   r2   r   r6   r   rm   )r   @py_assert2@py_assert5@py_assert4@py_format7@py_format9catsresult@py_assert0@py_assert3@py_format5desc@py_format2@py_assert7@py_assert10@py_assert9@py_format12@py_format14s                     r   Btest_phase16_schema_adds_rule_name_and_applies_card_category_rulesr   2   s   44Dd##)r)#r))))))))))#r))))))))))))))))))))))))))))))d)))))d))))))#))))r)))))))))))))))))))))))))))$D)MM	NN$%%%&&'((#$$
OOKKLLLL
OO%&&	NN#$$)	
, -!%&C!D3   8 34fEEEF./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&',1,'1,,,,,,,,,,'1,,,,,',,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,Q 2 2t$$%=>_B__>B___________>B______>____B____________________________t$$X.D2DD.2DDDDDDDDDDD.2DDDDDD.DDDD2D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t$$[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T/00:LnL:nLLLLLLLLLL:nLLLLL:LLLLn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T/00AzEzzAEzzzzzzzzzzzAEzzzzzzAzzzzEzzzzzzzzzzzzzzzzzzzzzzzzzzzz@ Y Yt$$%=>XBXX>BXXXXXXXXXXX>BXXXXXX>XXXXBXXXXXXXXXXXXXXXXXXXXXXXXXXXXX@ U Ut$$%=>TBTT>BTTTTTTTTTTT>BTTTTTT>TTTTBTTTTTTTTTTTTTTTTTTTTTTTTTTTTT* ^ ^t$$%=>]B]]>B]]]]]]]]]]]>B]]]]]]>]]]]B]]]]]]]]]]]]]]]]]]]]]]]]]]]]]@ N Nt$$%=>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MMMM0 _ _t$$%=>^B^^>B^^^^^^^^^^^>B^^^^^^>^^^^B^^^^^^^^^^^^^^^^^^^^^^^^^^^^^T<(()ABXFXXBFXXXXXXXXXXXBFXXXXXXBXXXXFXXXXXXXXXXXXXXXXXXXXXXXXXXXX5DK*4_EEEK3EFFK!KF!KKKKKKKKKKF!KKKKKKKKKKKK3KKKKK3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K4KKKKK4KKKKKK_KKKKEKKKKF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K5=D*4X>>>D3>??D1D?1DDDDDDDDDD?1DDDDDDDDDDDD3DDDDD3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DDDD4DDDDD4DDDDDDXDDDD>DDDD?DDDD1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DDDD5EL*45EFFFL3FGGL1LG1LLLLLLLLLLG1LLLLLLLLLLLL3LLLLL3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L4LLLLL4LLLLLL5ELLLLFLLLLGLLLL1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L5;B*4V<<<B3<==BB=BBBBBB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B4BBBBB4BBBBBBV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BBBBBBBBBBBr   c                    t                      } t          |           }t          | t          d          gd           t	          | ddddddd	d
dddddddd
gd|d                    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}}t          | 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}
}	|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(}t          | |           }	t          |	          }d}||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        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        |          d,z  }d-d.|iz  }t          t          j
        |                    d x}x}	x}x}}d/}t          | |           }	t          |	          }d}||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        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        |          d,z  }d-d.|iz  }t          t          j
        |                    d x}x}	x}x}}t          | d/           d         }t!          | |d0         |d1         d23           t#          | |d0         |d         d4d5d6g           |                     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}}d S )9Nz
Migros MMMrV   )rW   r&   z10:00zMigros Baden1Az10.00)r.   ZeitFilialeKasseTransaktionArtikelUmsatzz
2026-02-04z11:00Bz60.00zphase16_migros.csvr   )rW   auto_category_idrY   rZ   covered_by_migros_count   r:   r]   r^   r`   rA   migros_under_50_countrt   migros_over_50_countr   covered_by_migrosrj   r<   rm   coveredr=   rB   rC   rd   migros_over_50rl   r   r   rn   rq   rr   autotransaction_candidate_idr   ztest override)notez5.00part)category_idamount_originalnotesz*SELECT COUNT(*) c FROM budget_transactionsc)r   r$   r   r2   r	   r   rx   ry   r}   r~   r   r   rm   rz   r{   r|   r
   r   r4   r5   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                     r   Ftest_phase16_migros_and_review_filters_keep_confirm_boundary_and_editsr   m   sG	   44D$D)$\1B1B0CWijjjj$"GY\mp  ~A  MT  U  U"GY\mp  ~A  MT  U  U	
 /01    34fEEEF+,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)*/a/*a//////////*a/////*////a///////////////////////////().Q.)Q..........)Q.....)....Q...........................)$4GHHHGw<<1<1<133ww<11:h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66665EL*45EFFFL3FGGL1LG1LLLLLLLLLLG1LLLLLLLLLLLL3LLLLL3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L4LLLLL4LLLLLL5ELLLLFLLLLGLLLL1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L5;B*4V<<<B3<==BB=BBBBBB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B4BBBBB4BBBBBBV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BBBBBBBBB&t888;D)$5O0PRVWrRs  {J  K  K  K  K4&@!ATXYkTl  BH  SY  EZ  EZ  D[  \  \  \<<DEENNPPQTUZYZZUYZZZZZZZZZZZUYZZZZZZUZZZZYZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZr   )r%   r&   )r'   r(   r)   r(   r*   r(   r+   r,   )r'   r(   )r+   r7   )
__future__r   builtinsrz   _pytest.assertion.rewrite	assertionrewriterx   )jarvis_finance.services.budget_categoriesr   &jarvis_finance.services.budget_importsr   r   r   r   r	   r
   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r   r$   r2   r6   r   r   r1   r   r   <module>r      sM   " " " " " "               M M M M M M                ; : : : : : R R R R R R R R    "J J J J J   8C 8C 8C 8Cv[ [ [ [ [ [r   