
    jxhjG                    @   d dl mZ d dlmZmZ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mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dl m!Z!m"Z" d dl#m$Z$m%Z%m&Z& d d	l'm(Z(m)Z)m*Z*m+Z+ d d
l,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZV d dlWmXZX d dlYmZZZm[Z[ d dl\m]Z]m^Z^m_Z_m`Z` d dlambZbmcZcmdZdmeZemfZfmgZgmhZh d dlimjZjmkZkmlZlmmZmmnZnmoZompZp d dlqmrZrmsZsmtZtmuZumvZvmwZwmxZx d dlymzZzm{Z{m|Z|m}Z}m~Z~mZmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZ d dlmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZ  eddg          Zeɠ                    d           ee	          fdd            Zeɠ                    d            ee	          fdd#            Zeɠ                    d$          eɠ                    d%           ee	          fdd&                        Zeɠ                    d'          eɠ                    d(           ee	          fdd)                        Zeɠ                    d*          eɠ                    d+          d, ee	          fdd/                        Zeɠ                    d0          d, ee	          fdd1            Zeɠ                    d2           ee	          fdd3            Zeɠ                    d4          d5 ee	          fdd8            Zeɠ                    d9          d5d5d5d5d5d5d5d: ee	          f	ddB            Zeɠ                    dC          d: ee	          fddD            Zeɠ                    dE           ee	          fddF            Zeɠ                    dG           ee	          fddH            Zeɠ                    dI           ee	          fddJ            Zeɠ                    dK           ee	          fddL            Zeɠ                    dM           ee	          fddN            Zeɠ                    dO           ee	          fddP            Zeɠ                    dQ          dR             Zeɠ                    dS          ddV            Zeɠ                    dW          ddX            Zeɠ                    dY           ee	          fddZ            Zeɠ                    d[           ee	          fdd\            Zeɠ                    d]          d5 ee	          fdd`            Zeɠ                    da          d5 ee	          fddb            Zeɠ                    dc           ee	          fddd            Zeɠ                    de           ee	          fddf            Zeɠ                    dg           ee	          fddh            Zeɠ                    di           ee	          fddk            Zeɠ                    dl           ee	          fddm            Zeɠ                    dn           ee	          fddo            Zeɠ                    dp           ee	          fddq            Zeɠ                    dr          ds ee	          fddu            Zeɠ                    dv          d, ee	          fddw            Zeɠ                    dx          d5 ee	          fddy            Zeɠ                    dz           ee	          fdd{            Zeɠ                    d|           ee	          fdd}            Zeɠ                    d~          d5 ee	          fdd            Zeɠ                    d          d5 ee	          fdd            Zeɠ                    d          d5 ee	          fdd            Zeɠ                    d          dsd5 ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d          d ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d          d5 ee	          fdd            Zeɠ                    d          d5 ee	          fdd            Zeɠ                    d          d5 ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d          d5 ee	          fdd            Zeɠ                    d          d ee	          fdd            Z eɠ                    d          ds ee	          fdd            Zeɠ                    d          d5 ee	          fdd            Zeɠ                    d          ds ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d          ds ee	          fdd            Zeɠ                    d          dsd5d ee	          fdd            Zeɠ                    d          dsddddddddddddd ee	          fddƄ            Zeɠ                    dǦ          dsddd ee	          fddȄ            Zeɠ                    dɦ          ds ee	          fddʄ            Z	eɠ                    d˦          ds ee	          fdd̄            Z
eɠ                    dͦ          ds ee	          fdd΄            Zeɠ                    dϦ          ds ee	          fddЄ            Zeɠ                    dѦ          dsd ee	          fddՄ            Zeɠ                    d֦          ds ee	          fddׄ            Zeɠ                    dئ           ee	          fddل            Zeɠ                    dڦ           ee	          fddۄ            Zeɠ                    dܦ          d5 ee	          fdd݄            Zeɠ                    dަ          d5 ee	          fdd߄            Zeɠ                    d           ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d          d5 ee	          fdd            Zeɠ                    d          d5 ee	          fdd            Zeɠ                    d          d ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d           ee	          fdd            Zeɠ                    d          dd ee	          fdd            Zeɠ                    d          d ee	          fdd            Zeɠ                    d          d ee	          fdd            Zeɠ                    d           ee	          fdd            Z eɠ                    d           ee	          fdd            Z!eɠ                    d            ee	          fdܐd            Z"eɠ                    d          d5d ee	          fdݐd            Z#eɠ                    d           ee	          fdd            Z$eɠ                    d           ee	          fdd	            Z%eɠ                    d
          d5d5 ee	          fdސd            Z&eɠ                    d          d             Z'eɠ                    d           ee	          fdߐd            Z(eɠ                    d           ee	          fdߐd            Z)eɠ                    d           ee	          fdd            Z*eɠ                    d           ee	          fdd            Z+eɠ                    d          d, ee	          fdd            Z,eɠ                    d           ee	          fdd            Z-eɠ                    d          d5d5d5d5d5d5d5d5d5d5d5d5dddsd ee	          fdd&            Z.eɠ                    d'          ds ee	          fdƐd(            Z/eɠ                    d)           ee	          fdd*            Z0eɠ                    d+          d5 ee	          fdǐd,            Z1eɠ                    d-          d5 ee	          fdǐd.            Z2eɠ                    d/          d5 ee	          fdȐd0            Z3eɠ                    d1          d5 ee	          fdǐd2            Z4eɠ                    d3           ee	          fdd5            Z5eɠ                    d6          d5 ee	          fdd7            Z6eɠ                    d8          d5 ee	          fdǐd9            Z7eɠ                    d:           ee	          fdd;            Z8eɠ                    d<          d5 ee	          fdd=            Z9eɠ                    d>           ee	          fdΐd?            Z:eɠ                    d@           ee	          fdΐdA            Z;eɠ                    dB          d5 ee	          fddC            Z<eɠ                    dD          d5 ee	          fddE            Z=eɠ                    dF           ee	          fdΐdG            Z>eɠ                    dH           ee	          fddI            Z?eɠ                    dJ           ee	          fdΐdK            Z@eɠ                    dL           ee	          fdΐdM            ZAeɠ                    dN           ee	          fdΐdO            ZBeɠ                    dP          d5 ee	          fddQ            ZCeɠ                    dR           ee	          fdΐdS            ZDeɠ                    dT           ee	          fddU            ZEeɠ                    dV           ee	          fddW            ZFeɠ                    dX           ee	          fddY            ZGeɠ                    dZ          d5 ee	          fdǐd[            ZHeɠ                    d\           ee	          fdd]            ZIeɠ                    d^           ee	          fdd_            ZJeɠ                    d`          d ee	          fddb            ZKeɠ                    d`           ee	          fddc            ZLeɠ                    dd           ee	          fddf            ZMeɠ                    dg           ee	          fddh            ZNeɠ                    di           ee	          fddj            ZOeɠ                    dk           ee	          fddl            ZPeɠ                    dm           ee	          fddn            ZQeɠ                    do          d5 ee	          fddq            ZReɠ                    dr           ee	          fdds            ZSeɠ                    dt          d5 ee	          fddu            ZTeɠ                    dv          d5 ee	          fddw            ZUeɠ                    dx           ee	          fddy            ZVeɠ                    dz           ee	          fdd{            ZWeɠ                    d|           ee	          fdd}            ZXeɠ                    d~           ee	          fdd            ZYeɠ                    d           ee	          fdd            ZZeɠ                    d           ee	          fdd            Z[eɠ                    d           ee	          fdd            Z\eɠ                    d           ee	          fdd            Z]eɠ                    d           ee	          fdːd            Z^eɠ                    d           ee	          fdd            Z_eɠ                    d           ee	          fdd            Z`eɐa                    d           ee	          fdd            Zbeɠ                    d           ee	          fdd            Zceɠ                    d           ee	          fdd            Zdeɠ                    d           ee	          fdd            Zeeɠ                    d           ee	          fdd            Zfeɠ                    d           ee	          fdd            Zgeɠ                    d          d ee	          fdd            Zheɠ                    d           ee	          fdd            Zieɠ                    d           ee	          fdd            Zjeɠ                    d           ee	          fdd            Zkeɠ                    d           ee	          fdd            Zleɠ                    d           ee	          fdd            Zmeɠ                    d           ee	          fdd            Zneɠ                    d          d5dsd5d5d5d5d5d5d5d5d5d5 ee	          fdd            Zoeɠ                    d           ee	          fdd            Zpeɠ                    d           ee	          fdd            Zqeɠ                    d           ee	          fdd            Zreɠ                    d          d5 ee	          fdd            Zseɠ                    d           ee	          fdd            Zteɠ                    d          dsd5d5 ee	          fdd            Zueɠ                    d           ee	          fdd            Zveɠ                    d           ee	          fdd            Zwd5S (      )annotations)	APIRouterDependsHTTPException)
Connection)get_db)archive_budget_accountconfirm_create_budget_accountcreate_budget_account_previewlist_budget_accounts)archive_categoryarchive_tagconfirm_budget_category_cleanupconfirm_category_mergeconfirm_create_categoryconfirm_create_tagcreate_category_previewcreate_tag_previewdelete_empty_categorylist_category_tree_groupedlist_categories	list_tagspreview_budget_category_cleanuppreview_category_mergesreorder_categoriesupdate_category)import_budget_csv_textimport_profile_specs)build_import_status_auditbuild_review_backlog_dashboard!mark_2025_candidates_as_reference))confirm_uploaded_budget_import_candidatesget_budget_import_sessionlist_budget_import_sessionspreview_uploaded_budget_import)*!archive_reference_year_candidates%apply_budget_rules_to_open_candidates!apply_merchant_to_open_candidatesbatch_confirm_safe_candidatesbatch_mark_candidatesconfirm_migros_receipts_2026*bulk_update_transaction_candidate_categoryconfirm_candidate_splitconfirm_duplicate_overrideconfirm_transaction_candidatecreate_budget_rulecreate_merchantcreate_merchant_aliascreate_candidate_split$create_review_category_for_candidate$classify_swisslos_internal_transfersdeactivate_budget_ruledetect_duplicate_candidatesignore_transaction_candidatelist_budget_ruleslist_merchantslist_transaction_candidatesmerge_merchantsmark_candidate_transfermark_candidate_typepreview_migros_receipts_2026 preview_batch_confirm_candidatespreview_safe_auto_candidatespreview_transaction_candidateprioritize_budget_rule!reclassify_bank_income_candidatesreopen_transaction_candidatereview_candidate_summary'seed_bank_transfer_candidates_from_rows%seed_credit_card_candidates_from_rows seed_migros_candidates_from_rows)seed_transaction_candidates_from_csv_text%seed_transaction_candidates_from_rowstest_budget_ruleupdate_budget_ruleupdate_merchant_category%update_transaction_candidate_categoryget_monthly_comparison)get_budget_dashboard_cockpitget_budget_vs_actual_analysis)get_budget_data_explorerget_budget_deviation_analysisget_category_analysis_v2get_merchant_analysis)get_budget_charts_2026get_budget_overviewget_budget_status_by_categoryget_category_month_detailget_category_summaryget_income_statusget_monthly_summary)confirm_budget_planning_batchconfirm_category_budget_values"get_budget_planning_audit_timelineget_budget_planning_matrixpreview_budget_planning_batch&preview_budget_planning_excel_templatepreview_category_budget_values)archive_recurring_payment confirm_manual_recurring_payment"confirm_recurring_candidate_action#detect_recurring_payment_candidatesget_recurring_dashboard preview_manual_recurring_payment"preview_recurring_candidate_action)	apply_rule_suggestionget_import_historyget_monthly_import_dashboardlist_rule_suggestionspreview_drive_monthly_importreject_rule_suggestionrun_monthly_import_dry_runscan_budget_drive_filesscan_google_drive_budget_folder)accept_grocery_product_matchadd_demo_migros_receiptbuild_rappn_link_outconfirm_manual_grocery_mappingcreate_manual_grocery_mapping$generate_grocery_optimization_reportget_grocery_optimizer_dashboardget_grocery_provider_strategypreview_manual_grocery_mappingrefresh_grocery_mapping_pricereject_grocery_product_matchrun_grocery_optimizationupsert_product_match)provider_for_retailer search_and_store_product_matchessearch_open_prices_spike)archive_budget_plan_itemconfirm_budget_plan_itemconfirm_income_plan_templatesconfirm_update_income_plan_itemcreate_budget_plan_item_previewlist_budget_plan_itemslist_income_plan_itemslist_income_seed_candidatespreview_income_plan_templatespreview_update_income_plan_itemreorder_income_plan_items)confirm_budget_plan_takeoverconfirm_clear_category_takeoverconfirm_seed_candidateconvert_unclean_rangeignore_seed_candidatelist_seed_candidatespreview_budget_plan_takeoverpreview_clear_category_takeoverpreview_seed_candidatereopen_seed_candidate seed_budget_candidates_from_rowsset_seed_candidate_status)	confirm_budget_transaction"confirm_reverse_budget_transactionconfirm_transfer!create_budget_transaction_previewcreate_transfer_previewlist_budget_transactionslist_budget_transfers"reverse_budget_transaction_previewupdate_budget_transaction)confirm_transfer_pairlist_transfer_pairspropose_transfer_pairsreject_transfer_pair)configure_source_mappingconfirm_household_importget_household_import_optionsget_household_overviewget_household_reviewlist_household_batcheslist_household_transactionslist_source_mappingsconfirm_household_review_actionpreview_household_importpreview_household_review_actionz/budgetbudget)prefixtagsz/household/source-mappingsconnr   c                     t          |           S N)r   r   s    /home/agent/.hermes/worktrees/FinanceManager-sprint15-household-import-transfer-reconciliation-v1/src/jarvis_finance/api/routers/budget.pyhousehold_source_mappingsr      s    %%%    z"/household/source-mappings/confirmpayloaddictc                r    |                      d          durt          dd          t          ||           S )NconfirmT  explicit confirm=true requiredstatus_codedetail)getr   r   r   r   s     r    household_source_mapping_confirmr      s=    {{9T))4TUUUU#D'222r   z/household/import/previewz/household/imports/previewc                "    t          ||           S r   )r   r   s     r   household_import_previewr           $D'222r   z/household/import/confirmz/household/imports/confirmc                "    t          ||           S r   )r   r   s     r   household_import_confirmr      r   r   z/household/import/batchesz/household/imports/history   limitintc                $    t          ||           S Nr   )r   r   r   s     r   household_import_batchesr      s     "$e4444r   z/household/importsc                H    t          ||           }|t          |          dS )Nr   )itemstotal)r   len)r   r   r   s      r   household_import_historyr      s(    "4u555ESZZ000r   z/household/imports/optionsc                     t          |           S r   )r   r   s    r   household_import_optionsr          '---r   z/household/overviewNmonth
str | Nonec                $    t          ||           S N)r   )r   r   r   s     r   household_overviewr      s    !$e4444r   z/household/transactionsd   periodaccounttypecategorymerchantsourcereviewc	                2    t          || |||||||	  	        S )N)r   r   transaction_typer   r   r   r   r   )r   )	r   r   r   r   r   r   r   r   r   s	            r   household_transactionsr      s6     '
 
 
 
r   z/household/reviewc                $    t          ||           S r   )r   r   s     r   household_reviewr     s    E2222r   z/household/review/previewc                "    t          ||           S r   )r   r   s     r   household_review_previewr         *4999r   z/household/review/confirmc                "    t          ||           S r   )r   r   s     r   household_review_confirmr     r   r   z/import-status-auditc                     t          |           S r   )r   r   s    r   budget_import_status_auditr     s    $T***r   z/review-backlogc                     t          |           S r   )r    r   s    r   budget_review_backlogr     s    )$///r   z#/review-backlog/mark-2025-referencec                     t          |           S r   )r!   r   s    r   )budget_review_backlog_mark_2025_referencer     s    ,T222r   z/grocery-optimizer/dashboardc                     t          |           S r   )r|   r   s    r   grocery_optimizer_dashboardr   !      *4000r   z$/grocery-optimizer/provider-strategyc                     t                      S r   )r}    r   r   #grocery_optimizer_provider_strategyr  &  s    (***r   z/grocery-optimizer/rappn-linkproduct_namestrc                     t          |           S r   )rx   )r  s    r   grocery_optimizer_rappn_linkr  +  s    ---r   z$/grocery-optimizer/open-prices-spikec           	         t          |                     d          |                     d          t          |                     d          pd                    S )Nquerybarcodesize   )r	  r
  r  )r   r   r   )r   s    r   #grocery_optimizer_open_prices_spiker  0  sk    #'++g*>*>T]H^H^ehipititu{i|i|  jB  AB  fC  fC  D  D  D  Dr   z/grocery-optimizer/demo-receiptc                    t          ||                     d          pd|                     d          pd|                     d          pg           S )Npurchase_datez
2026-05-19
store_nameMigrosr   )r  r  r   )rw   r   r   s     r   grocery_optimizer_demo_receiptr  5  s    "4w{{?7S7S7cWcpwp{p{  }I  qJ  qJ  qV  NV  ^e  ^i  ^i  jq  ^r  ^r  ^x  vx  y  y  y  yr   z/grocery-optimizer/matchesc                `   t          || d         | d         | d         |                     d          pd| d         |                     d          |                     d          pd	g|                     d
          pd|                     d          pd|                     d          pd          S )Nproduct_item_idretailercandidate_product_namecandidate_urlzhttps://example.invalid/reviewcandidate_price_textcandidate_unit_price_textquality_flagsneeds_reviewmatch_confidencez0.60status	suggestedr   manual)	r  r  r  r  r  r  r  r  r   )r   r   r   s     r   grocery_optimizer_matchr   :  s   g.?&@7S]K^w~  @X  xY  ip  it  it  uD  iE  iE  ii  Ii  @G  H^  @_  {B  {F  {F  Gb  {c  {c  sz  s~  s~  N  sO  sO  sc  Tb  Sc  v}  vA  vA  BT  vU  vU  v_  Y_  ho  hs  hs  t|  h}  h}  hL  AL  U\  U`  U`  ai  Uj  Uj  Uv  nv  w  w  w  wr   z,/grocery-optimizer/matches/{match_id}/acceptmatch_iddict | Nonec                    |pi }t          || |                    d          t          |                    dd                              S )N	user_notesave_as_preferredT)r$  r%  )rv   r   boolr!  r   r   s      r   grocery_optimizer_accept_matchr(  ?  sn    mG'h'++kBZBZnrszs~s~  @S  UY  tZ  tZ  o[  o[  \  \  \  \r   z,/grocery-optimizer/matches/{match_id}/rejectc                P    t          || |pi                     d                    S )Nr$  )r$  )r   r   r'  s      r   grocery_optimizer_reject_matchr*  E  s*    'h7=bBUBUVaBbBbccccr   z)/grocery-optimizer/manual-mapping/previewc                r   t          || d         | d         | d         | d         |                     d          |                     d          |                     d          |                     d          |                     d	          |                     d
          |                     d                    S )Nr  target_retailertarget_product_nametarget_product_urlr  r  target_package_sizetarget_unittarget_price_datetarget_price_sourcer$  )r  r,  r-  r.  r  r  r/  r0  r1  r2  r$  )r~   r   r   s     r   (grocery_optimizer_manual_mapping_previewr3  J  s   )$HY@Zls  uF  mG  ]d  ez  ]{  PW  Xl  Pm  DK  DO  DO  Pf  Dg  Dg  CJ  CN  CN  Oj  Ck  Ck  AH  AL  AL  Mb  Ac  Ac  qx  q|  q|  }J  qK  qK  _f  _j  _j  k~  _  _  U\  U`  U`  av  Uw  Uw  C	J	  C	N	  C	N	  O	Z	  C	[	  C	[	  \	  \	  \	  \	r   z)/grocery-optimizer/manual-mapping/confirmc                "    t          ||           S r   )ry   r   s     r   (grocery_optimizer_manual_mapping_confirmr5  O  s    )$888r   z!/grocery-optimizer/manual-mappingc                   t          || d         | d         | d         | d         |                     d          |                     d          |                     d          |                     d          |                     d	          |                     d
          pd|                     d          |                     d          |                     d                    S )Nr  r,  r-  r.  target_brandr/  r0  r1  r2  
