
    aj02                       d dl mZ d dlZd dlmc mZ d dlm	Z	 d dl
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mZmZmZmZ d dlmZ d d	lmZ d d
lm Z m!Z! d Z"d Z#ddZ$ddZ%ddZ&ddZ'ddZ(ddZ)ddZ*ddZ+ddZ,ddZ-ddZ.dS )    )annotationsN)date)HTTPException)confirm_create_budget_account)confirm_create_category)	archive_recurring_payment confirm_manual_recurring_payment"confirm_recurring_candidate_action#detect_recurring_payment_candidatesget_recurring_dashboardlist_recurring_warningsnext_expected_date preview_manual_recurring_payment"preview_recurring_candidate_actionconfirm_budget_transaction)connect_memory)apply_migrationsget_schema_versionc                 @    t                      } t          |            | S )N)r   r   )conns    g/home/agent/.hermes/worktrees/FinanceManager-sprint0-v2/tests/unit/test_fixed_costs_subscriptions_v1.pydbr      s    D-d333D[    c                    t          | dddd          d         }t          | ddd          d         }t          | d	dd          d         }t          | d
dd          d         }||||fS )NHaushaltcheckingCHF)nameaccount_typecurrency	entity_idzElektronische Medienexpense)r   category_typezEssen & HaushaltVersicherungen)r   r   )r   
account_idmediafood	insurances        r   setupr*      s    .tjZdrw5x5xyy  {F  GJ#D3I\e*f*fgghstE"42DW`)a)abbcnoD'7GZc.d.deefqrIudI--r   r#   c                D    t          | ||||p|||d|d          d         S )Nr   )r&   transaction_typetransaction_datedescriptionpayeeamount_originalcurrency_originalcategory_idr"   r   )r   r&   r2   merchantamountdaydesctx_types           r   txr8   &   sk    %d:[bx{  MQ  M]  U]  hp  EK  bg  xC  -D  -D  E  E  FQ  R  Rr   pendingc                v    |                      dd| d|                     dd          |||||||f           d S )Na  
        INSERT INTO budget_transaction_candidates(transaction_candidate_id, source_file_label, source_type, transaction_date, description, merchant, amount_original, currency_original, proposed_category_id, confidence, requires_review, status, classification, created_at)
        VALUES (?, 'test.csv', 'csv_seed', ?, ?, ?, ?, 'CHF', ?, '0.80', 1, ?, ?, '2026-01-01T00:00:00Z')
    cand__ )executereplace)r   r2   r3   r4   r5   statusclassifications          r   	candidaterB   *   se    LL  #(
"
"S
"
"
*
*3
4
4c8XvWbdjlz	{} } } } }r   returnNonec                    t                      } 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             }|d         }|j        } |            }d}||k    }	|	st          j        d|	fd||f          t          j        |          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }
t          t          j	        |
                    d x}x}x}x}	}|d         }|j        } |            }d}||k    }	|	st          j        d|	fd||f          t          j        |          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }
t          t          j	        |
                    d x}x}x}x}	}|d         }|j        } |            }d}||k    }	|	st          j        d|	fd||f          t          j        |          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }
t          t          j	        |
                    d x}x}x}x}	}|d         }|j        } |            }d}||k    }	|	st          j        d|	fd||f          t          j        |          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }
t          t          j	        |
                    d x}x}x}x}	}|d         }|j        } |            }d}||k    }	|	st          j        d|	fd||f          t          j        |          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }
t          t          j	        |
                    d x}x}x}x}	}|d         }|j        } |            }d}||k    }	|	st          j        d|	fd||f          t          j        |          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }
t          t          j	        |
                    d x}x}x}x}	}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 S )N&   ==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   r   )py0py1py3py6zassert %(py8)spy8c                ,    i | ]}|d          |d         S )r   type .0rs     r   
