
    Abj                    <;   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  eddg          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%          d&             Ze                    d'          dd*            Ze                    d+          dd.            Ze                    d/           ee	          fdd0            Ze                    d1           ee	          fdd2            Ze                    d3          d4 ee	          fdd7            Ze                    d8          d4 ee	          fdd9            Ze                    d:           ee	          fdd;            Ze                    d<           ee	          fdd=            Ze                    d>           ee	          fdd?            Ze                    d@           ee	          fddB            Ze                    dC           ee	          fddD            Ze                    dE           ee	          fddF            Ze                    dG           ee	          fddH            Ze                    dI          dJ ee	          fddL            Ze                    dM          dN ee	          fddQ            Ze                    dR          d4 ee	          fddS            Ze                    dT           ee	          fddU            Ze                    dV           ee	          fddW            Ze                    dX          d4 ee	          fdd[            Ze                    d\          d4 ee	          fdd^            Ze                    d_          d4 ee	          fdd`            Ze                    da          dJd4 ee	          fddd            Ze                    de           ee	          fddg            Ze                    dh           ee	          fddi            Ze                    dj          dk ee	          fddl            Ze                    dm           ee	          fddn            Ze                    do           ee	          fddp            Ze                    dq          d4 ee	          fddr            Ze                    ds          d4 ee	          fddu            Ze                    dv          d4 ee	          fddw            Ze                    dx           ee	          fddy            Ze                    dz           ee	          fdd{            Ze                    d|           ee	          fdd~            Ze                    d           ee	          fdd            Ze                    d          d4 ee	          fdd            Ze                    d          d ee	          fdd            Ze                    d          dJ ee	          fdd            Ze                    d          d4 ee	          fdd            Ze                    d          dJ ee	          fdd            Ze                    d           ee	          fdd            Ze                    d          dJ ee	          fdd            Ze                    d          dJd4d ee	          fdd            Ze                    d          dJddddddddddddd ee	          fdd            Ze                    d          dJddd ee	          fdd            Ze                    d          dJ ee	          fdd            Ze                    d          dJ ee	          fdd            Ze                    d          dJ ee	          fdd            Ze                    d          dJ ee	          fdd            Ze                    d          dJd ee	          fdd            Ze                    d          dJ ee	          fdd            Ze                    d           ee	          fdd            Ze                    d           ee	          fdd            Ze                    d          d4 ee	          fdd            Ze                    d          d4 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Ǧ          d4 ee	          fddȄ            Ze                    dɦ          d4 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dd            Z
