
    |j                        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mZmZ d dlmZ d dlmZ d dlmZ d	 Zd
 ZddZddZddZddZdS )    )annotationsN)confirm_create_budget_account)confirm_create_category)batch_mark_candidateslist_transaction_candidates preview_batch_confirm_candidates%seed_credit_card_candidates_from_rows)list_budget_transactions)connect_memory)apply_migrationsc                 @    t                      } t          |            | S )N)r   r   )conns    ]/home/agent/.hermes/repos/FinanceManager/tests/unit/test_budget_review_bulk_assign_confirm.pydbr      s     DTK    c           
        t          | dddd          d         }t          | ddd          d         }t          | d	dd          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             }|                     d|d         f           |                                  ||||fS )NzReview KontocashCHF)nameaccount_typecurrency	entity_idzEssen & Haushaltexpense)r   category_typezElektronische Medienz
2026-05-01APPLE.COM/BILLz9.90)DatumBeschreibungBetragz
2026-05-02GOOGLE STORAGEz2.00z
2026-05-03NETFLIXz19.90z
2026-05-04COVERED SOURCEz5.00zvisa.csvF)source_file_labelmigros_coveredT)include_referencec                ,    i | ]}|d          |d         S )descriptiontransaction_candidate_id .0rows     r   
<dictcomp>zsetup_bulk.<locals>.<dictcomp>&   s%    SSSss=!3'A#BSSSr   zdUPDATE budget_transaction_candidates SET status='covered_by_source' WHERE transaction_candidate_id=?)r   r   r	   r   executecommit)r   
account_idfood_idmedia_idrowsby_descs         r   
setup_bulkr4      sD   .tn^drw5x5xyy  {F  GJ%d5GZc,d,deefqrG&t6L_h-i-ijjkvwH)"4DPVWW"4DPVWW"IQQ"4DPVWW		
 %
 
 
 
 'ttDDDDSSdSSSGLLw  {B  CS  {T  zV  W  W  WKKMMMw'11r   returnNonec                 H	   t                      } t          |           \  }}}}t          | |d         |d         |d         g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}||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         }||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         f          	                                }|                     d|d         f          	                                }|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 }||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}||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 S )"Nr   r   r!   category2026candidate_idsactioncategory_idbudget_yearupdated_count   ==z%(py1)s == %(py4)spy1py4assert %(py6)spy6skipped_count   errorsr   candidate_idz_SELECT proposed_category_id FROM budget_transaction_candidates WHERE transaction_candidate_id=?zgSELECT proposed_category_id, status FROM budget_transaction_candidates WHERE transaction_candidate_id=?proposed_category_id)z%(py1)s == %(py3)sr1   )rE   py3assert %(py5)spy5)is)z%(py1)s is %(py4)sstatuscovered_by_sourcez^SELECT COUNT(*) FROM audit_log WHERE action IN ('batch_category_candidates','update_category')>=z%(py1)s >= %(py4)s)r   r4   r   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr-   fetchone@py_builtinslocals_should_repr_global_name)r   _account_id_food_idr1   idsresult@py_assert0@py_assert3@py_assert2@py_format5@py_format7editableblocked@py_format4@py_format6s                  r   Ytest_bulk_category_assignment_updates_only_editable_candidates_and_reports_partial_errorsrm   ,   s   44D+5d+;+;(K8S"+,c2B.CSIYEZ[  F /"'a'"a''''''''''"a'''''"''''a'''''''''''''''''''''''''''/"'a'"a''''''''''"a'''''"''''a'''''''''''''''''''''''''''(A~.G#6F2GG.2GGGGGGGGGGG.2GGGGGG.GGGG2GGGGGGGGGGGGGGGGGGGGGGGGGGGG||}  AD  EU  AV  @X  Y  Y  b  b  d  dHll  E  HK  L\  H]  G_  `  `  i  i  k  kG*+7+x7777777777+x77777+77777777777x77777x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)*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8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3333<<xyy  C  C  E  E  FG  H  M  LM  M  H  LM  M  M  M  M  M  M  M  M  M  M  H  LM  M  M  M  M  M  H  M  M  M  M  L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r   c                 &
   t                      } t          |           \  }}}}t          | |d         gd|d           |                     d|d         f           |                     d|d         f           |                                  t          | |d         |d         |d         |d	         g|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                  }||v }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }	dd|	iz  }
