
    ojC#                     8   d dl mZmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d Zd Z d Z! ejD                  dddg      d        Z#d Z$ ejD                  dddg      d        Z%y)    )DecimalInvalidOperation)date)render_templateredirecturl_forflashrequestabort)func)
budgets_bp)BudgetEntryFormBudgetRecommendForm)db)Budget)Category)Settings)Transaction)fifty_thirty_twentyc                 N   |  d|dd}t         j                  j                  t        j                  t        j                  t        j                        j                  d            j                  t        j                  j                  |      t        j                  dk(        j                  t        j                        j                         }|D ci c]  }|j                  |j                   }}g }|D ]  }	|j!                  |	j"                        }
|
r|
j                  n
t%        d      }|j!                  |	j"                  t%        d            }||z
  }|dkD  rt'        ||z  dz        }nd}|dk\  rd	n|d
k\  rdnd}|j)                  |	||
du||||d        |S c c}w )zJReturn list of per-category display dicts with actuals and progress state.-02dz-%totalF0r   d   dangerP   warningsafeN)categorybudgeted
has_budgetspent	remainingpctstate)r   sessionqueryr   category_idr   sumamountlabelfilterr   like	is_creditgroup_byallr   getidr   intappend)yearmonthexistingactive_categoriesmonth_prefix
spent_rowsrowactualsrowscatbudgetr!   r#   r$   r%   r&   s                   9/var/www/html/financials/app/blueprints/budgets/routes.py_build_actualsrB      sx   V1U3Kr*L


00$((;;M;M2N2T2TU\2]^	  %%l3[5J5Je5S	T	+))	*		  6@@cs		)@G@D  cff%$*6==CFFGCL1u$	a<eh&,-CC3J#)Y  ,"
 	& K- As   F"c            
      8   t         j                  j                  t        j                  t        j
                        j                         j                         } t         j                  j                  t        j                  t        j                  t        j                  dd      t         j                        j                  d      t        j                  t        j                  t        j                  dd      t         j                        j                  d            j                         j                         }t        |       t        |      z  }t        j                          }|j#                  |j                  |j
                  f       t%        |d      S )	zPReturn sorted list of (year, month) tuples that have budget or transaction data.      r6         r7   T)reverse)r   r'   r(   r   r6   r7   distinctr1   r   castsubstrr   r   Integerr,   settodayaddsorted)budget_months
txn_monthsmonthsrN   s       rA   _available_monthsrT   3   s    	

fll3		  	

IIdkk+"2"2Aq92::FLLVTIIdkk+"2"2Aq92::FLLWU	
 
	  #j/1FJJLE
JJ

EKK()&$''    c                     t        j                         }| r.	 | j                  d      }t        |d         t        |d         fS |j                  |j                  fS # t        t
        t        f$ r Y .w xY w)zQParse '?month=YYYY-MM' into (year, month). Returns today's year/month on failure.r   r   rD   )	r   rN   splitr4   AttributeError
IndexError
ValueErrorr6   r7   )paramrN   partss      rA   _parse_month_paramr]   H   sn    JJLE	KK$EuQx=#eAh-// ::u{{"" 
J7 		s   ,A A43A4/GETPOST)methodsc            
      b  	
 t        j                         } t        t        j                  j                  d            \   dd| j                  k(  xr | j                  k(  t               	t        j                  j                  d      j                  t        j                        j                         t        j                  j                        j                         D ci c]  }|j                   | c}t#              
t%               d 	
f
d}t        j&                  dk(  rՉs t)        d	d
       t+        t-        d            S j/                         ri	 t1        t        j2                  j                  dd            }t        j                  j;                        }j<                  j>                  xs djA                         }	 tC        |      }|dk  r8j<                  jF                  jI                  d       |jJ                   |       S j                  |jJ                        }|Mt        |jJ                  | j                  | j                  |      }tL        jN                  jQ                  |       n||_        tL        jN                  jS                          t)        dd       t+        t-        d            S 	 t1        t        j2                  j                  dd      xs d      xs d  |       S  |       S c c}w # t4        t6        f$ r t9        d       Y w xY w# tD        $ r; j<                  jF                  jI                  d       |jJ                   |       cY S w xY w# t4        t6        f$ r d Y  |       S w xY w)Nr7   r   r   T	is_active)r7   r6   c                  2   
 t        d 	d      S )Nzbudgets/index.htmlbudgets)
