
    ܴ
jV                        d dl mZ 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mZ d dl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y)    )annotations)Decimal)confirm_create_budget_account)confirm_create_category)confirm_migros_receipts_2026list_transaction_candidatespreview_migros_receipts_2026%seed_credit_card_candidates_from_rows seed_migros_candidates_from_rows)get_budget_status_by_categoryget_category_month_detail)confirm_budget_plan_item)connect_memory)apply_migrationsc                 0    t               } t        |        | S )N)r   r   )conns    ;tests/unit/test_budget_phase111_migros_monthly_analytics.pydbr      s    DTK    c                ~    t        | dddd      d   }t        | dddd	      d   }t        | d
ddd	      d   }|||fS )NBudgetkontocashCHF)nameaccount_typecurrency	entity_idzEssen & Haushaltexpense
   )r   category_type
sort_orderzSonstiges / AdministrationZ   )r   r   )r   accountfoodothers       r   baser&      sw    +D=Z`ns2tu  wB  CG"42DW`pr)st  vA  BD#D3Obk{}*~  AL  MED%r   c            
        t               } t        |       \  }}}dddddddddddddd	d
dddddddddg}t        | |d|d      }|d   dk(  sJ t        | dd      }t	        |      dk(  sJ |D ch c]  }|d   	 c}|hk(  sJ |D ch c]  }|d   	 c}dhk(  sJ t        d |D              sJ t        d |D              sJ t        |       }|d   dk(  sJ |d   dk(  sJ |d   d k(  sJ |d!   d"k(  sJ d#|vsJ t        | |$      }	|	d%   dk(  sJ |	d&   d"k(  sJ |	d'   sJ | j                  d(      j                         }
t	        |
      dk(  sJ |
D ch c]  }|d)   	 c}|hk(  sJ t        d* |
D              sJ | j                  d+      j                         d"   d k(  sJ | j                  d,      j                         d"   d-k\  sJ y c c}w c c}w c c}w ).Nz
03.01.202610:00Migros Test1ABrotz30.00DatumZeitFilialeKasseTransaktionArtikelUmsatzHaushaltz31.00z
04.01.2026z11:002BMilchz12.00
migros.csvz50.00)source_file_labelauto_category_idthreshold_chfreceipt_candidate_count   migros_receiptT)source_typeinclude_referenceproposed_category_idstatusauto_categorizedc              3  *   K   | ]  }|d    du   yw)requires_reviewFN .0cs     r   	<genexpr>z~test_migros_receipts_are_always_food_household_and_can_be_confirmed_with_audit_without_article_transactions.<locals>.<genexpr>.   s     Aq"#u,As   c              3  ,   K   | ]  }|d    dk(    yw)classificationmigros_receipt_food_householdNrG   rH   s     r   rK   z~test_migros_receipts_are_always_food_household_and_can_be_confirmed_with_audit_without_article_transactions.<locals>.<genexpr>/   s     Z!q!"&EEZs   open_receipt_countline_item_count   covered_by_migros_countr   amount
account_idconfirmed_countline_item_transaction_countaudit_idzFSELECT * FROM budget_transactions WHERE source_type='import_candidate'category_idc              3  <   K   | ]  }d |d   vxr d|d   v  yw)r,   descriptionr8   NrG   )rI   rows     r   rK   z~test_migros_receipts_are_always_food_household_and_can_be_confirmed_with_audit_without_article_transactions.<locals>.<genexpr>?   s-     iZ]vS//UG3}CU4UUis   z-SELECT COUNT(*) FROM budget_import_line_itemszgSELECT COUNT(*) FROM audit_log WHERE action IN ('migros_receipts_2026_confirmed','candidate_confirmed')   )r   r&   r   r   lenallr	   r   executefetchallfetchone)r   r#   r$   _otherrowsseed
candidatesrJ   preview	confirmedtx_rowsr\   s               r   ktest_migros_receipts_are_always_food_household_and_can_be_confirmed_with_audit_without_article_transactionsrj   !   s   4Dd&$MTWhkx~  KR  	SMTWhk  yC  OV  	WMTWhkx  LS  	TD
 ,D$,im  ~E  FD)*a///,T?OcghJz?a/9:!A$%:tfDDD!+,AAhK,1C0DDDDAjAAAAZzZZZZ*40G,-222'(A---$%***,-2227""",TgFI&'1,,,23q888Z   llcdmmoGw<1*123C2tf<<<iahiiii<<GHQQSTUVZ[[[[<<  B  C  L  L  N  OP  Q  UV  V  V  V+ ;," 3s   3GGGc                 v   t               } t        |       \  }}}t        | ddddddddgd	|
       t        | ddddgdd       t	        |       }|d   dk(  sJ t        | |       | j                  d      j                         d   dk(  sJ t        | dd      }t        |      dk(  sJ |d   d   dk(  sJ y )Nz
05.01.2026r(   r)   r*   r+   Bonz44.00r-   r9   r:   r;   z
MIGROS MMM)r.   BeschreibungBetragzcard.csvT)r:   migros_coveredrR   r]   rT   zNSELECT COUNT(*) FROM budget_transactions WHERE description LIKE '%MIGROS MMM%'r   covered_by_migros)rC   rA   rC   )
r   r&   r   r
   r	   r   r`   rb   r   r^   )r   r#   r$   rc   rg   covereds         r   Otest_credit_card_migros_stays_covered_and_is_not_confirmed_as_duplicate_expensers   D   s   4Dd&$$TlG`mx{  MP  ]b  nu  -v  ,w  KW  jn  o)$<Yeqx1y0z  OY  jn  o*40G,-222 ':<<hirrtuvw{||||)$7J^bcGw<11:h#6666r   c                 X   t               } t        |       \  }}t        | ddddd       t        | dddd	d