<dictcomp>z_test_schema_38_creates_decimal_text_recurring_table_with_user_facing_fields.<locals>.<dictcomp>4   s"    rrrQAfIqyrrrr   z,PRAGMA table_info(budget_recurring_payments)expected_amount_textTEXT)zD%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.upper
}()
} == %(py8)s)rJ   rK   py5rM   zassert %(py10)spy10amount_tolerance_pcttolerance_percenttolerance_amount_textmerchant_namerecurring_typeignoredzUSELECT sql FROM sqlite_master WHERE type='table' AND name='budget_recurring_payments'sqlin)z%(py1)s in %(py4)srJ   py4assert %(py6)srL   )r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr>   fetchallupperfetchone)r   @py_assert2@py_assert5@py_assert4@py_format7@py_format9cols@py_assert0@py_assert7@py_assert6@py_format11@py_assert3@py_format5s                r   Ktest_schema_38_creates_decimal_text_recurring_table_with_user_facing_fieldsr|   1   s[   44Dd##)r)#r))))))))))#r))))))))))))))))))))))))))))))d)))))d))))))#))))r)))))))))))))))))))))))))))rr$,,7e*f*f*o*o*q*qrrrD&'9'-9--//969/69999999999/699999'9999-9999/99996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'-9--//969/69999999999/699999'9999-9999/99996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#$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666666666'(:(.:..00:F:0F::::::::::0F:::::(::::.::::0::::F::::::::::::::::::::::::::::::: 2 &2&&((2F2(F2222222222(F22222 2222&2222(2222F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 !3!'3''))3V3)V3333333333)V33333!3333'3333)3333V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  P%|}}  G  G  I  I  JO  P  P9  P  P  P  P  P  P  P  P  P  P  P9  P  P  P  P  P  P9  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r   c            	     
   t                      } t          |           \  }}}}dD ]}t          | ||dd|           dD ]}t          | ||dd|           dD ]}t          | ||dd	|           d
D ]}t          | ||dd|           t          | ||dddd           t          | |ddd           t	          | d          }d |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          }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}||v}
|
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}||v}
|
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}||v}
|
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z
2026-01-05
2026-02-05
2026-03-05Netflix19.90)z
2025-03-01
2026-03-01zHouse Insurancez1200.00)z
2026-01-15z
2026-04-15z
2026-07-15zMusic Schoolz300.00)
2026-01-03z
2026-02-03z
2026-03-03Migrosz150.00zTrue Wealthz500.00
2026-01-10zInvestment Transfer)r6   OpenAI20.00
2026-04-05z
2026-08-01todayc                     i | ]}|d          |S r   rP   rR   cs     r   rT   ztest_detection_finds_monthly_subscription_yearly_insurance_quarterly_payment_and_excludes_migros_transfer_investment.<locals>.<dictcomp>H       888aQvY888r   
candidates	frequencymonthlyrG   z%(py1)s == %(py4)srb   rd   rL   r]   subscriptionyearly
fixed_cost	quarterly)not in)z%(py1)s not in %(py3)snamesrJ   rK   assert %(py5)srW   )r   r*   r8   rB   r   re   rf   rj   rk   rl   rg   rh   ri   )r   accountr'   r(   r)   dresultr   rv   rz   rp   r{   rs   @py_format4@py_format6s                  r   ttest_detection_finds_monthly_subscription_yearly_insurance_quarterly_payment_and_excludes_migros_transfer_investmentr   >   s   44D5;;0%y7hhD'5R[]dfg9h9h9h9h)hh2dGYHY[dfg+h+h+h+h7nnD'5R`bjlm9n9n9n9n7ggD'4QY[cef9g9g9g9gtWi,MbccccdE8Wl;;;0\JJJF886,#7888EK(5I5(I5555555555(I55555(5555I555555555555555555555555555,-??-??????????-?????-???????????????????????????????"#K0<H<0H<<<<<<<<<<0H<<<<<0<<<<H<<<<<<<<<<<<<<<<<<<<<<<<<<<"#$45EE5EEEEEEEEEE5EEEEE5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 -<<-<<<<<<<<<<-<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 85          85     8           5     5                            85          85     8           5     5                           %=%%%%%%%%%%=%%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%r   c            	        t                      } t          |           \  }}}}dD ]}t          | ||dd|           t          | d          }d |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         }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 )N)r   z
2026-02-20z
2026-04-11zOpenAI ChatGPTr   z
2026-05-01r   c                     i | ]}|d          |S r   rP   r   s     r   rT   zatest_detection_finds_irregular_recurring_candidate_but_does_not_auto_activate.<locals>.<dictcomp>Z   r   r   r   r   	irregularrG   r   rb   rd   rL   r]   r   zHSELECT status FROM budget_recurring_payments WHERE name='OpenAI ChatGPT'r@   rB   zNSELECT COUNT(*) FROM budget_transactions WHERE source_type='recurring_payment'r   )r   r*   r8   r   re   rf   rj   rk   rl   r>   ro   )r   r   r'   _food
_insurancer   r   r   rv   rz   rp   r{   rs   rows                 r   Mtest_detection_finds_irregular_recurring_candidate_but_does_not_auto_activater   T   sb   44DU4[[2%
7 ? ?
4%!17A>>>>0\JJJF886,#7888E!";/>;>/;>>>>>>>>>>/;>>>>>/>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>!"#34FF4FFFFFFFFFF4FFFFF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
,,a
b
b
k
k
m
mCx='K'=K''''''''''=K'''''=''''K'''''''''''''''''''''''''''<<hiirrttuvw|{||w{|||||||||||w{||||||w||||{||||||||||||||||||||||||||||||r   c            	        t                      } t          |           \  }}}}dD ]}t          | ||dd|           t          | d          }|d         }g }||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   
2026-04-01r   r   rG   r   rb   rd   rL   z.SELECT COUNT(*) FROM budget_recurring_paymentsr   )r   r*   r8   r   re   rf   rj   rk   rl   r>   ro   )r   r   r'   r   r   r   	dashboardrv   rz   rp   r{   rs   s               r   @test_dashboard_read_does_not_silently_create_detected_candidatesr   c   s   44DU4[[2%
7 8 8
4%GQ7777'LAAAI\"(b("b(((((((((("b((((("((((b(((((((((((((((((((((((((((<<HIIRRTTUVW\[\\W[\\\\\\\\\\\W[\\\\\\W\\\\[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r   c            
        t                      } t          |           \  }}}}dD ]}t          | ||dd|           t          | d          d         d         }t	          | |d         d	d