t          t          j
        |
                    d x}x}}d}||d                  }||v }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }	dd|	iz  }
t          t          j
        |
                    d x}x}}d}||d	                  }||v }|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}||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   r8   r9   r:   zfUPDATE budget_transaction_candidates SET status='duplicate_candidate' WHERE transaction_candidate_id=?r   zUPDATE budget_transaction_candidates SET status='transfer_candidate', classification='transfer_candidate' WHERE transaction_candidate_id=?r    r!   r;   r/   r>   countrJ   rA   rC   rD   rG   rH   c                ,    i | ]}|d          |d         S )rL   reasonr(   )r*   items     r   r,   zgtest_bulk_confirm_preview_blocks_duplicates_covered_transfer_and_missing_categories.<locals>.<dictcomp>S   s#    UUUtN#T(^UUUr   	conflicts	duplicate)in)z%(py1)s in %(py4)stransferrS   blockersduplicate_candidatestransfer_candidateswithout_categoryr   )r   r4   r   r-   r.   r   rW   rX   rY   rZ   r[   )r   r/   ra   r1   rb   previewrd   re   rf   rg   rh   reasonss               r   Stest_bulk_confirm_preview_blocks_duplicates_covered_transfer_and_missing_categoriesr~   C   s   44D*4T*:*:'J(C$s3C/D.Ejfn  }C  D  D  D  DLLy|  AQ  }R  |T  U  U  ULL  ^  ad  en  ao  `q  r  r  rKKMMM.+,c2B.CS^UXYiUjk	  G 7 q q          q         q                           UU@TUUUG8'#&6"7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888888888888888888888880Y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000000000000000000000000@'#.>*?"@@"@@@@@@@@@@@"@@@@@@@@@@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@:56;!;6!;;;;;;;;;;6!;;;;;6;;;;!;;;;;;;;;;;;;;;;;;;;;;;;;;;:45::5::::::::::5:::::5::::::::::::::::::::::::::::::::238q83q88888888883q8888838888q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:127a72a77777777772a7777727777a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77r   c                    t                      } t          |           \  }}}}|d         |d         g}t          | |d|d           t          | ||d          }t          | |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}	||	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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 |D             }t          |          }	|	sddt          j                    v st	          j        t                    rt	          j        t                    ndt	          j        |          t	          j        |	          dz  }t          t	          j        |                    d x}}	d}	d}t          | |	|          }t!          |          }d}||k    }|sst	          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        |          t	          j        |          d z  }d!d"|iz  }t          t	          j        |                    d x}	x}x}x}x}}d# t#          |           D             }t%          |          }
