
    mj                        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 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!dS )    )annotationsN)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                 @    t                      } t          |            | S )N)r   r   )conns    d/home/agent/.hermes/repos/FinanceManager/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&      s    +D=Z`ns2t2tuu  wB  CG"42DW`pr)s)stt  vA  BD#D3Obk{}*~*~  AL  MED%r   returnNonec            
        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    }|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          }t          |          }d}||k    }|st          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        |          rt          j        |          nd t          j        |          t          j        |          d!z  }
d"d#|
iz  }t          t          j        |                    d x}x}}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             }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          |          }|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}}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,         }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/         }d0}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }	dd|	iz  }
t          t          j        |
                    d x}x}}d1}||v}|st          j        d2|fd3||f          t          j        |          d4t          j                    v st          j        |          rt          j        |          nd4d5z  }d6d7|iz  }t          t          j        |                    d x}}t          | |8          }|d9         }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}||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:d<d=t          j        |          iz  }t          t          j        |                    d }|                     d>                                          }t          |          }d}||k    }|st          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        |          rt          j        |          nd?t          j        |          t          j        |          d!z  }
d"d#|
iz  }t          t          j        |                    d x}x}}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}}dA |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}}|                     dB                                          d0         }d.}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }	dd|	iz  }
t          t          j        |
                    d x}x}}|                     dC                                          d0         }dD}||k    }|slt          j        dE|fdF||f          t          j        |          t          j        |          dz  }	dd|	iz  }
