
    ".j9                        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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 dlmZ d/de dedz  defdZ!de de de fdZ"de#de$e#e f   fdZ%d Z& ejN                  d      d        Z( ejN                  dddg      d        Z) ejN                  dddg      d         Z* ejN                  d!dg      d"        Z+ ejN                  d#dg      d$        Z, ejN                  d%dg      d&        Z- ejN                  d'ddg      d(        Z. ejN                  d)ddg      d*        Z/ ejN                  d+dg      d,        Z0d- Z1d. Z2y)0    )DecimalInvalidOperation)date)render_templateredirecturl_forflashrequestabort)bills_bp)BillFormDebtForm
ActionForm)db)Bill)Debt)Category)Transaction)Account)
add_monthsNdue_dayafterreturnc                    |xs t        j                         }|j                  |j                  }}	 t        ||t	        | t        ||                  }||k  r`t        t        ||d      d      }t        |j                  |j                  t	        | t        |j                  |j                                    }|S # t        $ r t        ||t        ||            }Y w xY w)zLReturn the next calendar date on which `due_day` falls, >= today (or after).   )r   todayyearmonthmin_days_in_month
ValueErrorr   )r   r   r   r   r   	candidate
next_months          7/var/www/html/financials/app/blueprints/bills/routes.py_next_due_dater%      s    !TZZ\E**ekk%DCuc'>$3N&OP	 5T5! 4a8
OO
9I9IJK
	
   CunT5&AB	Cs   !B: : CCr   r   c                 4    dd l }|j                  | |      d   S )Nr   r   )calendar
monthrange)r   r   r'   s      r$   r    r    '   s    tU+A..    due_date_strc                     t        j                         }t        j                  |       }||z
  j                  }|dk  rd|fS |dk(  ryd|fS )zAReturn (status_label, days_until_due) for a bill due_date string.r   Overdue)z	Due Todayr   Upcoming)r   r   fromisoformatdays)r*   r   duedeltas       r$   _bill_statusr2   ,   sS    JJLE


\
*C5[Eqy%	!5  r)   c                      t         j                  j                  d      j                  t         j                        j                         } dg| D cg c]  }|j                  |j                  f c}z   }|S c c}w )NT	is_active)r   u   — None —)r   query	filter_byorder_bynameallid)catscchoicess      r$   _category_choicesr?   9   s`    >>##d#3<<X]]KOOQD"#t&D!aff~&DDGN 'Es   A8/c                     t         j                  j                  d      dk(  } t        j                         }| s?t        |j
                  |j                  dk  r|j                  dz   nd|j                        nd }t        j                  j                  d      }t        j                  j                  d      }|j                         }|j                         }|D ]7  }|j                  rt        |j                        j!                         |_        9 t"        j$                  j'                          g }|D ]l  }t)        |j                        \  }	}
| s|
dkD  r#|j+                  d||	|
t        j,                  |j                        |j.                  |j0                  d	       n |D ]y  }|j                  st)        |j                        \  }	}
| s|
dkD  r0|j+                  d
||	|
t        j,                  |j                        |j.                  |j2                  d	       { |j5                  d        t7               }t9        d|| |d      S )Nr:   1   r   Tr4      bill)typeobjstatusr/   due_dater9   amountdebtc                     | d   S )NrI    )xs    r$   <lambda>zindex.<locals>.<lambda>s   s
    Qz] r)   )keyzbills/index.htmlbills)itemsshow_allaction_formactive_page)r
   argsgetr   r   r   r   dayr   r6   r7   r   r:   rI   r%   r   	isoformatr   sessioncommitr2   appendr.   r9   rJ   min_paymentsortr   r   )rS   r   cutoffbills_querydebts_queryrQ   debtsrE   rR   rH   r/   rK   rT   s                r$   indexrc   A   s   ||&#-HJJLE$, %**r1AekkAoq))26  **&&&6K**&&&6KOOEOOE  E}}*4<<8BBDDME JJ E #DMM2D2I**4==9IIkk
 		  =='6LFDr	LL  ..t}}=		**  