e                    d          d4d ee	          fdd            Ze                    d           ee	          fdd            Ze                    d           ee	          fdd            Ze                    d          d4d4 ee	          fdd            Ze                    d          d             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          dN ee	          fdd            Ze                    d           ee	          fdd            Ze                    d          d4d4d4d4d4d4d4d4d4d4d4d4dddJd ee	          fdd            Ze                    d          dJ ee	          fdd            Ze                    d           ee	          fdd            Ze                    d	          d4 ee	          fdd
            Ze                    d          d4 ee	          fdd            Ze                    d          d4 ee	          fdd            Ze                    d          d4 ee	          fdd            Ze                    d           ee	          fdd            Ze                    d          d4 ee	          fdd            Ze                    d          d4 ee	          fdd            Ze                    d           ee	          fdd            Z e                    d          d4 ee	          fdd            Z!e                    d           ee	          fdd            Z"e                    d           ee	          fdd            Z#e                    d           d4 ee	          fdd!            Z$e                    d"          d4 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                    d.          d4 ee	          fdd/            Z+e                    d0           ee	          fdd1            Z,e                    d2           ee	          fdd3            Z-e                    d4           ee	          fdd5            Z.e                    d6           ee	          fdd7            Z/e                    d8          d4 ee	          fdd9            Z0e                    d:           ee	          fdd;            Z1e                    d<           ee	          fdd=            Z2e                    d>          d ee	          fdd@            Z3e                    d>           ee	          fddA            Z4e                    dB           ee	          fdÐdD            Z5e                    dE           ee	          fdÐdF            Z6e                    dG           ee	          fdĐdH            Z7e                    dI           ee	          fddJ            Z8e                    dK           ee	          fddL            Z9e                    dM          d4 ee	          fdŐdO            Z:e                    dP           ee	          fdƐdQ            Z;e                    dR          d4 ee	          fdŐdS            Z<e                    dT          d4 ee	          fdŐdU            Z=e                    dV           ee	          fdƐdW            Z>e                    dX           ee	          fdƐdY            Z?e                    dZ           ee	          fdd[            Z@e                    d\           ee	          fdd]            ZAe                    d^           ee	          fdd_            ZBe                    d`           ee	          fdda            ZCe                    db           ee	          fddc            ZDe                    dd           ee	          fdde            ZEe                    df           ee	          fddg            ZFe                    dh           ee	          fdǐdi            ZGe                    dj           ee	          fdǐdk            ZHeI                    dl           ee	          fdǐdm            ZJe                    dn           ee	          fddo            ZKe                    dp           ee	          fddq            ZLe                    dr           ee	          fdds            ZMe                    dt           ee	          fddu            ZNe                    dv           ee	          fddw            ZOe                    dx          d ee	          fddy            ZPe                    dx           ee	          fddz            ZQe                    d{           ee	          fdȐd}            ZRe                    d~           ee	          fdɐd            ZSe                    d           ee	          fdɐd            ZTe                    d           ee	          fdȐd            ZUe                    d           ee	          fdȐd            ZVe                    d          d4dJd4d4d4d4d4d4d4d4d4d4 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          d4 ee	          fd̐d            Z[e                    d           ee	          fdːd            Z\e                    d          dJd4d4 ee	          fd͐d            Z]e                    d           ee	          fdd            Z^e                    d           ee	          fdd            Z_d4S (      )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_pairz/budgetbudget)prefixtagsz/import-status-auditconnr   c                     t          |           S N)r   r   s    /home/agent/.hermes/worktrees/FinanceManager-sprint4.1-portfolio-policy-contract-hardening/src/jarvis_finance/api/routers/budget.pybudget_import_status_auditr      s    $T***    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-spikepayloaddictc           	         t          |                     d          |                     d          t          |                     d          pd                    S )Nquerybarcodesize   )r   r   r   )r   getint)r   s    r   #grocery_optimizer_open_prices_spiker      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Migrositems)r   r   r   )rw   r   r   r   s     r   grocery_optimizer_demo_receiptr      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	suggestedsource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}/acceptN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      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   r   r   r   r   )r~   r   r   s     r   (grocery_optimizer_manual_mapping_previewr      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_confirmr      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   r   r   r   
match_typemanual_matchr   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   )rz   r   r   s     r    grocery_optimizer_manual_mappingr      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      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  r  r  )r   r   r   r   s     r   grocery_optimizer_runr     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	retailersr  max_retailersr  c                ,    g | ]}t          |          S r   )r   ).0r   s     r   
<listcomp>z3grocery_optimizer_search_prices.<locals>.<listcomp>  s!    KKKX&x00KKKr   r   r  max_productsr   	use_cacheTonly_safe_matchesprefer_known_mappings)	providersr  r  r  r  r  )r   r   r   r   )r   r   r
  r  s       r   grocery_optimizer_search_pricesr     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_reportr    s    /gh6GHHHr   z/monthly-import/dashboard2026budget_yearc                $    t          ||           S Nr  )ro   r  r   s     r   monthly_import_dashboardr    s    '+FFFFr   z/monthly-import/history   limitr   c                $    t          ||           S N)r   )rn   r   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   r&  s      r   monthly_import_drive_scanr'    s9    ]((E-2->"5)))DcDeDeer   z/monthly-import/dry-runc                    t          ||                     d          pg |                     d          |                     d                    S )Nr&  default_category_idincome_category_idr)  r*  )rs   r   r   s     r   monthly_import_dry_runr,  %  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 )Nr&  Fr)  r*  )dry_runr)  r*  )rq   r   r   s     r   !monthly_import_confirm_candidatesr/  *  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   
str | Nonec                $    t          ||           S N)r   )rp   r   r   s     r   budget_rule_suggestionsr4  /  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)r7  )rm   r   r   r5  r   r   s      r   budget_rule_suggestion_applyr9  4  s3     }D'-UWI\I\]lImImDnDnoooor   z)/rules/suggestions/{suggestion_id}/rejectc           	     j    t          || t          |pi                     d                              S )Nlater)r;  )rr   r   r   r8  s      r   budget_rule_suggestion_rejectr<  9  s2    !$T7=bBUBUV]B^B^=_=_````r   z/planning/matrixyearcurrent_monthc                &    t          || |          S )N)r=  r>  )rb   )r=  r>  r   s      r   budget_planning_matrixr@  >  s    %d]SSSSr   z*/planning/categories/{category_id}/previewcategory_idc                $    t          || |          S r   )re   rA  r   r   s      r    budget_planning_category_previewrD  C      )$WEEEr   z*/planning/categories/{category_id}/confirmc                $    t          || |          S r   )r`   rC  s      r    budget_planning_category_confirmrG  H  rE  r   z(/planning/categories/{category_id}/audit   c                &    t          || |          S r"  )ra   )rA  r   r   s      r   budget_planning_category_auditrJ  M  s    -dKuMMMMr   z/planning/batch/previewc                "    t          ||           S r   )rc   r   s     r   budget_planning_batch_previewrL  R      (w777r   z/planning/batch/confirmc                "    t          ||           S r   )r_   r   s     r   budget_planning_batch_confirmrO  W  rM  r   z /planning/excel-template/previewc                &    t          || pi           S r   )rd   r   s     r   &budget_planning_excel_template_previewrQ  \  s    1$2FFFr   z
/recurringtodayc                $    t          ||           S )NrR  )rj   )rR  r   s     r   recurring_dashboardrU  a  s    "4u5555r   z/recurring/detectc                N    t          || pi                     d                    S )NrR  rT  )ri   r   r   s     r   recurring_detectrW  f  s'    .tGMr;N;Nw;W;WXXXXr   z/recurring/manual/previewc                "    t          ||           S r   )rk   r   s     r   recurring_manual_previewrY  k      +D':::r   z/recurring/manual/confirmc                "    t          ||           S r   )rg   r   s     r   recurring_manual_confirmr\  p  rZ  r   z,/recurring/candidates/{candidate_id}/previewcandidate_idc                $    t          || |          S r   )rl   r]  r   r   s      r   recurring_candidate_previewr`  u  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_confirmrd  z  s1    ==DOONL111-dD999r   z!/recurring/{recurring_id}/archiverecurring_idc                (    t          || |pi           S r   )rf   )re  r   r   s      r   recurring_archiverg    s    $T<BGGGr   z/dashboard/cockpitz2026-05monthc                $    t          ||           S )N)rh  )rR   rh  r   s     r   dashboard_cockpitrk    s    'E::::r   z/analysis/budget-vs-actualc                $    t          ||           S Nr=  )rS   r=  r   s     r   budget_vs_actual_analysisrp        (D9999r   z	/overviewc                "    t          ||           S r   )rY   rj  s     r   overviewrs        tU+++r   z/status/categoriesc                $    t          ||           S rm  )rZ   ro  s     r   category_budget_statusrv    rq  r   z//status/categories/{category_id}/months/{month}c                &    t          || |          S )N)rA  rh  )r[   )rA  rh  r   s      r   category_month_detailrx    s    $T{%PPPPr   z/chartsc                $    t          ||           S rm  )rX   ro  s     r   budget_chartsrz        !$T2222r   z/analysis/categoriesexpensetx_typec                (    t          || ||          S )N)r=  rh  r}  )rV   )r=  rh  r}  r   s       r   category_analysisr    s    #Dt5'RRRRr   z/analysis/data-explorer both	date_fromdate_totypemerchant
account_idsource_typetag
amount_min
amount_maxsearchrecurring_typec                >    t          || |||||||||	|
|||          S )N)r=  rh  r  r  r  rA  r  r  r  r  r  r  r  r  )rT   )r=  rh  r  r  r  rA  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)r=  rh  r  r  )rW   )r=  rh  r  r  r   s        r   merchant_analysisr    s     DW[\\\\r   z/analysis/budget-deviationsc                $    t          ||           S rm  )rU   ro  s     r   budget_deviation_analysisr    rq  r   z/analysis/monthlyc                $    t          ||           S rm  rP   ro  s     r   monthly_analysisr    r{  r   z/analysis/monthly-comparisonc                $    t          ||           S rm  rP   ro  s     r   monthly_comparisonr    r{  r   z/income/statusc                $    t          ||           S rm  )r]   ro  s     r   income_budget_statusr    s    T----r   z/income/plansFinclude_archivedr   c                &    t          || |          S )N)r=  r  )r   )r=  r  r   s      r   income_plansr    s    !$TDTUUUUr   z/income/seed-candidatesc                $    t          ||           S rm  )r   ro  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        *4999r   z/income/plans/confirmc                "    t          ||           S r   r   r   s     r   income_plans_confirmr        #D'222r   z/income/templates/previewc                l    t          |t          | pi                     d          pd                    S Nr=  r  rn  )r   r   r   r   s     r   income_templates_previewr    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    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        *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    s    #D,777r   z/income/plans/reorderc           	         t          ||                     d          pg t          |                     d          pd                    S )Nplan_item_idsr=  r  rn  )r   r   r   r   s     r   income_plans_reorderr    sG    $T7;;+G+G+M2TWX_XcXcdjXkXkXuouTvTvwwwwr   z/monthly-summaryc                "    t          ||           S r   )r^   rj  s     r   monthly_summaryr  	  rt  r   z/categories/summaryc                "    t          ||           S r   )r\   rj  s     r   categories_summaryr    s    e,,,r   z	/accountsc                $    t          ||           S N)r  )r   r  r   s     r   accountsr    s    7GHHHHr   z/accounts/previewc                "    t          ||           S r   )r   r   s     r   accounts_previewr    rM  r   z/accounts/confirmc                "    t          ||           S r   )r
   r   s     r   accounts_confirmr    rM  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   3  s    T,<====r   z/tags/previewc                "    t          ||           S r   )r   r   s     r   tags_previewr  8      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  B  s    tV$$$r   z/plansTc                &    t          || |          S )N)rh  r  )r   )rh  r  r   s      r   plansr  G  s    !$eFVWWWWr   z/plans/previewc                "    t          ||           S r   r  r   s     r   plans_previewr  L  r  r   z/plans/confirmc                "    t          ||           S r   r  r   s     r   plans_confirmr  Q  r  r   z/seed-candidatescandidate_typec                &    t          || |          S )N)r   r  )r   )r   r  r   s      r   seed_candidatesr  V  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.csvTr)  r*  r  r.  r)  r*  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  Fr)  r*  r  r  r  s      r    budget_import_profile_candidatesr  e  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autor)  r*  )r  r  r  r)  r*  )r%   r   r   r   s     r   budget_import_upload_previewr  j  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  r)  r*  r+  )r"   r   r   r   s     r   'budget_import_upload_confirm_candidatesr  o  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  t  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  y  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  rA  r  r  r  r  r  r  r  r  r  r  r  )r;   )r   r  r  r  rA  r  r  r  r  r  r  r  r  r  r  r  r   s                    r   transaction_candidatesr   ~  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 r  )rF   r  s     r   transaction_candidates_summaryr    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 CSVr*  )r  r*  r  z