match_typemanual_matchr  r  r$  )r  r,  r-  r.  r7  r/  r0  r1  r2  r8  r  r  r$  )rz   r   r   s     r    grocery_optimizer_manual_mappingr:  T  s   (wGX?Ykr  tE  lF  \c  dy  \z  OV  Wk  Ol  {B  {F  {F  GU  {V  {V  ls  lw  lw  xM  lN  lN  \c  \g  \g  hu  \v  \v  JQ  JU  JU  Vi  Jj  Jj  @G  @K  @K  La  @b  @b  ov  oz  oz  {G  oH  oH  oZ  LZ  qx  q|  q|  }S	  qT	  qT	  p	w	  p	{	  p	{	  |	W
  p	X
  p	X
  d
k
  d
o
  d
o
  p
{
  d
|
  d
|
  }
  }
  }
  }
r   z6/grocery-optimizer/mappings/{mapping_id}/refresh-price
mapping_idc                "    t          ||           S r   )r   )r;  r   s     r   'grocery_optimizer_refresh_mapping_pricer=  Y  s    (z:::r   z/grocery-optimizer/optimizec           
         t          || d         |                     d          pg dt          |                     d          pd          |                     d                    S )N
receipt_idselected_retailers)CoopzAldi SuisseLidlDennerzOtto'smax_store_count   included_product_item_ids)r@  rD  rF  )r   r   r   r   s     r   grocery_optimizer_runrG  ^  s    #D',*?T[T_T_`tTuTu  Um  zm  zm  zm  B  CJ  CN  CN  O`  Ca  Ca  Cf  ef  g  g  CJ  CN  CN  Oj  Ck  Ck  l  l  l  lr   z /grocery-optimizer/search-pricesc                   |                      d          pdgd t          |                      d          pd                   }d |D             }t          || d         ||                      d          t          |                      d          pd	          t          |                      d
d                    t          |                      dd                    t          |                      dd                              S )N	retailersrA  max_retailersrE  c                ,    g | ]}t          |          S r  )r   ).0r  s     r   
<listcomp>z3grocery_optimizer_search_prices.<locals>.<listcomp>f  s!    KKKX&x00KKKr   r?  rF  max_productsr  	use_cacheTonly_safe_matchesprefer_known_mappings)	providersrF  rN  rO  rP  rQ  )r   r   r   r&  )r   r   rI  rR  s       r   grocery_optimizer_search_pricesrS  c  s    [))5fX7_W[[=Y=Y=^]^9_9_7_`IKKKKKI+")++.I"J"J^449::w{{;5566w{{+>EEFF"7;;/F#M#MNN	 	 	 	r   z/grocery-optimizer/reportc                .    t          || d                   S )Nrun_id)r{   r   s     r   grocery_optimizer_reportrV  s  s    /gh6GHHHr   z/monthly-import/dashboard2026budget_yearc                $    t          ||           S NrX  )ro   rX  r   s     r   monthly_import_dashboardr]  x  s    '+FFFFr   z/monthly-import/historyc                $    t          ||           S r   )rn   r   s     r   monthly_import_historyr_  }  s    d%0000r   z/monthly-import/drive-scanc                n    | pi                      d          }|t          |          nt                      S )Nfiles)r   rt   ru   )r   r   ra  s      r   monthly_import_drive_scanrb    s9    ]((E-2->"5)))DcDeDeer   z/monthly-import/dry-runc                    t          ||                     d          pg |                     d          |                     d                    S )Nra  default_category_idincome_category_idrd  re  )rs   r   r   s     r   monthly_import_dry_runrg    sn    %dGKK,@,@,FB\c\g\gh}\~\~  T[  T_  T_  `t  Tu  Tu  v  v  v  vr   z"/monthly-import/confirm-candidatesc           	         t          ||                     d          pg d|                     d          |                     d                    S )Nra  Frd  re  )dry_runrd  re  )rq   r   r   s     r   !monthly_import_confirm_candidatesrj    s}    'gkk'.B.B.HbRWmtmxmx  zO  nP  nP  el  ep  ep  qE  eF  eF  G  G  G  Gr   z/rules/suggestionsr  c                $    t          ||           S N)r  )rp   r  r   s     r   budget_rule_suggestionsrn    s     f5555r   z(/rules/suggestions/{suggestion_id}/applysuggestion_idc           	     j    t          || t          |pi                     d                              S )Napply_to_open)rq  )rm   r&  r   ro  r   r   s      r   budget_rule_suggestion_applyrs    s3     }D'-UWI\I\]lImImDnDnoooor   z)/rules/suggestions/{suggestion_id}/rejectc           	     j    t          || t          |pi                     d                              S )Nlater)ru  )rr   r&  r   rr  s      r   budget_rule_suggestion_rejectrv    s2    !$T7=bBUBUV]B^B^=_=_````r   z/planning/matrixyearcurrent_monthc                &    t          || |          S )N)rw  rx  )rb   )rw  rx  r   s      r   budget_planning_matrixrz    s    %d]SSSSr   z*/planning/categories/{category_id}/previewcategory_idc                $    t          || |          S r   )re   r{  r   r   s      r    budget_planning_category_previewr~        )$WEEEr   z*/planning/categories/{category_id}/confirmc                $    t          || |          S r   )r`   r}  s      r    budget_planning_category_confirmr    r  r   z(/planning/categories/{category_id}/audit   c                &    t          || |          S r   )ra   )r{  r   r   s      r   budget_planning_category_auditr    s    -dKuMMMMr   z/planning/batch/previewc                "    t          ||           S r   )rc   r   s     r   budget_planning_batch_previewr        (w777r   z/planning/batch/confirmc                "    t          ||           S r   )r_   r   s     r   budget_planning_batch_confirmr    r  r   z /planning/excel-template/previewc                &    t          || pi           S r   )rd   r   s     r   &budget_planning_excel_template_previewr    s    1$2FFFr   z
/recurringtodayc                $    t          ||           S )Nr  )rj   )r  r   s     r   recurring_dashboardr    s    "4u5555r   z/recurring/detectc                N    t          || pi                     d                    S )Nr  r  )ri   r   r   s     r   recurring_detectr    s'    .tGMr;N;Nw;W;WXXXXr   z/recurring/manual/previewc                "    t          ||           S r   )rk   r   s     r   recurring_manual_previewr        +D':::r   z/recurring/manual/confirmc                "    t          ||           S r   )rg   r   s     r   recurring_manual_confirmr    r  r   z,/recurring/candidates/{candidate_id}/previewcandidate_idc                $    t          || |          S r   )rl   r  r   r   s      r   recurring_candidate_previewr    s    -dL'JJJr   z,/recurring/candidates/{candidate_id}/confirmc                l    t          |          }|                    d|            t          ||          S )Nr  )r   
setdefaultrh   )r  r   r   bodys       r   recurring_candidate_confirmr    s1    ==DOONL111-dD999r   z!/recurring/{recurring_id}/archiverecurring_idc                (    t          || |pi           S r   )rf   )r  r   r   s      r   recurring_archiver    s    $T<BGGGr   z/dashboard/cockpitz2026-05c                $    t          ||           S r   )rR   r   s     r   dashboard_cockpitr    s    'E::::r   z/analysis/budget-vs-actualc                $    t          ||           S Nrw  )rS   rw  r   s     r   budget_vs_actual_analysisr        (D9999r   z	/overviewc                "    t          ||           S r   )rY   r   s     r   overviewr        tU+++r   z/status/categoriesc                $    t          ||           S r  )rZ   r  s     r   category_budget_statusr    r  r   z//status/categories/{category_id}/months/{month}c                &    t          || |          S )N)r{  r   )r[   )r{  r   r   s      r   category_month_detailr    s    $T{%PPPPr   z/chartsc                $    t          ||           S r  )rX   r  s     r   budget_chartsr        !$T2222r   z/analysis/categoriesexpensetx_typec                (    t          || ||          S )N)rw  r   r  )rV   )rw  r   r  r   s       r   category_analysisr    s    #Dt5'RRRRr   z/analysis/data-explorer both	date_fromdate_to
account_idsource_typetag
amount_min
amount_maxsearchrecurring_typec                >    t          || |||||||||	|
|||          S )N)rw  r   r  r  r   r{  r   r  r  r  r  r  r  r  )rT   )rw  r   r  r  r   r{  r   r  r  r  r  r  r  r  r   s                  r   data_explorerr    sl    $ $Dt5I_fmq  @K  V^  ku  CN  TW  dn  {E  NT  es  t  t  t  tr   z/analysis/merchantsc                *    t          || |||          S )N)rw  r   r   r   )rW   )rw  r   r   r   r   s        r   merchant_analysisr  !  s     DW[\\\\r   z/analysis/budget-deviationsc                $    t          ||           S r  )rU   r  s     r   budget_deviation_analysisr  &  r  r   z/analysis/monthlyc                $    t          ||           S r  rP   r  s     r   monthly_analysisr  +  r  r   z/analysis/monthly-comparisonc                $    t          ||           S r  rP   r  s     r   monthly_comparisonr  0  r  r   z/income/statusc                $    t          ||           S r  )r]   r  s     r   income_budget_statusr  5  s    T----r   z/income/plansFinclude_archivedr&  c                &    t          || |          S )N)rw  r  )r   )rw  r  r   s      r   income_plansr  :  s    !$TDTUUUUr   z/income/seed-candidatesc                $    t          ||           S r  )r   r  s     r   income_seed_candidatesr  ?  s    &t$7777r   z/income/plans/previewc                "    t          ||           S r   r   r   s     r   income_plans_previewr  D  r   r   z/income/plans/confirmc                "    t          ||           S r   r   r   s     r   income_plans_confirmr  I      #D'222r   z/income/templates/previewc                l    t          |t          | pi                     d          pd                    S Nrw  rW  r  )r   r  r   r   s     r   income_templates_previewr  N  5    (CB8K8KF8S8S8]W]4^4^____r   z/income/templates/confirmc                l    t          |t          | pi                     d          pd                    S r  )r   r  r   r   s     r   income_templates_confirmr  S  r  r   z+/income/plans/{plan_item_id}/update/previewplan_item_idc                $    t          || |          S r   )r   r  r   r   s      r   income_plans_update_previewr  X      *4wGGGr   z+/income/plans/{plan_item_id}/update/confirmc                $    t          || |          S r   )r   r  s      r   income_plans_update_confirmr  ]  r  r   z$/income/plans/{plan_item_id}/archivec                "    t          ||           S r   )r   )r  r   s     r   income_plans_archiver  b  s    #D,777r   z/income/plans/reorderc           	         t          ||                     d          pg t          |                     d          pd                    S )Nplan_item_idsrw  rW  r  )r   r   r  r   s     r   income_plans_reorderr  g  sG    $T7;;+G+G+M2TWX_XcXcdjXkXkXuouTvTvwwwwr   z/monthly-summaryc                "    t          ||           S r   )r^   r   s     r   monthly_summaryr  l  r  r   z/categories/summaryc                "    t          ||           S r   )r\   r   s     r   categories_summaryr  q  s    e,,,r   z	/accountsc                $    t          ||           S N)r  )r   r  r   s     r   accountsr  v  s    7GHHHHr   z/accounts/previewc                "    t          ||           S r   )r   r   s     r   accounts_previewr  {  r  r   z/accounts/confirmc                "    t          ||           S r   )r
   r   s     r   accounts_confirmr    r  r   z/accounts/{account_id}/archivec                "    t          ||           S r   )r	   )r  r   s     r   accounts_archiver    s    !$