JJ*J+,K r)   z/createGETPOST)methodsc                  v   t               } t               | j                  _        | j	                         rmt        |       }|r,|D ]  }t        |d        t        d| t        d      dd      S t        | j                  j                        }t        | j                  j                  j                         t        | j                   j                  j                               || j"                  j                  xs dj                         xs d | j                  j                  xs d dt%        |      j'                         	      }t(        j*                  j-                  |       t(        j*                  j/                          t        d
d       t1        t        d            S t        d| t        d      dd      S )Nerrorbills/bill_form.htmlzbills.createzAdd BillrQ   form
action_urltitlerU    T)r9   rJ   r   payeecategory_idr5   rI   zBill added.successbills.index)r   r?   rp   r>   validate_on_submit_validate_bill_formr	   r   r   intr   datar   r9   stripr   rJ   ro   r%   rY   r   rZ   addr[   r   )rk   errorsmsgr   rE   s        r$   creater{      sb   :D02D $T* $c7#$"#9.5n.E)3J J dll''(%%'4;;++1134::??(b//19T((--5#G,668
 	

t


mY'.//1&-n&=!+B Br)   z/<int:bill_id>/editc                    t         j                  j                  |       }t        |      }t	               |j
                  _        t        j                  dk(  rt        |j                        |j                  _        t        |j                        |j                  _        |j
                  xs d|j
                  _        t        d|t        d|       dd	      S |j                         rt!        |      }|r.|D ]  }t#        |d
        t        d|t        d|       dd	      S t%        |j                  j                        }|j&                  j                  j)                         |_        t+        |j                  j                  j)                               |_        ||_
        |j,                  j                  xs dj)                         xs d |_        |j
                  j                  xs d |_        |j.                  j                  |_        t1        |      j3                         |_        t6        j8                  j;                          t#        dd       t=        t        d            S t        d|t        d|       dd	      S )NrG   rd   r   ri   z
bills.edit)bill_idz	Edit BillrQ   rj   rh   rn   zBill updated.rq   rr   )r   r6   
get_or_404r   r?   rp   r>   r
   methodstrr   rv   rJ   r   r   rs   rt   r	   ru   r9   rw   r   ro   r5   r%   rY   rI   r   rZ   r[   r   )r~   rE   rk   ry   rz   r   s         r$   editr      s   ::  )DD02D~~-t{{+ $ 0 0 5A5D*1,*P%0gG 	G  $T* $c7#$"#9.5lG.T)4'K K dll''(IINN((*	dkk..4467jjoo+224<
++008D,,&w/99;


oy).//1&-lG&L!,'C Cr)   z/<int:bill_id>/deletec                     t         j                  j                  |       }t        j                  j                  |       t        j                  j                          t        dd       t        t        d            S )NzBill deleted.rq   rr   )
r   r6   r   r   rZ   deleter[   r	   r   r   )r~   rE   s     r$   r   r      R    ::  )DJJdJJ	/9%GM*++r)   z/<int:bill_id>/toggle-activec                 4   t         j                  j                  |       }|j                   |_        t        j
                  j                          |j                  rdnd}t        d| dd       t        t        di |j                  s
ddi      S i       S )	N	activateddeactivatedzBill .rq   r:   rB   )rr   )
r   r6   r   r5   r   rZ   r[   r	   r   r   )r~   rE   rH   s      r$   toggle_activer      s    ::  )D'DNJJ NN[F	E&
Y'G J26..uclJ K KFHJ K Kr)   z/<int:bill_id>/payc           	      T   t         j                  j                  |       }t        j                         }t
        j                  j                  d      j                         }| t        dd       t        t        d            S d }|j                  r)t        j                  j                  |j                        }|.t        j                  j                  d      j                         }t        |j                         |j                   |j"                  dd|j$                  |r|j$                  nd 	      }t&        j(                  j+                  |       |j                         |_        |j.                  rt        j0                  |j.                        n|}t3        t        |j4                  |j6                  d
      d
      }t9        |j:                  |      j                         |_        t&        j(                  j=                          t        dd       t        t        d            S )NTr4   z/No accounts exist. Please add an account first.rh   rr   Uncategorized)r9   F)r   merchant_normalizedrJ   	is_credit	is_manual
account_idrp   r   z(Bill marked as paid. Transaction logged.rq   )r   r6   r   r   r   r   r7   firstr	   r   r   rp   r   rW   r   rY   r9   rJ   r;   r   rZ   rx   last_paid_daterI   r.   r   r   r   r%   r   r[   )r~   rE   r   accountcategorytxncurrent_duenext_dues           r$   	mark_paidr      s   ::  )DJJLE mm%%%5;;=G?I.// H>>%%d&6&67>>+++AGGI
__ II{{::#+HKKC JJNN3//+D7;}}$$$T]]3%K${//1B1BAFJH"4<<:DDFDMJJ	
4i@GM*++r)   z/debts/createc            	      R   t               } | j                         rtt        |       }|r,|D ]  }t        |d        t	        d| t        d      dd      S t        | j                  j                  j                         t        | j                  j                  j                               t        | j                  j                  j                               t        | j                  j                  j                               | j                  j                  xs dj                         xs d d	      }t        j                   j#                  |       t        j                   j%                          t        d
d       t'        t        d            S t	        d| t        d      dd      S )Nrh   bills/debt_form.htmlzbills.create_debtzAdd DebtrQ   rj   rn   T)r9   current_balanceinterest_rater]   rI   r5   zDebt added.rq   rr   )r   rs   _validate_debt_formr	   r   r   r   r9   rv   rw   r   r   r   r]   rI   r   rZ   rx   r[   r   )rk   ry   rz   rK   s       r$   create_debtr     sU   :D $T* $c7#$"#9.56I.J)3J J %%'#D$8$8$=$=$C$C$EF!$"4"4"9"9"?"?"AB 0 0 5 5 ; ; =>mm((.B557?4
 	