d          }|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}
}	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         }|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}
}	t          | d!|d"d#d
d$d%          }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'd(i          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+i          }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 S )-Nr~   r   r   r   r   r   r   candidate_idactivater   actionr]   requires_explicit_confirmT)is)z%(py1)s is %(py4)srb   rd   rL   payloadr@   	confirmedrG   r   z
2026-04-10activebudget_month_chfbudget_year_chfz238.80>SELECT COUNT(*) FROM audit_log WHERE action LIKE 'recurring_%'   >=z%(py1)s >= %(py4)sz
Manual Aboz10.00r      r   r2   rU   r   r]   expected_day_of_monthr"   notesz
not neededarchivedr   ignorer^   )r   r*   r8   r   r   re   rf   rj   rk   rl   r
   r   r>   ro   r   r	   r   )r   r   r'   r   r   r   candpreviewrv   rz   rp   r{   rs   r   r   manual_previewmanualignored_previewr^   s                      r   4test_review_activate_ignore_manual_archive_and_auditr   n   s   44DU4[[2%
7hhD'5R[]dfg9h9h9h9h.t<HHHVWXYD0tN7KXb  wE  NF  NF  G  GG./747/47777777777/477777/77774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/gi6HIIF(*{*{**********{*********{***************************$T>>>xHF!9X*(*(**********(*********(***************************!9'(3G3(G3333333333(G33333(3333G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!9&'383'83333333333'833333'33338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bbddefglkllgklllllllllllgkllllllgllllkllllllllllllllllllllllllllll5d\bg  BI  Xa  uC  ^_  =`  =`  a  aN-dN94MNNF(*{*{**********{*********{***************************$T6++>,@WXXYabpfppbfpppppppppppbfppppppbppppfp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8tN?SV^`hUijjO0y7QRRG8)	)	))))))))))	)))))))))	)))))))))))))))))))))))))))))r   c            
        t                      } t          |           \  }}}}dD ]}t          | ||dd|           t          | d          d         d         }t	          | |d         d	d
d          }t          | |d                    t	          | |d         ddddd
d          }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|d         f                                          }|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di          }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d i          }|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   r   r   r   r   r   r   r   r   r   editzNetflix Premiumz21.90r   )r   r   rU   r   r]   r@   r   rG   r   rb   rd   rL   zUSELECT name, expected_amount_text FROM budget_recurring_payments WHERE recurring_id=?r   rU   r   pausepausedr   doner   r      r   r   )r   r*   r8   r   r   r
   re   rf   rj   rk   rl   r>   ro   r   )r   r   r'   r   r   r   r   r   edit_previeweditedrv   rz   rp   r{   rs   r   pause_previewr   r   s                      r   Etest_confirmed_candidate_can_be_edited_paused_and_archived_with_auditr      s   44DU4[[2%
7hhD'5R[]dfg9h9h9h9h.t<HHHVWXYD0tN7KXb  wE  NF  NF  G  GG&tWY-?@@@5dD<P]cm~  Y`  ox  LZ  S[  S[  \  \L/l96MNNF(*{*{**********{*********{***************************
,,nqu  wE  rF  qH  I  I  R  R  T  TCv;+++;+++++++++++;++++++;++++++++++++++++++++++++++++++++%&1'1&'1111111111&'11111&1111'1111111111111111111111111116tT.=QT\^eSfggM/mI6NOOF('x'x''''''''''x'''''''''x'''''''''''''''''''''''''''(tN/CgvEVWWHH++++++++++++++++++++++++++++++++++++++++++++++++<<XYYbbddefglkllgklllllllllllgkllllllgllllkllllllllllllllllllllllllllllllr   c                 J
   t                      } t          |           \  }}}}t          | d|ddddddd          }t          | |d	                   d
         }t	          | ||ddd           t          | d|ddddd          }t          | |d	                    dD ]}t	          | ||dd|           t          | d           t          | d          }	d |	D             }
d}||
v }|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}||
v }|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}||
v }|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}||
v }|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}d}t          |||          }d}d}t!          |||          }d!}||k    }|snt          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%t          j	        |          t          j	        |          t          j	        |          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}x}x}x}}d S ))Nr   r   r   r      5   )r   r2   rU   r   r]   r   rY   date_tolerance_daysr   r"   z25.00r   zNet flixr   )r   z
2026-02-10z
2026-03-10Spotifyz12.00r   r   z
2026-05-20c                    h | ]
}|d          S )r@   rP   )rR   ws     r   	<setcomp>zRtest_warnings_missing_amount_changed_and_duplicate_subscription.<locals>.<setcomp>   s    ...(...r   missingr`   z%(py1)s in %(py3)sstatusesr   r   rW   amount_changednew_candidatepossible_duplicate_subscriptioni  r   rG   )zw%(py15)s
{%(py15)s = %(py0)s(%(py9)s
{%(py9)s = %(py1)s(%(py3)s, %(py5)s, %(py7)s)
}, %(py11)s, %(py13)s)
} == %(py18)sr   r   )
rI   rJ   rK   rW   py7py9py11py13py15py18zassert %(py20)spy20)r   r*   r   r	   r8   r   r   re   rf   rj   rg   rh   ri   rk   rl   r   r   )r   r   r'   r   r   r   recurring_idpreview2r   warningsr   rv   rp   r   r   rr   rx   @py_assert8@py_assert10@py_assert12@py_assert14@py_assert17@py_assert16@py_format19@py_format21s                            r   ?test_warnings_missing_amount_changed_and_duplicate_subscriptionr      s-   44DU4[[2%
.tiX]w~  NW  ky  TU  or  KL  6M  6M  N  NG3D'):LMMkZLtWeY>>>/zZ_  zA  PY  m{  VW  7X  7X  Y  YH$T8I+>???7hhD'5R[]dfg9h9h9h9h'LAAAA&t<@@@H..X...H 9          9     9                                           'x''''''''''x''''''''''''''''x'''''x'''''''''''''''''''''''''''&?h&&&&&&&&&&?h&&&&&?&&&&&&&&&&&h&&&&&h&&&&&&&&&&&&&&&&&&&&&&&&&&&,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88888888#'MMAMd4A..M	M1M.	1==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MMMMMMMMMMMMdMMMMMdMMMMMM4MMMMMMMMAMMMM.MMMM	MMMM1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MMMMMMMMMMMMMMMMMMMr   c            
        t                      } t          |           \  }}}t          | dddddd          }t          | |d                    t	          | |ddd           t          | d	
          }|d         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         }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         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}||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!lm} t          fd" || d#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}||v }|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-lm}  || d#d.          }|d/         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}}d1 |d2         D             }t'          |          }|sd3d4t          j                    v st          j        t&                    rt          j        t&                    nd4t          j        |          t          j        |          d5z  }	t          t          j
        |	                    d x}}dd6lm}  || d$7          }|d8         }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         }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:}||v }|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 )<Nr   r   r   r   r   r   r   r   r   r   	analyticsfixed_cost_quote_percent)is not)z%(py1)s is not %(py4)srb   rd   rL   subscriptions_year_chfz240.00rG   r   kpismonthly_fixed_costs_chfannual_fixed_costs_chfactive_recurring_countr   open_candidate_countr   largest_fixed_costsr   category_breakdownknown_recurring_month_chf)get_budget_planning_matrixc              3  4   K   | ]}|d          k    |V  dS )r2   NrP   )rR   rS   r'   s     r   	<genexpr>zVtest_integrations_dashboard_budgetplanning_and_data_explorer_fields.<locals>.<genexpr>   s]        G  GQlmn{l|  AF  mF  mFq  mF  mF  mF  mF  G  Gr   2026z2026-02)yearcurrent_monthrowsr`   r   r   r   r   rW   )get_budget_data_explorer)r  r]   filtersr]   c              3  .   K   | ]}|d          dk    V  dS )r]   r   NrP   rQ   s     r   r  zVtest_integrations_dashboard_budgetplanning_and_data_explorer_fields.<locals>.<genexpr>   s-      WWq!"n4WWWWWWr   transactionsz,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}all)rI   py2rc   )get_budget_overview)monthfixed_costs_month_chfopen_fixed_cost_candidate_count missing_fixed_cost_payment_countoverview)r   r*   r   r	   r8   r   re   rf   rj   rk   rl   'jarvis_finance.services.budget_planningr  nextrg   rh   ri   ,jarvis_finance.services.budget_data_explorerr  r  'jarvis_finance.services.budget_overviewr  )r   r   r   r   r   dashrv   rz   rp   r{   rs   r  r   r   r   r  explorer@py_assert1r  r  r'   s                       @r   Ctest_integrations_dashboard_budgetplanning_and_data_explorer_fieldsr     s   44DU4[[2%
.tiX]w~  NW  ky  TU  6V  6V  W  WG$T79+=>>>tWeY>>>"4|<<<D78DD8DDDDDDDDDD8DDDDD8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56B(B6(BBBBBBBBBB6(BBBBB6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<12=g=2g==========2g=====2====g===========================<01=X=1X==========1X=====1====X===========================<016Q61Q66666666661Q6666616666Q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<./414/14444444444/144444/44441444444444444444444444444444<-.q1&9FYF9YFFFFFFFFFF9YFFFFF9FFFFYFFFFFFFFFFFFFFFFFFFFFFFFFFF$%a()DEPPEPPPPPPPPPPEPPPPPE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RRRRRR
  G  G  G  G44TV_```agh  G  G  G  G  GC*+6w6+w6666666666+w66666+6666w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%,%,,,,,,,,,,%,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,UUUUUU''6.YYYHI/0BNB0NBBBBBBBBBB0NBBBBB0BBBBN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WWh~>VWWWW3WWWWWWWWWWWWWWWW3WWWWW3WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK""4y999H+,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7777777777777777777756;!;6!;;;;;;;;;;6!;;;;;6;;;;!;;;;;;;;;;;;;;;;;;;;;;;;;;;-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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9r   c            
         t                      } t          |           \  }}}}t          j        t                    5  t          | d|dddd           d d d            d S # 1 swxY w Y   d S )NBadz-1r   r   )r   r2   rU   r   r]   )r   r*   pytestraisesr   r   )r   _accountr'   r   r   s        r   ,test_invalid_manual_recurring_values_blockedr$     s    44DeDkk35%	}	%	% n n(emq  AJ  ^l  0m  0m  	n  	n  	nn n n n n n n n n n n n n n n n n ns   A  A$'A$)Nr#   )r9   N)rC   rD   )/
__future__r   builtinsrg   _pytest.assertion.rewrite	assertionrewritere   datetimer   r!  fastapir   'jarvis_finance.services.budget_accountsr   )jarvis_finance.services.budget_categoriesr   (jarvis_finance.services.budget_recurringr   r	   r
   r   r   r   r   r   r   +jarvis_finance.services.budget_transactionsr   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r   r*   r8   rB   r|   r   r   r   r   r   r   r  r$  rP   r   r   <module>r2     sZ   " " " " " "                      ! ! ! ! ! ! Q Q Q Q Q Q M M M M M M
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 S R R R R R : : : : : : R R R R R R R RA A A. . .R R R R} } } }
P 
P 
P 
P& & & &,} } } }] ] ] ]* * * *2m m m m,N N N N&: : : :@n n n n n nr   