333r   z/categoriesgroupedc                J    |rt          ||           S t          ||           S r  )r   r   )r  r  r   s      r   
categoriesr    s3     S)$AQRRRR42BCCCCr   z/categories/treec                $    t          ||           S r  )r   r  s     r   category_treer    s    %d=MNNNNr   z/tagsc                $    t          ||           S r  )r   r  s     r   r   r     s    T,<====r   z/tags/previewc                "    t          ||           S r   )r   r   s     r   tags_previewr        dG,,,r   z/tags/confirmc                "    t          ||           S r   )r   r   s     r   tags_confirmr    r  r   z/tags/{tag_id}/archivetag_idc                "    t          ||           S r   )r   )r  r   s     r   tags_archiver    s    tV$$$r   z/plansTc                &    t          || |          S )N)r   r  )r   )r   r  r   s      r   plansr
    s    !$eFVWWWWr   z/plans/previewc                "    t          ||           S r   r  r   s     r   plans_previewr    r   r   z/plans/confirmc                "    t          ||           S r   r  r   s     r   plans_confirmr    r  r   z/seed-candidatescandidate_typec                &    t          || |          S )N)r  r  )r   )r  r  r   s      r   seed_candidatesr    s    VNSSSSr   z/import-profilesc                     t                      S r   )r   r  r   r   budget_import_profilesr    s    !!!r   z'/import-profiles/{profile_name}/dry-runprofile_namec                    t          || t          |                    d          pd          |                    d          p|  dd|                    d          |                    d                    S )	Ncsv_textr  source_file_label.csvTrd  re  r  ri  rd  re  r   r  r   r  r   r   s      r   budget_import_profile_dry_runr    s    !$c'++j:Q:Q:WUW6X6Xlslwlw  yL  mM  mM  mf  T`  Qf  Qf  Qf  pt  JQ  JU  JU  Vk  Jl  Jl  AH  AL  AL  Ma  Ab  Ab  c  c  c  cr   z*/import-profiles/{profile_name}/candidatesc                    t          || t          |                    d          pd          |                    d          p|  dd|                    d          |                    d                    S )	Nr  r  r  r  Frd  re  r  r  r  s      r    budget_import_profile_candidatesr    s    !$c'++j:Q:Q:WUW6X6Xlslwlw  yL  mM  mM  mf  T`  Qf  Qf  Qf  pu  KR  KV  KV  Wl  Km  Km  BI  BM  BM  Nb  Bc  Bc  d  d  d  dr   z/import/upload/previewc           
     *   t          |t          |                     d          pd          t          |                     d          pd          |                     d          pd|                     d          |                     d          	          S )