t          t          j        |
                    d x}x}}d S )GNz
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   ==z%(py1)s == %(py4)spy1py4assert %(py6)spy6migros_receiptT)source_typeinclude_referencez0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slen
candidatespy0rE   py3rH   assert %(py8)spy8c                    h | ]
}|d          S )proposed_category_id .0cs     r   	<setcomp>z~test_migros_receipts_are_always_food_household_and_can_be_confirmed_with_audit_without_article_transactions.<locals>.<setcomp>,   s    :::!A$%:::r   c                    h | ]
}|d          S )statusrV   rW   s     r   rZ   z~test_migros_receipts_are_always_food_household_and_can_be_confirmed_with_audit_without_article_transactions.<locals>.<setcomp>-   s    ,,,AAhK,,,r   auto_categorizedc              3  *   K   | ]}|d          du V  dS )requires_reviewFNrV   rW   s     r   	<genexpr>z~test_migros_receipts_are_always_food_household_and_can_be_confirmed_with_audit_without_article_transactions.<locals>.<genexpr>.   s-      AAq"#u,AAAAAAr   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}all)rP   py2rF   c              3  .   K   | ]}|d          dk    V  dS )classificationmigros_receipt_food_householdNrV   rW   s     r   r`   z~test_migros_receipts_are_always_food_household_and_can_be_confirmed_with_audit_without_article_transactions.<locals>.<genexpr>/   s.      ZZ!q!"&EEZZZZZZr   open_receipt_countline_item_count   covered_by_migros_countr   amount)not in)z%(py1)s not in %(py3)spreviewrE   rQ   assert %(py5)spy5
account_idconfirmed_countline_item_transaction_countaudit_idassert %(py1)srE   zFSELECT * FROM budget_transactions WHERE source_type='import_candidate'tx_rowsc                    h | ]
}|d          S )category_idrV   rX   rows     r   rZ   z~test_migros_receipts_are_always_food_household_and_can_be_confirmed_with_audit_without_article_transactions.<locals>.<setcomp>>   s    2223C222r   c              3  >   K   | ]}d |d         vo	d|d         vV  dS )r.   descriptionr:   NrV   ry   s     r   r`   z~test_migros_receipts_are_always_food_household_and_can_be_confirmed_with_audit_without_article_transactions.<locals>.<genexpr>?   s<      iiZ]vS//UG3}CU4Uiiiiiir   z-SELECT COUNT(*) FROM budget_import_line_itemszgSELECT COUNT(*) FROM audit_log WHERE action IN ('migros_receipts_2026_confirmed','candidate_confirmed')   )>=)z%(py1)s >= %(py4)s)r   r&   r   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr   rM   @py_builtinslocals_should_repr_global_namera   r	   r   executefetchallfetchone)r   r#   r$   _otherrowsseed@py_assert0@py_assert3@py_assert2@py_format5@py_format7rN   @py_assert5@py_assert4@py_format9@py_assert1rl   @py_format4@py_format6	confirmed@py_format2rv   s                         r   ktest_migros_receipts_are_always_food_household_and_can_be_confirmed_with_audit_without_article_transactionsr   !   s   44Dd&$MTWhkx~  KR  	S  	SMTWhk  yC  OV  	W  	WMTWhkx  LS  	T  	TD
 ,D$,im  ~E  F  F  FD)*/a/*a//////////*a/////*////a///////////////////////////,T?OcghhhJz??a?a?a33zz?a::z:::DtfD:fDDDDDDDDDD:fDDDDD:DDDDfDDDDDDDDDDDDDDDDDDDDDDDDDDD,,,,,D1C0DD,0DDDDDDDDDDD,0DDDDDD,DDDD0DDDDDDDDDDDDDDDDDDDDDDDDDDDDAAjAAAA3AAAAAAAAAAAAAAAA3AAAAA3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ZZzZZZZ3ZZZZZZZZZZZZZZZZ3ZZZZZ3ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ*400G,-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22222222222'(-A-(A----------(A-----(----A---------------------------$%**%**********%*****%*******************************,-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22222222222"87""""""""""87"""""8"""""""""""7"""""7""""""""""""""""""""""""""",TgFFFI&',1,'1,,,,,,,,,,'1,,,,,',,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,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Z                         llcddmmooGw<<1<1<133ww<122'222<tf<2f<<<<<<<<<<2f<<<<<2<<<<f<<<<<<<<<<<<<<<<<<<<<<<<<<<iiahiiii3iiiiiiiiiiiiiiii3iiiii3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<<GHHQQSSTUV[Z[[VZ[[[[[[[[[[[VZ[[[[[[V[[[[Z[[[[[[[[[[[[[[[[[[[[[[[[[[[[<<  B  C  C  L  L  N  N  OP  Q  V  UV  V  Q  UV  V  V  V  V  V  V  V  V  V  V  Q  UV  V  V  V  V  V  Q  V  V  V  V  U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  V  V  Vr   c                    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    }|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}||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          }
t          |
          }d}||k    }|st          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        |
          rt          j        |
          nd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 )#Nz
05.01.2026r*   r+   r,   r-   Bonz44.00r/   r;   r<   r=   z
MIGROS MMM)r0   BeschreibungBetragzcard.csvT)r<   migros_coveredri   r}   rA   rC   rD   rG   rH   rp   zNSELECT COUNT(*) FROM budget_transactions WHERE description LIKE '%MIGROS MMM%'r   covered_by_migros)r\   rK   rL   rM   coveredrO   rR   rS   r\   )r   r&   r   r
   r	   r   r   r   r   r   r   r   r   r   rM   r   r   r   )r   r#   r$   r   rl   r   r   r   r   r   r   r   r   r   s                 r   Otest_credit_card_migros_stays_covered_and_is_not_confirmed_as_duplicate_expenser   D   s-   44Dd&$$TlG`mx{  MP  ]b  nu  -v  -v  ,w  KW  jn  o  o  o  o)$<Yeqx1y1y0z  OY  jn  o  o  o  o*400G,-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22222222222 '::::<<hiirrttuvw|{||w{|||||||||||w{||||||w||||{||||||||||||||||||||||||||||)$7J^bcccGw<<1<1<133ww<11:h6#66#66666666666#6666666666#666666666666666666666666666666r   c                    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    }	|	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#}||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}||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'}||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)         }|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    }	|	slt          j        d|	fd||f          t          j	        |          t          j	        |          dz  }
