
    xjU/                        d dl Z d dlZd dlZd dlmZmZ d dlmZ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 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e!dede!de!fdZ"d Z#dZ$d Z%d Z& ejN                  d      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,y)#    N)date	timedelta)DecimalInvalidOperation)make_responserender_templateredirecturl_forflashrequest)transactions_bp)TransactionForm)db)Account)Category)Transaction)flag_duplicates)validate_amountmerchantamountdate_strreturnc                     t        |j                  t        d                  }| |z   |z   }t        j                  |j                               j                         S )Nz0.01)strquantizer   hashlibsha256encode	hexdigest)r   r   r   normalized_amtraws        >/var/www/html/financials/app/blueprints/transactions/routes.py_compute_dedup_hashr#      sF    9:N
^
#h
.C>>#**,'1133    c                 R   dgt         j                  j                  d      j                  t         j                  j                         t         j                        j                         D cg c]  }|j                  |j                  f c}z   | j                  _
        t        j                  j                  d      j                  t        j                        j                         D cg c]  }|j                  |j                  f c}| j                  _
        y c c}w c c}w )N)r   u   — Select Category —T	is_active)r   query	filter_byorder_by	is_systemdescnameallidcategory_idchoicesr   
account_id)formcas      r"   _load_form_choicesr6      s    	'(>>##d#3HX'',,.>ssuFaADD!&&> F	F 	 	$/88FJJLqvvDOO	Fs   -D-D$2   c                    | j                  dd      | j                  dd      | j                  d      xs dj                         | j                  dt              | j                  d	t              | j                  d
d      j                         | j                  dd      j                         | j                  dd      j                         | j                  dd      j                         d	S )zAParse and return filter/sort parameters from a request args dict.sortr   dirr,   q r0   typer2   	date_fromdate_to
amount_min
amount_max)	r9   	directionr;   r0   r2   r?   r@   rA   rB   )getstripint)argss    r"   _parse_filter_argsrH   )   s     xx/xxv.+224xxCx8xx3x7xxR0668xx	2.446xxb1779xxb1779
 
r$   c                 f   | d   }| d   }| d   }| d   }| d   }| d   }| d   }| d   }| d	   }	t         j                  }
|red
| d
}|
j                  t        j                  t         j
                  j                  |      t         j                  j                  |                  }
|r"|
j                  t         j                  |k(        }
|r"|
j                  t         j                  |k(        }
|r"|
j                  t         j                  |k\        }
|r"|
j                  t         j                  |k        }
|r,	 |
j                  t         j                  t        |      k\        }
|r,	 |
j                  t         j                  t        |      k        }
t         j                  t         j                  t         j
                  dj                  |t         j                        }|	dk(  r|j                         n|j!                         }|
j#                  |      S # t        $ r Y w xY w# t        $ r Y w xY w)zDBuild a filtered, sorted SQLAlchemy query from parsed filter params.r;   r0   r2   r?   r@   rA   rB   r9   rC   %)r   r   r   asc)r   r(   filterr   or_merchant_normalizedilikenotesr0   r2   r   r   r   r   rD   rK   r,   r*   )paramsr;   r0   r2   r?   r@   rA   rB   r9   rC   r(   likesort_colorders                 r"   _build_transaction_queryrU   8   s   +A'K&J%I#G&J&J.D%IE1#QxFF//55d;!!''-
 [44CD[33zAB[--:;[--89	LL!3!3wz7J!JKE 	LL!3!3wz7J!JKE
  $$&&33 
c$  !	 
 (50HLLNhmmoE>>%     		
   		s$   8+H &+H$ 	H! H!$	H0/H0/c            
      b   t        dt        j                  j                  ddt                    } t        t        j                        t              }|j                         }|j                  | dz
  t        z        j                  t              j                         }t        j                  j                         D ci c]  \  }}|s	|dk7  s|| c}}fd}fd}|dk(  xr( t        d   d   d	   d
   d   d   d   g       }|dk(  xr | }	t        j                  j!                  d      j#                  t        j$                        j                         }
t&        j                  j!                  d      j#                  t&        j$                        j                         }t)        di }t+        	 di ddd|d|d| dt        dd   dd   d|d|d|d|	d|
d|d|dd   dd   d	d	   d
d
   dd   dd   dd   S c c}}w )N   pager=   c                 "    t        di d| iS )NrY   transactions.indexr
   )pfilter_paramss    r"   url_for_pagezindex.<locals>.url_for_pageu   s    E}E1EEr$   c                 P    d   | k(  r