Nfilenamez
budget.csvr  r  profileautord  re  )r   r  r!  rd  re  )r%   r  r   r   s     r   budget_import_upload_previewr#    s   )$W[[=T=T=dXd9e9epst{tt  AK  uL  uL  uR  PR  qS  qS  ]d  ]h  ]h  ir  ]s  ]s  ]}  w}  SZ  S^  S^  _t  Su  Su  JQ  JU  JU  Vj  Jk  Jk  l  l  l  lr   z!/import/upload/confirm-candidatesc                    t          |t          |                     d          p|                     d          pd          |                     d          |                     d                    S )N
preview_idimport_session_idr  rd  re  rf  )r"   r  r   r   s     r   'budget_import_upload_confirm_candidatesr'    s    4T3w{{<?X?X  @C\c\g\gh{\|\|  @C  AC  <D  <D  Za  Ze  Ze  f{  Z|  Z|  QX  Q\  Q\  ]q  Qr  Qr  s  s  s  sr   z/import/sessionsc                $    t          ||           S r   )r$   r   s     r   budget_import_sessionsr)    s    &t59999r   z$/import/sessions/{import_session_id}r&  c                "    t          ||           S r   )r#   )r&  r   s     r   budget_import_sessionr+    s    $T+<===r   z/transaction-candidates
created_atdesctabrulemin_confidencesort_bysort_dirinclude_referencec                x    t          |fi d| d|d|d|d|d|d|d|d	|d
|	d|
d|d|d|d|d|S )Nr  r.  r  r&  r{  r   r/  r0  r  r  r  r  r1  r2  rX  r3  )r;   )r  r.  r  r&  r{  r   r/  r0  r  r  r  r  r1  r2  rX  r3  r   s                    r   transaction_candidatesr5    sC   &t  O  O  OFF  O  OQ\Q\  O  qB  qB  O  P[  P[  O  fn  fn  O  uy  uy  O  JX  JX  O  dm  dm  O  w~  w~  O  KU  KU  O  bl  bl  O  v}  v}  O  HP  HP  O  ^i  ^i  O  }N  }N  O  Or   z/transaction-candidates/summaryc                $    t          ||           S rZ  )rF   r\  s     r   transaction_candidates_summaryr7    s    #DkBBBBr   z /transaction-candidates/generatec                *   |                      d          pd}|                      d          pg }|dk    rPt          |||                      d          pd|                      d          |                      dd	          
          S |dk    r^t          |||                      d          pd|                      d          t          |                      d          pd                    S |dk    r;t	          |||                      d          pd|                      d                    S |                      d          r.t          || d         |                      d          pd|          S t          |||                      d          pd|          S )Nr  csv_seedrowscredit_card_csvr  zCredit card CSVsubscription_category_idmigros_coveredT)r  r<  r=  
