
    |j                        d dl 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y)    )annotations)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                 0    t               } t        |        | S )N)r   r   )conns    4tests/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 ci c]  }|d   |d    }}| j	                  d|d   f       | j                          ||||fS c c}w )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_referencedescriptiontransaction_candidate_idzdUPDATE 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rowby_descs          r   
setup_bulkr/      s   .tn^drw5xy  {F  GJ%d5GZc,defqrG&t6L_h-ijkvwH)"4DPVW"4DPVW"IQ"4DPVW		
 %
 'ttDDNRSss=!3'A#BBSGSLLw  {B  CS  {T  zV  WKKMw'11 Ts   ,B*c                    t               } t        |       \  }}}}t        | |d   |d   |d   gd|d      }|d   dk(  sJ |d	   d
k(  sJ |d   d   d   |d   k(  sJ | j                  d|d   f      j	                         }| j                  d|d   f      j	                         }|d   |k(  sJ |d   J |d   dk(  sJ | j                  d      j	                         d   dk\  sJ y )Nr   r   r!   category2026candidate_idsactioncategory_idbudget_yearupdated_count   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statuscovered_by_sourcez^SELECT COUNT(*) FROM audit_log WHERE action IN ('batch_category_candidates','update_category'))r   r/   r   r'   fetchone)r   _account_id_food_idr+   idsresulteditableblockeds           r   Ytest_bulk_category_assignment_updates_only_editable_candidates_and_reports_partial_errorsrH   ,   s   4D+5d+;(K8S"+,c2B.CSIYEZ[F /"a'''/"a'''(A~.#6F2GGGG||}  AD  EU  AV  @X  Y  b  b  dHll  E  HK  L\  H]  G_  `  i  i  kG*+x777)*2228 3333<<xy  C  C  E  FG  H  LM  M  M  Mr   c                    t               } t        |       \  }}}}t        | |d   gd|d       | j                  d|d   f       | j                  d|d   f       | j	                          t        | |d   |d   |d   |d	   g|d
      }|d   dk(  sJ |d   D ci c]  }|d   |d    }}d||d      v sJ d||d      v sJ d||d	      v sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ y c c}w )Nr   r1   r2   r3   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!   r4   r)   r7   countr;   	conflictsr=   reason	duplicatetransferr@   blockersduplicate_candidatestransfer_candidateswithout_categoryr   )r   r/   r   r'   r(   r   )r   r)   rC   r+   rD   previewitemreasonss           r   Stest_bulk_confirm_preview_blocks_duplicates_covered_transfer_and_missing_categoriesrW   C   s   4D*4T*:'J(C$s3C/D.Ejfn  }C  DLLy|  AQ  }R  |T  ULL  ^  ad  en  ao  `q  rKKM.+,c2B.CS^UXYiUjk	G 7q   @G@TUtN#T(^3UGU'#&6"78888Y0000'#.>*?"@@@@:56!;;;:45::::23q888:12a777 Vs   Dc                    t               } t        |       \  }}}}|d   |d   g}t        | |d|d       t        | ||d      }t        | |d||d   d	      }|d
   dk(  sJ |d   dk(  sJ | j	                  d|      j                         }|D 	ch c]  }	|	d   	 c}	dhk(  sJ t        d |D              sJ t        t        | dd            dk(  sJ t        |       D 	ch c]  }	|	d   	 }
}	t        |      |
z  rJ y c c}	w c c}	w )Nr   r   r1   r2   r3   rJ   confirm
preview_id)r4   r5   r)   rZ   r7   confirmed_countr9   r:   r   zSELECT status, confirmed_transaction_id FROM budget_transaction_candidates WHERE transaction_candidate_id IN (?, ?) ORDER BY transaction_candidate_idr?   	confirmedc              3  &   K   | ]	  }|d      yw)confirmed_transaction_idN ).0r-   s     r   	<genexpr>zktest_bulk_confirm_creates_transactions_sets_candidate_links_and_removes_from_open_review.<locals>.<genexpr>q   s     ?3s-.?s   r   )transaction_typeyearr&   )r   r/   r   r   r'   fetchallalllenr
   r   set)r   r)   rC   r+   rD   selectedrT   rE   r,   r-   open_idss              r   Xtest_bulk_confirm_creates_transactions_sets_candidate_links_and_removes_from_open_reviewrj   ]   s^   4D*4T*:'J(C$%s+;'<=H$hzW_mst.t8XbpvwG"<(F #$)))/"a'''<<  p  rz  {  D  D  FD%)*cCM*{m;;;?$????'yvVW[\\\\;VW[;\]C./]H]8}x''''	 + ^s   D"Dc                 z   t               } t        |       \  }}}}|d   |d   g}t        | |dd      }t        | |dd      }|d   dk(  sJ |d	   dk(  sJ | j                  d
|      j	                         D ch c]  }|d   	 }	}|	ddhk  sJ | j                  d      j                         d   dk\  sJ y c c}w )Nr   r   ignorer2   )r4   r5   r7   reopenignored_countr9   reopened_countzYSELECT status FROM budget_transaction_candidates WHERE transaction_candidate_id IN (?, ?)r?   pendingneeds_reviewzvSELECT COUNT(*) FROM audit_log WHERE action IN ('batch_ignore_candidates','batch_reopen_candidates','ignore','reopen')r      )r   r/   r   r'   rd   rA   )
r   rB   rC   	_media_idrD   rh   ignoredreopenedr-   statusess
             r   :test_bulk_ignore_and_reopen_multiple_candidates_with_auditrw   w   s(   4D,6t,<)K9c$%s+;'<=H#D_efG$T(`fgH?#q((($%***)-  7R  T\  *]  *f  *f  *h  i#H  iH  i	>2222<<  Q  R  [  [  ]  ^_  `  de  e  e  e is   9B8N)returnNone)
__future__r   '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   r/   rH   rW   rj   rw   r_   r   r   <module>r      sD    " Q M  Q : >2,M.84(4er   