t


mY'.//1&-.A&B!+B Br)   z/debts/<int:debt_id>/editc                    t         j                  j                  |       }t        |      }t        j
                  dk(  rt        |j                        |j                  _        t        |j                        |j                  _        t        |j                        |j                  _        t        d|t        d|       dd      S |j                         rit        |      }|r.|D ]  }t        |d	        t        d|t        d|       dd      S |j                   j                  j#                         |_        t%        |j                  j                  j#                               |_        t%        |j                  j                  j#                               |_	        t%        |j                  j                  j#                               |_
        |j&                  j                  xs d
j#                         xs d |_        t(        j*                  j-                          t        dd       t/        t        d            S t        d|t        d|       dd      S )Nr}   rd   r   zbills.edit_debt)debt_idz	Edit DebtrQ   rj   rh   rn   zDebt updated.rq   rr   )r   r6   r   r   r
   r   r   r   rv   r   r]   r   r   rs   r   r	   r9   rw   r   rI   r   rZ   r[   r   )r   rK   rk   ry   rz   s        r$   	edit_debtr   *  s   ::  )DD~~$'(<(<$=!"%d&8&8"9 #D$4$4 55D*12CW*U%0gG 	G  $T* $c7#$"#9.56GQX.Y)4'K K IINN((*	&t';';'@'@'F'F'HI$T%7%7%<%<%B%B%DE"4#3#3#8#8#>#>#@A++1r88:Bd


oy).//1&-.?&Q!,'C Cr)   z/debts/<int:debt_id>/deletec                     t         j                  j                  |       }t        j                  j                  |       t        j                  j                          t        dd       t        t        d            S )NzDebt deleted.rq   rr   )
r   r6   r   r   rZ   r   r[   r	   r   r   )r   rK   s     r$   delete_debtr   N  r   r)   c                    g }| j                   j                  xs dj                         }	 t        |      }|dk  r|j	                  d       	 t        | j                  j                  xs d      }d|cxk  rdk  sn |j	                  d       |S # t
        $ r |j	                  d       Y `w xY w# t        t        f$ r |j	                  d       Y |S w xY w)	Nrn   r   z!Amount must be greater than zero.zEnter a valid numeric amount.r      z!Due day must be between 1 and 31.z*Due day must be a number between 1 and 31.)
rJ   rv   rw   r   r\   r   ru   r   	TypeErrorr!   )rk   ry   
raw_amountrJ   rX   s        r$   rt   rt   Y  s    F++""(b//1J7$Q;MM=>D$,,##)r*SBMM=> M  7567 z" DBCMDs$   !B AB1 B.-B.1 CCc                    g }dD ]R  \  }}t        | |      j                  xs dj                         }	 t        |      }|dk  r|j	                  | d       T | j                  j                  xs dj                         }	 t        |      }|dk  r|j	                  d       | j                  j                  xs dj                         }|r	 t        j                  |       |S |S # t
        $ r |j	                  | d       Y w xY w# t
        $ r |j	                  d       Y w xY w# t        $ r |j	                  d       Y |S w xY w)	N))r   zCurrent balance)r]   zMinimum paymentrn   r   z must be zero or greater.z: enter a valid numeric amount.z&Interest rate must be zero or greater.z+Interest rate: enter a valid numeric value.z&Due date must be in YYYY-MM-DD format.)getattrrv   rw   r   r\   r   r   rI   r   r.   r!   )	rk   ry   
field_namelabelrawvalraw_raterateraw_dues	            r$   r   r   m  s\   F 
E
E tZ(--3::<	E#,CQw'@AB
E ""''-2446HEx !8MMBC }}!!'R..0G	Dw' M6M%   	EMMUG#BCD	E  ECDE  	DMMBCM	Ds5   $C(!D D, (D	D	D)(D),E
	E
)N)3decimalr   r   datetimer   flaskr   r   r   r	   r
   r   app.blueprints.billsr   app.blueprints.bills.formsr   r   r   app.extensionsr   app.models.billr   app.models.debtr   app.models.categoryr   app.models.transactionr   app.models.accountr   app.utils.date_utilsr   ru   r%   r    r   tupler2   r?   routerc   r{   r   r   r   r   r   r   r   rt   r   rM   r)   r$   <module>r      s   -  K K ) E E      ( . & +
C t t (/ /S /S /

!s 
!uS#X 
! : :~ 	E6?3B 4BB %v?$C @$CN '&:, ;, .AK BK $vh7$, 8$,R %9B :B< +eV_E C F CF -x@, A,(r)   