migros_csvz
Migros CSVauto_category_idthreshold_chfz50.00)r  r?  r@  bank_csvzBank CSVre  )r  re  r  z
CSV Import)r  r  zBudget Import)r   rH   rI   r  rG   rJ   rK   )r   r   r  r:  s       r   transaction_candidates_generaterB    s   ++m,,:
K;;v$"D'''4T4SZS^S^_rSsSs  TI  xI  dk  do  do  pJ  dK  dK  \c  \g  \g  hx  z~  \  \  @  @  @  	@l""/dgkkZmNnNnN~r~  RY  R]  R]  ^p  Rq  Rq  AD  EL  EP  EP  Q`  Ea  Ea  El  el  Am  Am  n  n  n  	nj  6tTU\U`U`atUuUu  VD  zD  Y`  Yd  Yd  ey  Yz  Yz  {  {  {  	{{{: q8wz?Rfmfqfq  sF  gG  gG  gW  KW  ep  q  q  q  	q0tw{{[nOoOo  PC  tC  Q\  ]  ]  ]  ]r   z./transaction-candidates/bank-income/reclassifyc                l    t          |t          | pi                     d          pd                    S NrX  rW  r[  )rD   r  r   r   s     r   -transaction_candidates_bank_income_reclassifyrE    s6    ,TsGMrCVCVWdCeCeCoio?p?pqqqqr   z>/transaction-candidates/internal-transfers/swisslos/reclassifyc                l    t          |t          | pi                     d          pd                    S rD  )r5   r  r   r   s     r   3transaction_candidates_swisslos_transfer_reclassifyrG    s7    /#w}RTFYFYZgFhFhFrlrBsBsttttr   z/transfer-pairsc                $    t          ||           S rl  )r   rm  s     r   transfer_pairsrI    s    tF3333r   z/transfer-pairs/matchc                p    t          | pi                     d          pd          }t          ||          S )Ndate_window_daysrE  )rK  )r   r   r   )r   r   windows      r   transfer_pairs_matchrM  	  s:    '-R$$%788=A>>F!$@@@@r   z!/transfer-pairs/{pair_id}/confirmpair_idc           
         |                     d          durt          dd          t          || dt          |                     d          pd          pd 	          S )