ddddddd	ddddgd       t	        | |       t        | d      }t        fd|D              }t        d |d   D              }t        d |d   D              }|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ |d   d k(  sJ |d   dk(  sJ |d   d!k(  sJ |d   d"k(  sJ t        | d#      }|d$   k(  sJ |d%   dk(  sJ |d&   dk(  sJ |d   dk(  sJ |d'   d(k(  sJ t        |d)         t        d(      k(  sJ |d   dk(  sJ |d*   sJ |d+   d,v sJ t        |d-         d.k(  sJ |d-   d/   d$   k(  sJ |d-   d/   d0   d.k(  sJ d1|v sJ d2|d1   v rd3|d1   v sJ y )4N2026-01z	Food planz100.00monthly)
plan_monthrY   r   monthly_amount_chfcadencez
10.01.2026r(   zMigros Ar*   r+   rl   z120.00r-   z
11.02.2026zMigros Br7   z40.00r9   rm   rT   2026)yearc              3  4   K   | ]  }|d    k(  s|  yw)rY   NrG   )rI   rr$   s     r   rK   zQtest_budgetstatus_monthly_analytics_and_month_detail_groupings.<locals>.<genexpr>\   s     @!q'74'?A@s   c              3  2   K   | ]  }|d    dk(  s|  yw)monthru   NrG   rI   ms     r   rK   zQtest_budgetstatus_monthly_analytics_and_month_detail_groupings.<locals>.<genexpr>]        RQ!G*	:QqR   monthly_analysisc              3  2   K   | ]  }|d    dk(  s|  yw)r   z2026-02NrG   r   s     r   rK   zQtest_budgetstatus_monthly_analytics_and_month_detail_groupings.<locals>.<genexpr>^   r   r   
actual_chf
budget_chfrC   Rot	bar_colorredu   Grüngreen)rY   r   rY   r   budget_monthdifference_chfz20.00difference_percent	breakdownbreakdown_mode>   sourcemerchanttransactionsr]   r   rP   expense_filter_urlz	year=2026zmonth=2026-01)
r   r&   r   r   r   r   nextr   r   r^   )	r   r#   r%   rd   food_rowjanfebdetailr$   s	           @r   >test_budgetstatus_monthly_analytics_and_month_detail_groupingsr   R   s   4DT
%$T)DZe  ~F  S\  $]  ^$TJQTehuz  GO  	PJQTehuz  GN  	O, &> !':(F;D@t@@H
R(#56R
RC
R(#56R
RC|(((|(((x=E!!!{u$$$|'''x=G###{w&&&&tYOF- D((('?i'''.!X---,8+++"#w...6./0GG4DDDD(u$$$+"#'====vn%&!+++.!!$]3t;;;.!!$%671<<<6)))&!566?fUiNj;jjj;jr   N)returnNone)
__future__r   decimalr   'jarvis_finance.services.budget_accountsr   )jarvis_finance.services.budget_categoriesr   &jarvis_finance.services.budget_importsr   r   r	   r
   r   'jarvis_finance.services.budget_overviewr   r   $jarvis_finance.services.budget_plansr   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r&   rj   rs   r   rG   r   r   <module>r      sF    "  Q M  m I : >  VF7#kr   