d   dk(  rdnd}t        di i | |dS )Nr9   rC   r,   rK   )r9   r:   r[   r]   )colnew_dirr_   rQ   s     r"   sort_urlzindex.<locals>.sort_urlx   s>    "6Nc1f[6IV6S%Z`^/]-/]U\/]^^r$   r   r;   r0   r2   r?   r@   rA   rB   Tr&   active_pagetransactionstotalper_pager9   rC   r`   rd   no_datano_match
categoriesaccountscsv_url)ztransactions.export_csv)ztransactions/index.html)maxr   rG   rD   rF   rH   rU   countoffsetPER_PAGElimitr.   itemsanyr   r(   r)   r*   r-   r   r
   r   )rY   r(   rg   rf   kvr`   rd   ri   rj   rk   rl   rm   r_   rQ   s                @@r"   indexrw   j   s   q',,""613"78D-F$V,EKKME<<X 56<<XFJJLL&-ll&8&8&:PdaaAKQTPMF_ 
 3sVM*F<,@{VI.|0Df\FZ( $  G 
*7{H))D)9BB8==QUUWJ((4(8AA',,OSSUHA=AG!" " 	
   F^ % "        +!" =)#$ ,'%& %'( y!)* ,'+, ,'- ) Qs   
H+H+H+z/export.csvc            
      ~   t        t        j                        } t        |       j	                         }t        j                         }t        j                  |      }|j                  g d       |D ]  }|j                  |j                  |j                  t        |j                        |j                  r|j                  j                  nd|j                   r|j                   j                  nd|j"                  xs dg        t%        |j'                               }d|j(                  d<   d|j(                  d<   |S )N)DateMerchantAmountr   r   Notesr<   z'attachment; filename="transactions.csv"zContent-Dispositionztext/csvzContent-Type)rH   r   rG   rU   r.   ioStringIOcsvwriterwriterowr   rN   r   r   categoryr-   accountrP   r   getvalueheaders)rQ   rf   sir   txnoutputs         r"   
export_csvr      s    -F+F3779L	BZZ^F
OORS HH##

O!$CLL2 #CKKIIO
 	 2;;=)F,UFNN()%/FNN>"Mr$   z/createGETPOST)methodsc                     t               } t        |        t        j                  dk(  rMt	        | j
                  j                        dk(  r+| j
                  j                  d   d   | j
                  _        d}| j                         r{	 t        | j                  j                        }| j                   j                  j#                         }| j$                  j                  j'                         }t)        |||      }t        j*                  j-                  dd	      d
k(  }|s| j$                  j                  t/        d      z
  j'                         }| j$                  j                  t/        d      z   j'                         }	t0        j2                  j5                  t0        j$                  |k\  t0        j$                  |	k  t0        j6                  j9                  d             j;                         D 
cg c]  }
|
j6                   }}
t=        |g|      d   rt?        dd       t        d| dd      S | j@                  j                  dk7  r| j@                  j                  nd }t1        |||||| j
                  j                  | jB                  j                  xs d d|	      }tD        jF                  jI                  |       tD        jF                  jK                          t?        dd       tM        tO        d            S t        d| dd      S # t        $ rG}| j                  j                  j                  t        |             t        d| dd      cY d }~S d }~ww xY wc c}
w )Nr   rX   r   Fztransactions/create.htmlrf   )r3   duplicate_detectedre   
force_save01   days(Possible duplicate transaction detected.warningT)	r   rN   merchant_rawr   r0   r2   rP   	is_manual
dedup_hashzTransaction added.successr\   )(r   r6   r   methodlenr2   r1   datavalidate_on_submitr   r   
ValueErrorerrorsappendr   r   r   rE   r   	isoformatr#   r3   rD   r   r   r(   rL   r   isnotr.   r   r   r0   rP   r   sessionaddcommitr	   r
   )r3   r   r   er   r   new_hashr   window_start
window_endtrecent_hashescat_idr   s                 r"   creater      s   Dt ~~3t'>'>#?1#D#66q9!< 	?$T[[%5%56F ==%%++-99>>++-&xB\\%%lC8C?
 IINNYA->>IIKL IINNYA->>IIKJ !!VK,,<',,
:'2288>@ SU!"M  z=9!<@)L&'A:>3AC C +/*:*:*?*?1*D!!&&$ (!++**//)T

 	

s


"I. 45665D.3'57 7[  	?KK%%c!f-"#=D6;/=? ?	?s$   
L 6M&	M#<MM#M#z/<int:txn_id>/editc                 f   t         j                  j                  |       }t               }t	        |       t
        j                  dk(  rt        j                  |j                        |j                  _
        |j                  |j                  _
        t        |j                        |j                  _
        |j                  xs d|j                  _
        |j                   |j                   _
        |j"                  xs d|j"                  _
        t%        d||dd      S |j'                         r	 t)        |j                  j                        }|j                  j                  j1                         }|j                  j                  j3                         }t5        |||      }t
        j6                  j9                  dd	      d
k(  }|s/|j                  j                  t;        d      z
  j3                         }	|j                  j                  t;        d      z   j3                         }
t         j                  j=                  t         j>                  |j>                  k7  t         j                  |	k\  t         j                  |
k  t         j@                  jC                  d             jE                         D cg c]  }|j@                   }}tG        |g|      d   rtI        dd       t%        d||dd      S ||_	        ||_        ||_%        ||_        |j                  j                  dk7  r|j                  j                  nd |_        |j                   j                  |_        |j"                  j                  xs d |_        ||_         tL        jN                  jQ                          tI        dd       tS        tU        d            S t%        d||dd      S # t*        $ rH}|j                  j,                  j/                  t        |             t%        d||dd      cY d }~S d }~ww xY wc c}w )Nr   r   r<   ztransactions/edit.htmlFrf   )r3   r   r   re   r   r   r   r   r   r   r   TzTransaction updated.r   r\   )+r   r(   
get_or_404r   r6   r   r   	date_typefromisoformatr   r   rN   r   r   r   r0   r2   rP   r   r   r   r   r   r   rE   r   r#   r3   rD   r   rL   r/   r   r   r.   r   r   r   r   r   r   r	   r
   )txn_idr   r3   r   r   r   r   r   r   r   r   r   r   s                r"   editr      sG   



&
&v
.CDt~~ ) 7 7 A		 # 7 7 #CJJ # 41 # #		R

7d#&5+9; 	;  	?$T[[%5%56F MM&&,,.IINN,,.'&(C\\%%lC8C?
 IINNYA->>IIKL IINNYA->>IIKJ !!VKNNcff4',,<',,
:'2288>@ SU!"M  z=9!<@)L&'?d+.43AC C #+"*"*"(
;?;K;K;P;PTU;U$"2"2"7"7[_"&//"6"6"&**//"9T	"*


$i0 45663$"u'57 7S  	?KK%%c!f-"#;$'*u/=? ?	?s$   0O 8P.	P+#=P& P+&P+z/<int:txn_id>/deletec                     t         j                  j                  |       }t        j                  j                  |       t        j                  j                          t        dd       t        t        d            S )NzTransaction deleted.r   r\   )
r   r(   r   r   r   deleter   r   r	   r
   )r   r   s     r"   r   r   <  sV    



&
&v
.CJJcJJ	
 ),G0122r$   )-r   r   r}   datetimer   r   r   decimalr   r   flaskr   r   r	   r
   r   r   app.blueprints.transactionsr   !app.blueprints.transactions.formsr   app.extensionsr   app.models.accountr   app.models.categoryr   app.models.transactionr   app.services.duplicate_detectorr   app.utils.validatorsr   r   r#   r6   rq   rH   rU   routerw   r   r   r   r    r$   r"   <module>r      s&   
  	 1 - S S 7 =  & ( . ; 04# 4w 4# 4# 4
 /!d s3 3l }% &. y5&/:=7 ;=7@ +eV_E>7 F>7B -x@3 A3r$   