CSV Import)r  r  zBudget Import)r   rH   rI   r   rG   rJ   rK   )r   r   r  r  s       r   transaction_candidates_generater    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 Nr  r  r  )rD   r   r   r   s     r   -transaction_candidates_bank_income_reclassifyr    s6    ,TsGMrCVCVWdCeCeCoio?p?pqqqqr   z>/transaction-candidates/internal-transfers/swisslos/reclassifyc                l    t          |t          | pi                     d          pd                    S r  )r5   r   r   r   s     r   3transaction_candidates_swisslos_transfer_reclassifyr    s7    /#w}RTFYFYZgFhFhFrlrBsBsttttr   z/transfer-pairsc                $    t          ||           S r2  )r   r3  s     r   transfer_pairsr    s    tF3333r   z/transfer-pairs/matchc                p    t          | pi                     d          pd          }t          ||          S )Ndate_window_daysr  )r  )r   r   r   )r   r   windows      r   transfer_pairs_matchr    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 )
NconfirmTi  zexplicit confirm=true required)status_codedetailusernoter  decision_byr  )r   r   r   r   r  r   r   s      r   transfer_pairs_confirmr#    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 )Nr  r  r  r   )r   r   r   r"  s      r   transfer_pairs_rejectr%    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_previewr'    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  r=  r  )r  r=  )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-    s    (|WEEEr   zA/transaction-candidates/{candidate_id}/confirm-duplicate-overridec                $    t          || |          S r   )r.   r_  s      r   1transaction_candidates_confirm_duplicate_overrider/    s    %dL'BBBr   z-/transaction-candidates/{candidate_id}/ignorec                N    t          || |pi                     d                    S Nr  )r8   r   r_  s      r   transaction_candidates_ignorer2    '    'lW]<O<OPV<W<WXXXr   z-/transaction-candidates/{candidate_id}/reopenc                N    t          || |pi                     d                    S r1  )rE   r   r_  s      r   transaction_candidates_reopenr5    r3  r   z//transaction-candidates/{candidate_id}/categoryc                r    t          || |                    d          |                    d                    S )NrA  r  )rO   r   r_  s      r   transaction_candidates_categoryr7    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 )NrA  r  candidate_idsr  )r9  rA  r  )r   r   r,   )r   r   rA  s      r   $transaction_candidates_bulk_categoryr:    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_splitr=    s%    !$gkk(6K6K6QrRRRr   z4/transaction-candidates/{candidate_id}/split/confirmc                $    t          || |          S r   )r-   r_  s      r   $transaction_candidates_split_confirmr?    s    "4w???r   z6/transaction-candidates/{candidate_id}/category/createc                $    t          || |          S r   )r4   r_  s      r   &transaction_candidates_create_categoryrA    s    /lGLLLr   z//transaction-candidates/{candidate_id}/transferc                N    t          || |pi                     d                    S r1  )r=   r   r_  s      r   transaction_candidates_transferrC    s&    "427J7J67R7RSSSr   z+/transaction-candidates/{candidate_id}/typec           	         t          || t          |                    d          pd          |pi                     d                    S )Nr  r  r  )r>   r   r   r_  s      r   transaction_candidates_typerE    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_previewrG  	      '---r   z%/transaction-candidates/batch/previewc           
         t          ||                     d          pg t          |                     d          pd          t          |                     d          pd                    S )Nr9  r  r  r  r  )r9  r  r  )r@   r   r   r   s     r   $transaction_candidates_batch_previewrJ    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 )Nr9  actionr  r  rA  r  r  r  r  )r9  rL  r  rA  r  r  r  )r*   r   r   r   s     r   transaction_candidates_batchrM    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_yearr  reference_year2025)rO  rP  )r&   r   r   r   s     r   (transaction_candidates_archive_referencerR    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  r9  )r  r9  )r   r   r)   )r   r   r  s      r   )transaction_candidates_batch_confirm_saferT    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_duplicatesrV  $  s    &t,,,r   z