|
|z  }| }|sd$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't          j                    v st	          j        |          rt	          j        |          nd'd(z  }t          t	          j        |                    d x}
x}}d S ))Nr   r   r8   r9   r:   ro   confirm
preview_id)r;   r<   r/   r   r>   confirmed_countr@   rA   rC   rD   rG   rH   rI   r   zSELECT status, confirmed_transaction_id FROM budget_transaction_candidates WHERE transaction_candidate_id IN (?, ?) ORDER BY transaction_candidate_idc                    h | ]
}|d          S rR   r(   r)   s     r   	<setcomp>zktest_bulk_confirm_creates_transactions_sets_candidate_links_and_removes_from_open_review.<locals>.<setcomp>p   s    ***cCM***r   	confirmedc              3  &   K   | ]}|d          V  dS )confirmed_transaction_idNr(   r)   s     r   	<genexpr>zktest_bulk_confirm_creates_transactions_sets_candidate_links_and_removes_from_open_review.<locals>.<genexpr>q   s(      ??3s-.??????r   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}all)py0py2rF   r   )transaction_typeyear)zy%(py10)s
{%(py10)s = %(py0)s(%(py8)s
{%(py8)s = %(py1)s(%(py2)s, transaction_type=%(py4)s, year=%(py6)s)
})
} == %(py13)slenr
   r   )r   rE   r   rF   rH   py8py10py13zassert %(py15)spy15c                    h | ]
}|d          S )r'   r(   r)   s     r   r   zktest_bulk_confirm_creates_transactions_sets_candidate_links_and_removes_from_open_review.<locals>.<setcomp>s   s    ]]]C./]]]r   z<assert not (%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} & %(py4)s)setselectedopen_ids)r   rE   rN   rF   )r   r4   r   r   rW   rX   rY   rZ   r[   r-   fetchallr   r]   r^   r_   r
   r   r   r   )r   r/   ra   r1   rb   r   r|   rc   rd   re   rf   rg   rh   r2   @py_assert1@py_assert5@py_assert7@py_assert9@py_assert12@py_assert11@py_format14@py_format16r   @py_assert6s                           r   Xtest_bulk_confirm_creates_transactions_sets_candidate_links_and_removes_from_open_reviewr   ]   s   44D*4T*:*:'J(C$%s+;'<=H$hzW_mstttt.t8XbpvwwwG"<(  F #$))$))))))))))$)))))$)))))))))))))))))))))))))))))))/"'a'"a''''''''''"a'''''"''''a'''''''''''''''''''''''''''<<  p  rz  {  {  D  D  F  FD**T***;{m;*m;;;;;;;;;;*m;;;;;*;;;;m;;;;;;;;;;;;;;;;;;;;;;;;;;;??$????3????????????????3?????3????????????????????????????????H\v\'yvVVV\3VWW\[\\W[\\\\\\\\\\\W[\\\\\\\\\\\\\3\\\\\3\\\\\\\\\\\\\'\\\\\'\\\\\\\\\\\\\\\\\\\\\\\\y\\\\v\\\\V\\\\W\\\\[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]];VW[;\;\]]]H8}}'}x'''''''''''''''''s'''''s'''''''''''''8'''''8''''''}'''''''''''x'''''x'''''''''''''''''''''''''r   c                    t                      } t          |           \  }}}}|d         |d         g}t          | |dd          }t          | |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}	||	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    }|st          j        d|fd||
f          dt          j                    v st          j        |          rt          j        |          ndt          j        |
          dz  }dd|iz  }t          t          j        |                    d 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 S )Nr   r   ignorer9   )r;   r<   r>   reopenignored_countr@   rA   rC   rD   rG   rH   reopened_countc                    h | ]
}|d          S r   r(   r)   s     r   r   zMtest_bulk_ignore_and_reopen_multiple_candidates_with_audit.<locals>.<setcomp>   s.      i  i  i#H  i  i  ir   zYSELECT status FROM budget_transaction_candidates WHERE transaction_candidate_id IN (?, ?)pendingneeds_review)<=)z%(py0)s <= %(py3)sstatuses)r   rN   rO   rP   zvSELECT COUNT(*) FROM audit_log WHERE action IN ('batch_ignore_candidates','batch_reopen_candidates','ignore','reopen')r      rT   rV   )r   r4   r   rW   rX   rY   rZ   r[   r-   r   r]   r^   r_   r\   )r   r`   ra   	_media_idrb   r   ignoredreopenedrd   re   rf   rg   rh   r   r   rk   rl   s                    r   :test_bulk_ignore_and_reopen_multiple_candidates_with_auditr   w   sq   44D,6t,<,<)K9c$%s+;'<=H#D_efffG$T(`fgggH?#(q(#q((((((((((#q(((((#((((q((((((((((((((((((((((((((($%**%**********%*****%******************************* i  i  7R  T\  *]  *]  *f  *f  *h  *h  i  i  iH!>22822222222222822222222222228222228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<<  Q  R  R  [  [  ]  ]  ^_  `  e  de  e  `  de  e  e  e  e  e  e  e  e  e  e  `  de  e  e  e  e  e  `  e  e  e  e  de  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  er   )r5   r6   )
__future__r   builtinsr]   _pytest.assertion.rewrite	assertionrewriterW   'jarvis_finance.services.budget_accountsr   )jarvis_finance.services.budget_categoriesr   &jarvis_finance.services.budget_importsr   r   r   r	   +jarvis_finance.services.budget_transactionsr
   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r4   rm   r~   r   r   r(   r   r   <module>r      sM   " " " " " "               Q Q Q Q Q Q M M M M M M            Q P P P P P : : : : : : > > > > > >  2 2 2,M M M M.8 8 8 84( ( ( (4e e e e e er   