
    1&Fj+                    B   d Z ddlmZ ddlZddlZddlZddl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mZmZmZ  eej(                  j+                  dd	            Zej/                  d
d
       edz  Zedz  Zej(                  j+                  dd      ZdZ ede      Zd'dZd'dZd(dZ d)dZ!d*dZ"d+dZ#ejI                  ddg      d        Z%ejI                  dddg      d        Z&ejI                  ddg      d         Z'd,d!Z(d-d"Z)d.d#Z*d.d$Z+d/d%Z,d0d&Z-y)1aT  
Modulo de rastreamento Dashboard Borrello.

- Endpoint /track/wa: registra clique em link de WhatsApp (com UTMs) e redireciona pro wa.me.
- Endpoint /track/lp: beacon pra registrar pageview da landing (chamado por GTM/JS).
- Helpers de agregacao usados pela aba /rastreamento do dashboard.

Registros em JSONL, um arquivo por evento tipo.
    )annotationsN)datetime	timedeltatimezone)Path)Iterable)	BlueprintrequestredirectjsonifyBORRELLO_TRACKING_DIRz7/opt/mia/workspace/clientes/borrello/dashboard/trackingT)parentsexist_okzclicks.jsonlzpageviews.jsonlBORRELLO_WA_PHONE5511999999999)
utm_source
utm_mediumutm_campaignutm_contentutm_termtrackingc                 h    t        j                  t        j                        j	                  d      S )Nseconds)timespec)r   nowr   utc	isoformat     :/opt/mia/workspace/clientes/borrello/dashboard/tracking.py_now_isor!   6   s#    <<%///CCr   c                     t         j                  j                  dd      } | r"| j                  d      d   j	                         S t         j                  j                  d      xs t         j
                  xs dS )NzX-Forwarded-For ,r   z	X-Real-IP)r
   headersgetsplitstripremote_addr)fwds    r    
_client_ipr+   :   s]    
//

/
4C
yy~a &&((??{+Hw/B/BHbHr   c                     i } t         D ];  }t        j                  j                  |      xs dj	                         }|s7|| |<   = | S )Nr#   )
UTM_FIELDSr
   argsr&   r(   )outkvs      r    _collect_utmsr2   A   sK    
C \\a &B--/CF Jr   c                    	 | j                  dd      5 }|j                  t        j                  |d      dz          d d d        y # 1 sw Y   y xY w# t        $ r Y y w xY w)Nautf-8encodingF)ensure_ascii
)openwritejsondumps	Exception)pathrecordfs      r    _append_jsonlrB   J   s_    YYsWY- 	CGGDJJvE:TAB	C 	C 	C s-   A *AA AA A 	A A c                T    | st         S t        j                  dd|       }|xs t         S )Nz\Dr#   )DEFAULT_WA_PHONEresub)rawdigitss     r    _clean_phonerI   R   s)    VVE2s#F%%%r   c                \    d|  }|r$| dt         j                  j                  |       S |S )Nzhttps://wa.me/z?text=)urllibparsequote)phonetextbases      r    _build_wa_urlrQ   Y   s7    E7#Dvfll006788Kr   z	/track/waGET)methodsc                    t               } t        t        j                  j	                  d            }t        j                  j	                  d      xs dj                         }t               t               t        j                  j	                  dd      t        j                  j	                  dd      |d| }t        t        |       t        t        ||      d      S )	NrN   rO   r#   
User-AgentReferer)tsip
user_agentrefererrN   i.  )code)r2   rI   r
   r.   r&   r(   r!   r+   r%   rB   CLICKS_FILEr   rQ   )utmsrN   rO   r@   s       r    track_war^   c   s    ?D))'23ELLV$*113D jloo)),;??&&y"5 F +v&M%.S99r   z	/track/lpPOSTc                 \   t               } i }t        j                  r	 t        j                  d      xs i }t        D ]E  }| j                  |      r|j                  |      s't        ||         j                         | |<   G dD ](  }|j                  |      st        ||         d d ||<   * 	 dD ]C  }t        j                  j                  |      xs dj                         }|s7||vs<|d d ||<   E t               t               t        j                  j                  dd      t        j                  j                  dd      d| |}t        t        |       t        d	di      }d
