
    j                        d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
mZ d dlmZ d dlmZ d Zddd	Zdd
ZddddddddddZddZddZddZy)    )annotationsconfirm_create_budget_accountconfirm_create_category)build_review_backlog_dashboard!mark_2025_candidates_as_reference)confirm_transaction_candidatelist_transaction_candidates)connect_memory)apply_migrationsc                 0    t               } t        |        | S )N)r   r   conns    ,tests/unit/test_review_backlog_cleanup_v1.pydbr      s    DTK    c                &    t        | |dd      d   S )Nexpense)namecategory_type	entity_idr   )r   r   s     r   categoryr      s    "4$)STU`aar   c                (    t        | dddd      d   S )NBudgetcashCHF)r   account_typecurrencyr   r   r   s    r   accountr       s    (RXfk/lmnyzzr   visa_credit_cardpendingNz
2026-03-10z0.70r      )source_typestatuscategory_iddate
confidenceclassificationrequires_reviewc               j    | j                  d|| d|||||||||	|||f       | j                          y )Nao  
        INSERT INTO budget_transaction_candidates(
            transaction_candidate_id, source_file_label, source_row_or_range, source_type,
            transaction_date, description, merchant, amount_original, currency_original,
            proposed_category_id, proposed_category_name, confidence, requires_review, status,
            classification, review_reason, raw_fingerprint, created_at, updated_at
        ) VALUES (?, ?, ?, ?, ?, ?, ?, '0.00', 'CHF', ?,
            CASE WHEN ? IS NULL THEN NULL ELSE 'Kategorie' END, ?, ?, ?, ?,
            'fixture', ?, '2026-01-01T00:00:00', '2026-01-01T00:00:00')
        z.csv)executecommit)
r   cidmerchantr$   r%   r&   r'   r(   r)   r*   s
             r   candr0      sa    LL		 
T"CdHhP[]hjt  wF  HN  P^  `c  	d 	KKMr   c                     t               } t        |       }t        |       }t        | ddd|d       t        | ddd|d       t	        |       }|d	   d
k(  sJ t        | d      D ch c]  }|d   	 c}dhk(  sJ t        | ddd      D ch c]  }|d   	 c}dhk(  sJ 	 t        | d||dd       t        d      c c}w c c}w # t        $ r+}dt        |      v sdt        |      v sJ Y d }~y Y d }~y d }~ww xY w)Nzold-openzOld Shopz
2025-08-01r"   )r/   r'   r&   r%   znew-openzNew Shopz
2026-02-01marked_countr#   2026)budget_yeartransaction_candidate_idreference_20252025T)tabr4   include_reference)
account_idr&   r4   z22025 reference candidate must not confirm normallyzDuplikat/covered/ignoredzoutside active budget year)
r   r   r    r0   r	   r   r
   AssertionError	Exceptionstr)r   catacctresultrexcs         r   Otest_2025_candidates_are_marked_reference_and_not_in_2026_review_or_confirmablerC   *   sF   4Dx~gdmtzJ\s[dezJ\s[de.t4F.!Q&&&3Ntag3hiaA()inxmyyyy3NtYiw}  RV  4W  XaA()  X  ]g  \h  h  h  hS%dJt\_pv8wx QRR j X  b)SX59UY\]`Ya9aaa9a5bs$   'B?C#C	 		C=C88C=c            	     f   t               } t        | d      }t        | ddd d       t        | ddd d       t        | dd	d d
       t        | ddd|dd       t        | dddd|       t        | dddd d       t        | dddd d       t        | dd |d!d"       t        | d#d |d$%       | j                  d&|f       | j	                          t        |       }|d'   d(   d)k\  sJ |d*   d+   d,   d   d-   d.k(  sJ |d*   d/   d-   d0k(  sJ |d*   d1   d-   d0k(  sJ |d*   d2   d3   d0k(  sJ |d*   d2   d4   d0k(  sJ |d*   d5   d-   d0k(  sJ |d*   d6   d-   d0k(  sJ t        |d7   d8   d9         }d|v sJ d#|vsJ d|vsJ |d7   d1   d9   dgk(  sJ d:t        |      j                         vsJ y );N
Elektronikzuncat-aApplez0.40)r/   r&   r(   zuncat-bz0.55galaxusGalaxusgalaxus_review)r/   r&   r)   z
migros-bonMigrosmigros_receiptmigros_receipt_food_householdr   )r/   r$   r&   r)   r*   z	cc-migrosr!   covered_by_migros)r/   r$   r%   r&   akbzAKB Transferakb_banktransfer_candidate)r/   r$   r&   r)   raiffzRaiffeisen Lohnraiffeisen_bankincome_candidatenetflixNetflix0.95r/   r&   r(   r*   dupduplicate_candidate)r/   r&   r%   a<  INSERT INTO budget_recurring_payments(recurring_id,name,merchant_name,category_id,expected_amount_text,currency,frequency,recurring_type,status,source,confidence,created_at,updated_at) VALUES ('rec1','Netflix','Netflix',?,'0.00','CHF','monthly','subscription','candidate','detected','0.90','2026-01-01','2026-01-01')headercandidates_without_category   groupswithout_categorymerchant_groupscount   galaxus_digitecr#   migros_bonsakb_raiffeisen	akb_countraiffeisen_count
duplicates	fixkostenconfirm_groupssafe_subscriptionscandidate_idsamount)	r   r   r0   r,   r-   r   setreprlower)r   r>   	dashboardsafe_idss       r   Ytest_review_backlog_groups_without_category_migros_galaxus_bank_fixkosten_and_safe_groupsrr   <   s{   4Dxl3y7Py7Py9$O_`|h<LZ]  oN  `a  b{X;MViwz{u~:SWh|}w!2@Q_c  uG  Hy9#&bcduycBWXLL  P  SV  RX  YKKM.t4IX<=BBBX123DEaHQUVVVVX01':a???X}-g6!;;;X/0=BBBX/01CDIIIX|,W5:::X{+G49999-./CD_UVH      h&&&%&}5oF<.XXX4	?002222r   c                    t               } t        |       }t        | dd|dd       | j                  d      j	                         d   }| j                  d      j	                         d   }t        |        | j                  d      j	                         d   |k(  sJ | j                  d      j	                         d   |k(  sJ y )NsafezOpenAI ChatGPTrV   r   rW   z2SELECT COUNT(*) FROM budget_transaction_candidatesz(SELECT COUNT(*) FROM budget_transactions)r   r   r0   r,   fetchoner   )r   r>   before_candidates	before_txs       r   =test_review_backlog_is_read_only_and_does_not_create_bookingsrx   \   s    4Dx~v 0cffgh%YZccefghGHQQSTUVI"4(<<LMVVXYZ[_pppp<<BCLLNqQU^^^^r   )zEssen & Haushalt)returnr=   )r.   r=   r/   r=   r$   r=   r%   r=   r&   z
str | Noner'   r=   r(   r=   r)   r=   r*   intry   None)ry   r{   )
__future__r   'jarvis_finance.services.budget_accountsr   )jarvis_finance.services.budget_categoriesr   ,jarvis_finance.services.budget_import_statusr   r	   &jarvis_finance.services.budget_importsr
   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r   r    r0   rC   rr   rx    r   r   <module>r      sn    " Q M z m : >b{ ?Q`i  FJ  Xd  x~  V_  xy "S$3@	_r   