
    4j                        d 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 e G d	 d
             Ze G d d             ZdddZdddZddZddZy)u   
Trend analytics — Stories 10.1, 10.2, 10.3.

Monthly spend by category (stacked bar + trend lines) and MoM/YoY comparisons.
SQL aggregation only — no Python loops over raw rows.
    )annotations)	dataclass)Decimal)func)db)Transaction)Categoryc                  6    e Zd ZU ded<   ded<   ded<   ded<   y)	MonthlySpendintyearmonthstrcategory_namer   totalN__name__
__module____qualname____annotations__     B/var/www/html/financials/app/services/analytics/trend_analytics.pyr   r      s    
IJNr   r   c                  ,    e Zd ZU ded<   ded<   ded<   y)MonthSummaryr   r   r   r   r   Nr   r   r   r   r   r      s    
IJNr   r   c                   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      t        j                  j                  d      t        j                  t        j                        j                  d            j                  t        t        j                  t        j                   k(  d	
      j#                  t        j$                  dk(        j'                  ddt        j                        j)                  dd      j+                         }|D cg c]S  }t-        |j.                  |j0                  |j2                  xs dt5        t7        |j8                  xs d                  U }}t;        |D ch c]  }|j.                  |j0                  f c}d	      d|  }t=        |      }|D cg c]  }|j.                  |j0                  f|v s|! c}S c c}w c c}w c c}w )z;Per-category totals for each of the last N distinct months.      r         r   r   r   T)isouterFUncategorizedr   )r   r   r   r   )reverseN)r   sessionqueryr   castsubstrr   dateIntegerlabelr	   namesumamountjoincategory_ididfilter	is_creditgroup_byorder_byallr   r   r   r   r   r   r   sortedset)months_backrowsrresultdistinct_monthscutoffs         r   spending_by_category_monthlyr>   "   s    	

IIdkk+"2"2Aq92::FLLVTIIdkk+"2"2Aq92::FLLWUMM0HH[''(..w7		
 
h//8;;>	M	%%.	/	&'8==	1	&'	"	 	&   	qww//<_#aggl+,	
F  @Aqvvqww/@$OP\Q\]O!F=!!&&!''!2f!<A== A=s   .AI2I7I<+I<c                :   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      t        j                  t        j                        j                  d            j                  t        j                  dk(        j                  dd      j                  dd      j!                         }|D cg c]D  }t#        |j$                  |j&                  t)        t+        |j,                  xs d	            
      F c}S c c}w )z*Total monthly spend for the last N months.r   r   r   r   r    r   r   Fr   )r   r   r   )r   r$   r%   r   r&   r'   r   r(   r)   r*   r,   r-   r1   r2   r3   r4   r5   r   r   r   r   r   r   )r8   r9   r:   s      r   monthly_totalsr@   >   s    	

IIdkk+"2"2Aq92::FLLVTIIdkk+"2"2Aq92::FLLWUHH[''(..w7	

 
%%.	/	&'	"	&'	"	 	  	!&&ws177<a?P7QR  s   A	Fc                    |  d|dd}|dk(  r| dz
  dfn| |dz
  f\  }}| d|dd}d } ||       ||      }}| |||||||z
  |dkD  rt        ||z
  |z  dz        d
S d	d
S )zCurrent vs. prior month totals.-02d-%r      c                J   t         j                  j                  t        j                  t
        j                              j                  t
        j                  j                  |       t
        j                  dk(        j                         }t        t        |xs d            S NFr   r   r$   r%   r   r,   r   r-   r1   r(   liker2   scalarr   r   prefixvals     r   _totalzmom_comparison.<locals>._totalW   l    JJTXXk&8&89:VK$$))&1;3H3HE3QRVX 	
 s38!}%%r   r   d           )current_yearcurrent_monthcurrent_total
prior_yearprior_monthprior_totaldelta
pct_changefloat)	r   r   
cur_prefixrU   rV   prior_prefixrN   currentpriors	            r   mom_comparisonr`   Q   s    65+R(J05
taxnuqy@QJ \;s"326L& J')=UGuw U5@E	eWu_5;<	  PS	 r   c           
         |  d|dd}| dz
   d|dd}d } ||       ||      }}| | dz
  |||||z
  |dkD  rt        ||z
  |z  dz        d	S dd	S )
z'Current month vs. same month last year.rB   rC   rD   r   c                J   t         j                  j                  t        j                  t
        j                              j                  t
        j                  j                  |       t
        j                  dk(        j                         }t        t        |xs d            S rG   rH   rK   s     r   rN   zyoy_comparison.<locals>._totalm   rO   r   r   rP   rQ   )rR   rU   r   rT   rW   rX   rY   rZ   )r   r   r\   r]   rN   r^   r_   s          r   yoy_comparisonrc   h   s    65+R(JQhZqs2.L& J')=UGD1Hu 5@E	eWu_5;<	  PS	 r   N)rE   )r8   r   returnzlist[MonthlySpend])   )r8   r   rd   zlist[MonthSummary])r   r   r   r   rd   dict)__doc__
__future__r   dataclassesr   decimalr   
sqlalchemyr   app.extensionsr   app.models.transactionr   app.models.categoryr	   r   r   r>   r@   r`   rc   r   r   r   <module>ro      sg    # !    . (      >8&.r   