/merchantsinclude_inactivec                $    t          ||           S N)rW  )r:   rW  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_aliasra  3  s     {G<<<r   z!/merchants/{merchant_id}/categoryc                J    t          || |                    d                    S )NrA  )rN   r   r`  s      r   merchants_update_categoryrc  8  s     #D+w{{=7Q7QRRRr   z/merchants/{merchant_id}/applyc                "    t          ||           S r   )r(   )r^  r   s     r   merchants_applyre  =  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_mergeri  B  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_generaterl  G  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   rm  r   r   s      r   seed_candidates_previewrp  L  s    !$(97=bIIIr   z,/seed-candidates/{seed_candidate_id}/confirmc                $    t          || |          S r   )r   ro  s      r   seed_candidates_confirmrr  Q  s    !$(97CCCr   z+/seed-candidates/{seed_candidate_id}/ignorec                N    t          || |pi                     d                    S r1  )r   r   ro  s      r   seed_candidates_ignorert  V  '     '87=b:M:Mf:U:UVVVr   z+/seed-candidates/{seed_candidate_id}/reopenc                N    t          || |pi                     d                    S r1  )r   r   ro  s      r   seed_candidates_reopenrw  [  ru  r   z+/seed-candidates/{seed_candidate_id}/statusc                r    t          || |                    d          |                    d                    S )Nr   r  )r   r   ro  s      r   seed_candidates_statusry  `  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   ro  s      r   seed_candidates_convert_uncleanr|  e  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~  j  r   r   z2/seed-candidates/categories/confirm-clear-takeoverc                     t          |           S r   )r   r   s    r   1seed_candidates_categories_confirm_clear_takeoverr  o  r   r   z./seed-candidates/budget-plans/preview-takeoverc                     t          |           S r   )r   r   s    r   -seed_candidates_budget_plans_preview_takeoverr  t  rH  r   z./seed-candidates/budget-plans/confirm-takeoverc                     t          |           S r   )r   r   s    r   -seed_candidates_budget_plans_confirm_takeoverr  y  rH  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   rC  s      r   categories_updater    s    4g666r   z!/categories/{category_id}/archivec                "    t          ||           S r   )r   rA  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 rY  )r9   rZ  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priorityd   )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        D'***r   z/rules/{rule_id}/applyc                "    t          ||           S r   )r'   r  s     r   rules_applyr    s    0w???r   z/transactionstransaction_typec                :    t          || |||||||||	|
|          S )N)rh  r=  r  rA  r  r  r  r   r  r  r  r  )r   )rh  r=  r  rA  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    s    %dG444r   z%/transactions/{transaction_id}/updatetransaction_idc                $    t          || |          S r   )r   r  r   r   s      r   transactions_updater    s    $T>7CCCr   z./transactions/{transaction_id}/reverse/previewc                (    t          || |pi           S r   )r   r  s      r   transactions_reverse_previewr    s    -dNGMrRRRr   z./transactions/{transaction_id}/reverse/confirmc                $    t          || |          S r   )r   r  s      r   transactions_reverse_confirmr    s    -dNGLLLr   z
/transferstransfer_typec                (    t          || ||          S )N)r=  r  r  )r   )r=  r  r  r   s       r   	transfersr    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     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   )r5  r   r   r   r   r   )r=  r   r>  r0  r   r   )rA  r   r   r   r   r   )rA  r   r   r   r   r   )rR  r0  r   r   )r]  r   r   r   r   r   )re  r   r   r   r   r   )rh  r   r   r   )r=  r   r   r   )rh  r0  r   r   )rA  r   rh  r   r   r   )r=  r   rh  r0  r}  r   r   r   )r=  r   rh  r   r  r   r  r   r  r   rA  r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r   r   )
r=  r   rh  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   )rh  r0  r  r   r   r   )r   r0  r  r0  r   r   )r  r   r   r   r   r   )r  r   r   r   )"r   r0  r  r0  r  r0  r  r0  rA  r0  r  r0  r  r0  r  r0  r  r0  r  r0  r  r0  r  r0  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   )rm  r   r   r   r   r   )rm  r   r   r   r   r   )rA  r   r   r   )r  r   r   r   )r  r   r   r   r   r   )rh  r0  r=  r0  r  r0  rA  r0  r  r0  r  r0  r  r0  r   r0  r  r0  r  r0  r  r0  r  r0  r   r   )r  r   r   r   r   r   )r  r   r   r   r   r   )r=  r0  r  r0  r  r0  r   r   (`  
__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   routerr   r   r   postr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r$  r'  r,  r/  r4  r9  r<  r@  rD  rG  rJ  rL  rO  rQ  rU  rW  rY  r\  r`  rd  rg  rk  rp  rs  rv  rx  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/  r2  r5  r7  r:  r=  r?  rA  rC  rE  rG  rJ  rM  rR  rT  rV  r[  r]  ra  rc  re  ri  rl  rp  rr  rt  rw  ry  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     s2   " " " " " " 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 "##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   