Nr   Tr   r   r   usernoter  decision_byrQ  )r   r   r   r  rN  r   r   s      r   transfer_pairs_confirmrU    sn    {{9T))4TUUUU V$$*++3t	   r   z /transfer-pairs/{pair_id}/rejectc           
     t    t          || dt          |pi                     d          pd          pd           S )NrP  rQ  r  rR  )r   r  r   rT  s      r   transfer_pairs_rejectrW    sI    '-R$$V,,233;t	   r   z+/transaction-candidates/migros-2026/previewc                l    t          |t          | pi                     d          pd                    S r  )r?   r  r   r   s     r   *transaction_candidates_migros_2026_previewrY  %  s5    '327J7J67R7R7\V\3]3]^^^^r   z+/transaction-candidates/migros-2026/confirmc           	         t          |t          |                     d          pd          t          |                     d          pd                    S )Nr  r  rw  rW  )r  rw  )r+   r  r   r   s     r   *transaction_candidates_migros_2026_confirmr[  *  sl    'W[[=V=V=\Z\9]9]dghohshstzh{h{  iF  @F  eG  eG  H  H  H  Hr   z./transaction-candidates/{candidate_id}/previewc                (    t          || |pi           S r   )rB   r  s      r   transaction_candidates_previewr]  /  s    (|W]KKKr   z./transaction-candidates/{candidate_id}/confirmc                $    t          || |          S r   )r/   r  s      r   transaction_candidates_confirmr_  4  s    (|WEEEr   zA/transaction-candidates/{candidate_id}/confirm-duplicate-overridec                $    t          || |          S r   )r.   r  s      r   1transaction_candidates_confirm_duplicate_overridera  9  s    %dL'BBBr   z-/transaction-candidates/{candidate_id}/ignorec                N    t          || |pi                     d                    S NrQ  )r8   r   r  s      r   transaction_candidates_ignorerd  >  '    'lW]<O<OPV<W<WXXXr   z-/transaction-candidates/{candidate_id}/reopenc                N    t          || |pi                     d                    S rc  )rE   r   r  s      r   transaction_candidates_reopenrg  C  re  r   z//transaction-candidates/{candidate_id}/categoryc                r    t          || |                    d          |                    d                    S )Nr{  rQ  )rO   r   r  s      r   transaction_candidates_categoryri  H  s3    0|W[[Q^E_E_ahalalmsatatuuur   z%/transaction-candidates/bulk-categoryc                    t          |                     d          pd          }t          ||                     d          pg ||                     d                    S )Nr{  r  candidate_idsrQ  )rk  r{  rQ  )r  r   r,   )r   r   r{  s      r   $transaction_candidates_bulk_categoryrl  M  s    gkk-006B77K5d'++VeJfJfJljl  {F  MT  MX  MX  Y_  M`  M`  a  a  a  ar   z,/transaction-candidates/{candidate_id}/splitc                N    t          || |                    d          pg           S )Nsplits)r3   r   r  s      r   transaction_candidates_splitro  S  s%    !$gkk(6K6K6QrRRRr   z4/transaction-candidates/{candidate_id}/split/confirmc                $    t          || |          S r   )r-   r  s      r   $transaction_candidates_split_confirmrq  X  s    "4w???r   z6/transaction-candidates/{candidate_id}/category/createc                $    t          || |          S r   )r4   r  s      r   &transaction_candidates_create_categoryrs  ]  s    /lGLLLr   z//transaction-candidates/{candidate_id}/transferc                N    t          || |pi                     d                    S rc  )r=   r   r  s      r   transaction_candidates_transferru  b  s&    "427J7J67R7RSSSr   z+/transaction-candidates/{candidate_id}/typec           	         t          || t          |                    d          pd          |pi                     d                    S )Nr  r  rQ  )r>   r  r   r  s      r   transaction_candidates_typerw  g  sG    t\3w{{CS7T7T7ZXZ3[3[^e^kik]p]pqw]x]xyyyr   z2/transaction-candidates/batch-confirm-safe/previewc                     t          |           S r   )rA   r   s    r   1transaction_candidates_batch_confirm_safe_previewry  l  r   r   z%/transaction-candidates/batch/previewc           
         t          ||                     d          pg t          |                     d          pd          t          |                     d          pd                    S )Nrk  r  r  rX  rW  )rk  r  rX  )r@   r   r  r   s     r   $transaction_candidates_batch_previewr{  q  s    +DO@\@\@b`borszs~s~  @L  tM  tM  tS  QS  pT  pT  be  fm  fq  fq  r  f@  f@  fJ  DJ  bK  bK  L  L  L  Lr   z/transaction-candidates/batchc                z   t          ||                     d          pg t          |                     d          pd          |                     d          |                     d          |                     d          |                     d          t          |                     d          pd	          
          S )Nrk  actionr  r  r{  r%  rQ  rX  rW  )rk  r}  r  r{  r%  rQ  rX  )r*   r   r  r   s     r   transaction_candidates_batchr~  v  sQ    W[[5Q5Q5WUW`cdkdodopxdydyd}  aA  aA  NU  NY  NY  Zf  Ng  Ng  u|  u@  u@  AN  uO  uO  \c  \g  \g  ht  \u  \u  |C  |G  |G  HN  |O  |O  ]`  ah  al  al  mz  a{  a{  aE  E  ]F  ]F  G  G  G  Gr   z./transaction-candidates/archive-reference-yearc           	         | pi } t          |t          |                     d          pd          t          |                     d          pd                    S )Nactive_yearrW  reference_year2025)r  r  )r&   r  r   r   s     r   (transaction_candidates_archive_referencer  {  s    mG,Ts7;;}C]C]Cgag?h?hy|  ~E  ~I  ~I  JZ  ~[  ~[  ~e  _e  zf  zf  g  g  g  gr   z*/transaction-candidates/batch-confirm-safec                    t          |                     d          pd          }t          |||                     d          pd           S )Nr  r  rk  )r  rk  )r  r   r)   )r   r   r  s      r   )transaction_candidates_batch_confirm_safer    sK    W[[..4"55J(*T[T_T_`oTpTpTxtxyyyyr   z)/transaction-candidates/detect-duplicatesc                     t          |           S r   )r7   r   s    r   (transaction_candidates_detect_duplicatesr    s    &t,,,r   z
/merchantsinclude_inactivec                $    t          ||           S N)r  )r:   r  r   s     r   	merchantsr    s    $1ABBBBr   c                "    t          ||           S r   )r1   r   s     r   merchants_creater    s    4)))r   z /merchants/{merchant_id}/aliasesmerchant_idc                $    t          || |          S r   )r2   r  r   r   s      r   merchants_create_aliasr    s     {G<<<r   z!/merchants/{merchant_id}/categoryc                J    t          || |                    d                    S )Nr{  )rN   r   r  s      r   merchants_update_categoryr    s     #D+w{{=7Q7QRRRr   z/merchants/{merchant_id}/applyc                "    t          ||           S r   )r(   )r  r   s     r   merchants_applyr    s    ,T;???r   z/merchants/mergec           	         t          |t          |                     d          pd          t          |                     d          pd                    S )Nsource_merchant_idr  target_merchant_id)r<   r  r   r   s     r   merchants_merger    sL    4W[[1E%F%F%L"!M!MsSZS^S^_sStStSzxzO{O{|||r   z/seed-candidates/generatec                z    t          ||                     d          pi |                     d          pd          S )Nworkbook_rowsr  zBudget workbook)r  )r   r   r   s     r   seed_candidates_generater    s_    +D'++o2N2N2TRThohshs  uH  iI  iI  i^  M^  _  _  _  _r   z,/seed-candidates/{seed_candidate_id}/previewseed_candidate_idc                (    t          || |pi           S r   )r   r  r   r   s      r   seed_candidates_previewr    s    !$(97=bIIIr   z,/seed-candidates/{seed_candidate_id}/confirmc                $    t          || |          S r   )r   r  s      r   seed_candidates_confirmr    s    !$(97CCCr   z+/seed-candidates/{seed_candidate_id}/ignorec                N    t          || |pi                     d                    S rc  )r   r   r  s      r   seed_candidates_ignorer    '     '87=b:M:Mf:U:UVVVr   z+/seed-candidates/{seed_candidate_id}/reopenc                N    t          || |pi                     d                    S rc  )r   r   r  s      r   seed_candidates_reopenr    r  r   z+/seed-candidates/{seed_candidate_id}/statusc                r    t          || |                    d          |                    d                    S )Nr  rQ  )r   r   r  s      r   seed_candidates_statusr    s3    $T+<gkk(>S>SU\U`U`agUhUhiiir   z4/seed-candidates/{seed_candidate_id}/convert-uncleanc                L    t          || |                    d          |          S )Ntarget_type)r   r   r  s      r   seed_candidates_convert_uncleanr    s$     '8'++m:T:TV]^^^r   z2/seed-candidates/categories/preview-clear-takeoverc                     t          |           S r   )r   r   s    r   1seed_candidates_categories_preview_clear_takeoverr    r   r   z2/seed-candidates/categories/confirm-clear-takeoverc                     t          |           S r   )r   r   s    r   1seed_candidates_categories_confirm_clear_takeoverr    r   r   z./seed-candidates/budget-plans/preview-takeoverc                     t          |           S r   )r   r   s    r   -seed_candidates_budget_plans_preview_takeoverr    r   r   z./seed-candidates/budget-plans/confirm-takeoverc                     t          |           S r   )r   r   s    r   -seed_candidates_budget_plans_confirm_takeoverr    r   r   z/categories/previewc                "    t          ||           S r   )r   r   s     r   categories_previewr        "4111r   z/categories/confirmc                "    t          ||           S r   )r   r   s     r   categories_confirmr    r  r   z /categories/{category_id}/updatec                $    t          || |          S r   )r   r}  s      r   categories_updater    s    4g666r   z!/categories/{category_id}/archivec                "    t          ||           S r   )r   r{  r   s     r   categories_archiver    s    D+...r   z&/categories/{category_id}/delete-emptyc                "    t          ||           S r   r   r  s     r   categories_delete_emptyr         {333r   z/categories/{category_id}c                "    t          ||           S r   r  r  s     r   categories_deleter    r  r   z/categories/cleanup/previewc                     t          |           S r   )r   r   s    r   categories_cleanup_previewr    r   r   z/categories/cleanup/confirmc                "    t          ||           S r   )r   r   s     r   categories_cleanup_confirmr    r   r   z/categories/reorderc           	         t          ||                     d          pg t          |                     d          pd                    S )Ncategory_idscategory_typer  )r  )r   r   r  r   s     r   categories_reorderr  	  sc    dGKK$?$?$E2UXY`YdYdetYuYu  ZC  zC  VD  VD  E  E  E  Er   z/categories/merge/previewc                     t          |           S r   )r   r   s    r   categories_merge_previewr    s    "4(((r   z/categories/merge/confirmc                "    t          ||           S r   )r   r   s     r   categories_merge_confirmr        !$000r   z/rulesc                $    t          ||           S r  )r9   r  s     r   rulesr    s    T4DEEEEr   c                "    t          ||           S r   )r0   r   s     r   rules_creater    r  r   z/rules/{rule_id}/deactivaterule_idc                "    t          ||           S r   )r6   r  r   s     r   rules_deactivater  "  r  r   z/rules/{rule_id}/updatec                $    t          || |          S r   )rM   r  r   r   s      r   rules_updater  '  s    dGW555r   z/rules/{rule_id}/priorityc           	     h    t          || t          |                    d          pd                    S )Npriorityr   )rC   r   r   r  s      r   rules_prioritizer  ,  s.    !$W[[5L5L5SPS1T1TUUUr   z/rules/{rule_id}/testc                "    t          ||           S r   )rL   r  s     r   
rules_testr  1      D'***r   z/rules/{rule_id}/applyc                "    t          ||           S r   )r'   r  s     r   rules_applyr  6  s    0w???r   z/transactionsr   c                :    t          || |||||||||	|
|          S )N)r   rw  r  r{  r   r   r  r  r  r  r  r  )r   )r   rw  r  r{  r   r   r  r  r  r  r  r  r   s                r   transactionsr  ;  s`    #DDZep  DT  _g  mp  y  MX  ag  s|  FM  N  N  N  Nr   z/transactions/previewc                "    t          ||           S r   )r   r   s     r   transactions_previewr  @  s    ,T7;;;r   z/transactions/confirmc                "    t          ||           S r   )r   r   s     r   transactions_confirmr  E  s    %dG444r   z%/transactions/{transaction_id}/updatetransaction_idc                $    t          || |          S r   )r   r  r   r   s      r   transactions_updater  J  s    $T>7CCCr   z./transactions/{transaction_id}/reverse/previewc                (    t          || |pi           S r   )r   r  s      r   transactions_reverse_previewr  O  s    -dNGMrRRRr   z./transactions/{transaction_id}/reverse/confirmc                $    t          || |          S r   )r   r  s      r   transactions_reverse_confirmr  T  s    -dNGLLLr   z
/transferstransfer_typec                (    t          || ||          S )N)rw  r  r  )r   )rw  r  r  r   s       r   	transfersr  Y  s     DZWdeeeer   z/transfers/previewc                "    t          ||           S r   )r   r   s     r   transfers_previewr  ^  r  r   z/transfers/confirmc                "    t          ||           S r   )r   r   s     r   transfers_confirmr  c  r  r   )r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r  r  )r   r   )r!  r  r   r"  r   r   )r;  r  r   r   )rX  r  r   r   )r   r"  r   r   )r  r   r   r   )ro  r  r   r"  r   r   )rw  r  rx  r   r   r   )r{  r  r   r   r   r   )r{  r  r   r   r   r   )r  r   r   r   )r  r  r   r   r   r   )r  r  r   r"  r   r   )r   r  r   r   )rw  r  r   r   )r{  r  r   r  r   r   )rw  r  r   r   r  r  r   r   )rw  r  r   r  r  r  r  r  r   r  r{  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   )
rw  r  r   r  r   r  r   r  r   r   )rw  r  r  r&  r   r   )r  r  r   r   r   r   )r  r  r   r   )r  r&  r   r   )r  r  r   r   )r  r&  r  r&  r   r   )r  r  r   r   )r   r   r  r&  r   r   )r  r   r  r   r   r   )r  r  r   r   r   r   )r&  r  r   r   )"r  r   r.  r   r  r   r&  r   r{  r   r   r   r/  r   r0  r   r  r   r  r   r  r   r  r   r1  r  r2  r  rX  r  r3  r&  r   r   )rN  r  r   r   r   r   )rN  r  r   r"  r   r   )r  r  r   r"  r   r   )r  r&  r   r   )r  r  r   r   r   r   )r  r  r   r   )r  r  r   r"  r   r   )r  r  r   r   r   r   )r{  r  r   r   )r  r  r   r   )r  r  r   r   r   r   )r   r   rw  r   r  r   r{  r   r   r   r   r   r  r   r  r   r  r   r  r   r  r   r  r   r   r   )r  r  r   r   r   r   )r  r  r   r"  r   r   )rw  r   r  r   r  r   r   r   (x  
__future__r   fastapir   r   r   sqlite3r   jarvis_finance.api.dependenciesr   'jarvis_finance.services.budget_accountsr	   r
   r   r   )jarvis_finance.services.budget_categoriesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   *jarvis_finance.services.budget_csv_importsr   r   ,jarvis_finance.services.budget_import_statusr   r    r!   ,jarvis_finance.services.budget_import_uploadr"   r#   r$   r%   &jarvis_finance.services.budget_importsr&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   (jarvis_finance.services.budget_analyticsrQ   +jarvis_finance.services.budget_analytics_v2rR   rS   ,jarvis_finance.services.budget_data_explorerrT   rU   rV   rW   'jarvis_finance.services.budget_overviewrX   rY   rZ   r[   r\   r]   r^   'jarvis_finance.services.budget_planningr_   r`   ra   rb   rc   rd   re   (jarvis_finance.services.budget_recurringrf   rg   rh   ri   rj   rk   rl   -jarvis_finance.services.budget_monthly_importrm   rn   ro   rp   rq   rr   rs   rt   ru   )jarvis_finance.services.grocery_optimizerrv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   /jarvis_finance.services.grocery_price_providersr   r   r   $jarvis_finance.services.budget_plansr   r   r   r   r   r   r   r   r   r   r   *jarvis_finance.services.budget_seed_reviewr   r   r   r   r   r   r   r   r   r   r   r   +jarvis_finance.services.budget_transactionsr   r   r   r   r   r   r   r   r   (jarvis_finance.services.transfer_pairingr   r   r   r   (jarvis_finance.services.household_importr   r   r   r   r   r   r   r   r   r   r   routerr   r   postr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r(  r*  r3  r5  r:  r=  rG  rS  rV  r]  r_  rb  rg  rj  rn  rs  rv  rz  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r
  r  r  r  r  r  r  r#  r'  r)  r+  r5  r7  rB  rE  rG  rI  rM  rU  rW  rY  r[  r]  r_  ra  rd  rg  ri  rl  ro  rq  rs  ru  rw  ry  r{  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  deleter  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   <module>r     s6   " " " " " " 5 5 5 5 5 5 5 5 5 5       2 2 2 2 2 2 _  _  _  _  _  _  _  _  _  _  _  _                                   $ d c c c c c c c V  V  V  V  V  V  V  V  V  V           + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +X L K K K K K s s s s s s s s b  b  b  b  b  b  b  b  b  b  b  b X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X                                  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                              N  N  N  N  N  N  N  N  N  N                                                    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                                     
)8*	5	5	5 ())18 & & & & *)& 122GNwv 3 3 3 3 323 ()))**?Fwv 3 3 3 3 +* *)3 ()))**?Fwv 3 3 3 3 +* *)3 '((())*, 5 5 5 5 *) )(5  !!*, 1 1 1 1 "!1
 ())07 . . . . *). !""+/GGFOO 5 5 5 5 #"5 %&&wv    '&0   "%''&// 3 3 3 3 ! 3 ())?Fwv : : : : *): ())?Fwv : : : : *): "##29'&// + + + + $#+ -4WV__ 0 0 0 0 0 233AH 3 3 3 3 433 *++3:76?? 1 1 1 1 ,+1 233+ + 43+ +,,. . . -,. 344D D D 54D .//ELWV__ y y y y 0/y )**>Egfoo w w w w +*w ;<<IMbibijpbqbq \ \ \ \ =<\
 ;<<IMbibijpbqbq d d d d =<d 899OVwW] \	 \	 \	 \	 :9\	 899OVwW] 9 9 9 9 :99 011GNwv }
 }
 }
 }
 21}
 EFFPWPWX^P_P_ ; ; ; ; GF; *++<CGFOO l l l l ,+l /00FMgfoo     10 ())?Fwv I I I I *)I '((0677SY?? G G G G )(G %&&(*wwv 1 1 1 1 '&1 )**59ggV\oo f f f f +*f
 &''=DWV__ v v v v ('v 122HOPV G G G G 32G  !!15''RX// 6 6 6 6 "!6 788LPelelmsetet p p p p 98p 899MQfmfmntfufu a a a a :9a '-4dkdklrdsds T T T T  T 9::Y`Y`agYhYh F F F F ;:F 9::Y`Y`agYhYh F F F F ;:F 677BDY`Y`agYhYh N N N N 87N &''DKGFOO 8 8 8 8 ('8 &''DKGFOO 8 8 8 8 ('8 /00BF[b[bci[j[j G G G G 10G L,0WWV__ 6 6 6 6 6  !!,0WWV__ Y Y Y Y "!Y ())?Fwv ; ; ; ; *); ())?Fwv ; ; ; ; *); ;<<U\U\]cUdUd K K K K =<K ;<<U\U\]cUdUd : : : : =<: 011@DY`Y`agYhYh H H H H 21H  !!#, ; ; ; ; "!; ())*0WWV__ : : : : *): K!%''&// , , , , ,  !!'-''&// : : : : "!: =>>KR7SY?? Q Q Q Q ?>Q I$ 3 3 3 3 3 "##"(dS\qxqxy  rA  rA S S S S $#S %&&wvt t t t '&t( !"""(r2[d  zA  zA  BH  zI  zI ] ] ] ] #"] )***0WWV__ : : : : +*:   !'GGFOO 3 3 3 3 ! 3 *++#)ggfoo 3 3 3 3 ,+3 %+ . . . . . O#eX_X_`fXgXg V V V V V %&&'-''&// 8 8 8 8 '&8 $%%;B76?? : : : : &%: $%%;B76?? 3 3 3 3 &%3 ())48WWU[__ ` ` ` ` *)` ())48WWU[__ ` ` ` ` *)` :;;U\U\]cUdUd H H H H <;H :;;U\U\]cUdUd H H H H <;H 344?Fwv 8 8 8 8 548 $%%;B76?? x x x x &%x (, , , , ,  , !""+/GGFOO - - - - #"- K&+ I I I I I  !!7>wv 8 8 8 8 "!8  !!7>wv 8 8 8 8 "!8 -..9@ 4 4 4 4 /.4 M(-uY`Y`agYhYh D D D D D +0WWV__ O O O O  O G"'GGFOO > > > > > _3:76?? - - - - - _3:76?? - - - - - %&&18 % % % % '&% H"TV]V]^dVeVe X X X X X 4;GFOO : : : : : 4;GFOO 3 3 3 3 3 )-Delelmsetet T T T T  T " "  " 677W^W^_eWfWf c c c c 87c 9::ZaZabhZiZi d d d d ;:d %&&CJ76?? l l l l '&l 011NUgV\oo s s s s 21s (*wwv : : : :  : 233ELWV__ > > > > 43> %&&04hl  OS  os  LP  ei  HL  fj  BF  ae  @D  Ua  sy  NT  pu  JQ  JQ  RX  JY  JY O O O O '&O -..6<QXQXY_Q`Q` C C C C /.C /00FMgfoo ] ] ] ] 10] =>>IMbibijpbqbq r r r r ?>r MNNOShohopvhwhw u u u u ONu (, 4 4 4 4 4 $%%04QW A A A A &%A
 011KR7SY??     21 /00?CX_X_`fXgXg     10 :;;FJ_f_fgm_n_n _ _ _ _ <;_ :;;QXQXY_Q`Q` H H H H <;H =>>MQfmfmntfufu L L L L ?>L =>>X_X_`fXgXg F F F F ?>F PQQkrkrsykzkz C C C C RQC <==LPelelmsetet Y Y Y Y >=Y <==LPelelmsetet Y Y Y Y >=Y >??Y`Y`agYhYh v v v v @?v 455KR7SY?? a a a a 65a
 ;<<V]V]^dVeVe S S S S =<S CDD^e^efl^m^m @ @ @ @ ED@ EFF`g`ghn`o`o M M M M GFM >??NRgngnougvgv T T T T @?T :;;U\U\]cUdUd z z z z <;z ABBIPQW . . . . CB. 455KR7SY?? L L L L 65L ,--CJ76?? G G G G .-G =>>DH]d]dek]l]l g g g g ?>g
 9::PWPWX^P_P_ z z z z ;:z
 899@G - - - - :9- L', C C C C C \7>wv * * * * * /00OVwW] = = = = 10= 011RYRYZ`RaRa S S S S 21S -..9@ @ @ @ @ /.@   6=gfoo } } } } ! } ())?Fwv _ _ _ _ *)_ ;<<KOdkdklrdsds J J J J =<J ;<<V]V]^dVeVe D D D D =<D :;;JNcjcjkqcrcr W W W W <;W :;;JNcjcjkqcrcr W W W W <;W :;;U\U\]cUdUd j j j j <;j CDD^e^efl^m^m _ _ _ _ ED_ ABBIPQW 1 1 1 1 CB1 ABBIPQW 1 1 1 1 CB1 =>>ELWV__ . . . . ?>. =>>ELWV__ . . . . ?>. "##9@ 2 2 2 2 $#2 "##9@ 2 2 2 2 $#2 /00JQ'RX// 7 7 7 7 107 011<CGFOO / / / / 21/ 566AH 4 4 4 4 764 *++;B76?? 4 4 4 4 ,+4 *++29'&// 1 1 1 1 ,+1 *++AH : : : : ,+: "##9@ E E E E $#E ())07 ) ) ) ) *)) ())?Fwv 1 1 1 1 *)1 H#(WWV__ F F F F F X3:76?? - - - - - *++6=gfoo 1 1 1 1 ,+1 &''AH 6 6 6 6 ('6 ())ELWV__ V V V V *)V $%%07 + + + + &%+ %&&18 @ @ @ @ '&@ O%)f_c  @D  ei  BF  Z^  uy  UY  pt  NR  jn  CJ  CJ  KQ  CR  CR N N N N N $%%;B76?? < < < < &%< $%%;B76?? 5 5 5 5 &%5 455OVwW] D D D D 65D =>>MQfmfmntfufu S S S S ?>S =>>X_X_`fXgXg M M M M ?>M L!'$dh  ~E  ~E  FL  ~M  ~M f f f f f !""8? 2 2 2 2 #"2 !""8? + + + + #"+ + +r   