dd |
iz  }t          t          j        |                    d x}x}	}|d0         }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}	}|d1         }d2}||k    }	|	slt          j        d|	fd||f          t          j	        |          t          j	        |          dz  }
dd |
iz  }t          t          j        |                    d x}x}	}|d3         }t!          |          }d2}t!          |          }||k    }|s"t          j        d|fd4||f          d5t          j                    v st          j        t                     rt          j	        t                     nd5t          j	        |          t          j	        |          d5t          j                    v st          j        t                     rt          j	        t                     nd5t          j	        |          t          j	        |          d6z  }d7d8|iz  }t          t          j        |                    d x}x}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}	}|d9         }|s:d:d;t          j	        |          iz  }t          t          j        |                    d }|d<         }d=d>h}||v }	|	slt          j        d?|	fd@||f          t          j	        |          t          j	        |          dz  }
dd |
iz  }t          t          j        |                    d x}x}	}|dA         }t#          |          }dB}||k    }|st          j        d|fdC||f          dDt          j                    v st          j        t"                    rt          j	        t"                    ndDt          j	        |          t          j	        |          t          j	        |          dEz  }dFdG|iz  }t          t          j        |                    d x}x}x}}|dA         dH         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}}	|dA         dH         dI         }dB}||k    }	|	slt          j        d|	fd||f          t          j	        |          t          j	        |          dz  }
dd |
iz  }t          t          j        |                    d x}x}	}dJ}||v }	|	st          j        d?|	fdK||f          t          j	        |          dLt          j                    v st          j        |          rt          j	        |          ndLd,z  }d-d.|iz  }t          t          j        |                    d x}}	|dJ         }|j        }	dM} |	|          }|ssdNt          j	        |          t          j	        |	          t          j	        |          t          j	        |          dOz  }t          t          j        |                    d x}x}	x}}dP}|dJ         }||v }	|	slt          j        d?|	fd@||f          t          j	        |          t          j	        |          dz  }
dd |
iz  }t          t          j        |                    d x}x}	}dQ }|dJ         }||v }	|	slt          j        d?|	fd@||f          t          j	        |          t          j	        |          dz  }
dd |
iz  }t          t          j        |                    d x}x}	}dR}|dJ         }||v }	|	slt          j        d?|	fd@||f          t          j	        |          t          j	        |          dz  }
dd |
iz  }t          t          j        |                    d x}x}	}d S )SN2026-01z	Food planz100.00monthly)
plan_monthrx   r   monthly_amount_chfcadencez
10.01.2026r*   zMigros Ar,   r-   r   z120.00r/   z
11.02.2026zMigros Br9   z40.00r;   r   rp   2026)yearc              3  4   K   | ]}|d          k    |V  dS )rx   NrV   )rX   rr$   s     r   r`   zQtest_budgetstatus_monthly_analytics_and_month_detail_groupings.<locals>.<genexpr>\   s2      @@!q'74'?'?A'?'?'?'?@@r   c              3  2   K   | ]}|d          dk    |V  dS )monthr   NrV   rX   ms     r   r`   zQtest_budgetstatus_monthly_analytics_and_month_detail_groupings.<locals>.<genexpr>]   0      RRQ!G*	:Q:Qq:Q:Q:Q:QRRr   monthly_analysisc              3  2   K   | ]}|d          dk    |V  dS )r   z2026-02NrV   r   s     r   r`   zQtest_budgetstatus_monthly_analytics_and_month_detail_groupings.<locals>.<genexpr>^   r   r   
actual_chfrA   rC   rD   rG   rH   
budget_chfr\   Rot	bar_colorredu   Grüngreen)rx   r   rx   )z%(py1)s == %(py3)sr$   rm   rn   ro   r   budget_monthdifference_chfz20.00difference_percent)zP%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}r   )rP   rb   rF   rH   rS   py10zassert %(py12)spy12	breakdownru   rE   breakdown_modemerchantsource)in)z%(py1)s in %(py4)stransactionsr}   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)srM   )rP   rb   rF   py7zassert %(py9)spy9r   rg   expense_filter_url)z%(py1)s in %(py3)sdetailz/household/transactions?zLassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
})rE   rQ   ro   r   zperiod=2026-01zcategory_id=zfinancial_effect=expense)r   r&   r   r   r   r   nextr   r   r   r   r   r   r   r   r   r   rM   
startswith)r   r#   r%   r   food_rowjanfebr   r   r   r   r   r   r   r   r   @py_assert7@py_assert9r   @py_format11@py_format13r   @py_assert6@py_format8@py_format10r   r$   s                             @r   >test_budgetstatus_monthly_analytics_and_month_detail_groupingsr   R   s   44DT

%$T)DZe  ~F  S\  $]  $]  ^  ^  ^$TJQTehuz  GO  	P  	PJQTehuz  GN  	O  	O, &> > > > !'::::(F;;;D@@@@t@@@@@H
RR(#56RRR
R
RC
RR(#56RRR
R
RC|((((((((((((((((((((((((((((((((((((((((((((((((|((((((((((((((((((((((((((((((((((((((((((((((((x=!E!=E!!!!!!!!!!=E!!!!!=!!!!E!!!!!!!!!!!!!!!!!!!!!!!!!!!{$u$u$$$$$$$$$$u$$$$$$$$$u$$$$$$$$$$$$$$$$$$$$$$$$$$$|''''''''''''''''''''''''''''''''''''''''''''''''x=#G#=G##########=G#####=####G###########################{&w&w&&&&&&&&&&w&&&&&&&&&w&&&&&&&&&&&&&&&&&&&&&&&&&&&&tYOOOF- ( D(((((((((( D((((( (((((((((((D(((((D((((((((((((((((((((((((((('?'i'?i''''''''''?i'''''?''''i'''''''''''''''''''''''''''.!-X-!X----------!X-----!----X---------------------------,+8+8++++++++++8+++++++++8+++++++++++++++++++++++++++"#.w.#w..........#w.....#....w............................/D7/00DGDGG4D4DD04DDDDDDDDDDD04DDDDDDDDDDDDD7DDDDD7DDDDDD/DDDD0DDDDDDDDDDDGDDDDDGDDDDDDGDDDD4DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD($u$u$$$$$$$$$$u$$$$$$$$$u$$$$$$$$$$$$$$$$$$$$$$$$$$$+"#=
H'==#'===========#'======#===='============================n%+3%&&+!+&!++++++++++&!++++++++++++3+++++3++++++%++++&++++!+++++++++++++++++++++++++++++.!!$]3;3t;;;;;;;;;;3t;;;;;3;;;;;;;;;;;t;;;;;t;;;;;;;;;;;;;;;;;;;;;;;;;;;.!!$%67<1<71<<<<<<<<<<71<<<<<7<<<<1<<<<<<<<<<<<<<<<<<<<<<<<<<<)6))))))))))6))))))))))))))))6)))))6)))))))))))))))))))))))))))&'N'2N3MN223MNNNNNNNN'NNNN2NNNN3MNNNNNNNNNNNNNNNNNNNNNNNNNNNN;v&:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; $  @F+?$@@ $@@@@@@@@@@@ $@@@@@@ @@@@$@@@@@@@@@@@@@@@@@@@@@@@@@@@@%E0D)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EEEEEEEEEEEEEEEEEEEEEEEr   )r'   r(   )"
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   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&   r   r   r   rV   r   r   <module>r      sn   " " " " " "                     Q Q Q Q Q Q M M M M M M              m l l l l l l l I I I I I I : : : : : : > > > > > >        V  V  V  VF7 7 7 7&F &F &F &F &F &Fr   