
    pj                        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dS )*    )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                 @    t                      } t          |            | S )N)r   r   conns    ,tests/unit/test_review_backlog_cleanup_v1.pydbr      s     DTK    Essen & Haushaltreturnstrc                4    t          | |dd          d         S )Nexpense)namecategory_type	entity_idr   )r   r   s     r   categoryr      s     "4$)S)STTU`aar   c                6    t          | dddd          d         S )NBudgetcashCHF)r   account_typecurrencyr   r   r   s    r   accountr#      s$    (RXfk/l/lmmnyzzr   visa_credit_cardpendingNz
2026-03-10z0.70r      )source_typestatuscategory_iddate
confidenceclassificationrequires_reviewcidmerchantr'   r(   r)   
str | Noner*   r+   r,   r-   intNonec               |    |                      d|| d|||||||||	|||f           |                                  d S )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   r.   r/   r'   r(   r)   r*   r+   r,   r-   s
             r   candr6      su    LL		 
"""CdHhP[]hjt  wF  HN  P^  `c  	d   	KKMMMMMr   c                 B   t                      } t          |           }t          |           }t          | ddd|d           t          | ddd|d           t	          |           }|d	         d
k    sJ d t          | d          D             dhk    sJ d t          | ddd          D             dhk    sJ 	 t          | d||dd           t          d          # t          $ r5}dt          |          v sdt          |          v sJ Y d }~d S Y d }~d S 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&   c                    h | ]
}|d          S transaction_candidate_id .0rs     r   	<setcomp>zbtest_2025_candidates_are_marked_reference_and_not_in_2026_review_or_confirmable.<locals>.<setcomp>2   s    iiiaA()iiir   2026)budget_yearc                    h | ]
}|d          S r:   r<   r=   s     r   r@   zbtest_2025_candidates_are_marked_reference_and_not_in_2026_review_or_confirmable.<locals>.<setcomp>3   s0      X  X  XaA()  X  X  Xr   reference_20252025T)tabrB   include_reference)
account_idr)   rB   z22025 reference candidate must not confirm normallyzDuplikat/covered/ignoredzoutside active budget year)
r   r   r#   r6   r	   r   r
   AssertionError	Exceptionr   )r   catacctresultexcs        r   Otest_2025_candidates_are_marked_reference_and_not_in_2026_review_or_confirmablerO   *   s   44Dx~~gdmmtzJ\s[deeeezJ\s[deeee.t44F.!Q&&&&ii3Ntag3h3h3hiiinxmyyyyy X  X3NtYiw}  RV  4W  4W  4W  X  X  X  ]g  \h  h  h  h  hS%dJt\_pv8w8wxxx QRRR  b b b)SXX559UY\]`YaYa9a9a9aa5555559a9a9a9a9a9abs   ;C 
D)$DDc            	        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$%           |                     d&|f           |                                  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          |                                          vsJ d S );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   r6   r4   r5   r   setreprlower)r   rK   	dashboardsafe_idss       r   Ytest_review_backlog_groups_without_category_migros_galaxus_bank_fixkosten_and_safe_groupsr~   <   s+   44Dxl33y7PPPPy7PPPPy9$O_````|h<LZ]  oN  `a  b  b  b  b{X;MViwz{{{{u~:SWh|}}}}w!2@Q_c  uG  H  H  H  Hy9#&bcdddduycBWXXXXLL  P  SV  RX  Y  Y  YKKMMM.t44IX<=BBBBX123DEaHQUVVVVVX01':a????X}-g6!;;;;X/0=BBBBX/01CDIIIIX|,W5::::X{+G499999-./CD_UVVH        h&&&&%&}5oF<.XXXX4	??0022222222r   c                    t                      } t          |           }t          | dd|dd           |                     d                                          d         }|                     d                                          d         }t          |            |                     d                                          d         |k    sJ |                     d                                          d         |k    sJ d S )NsafezOpenAI ChatGPTrb   r   rc   z2SELECT COUNT(*) FROM budget_transaction_candidatesz(SELECT COUNT(*) FROM budget_transactions)r   r   r6   r4   fetchoner   )r   rK   before_candidates	before_txs       r   =test_review_backlog_is_read_only_and_does_not_create_bookingsr   \   s    44Dx~~v 0cffghhhh%YZZcceefghGHHQQSSTUVI"4(((<<LMMVVXXYZ[_ppppp<<BCCLLNNqQU^^^^^^^r   )r   )r   r   )r.   r   r/   r   r'   r   r(   r   r)   r0   r*   r   r+   r   r,   r   r-   r1   r   r2   )r   r2   )
__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#   r6   rO   r~   r   r<   r   r   <module>r      so   " " " " " " Q Q Q Q Q Q M M M M M M z z z z z z z z m m m m m m m m : : : : : : > > > > > >  b b b b b{ { { { ?Q`i  FJ  Xd  x~  V_  xy      "S S S S$3 3 3 3@	_ 	_ 	_ 	_ 	_ 	_r   