
    pj                        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 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 )*    )annotationsN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    c/home/agent/.hermes/worktrees/FinanceManager-sprint20d/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pendingz
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                 Z	   t                      } t          |           }t          |           }t          | ddd|d           t          | dd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 t          | 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 t          | 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}}	 t          | d||dd           t          d          # t          $ r^}	g }
d}t          |	          }||v }|}|sd}t          |	          }||v }|}|st          j        d|fd||f          t          j        |          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        |          d z  }d!d"|iz  }|
                    |           |st          j        d|fd#||f          t          j        |          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        |          d$z  }d%d&|iz  }|
                    |           t          j        |
d
          i z  }d'd(|iz  }t          t          j	        |                    d x}x}
x}x}x}x}x}}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&   ==z%(py1)s == %(py4)spy1py4assert %(py6)spy6c                    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 rB   rD   rE   s     r   rH   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)tabrJ   include_reference)
account_idr)   rJ   z22025 reference candidate must not confirm normallyzDuplikat/covered/ignoredzoutside active budget yearin)z0%(py3)s in %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}r   exc)py3py5r@   py8z%(py10)spy10)z5%(py13)s in %(py18)s
{%(py18)s = %(py15)s(%(py16)s)
})py13py15py16py18z%(py20)spy20zassert %(py23)spy23)r   r   r#   r6   r	   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr   r
   	Exceptionr   @py_builtinslocals_should_repr_global_nameappend_format_boolop)r   catacctresult@py_assert0@py_assert3@py_assert2@py_format5@py_format7rS   @py_assert1@py_assert7@py_assert4@py_assert12@py_assert17@py_assert14@py_format9@py_format11@py_format19@py_format21@py_format22@py_format24s                         r   Otest_2025_candidates_are_marked_reference_and_not_in_2026_review_or_confirmabler}   *   s   44Dx~~gdmmtzJ\s[deeeezJ\s[deeee.t44F.!&Q&!Q&&&&&&&&&&!Q&&&&&!&&&&Q&&&&&&&&&&&&&&&&&&&&&&&&&&&ii3Ntag3h3h3hiiiynxmyyimyyyyyyyyyyyimyyyyyyiyyyymyyyyyyyyyyyyyyyyyyyyyyyyyyyy X  X3NtYiw}  RV  4W  4W  4W  X  X  X  h  ]g  \h  h  X  \h  h  h  h  h  h  h  h  h  h  h  X  \h  h  h  h  h  h  X  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S%dJt\_pv8w8wxxx QRRR  b b baa)aSXXa)X5aaaaa9UaY\]`YaYaa9UYa9aaaaaaaaaaaa)Xaaaaa)aaaaaaaaaaaSaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaX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a9UYaaaaaa9UaaaaaaaaaaaY\aaaaaY\aaaaaaaaaaaaa]`aaaaa]`aaaaaaYa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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aaaaaaaaaaabs   I R*IR%%R*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    }|slt          j        d*|fd+||f          t          j        |          t          j        |          d,z  }d-d.|iz  }t          t          j
        |                    d x}x}}|d/         d0         d1         d         d2         }d3}||k    }|slt          j        d4|fd5||f          t          j        |          t          j        |          d,z  }d-d.|iz  }t          t          j
        |                    d x}x}}|d/         d6         d2         }d7}||k    }|slt          j        d4|fd5||f          t          j        |          t          j        |          d,z  }d-d.|iz  }t          t          j
        |                    d x}x}}|d/         d8         d2         }d7}||k    }|slt          j        d4|fd5||f          t          j        |          t          j        |          d,z  }d-d.|iz  }t          t          j
        |                    d x}x}}|d/         d9         d:         }d7}||k    }|slt          j        d4|fd5||f          t          j        |          t          j        |          d,z  }d-d.|iz  }t          t          j
        |                    d x}x}}|d/         d9         d;         }d7}||k    }|slt          j        d4|fd5||f          t          j        |          t          j        |          d,z  }d-d.|iz  }t          t          j
        |                    d x}x}}|d/         d<         d2         }d7}||k    }|slt          j        d4|fd5||f          t          j        |          t          j        |          d,z  }d-d.|iz  }t          t          j
        |                    d x}x}}|d/         d=         d2         }d7}||k    }|slt          j        d4|fd5||f          t          j        |          t          j        |          d,z  }d-d.|iz  }t          t          j
        |                    d x}x}}t          |d>         d?         d@                   }d}||v }|st          j        dA|fdB||f          t          j        |          dCt          j                    v st          j        |          rt          j        |          ndCdDz  }	dEdF|	iz  }
t          t          j
        |
                    d x}}d#}||v}|st          j        dG|fdH||f          t          j        |          dCt          j                    v st          j        |          rt          j        |          ndCdDz  }	dEdF|	iz  }
t          t          j
        |
                    d x}}d}||v}|st          j        dG|fdH||f          t          j        |          dCt          j                    v st          j        |          rt          j        |          ndCdDz  }	dEdF|	iz  }
t          t          j
        |
                    d x}}|d>         d8         d@         }dg}||k    }|slt          j        d4|fd5||f          t          j        |          t          j        |          d,z  }d-d.|iz  }t          t          j
        |                    d x}x}}dI}t          |          }|j        } |            }||v}|st          j        dG|fdJ||f          t          j        |          dKt          j                    v st          j        t                    rt          j        t                    ndKdLt          j                    v st          j        |          rt          j        |          ndLt          j        |          t          j        |          t          j        |          dMz  }dNdO|iz  }t          t          j
        |                    d x}x}x}x}}d S )PN
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   )>=)z%(py1)s >= %(py4)sr<   r?   r@   groupswithout_categorymerchant_groupscount   r9   r;   galaxus_digitecr&   migros_bonsakb_raiffeisen	akb_countraiffeisen_count
duplicates	fixkostenconfirm_groupssafe_subscriptionscandidate_idsrQ   )z%(py1)s in %(py3)ssafe_idsr=   rT   assert %(py5)srU   )not in)z%(py1)s not in %(py3)samount)zh%(py1)s not in %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}.lower
}()
}repr	dashboard)r=   rT   r>   r@   rV   rW   zassert %(py12)spy12)r   r   r6   r4   r5   r   r^   r_   r`   ra   rb   setrd   re   rf   r   lower)r   ri   r   rl   rm   rn   ro   rp   r   @py_format4@py_format6@py_assert5rr   @py_assert9rx   @py_format13s                   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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X123DEaHQVUVVQUVVVVVVVVVVVQUVVVVVVQVVVVUV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X01':?a?:a??????????:a?????:????a???????????????????????????X}-g6;!;6!;;;;;;;;;;6!;;;;;6;;;;!;;;;;;;;;;;;;;;;;;;;;;;;;;;X/0=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BBBBX/01CDIIDIIIIIIIIIIDIIIIID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X|,W5::5::::::::::5:::::5:::::::::::::::::::::::::::::::X{+G49949999999999499999499999999999999999999999999999999-./CD_UVVH 9          9     9                                            5          5     5                                           &;h&&&&&&&&&&;h&&&&&;&&&&&&&&&&&h&&&&&h&&&&&&&&&&&&&&&&&&&&&&&&&&&%&}5oFX<.XF.XXXXXXXXXXF.XXXXXF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XXX24	??2?020022282222222222282222228222222222224222224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20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22222222222r   c                 |   t                      } t          |           }t          | dd|dd           |                     d                                          d         }|                     d                                          d         }t          |            |                     d                                          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                                          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 S )NsafezOpenAI ChatGPTr   r   r   z2SELECT COUNT(*) FROM budget_transaction_candidatesz(SELECT COUNT(*) FROM budget_transactionsr9   )z%(py1)s == %(py3)sbefore_candidatesr   r   rU   	before_tx)r   r   r6   r4   fetchoner   r^   r_   r`   rd   re   rf   ra   rb   )r   ri   r   r   rl   rn   r   r   s           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ppppppp[_pppppp[ppppppppppp_pppppp_pppppppppppppppppppppppppppp<<BCCLLNNqQ^QU^^^^^^^^^^^QU^^^^^^Q^^^^^^^^^^^U^^^^^^U^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^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   builtinsrd   _pytest.assertion.rewrite	assertionrewriter^   '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   r}   r   r   rD   r   r   <module>r      s   " " " " " "               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   