
    ?j4                        d Z ddlmZ ddlmZ ddlmZ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 e G d
 d             Z	 	 	 d	 	 	 	 	 	 	 ddZddZy)u   
Budget analytics and merchant summary — Stories 10.2, 10.6, 10.7.

History-based budget recommendations using 3-month rolling averages.
Merchant spend summary top-20.
    )annotations)	dataclass)DecimalROUND_HALF_UP)funcor_)db)Transaction)Category)BudgetRecommendationc                  ,    e Zd ZU ded<   ded<   ded<   y)MerchantSpendstrmerchantr   totalinttransaction_countN)__name__
__module____qualname____annotations__     C/var/www/html/financials/app/services/analytics/budget_analytics.pyr   r      s    MNr   r   Nc                   t         j                  j                  t        j                  t        j                  t        j                        j                  d      t        j                  t        j                        j                  d            j                  t        j                  dk(        }|r"|j                  t        j                  |k\        }|r"|j                  t        j                  |k        }|j                  t        j                        j                  t        j                  t        j                        j!                               j#                  |       j%                         }|D cg c]H  }t'        |j                  xs dt)        t+        |j,                  xs d            |j                        J c}S c c}w )z&Top merchants by total spend (FR-3.6).r   countFUnknownr   )r   r   r   )r	   sessionqueryr
   merchant_normalizedr   sumamountlabelr   idfilter	is_creditdategroup_byorder_bydesclimitallr   r   r   r   )r+   	date_fromdate_toqrowsrs         r   merchant_spend_summaryr2      sI    	

++HH[''(..w7JJ{~~&,,W5	

 
%%.	/  HH[%%23HH[%%01	

;223	$((;--.335	6	u		 	   	**7i#aggl+,gg	
  s   6AG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            j                  t        j                  dk(        j                  dd      j                  t        j                  t        j
                  t        j                  dd      t         j                        j                         t        j                  t        j
                  t        j                  dd      t         j                        j                               j                  d      j!                         }|sg S t#        |      }|D cg c]  }|j$                   d	|j&                  d
d! }}t)        |D cg c]!  }t        j                  j+                  |      # c} }t         j                  j                  t,        j.                  t        j0                  t        j2                        j                  d            j5                  t,        t        j6                  t,        j8                  k(        j                  t        j                  dk(  |      j                  t,        j.                        j!                         }dd}g }	|D ]V  }
t;        t=        |
j>                  xs d            |z  } ||      }|	jA                  tC        |
j.                  |d             X tE        |	d       S c c}w c c}w )z
    Story 10.7: Budget recommendations from 3-month rolling average spend.

    Completes FR-1.12. Same interface as fifty_thirty_twenty().
    Rounds suggested amounts to nearest $5.
          year      monthF   -02dz-%r   c                N    | dz  j                  t        d      t              dz  S )N   1)rounding)quantizer   r   )ds    r   _round5zfrom_history.<locals>._round5k   s%    A}EIIr   r   history)category_namesuggested_amountbucketc                    | j                   S )N)rE   )r1   s    r   <lambda>zfrom_history.<locals>.<lambda>x   s
     r   )key)rB   r   returnr   )#r	   r   r   r   castsubstrr
   r'   Integerr#   r%   r&   r(   r)   r*   r+   r,   lenr6   r9   r   liker   namer!   r"   joincategory_idr$   r   r   r   appendr   sorted)monthly_income
month_rowsmonth_countr1   month_prefixespdate_filtercategory_rowsrC   recommendationsrowavg	suggesteds                r   from_historyra   =   s    	

IIdkk+"2"2Aq92::FLLVTIIdkk+"2"2Aq92::FLLWU	
 
%%.	/	&'	"	IIdkk+"2"2Aq92::FKKMIIdkk+"2"2Aq92::FKKM

 
q	  	j/K;EFa!''#b1FNF .IQ((--a0IJK 	

MMHH[''(..w7	
 
h//8;;>	?	!!U*

 
(--	 	 J O c#)).q)*[8CL	3((& 
 	 /'@AAA G Js   $N&N	)   NN)r+   r   r-   
str | Noner.   rc   rK   zlist[MerchantSpend])rV   r   rK   zlist[BudgetRecommendation])__doc__
__future__r   dataclassesr   decimalr   r   
sqlalchemyr   r   app.extensionsr	   app.models.transactionr
   app.models.categoryr   (app.services.insights.budget_recommenderr   r   r2   ra   r   r   r   <module>rm      sx    # ! *    . ( I       	D;Br   