|j                  d<   d|j                  d<   d|j                  d<   |S # t        $ r Y w xY w)NT)silent)pagetitler?   eventi,  r#   rU   rV   )rW   rX   rY   rZ   ok*Access-Control-Allow-OriginGET, POST, OPTIONSAccess-Control-Allow-MethodsContent-TypeAccess-Control-Allow-Headers)r2   r
   is_jsonget_jsonr-   r&   strr(   r>   r.   r!   r+   r%   rB   PAGEVIEWS_FILEr   )r]   extrabodyr0   r1   r@   resps          r    track_lprs   v   s   ?DE		##406BD 3xx{txx{!$q'l002DG3 8 288A;"47|DS1E!H2 0 \\a &B--/%#wE!H jloo)),;??&&y"5	
  F .&)D$< D25DLL./3GDLL/03ADLL/0K-  		s#   4F F %7F F 	F+*F+OPTIONSc                 z    t        ddi      } d| j                  d<   d| j                  d<   d| j                  d<   | S )	Nre   Trf   rg   rh   ri   rj   rk   )r   r%   )rr   s    r    track_lp_optionsrv      sB    D$< D25DLL./3GDLL/03ADLL/0Kr   c              #  "  K   | j                         sy 	 | j                  dd      5 }|D ]-  }|j                         }|s	 t        j                  |       / 	 d d d        y # t
        $ r Y Ew xY w# 1 sw Y   y xY w# t
        $ r Y y w xY ww)Nrr5   r6   )existsr:   r(   r<   loadsr>   )r?   rA   lines      r    _iter_jsonlr|      s     ;;=YYsWY- 	 zz|**T**	 	 ! 	 	  so   BB  A4A%A4B  $B%	A1.A40A11A44A=9B  <B=B   	B	BBBc                r    | sy 	 t        j                  | j                  dd            S # t        $ r Y y w xY w)NZz+00:00)r   fromisoformatreplacer>   )rW   s    r    	_parse_tsr      s;    %%bjjh&?@@ s   $* 	66c                 2    t        t        t                    S N)listr|   r\   r   r   r    carregar_clicksr      s    K())r   c                 2    t        t        t                    S r   )r   r|   ro   r   r   r    carregar_pageviewsr      s    N+,,r   c                   t        j                  t        j                        }|t	        d      z
  }|t	        d      z
  }d}d}d}i }i }| D ]  }	|dz  }t        |	j                  dd            }
|
r|
|k\  r|dz  }|
|k\  r|dz  }|	j                  d	      xs d
j                         j                         }|	j                  d      xs dj                         j                         }| d| }|j                  |d      dz   ||<   |	j                  d      xs dj                         j                         }|j                  |d      dz   ||<    dd}||| ||d       ||d      dS )N   hours   daysr      rW   r#   r   diretor   -z / r   zsem-campanhac                    | sg S t        | j                               xs d}| j                         D cg c]  \  }}||d|d||z  dz  i }}}|j                  d        |S c c}}w )Nr   qtdpctd   c                    | d    S )Nr   r   )xs    r    <lambda>z2agregar_clicks.<locals>._ranking.<locals>.<lambda>   s    5	 r   )key)sumvaluesitemssort)dkey_namesomar0   r1   rowss         r    _rankingz agregar_clicks.<locals>._ranking   sw    I188:#! 	
1 q%E1t8c>:
 
 			)	*
s   A%canalcampanha)totalultimas_24h
ultimos_7d	por_canalpor_campanha)r   zdict[str, int]r   rn   return
list[dict])	r   r   r   r   r   r   r&   r(   lower)clicksagorah24d7r   last_24last_7r   r   crW   srcmedr   campr   s                   r    agregar_clicksr      s}   LL&E
)"%
%C	"	"BEGF "I#%L ;
quuT2'Sy1Rx!uu\".h557==?uu\")c00288:%s3% $==2Q6	%n%7>>@FFH)--dA6:T;"	 i1 z: r   c                   t        j                  t        j                        }|t	        d      z
  }|t	        d      z
  }d}d}d}| D ]:  }|dz  }t        |j                  dd            }|s&||k\  r|dz  }||k\  s6|dz  }< |||d	S )
Nr   r   r   r   r   r   rW   r#   )r   r   r   )r   r   r   r   r   r   r&   )	pvsr   r   r   r   r   r   prW   s	            r    agregar_pageviewsr      s    LL&E
)"%
%C	"	"BEGF 
quuT2'Sy1Rx!  r   )r   rn   )r   dict)r?   r   r@   r   r   None)rG   z
str | Noner   rn   )rN   rn   rO   rn   r   rn   )r?   r   r   zIterable[dict])rW   rn   r   zdatetime | None)r   r   )r   r   r   r   )r   r   r   r   ).__doc__
__future__r   r<   osrE   urllib.parserK   r   r   r   pathlibr   typingr   flaskr	   r
   r   r   environr&   TRACKING_DIRmkdirr\   ro   rD   r-   __name__bpr!   r+   r2   rB   rI   rQ   router^   rs   rv   r|   r   r   r   r   r   r   r   r    <module>r      sQ   #  	 	  2 2   7 7
 JJNNA   4$  /^+ 11 ::>>"5G 
 z8$DI& +w': (:$ +v/# 0#L +	{+ ,"*--`r   