categoriesr8   display_rowsformerror_cat_idselected_keyselected_yearselected_monthis_current_monthavailable_monthsactive_pager   )
r9   ro   rh   rj   r8   ri   rn   rk   rm   rl   s
   rA   _render_indexzindex.<locals>._render_indexj   s4     (%%%')--!
 	
rU   r`   z8Budget amounts can only be edited for the current month.errorbudgets.indexr)    i  Enter a valid numeric amount.r   Amount must be zero or greater.r)   r7   r6   r+   zBudget saved.success)*r   rN   r]   r
   argsr2   r6   r7   rT   r   r(   	filter_byorder_bynamer1   r   r)   rB   r   methodr	   r   r   validate_on_submitr4   ri   	TypeErrorrZ   r   
get_or_404r+   datastripr   r   errorsr5   r3   r   r'   rO   commit)rN   brr   cat_idr?   rawr+   r@   r9   ro   rh   rj   r8   ri   rn   rk   rm   rl   s           @@@@@@@@@@rA   indexr   T   s	   JJLE$6w||7G7G7P$Q!M>#_AnS%9:L%3U%++8U(* 	  4 099(--HLLN 
 ''n='QUUW 	
qH
 "-K\]LDL
 
  ~~LgVGO455""$ W\\--mR@A ..++F3C;;##)r002C'  z""))*KL"vv$&\\#&&)F~ #++!	 

v& &JJ/9-GO455	 w||//qAFQGO4L ?=?UF z* c
 $ '""))*IJ"vv$&'8 :& 	 L?	 s=   8L'?)L, 0M (1N ,M
	M
ANNN.-N.c           
      (    t        dd||| ||d      S )Nbudgets/recommend.htmlTrf   )
has_incomemonthly_incomeitemsri   r   	submittedrp   rq   )ri   r   r   r   r   s        rA   _render_recommendr      s'     %	 	rU   z
/recommendc            	      D   t         j                  j                         } | r| j                  nd }|t	        ddd      S t
        j                  j                  d      j                         D ci c]  }|j                  | }}t        |      }|D cg c]  }||j                  |j                        f! }}t               }|j                         ri }i }	|D ]  \  }}
|
|j                  dk(  rt        j                   j                  d|
j"                   d	      j%                         }|sV	 t'        |      }|dk  rd||
j"                  <   w|dkD  s}||	|
j"                  <    |r_|D 
ci c]C  \  }}
|
s	d|
j"                   t        j                   j                  d|
j"                   d	      E }}}
t+        |||||      S t-        |	j/                         t'        d            }||kD  rtt1        d|dd|ddd       |D 
ci c]C  \  }}
|
s	d|
j"                   t        j                   j                  d|
j"                   d	      E }}}
t+        |||i |      S t3        j4                         }|	j7                         D ]  \  }}t8        j                  j                  ||j:                  |j<                        j                         }|r||_        Tt@        jB                  jE                  t9        ||j:                  |j<                  |              t@        jB                  jG                          t1        dd       tI        tK        d            S t+        |||i i       S c c}w c c}w # t(        $ r d
||
j"                  <   Y w xY wc c}
}w c c}
}w )Nr   Frf   )r   rp   Trc   savingsamount_ru   rv   r   rw   r   zTotal ($z.2fz) exceeds monthly income ($z). Please reduce some amounts.rs   )r)   r7   r6   rx   zBudgets applied.ry   rt   )&r   r(   firstr   r   r   r{   r1   r}   r   r2   category_namer   r   bucketr
   ri   r3   r   r   r   r   r*   valuesr	   r   rN   r   r   r7   r6   r+   r   r'   rO   r   r   r   )settingsr   ccat_maprecommendationsrecr   ri   r   amountsr?   r   r+   _r   r   rN   r   r8   s                      rA   	recommendr      sp   ~~##%H08X,,dN$!
 	
 ))D)9==? 	
	G  *.9O>MNsc7;;s0012NEN D  	)HC{cjjI5,,""WSVVH#5r:@@BC  z!Bsvvz"(	)" diqZ`Z[]`mp7366(+W\\-=-=x>PRT-UUqIq$T5.&)TTGNN$gcl3>!5+%@PS@T U. .
 ejqZ`Z[]`mp7366(+W\\-=-=x>PRT-UUqIq$T5."iPP

%mmo 		NFF||--"%++EJJ . eg  "(

vU[[uzzZ`a		 	

 ),011T5."bAAy O  $ !@svv r rs6   /M-$M22M70
N;=N
N=N7NNN)&decimalr   r   datetimer   flaskr   r   r   r	   r
   r   
sqlalchemyr   app.blueprints.budgetsr   app.blueprints.budgets.formsr   r   app.extensionsr   app.models.budgetr   app.models.categoryr   app.models.settingsr   app.models.transactionr   (app.services.insights.budget_recommenderr   rB   rT   r]   router   r   r    rU   rA   <module>r      s    -  K K  - M  $ ( ( . HD(*	# #v/V 0Vr
 ,8GB 9GBrU   