U
    —âñjŽ®  ã                   @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
mZmZ d dlmZmZmZ d dlmZmZmZmZ d dlmZ d dlmZmZmZmZ e
d	eƒZeej  !d
d¡ƒZ"ddhZ#dd„ Z$dd„ Z%dd„ Z&dd„ Z'dd„ Z(dd„ Z)dd„ Z*dd„ Z+dd„ Z,d d!„ Z-d"d#„ Z.d$d%„ Z/d&d'„ Z0d(d)„ Z1d*d+„ Z2d,d-„ Z3d.d/„ Z4d0d1„ Z5d2d3„ Z6d4d5„ Z7d6d7„ Z8d8d9„ Z9d:d;„ Z:d<d=„ Z;d>d?„ Z<d@dA„ Z=dBdC„ Z>dDdE„ Z?dFdG„ Z@dHdI„ ZAd|dKdL„ZBdMdN„ ZCd}dOdP„ZDdQdR„ ZEdSdT„ ZFdUdV„ ZGdWdX„ ZHejIdYdZgd[�d\d]„ ƒZJejId^dZgd[�d_d`„ ƒZKejIdadZgd[�dbdc„ ƒZLejIdddZgd[�dedf„ ƒZMejIdgdZgd[�dhdi„ ƒZNejIdjdZgd[�dkdl„ ƒZOejIdmdZgd[�dndo„ ƒZPejIdpdZgd[�dqdr„ ƒZQejIdsdZgd[�dtdu„ ƒZRejIdvdZgd[�dwdx„ ƒZSejIdydZgd[�dzd{„ ƒZTdS )~é    N)Údefaultdict)ÚdatetimeÚ	timedelta)Ú	BlueprintÚjsonifyÚrequest)ÚSCAPP_DATABASE_NAMEÚUSER_DATABASE_NAMEÚget_db)Úcompute_analytic_area_dataÚ!compute_analytic_area_versus_dataÚcompute_analytics_by_regionÚcompute_multiple_analytic_days)Úbuild_centro_id)ÚFEEDER_SCORE_COLLECTION_NAMEÚcompute_feeder_score_by_areaÚcompute_feeder_score_by_regionÚfetch_feeder_score_dataZ
agent_dataZSCAPP_MAX_SNAPSHOT_ROWSZ1000000ZgerenciaZsuperusuarioc                   C   s   t j dd¡ ¡ S )NZAGENT_INTERNAL_SHARED_SECRETÚ )ÚosÚenvironÚgetÚstrip© r   r   ú7/var/www/itgmanager/itgmanager/blueprints/agent_data.pyÚ_read_internal_secret%   s    r   c                 C   s
   t | tƒS ©N©Ú
isinstanceÚdict©Úvaluer   r   r   Ú_is_plain_object)   s    r"   c                 C   s   t | pdƒ ¡ S )Nr   )Ústrr   r    r   r   r   Ú_normalize_text-   s    r$   c                 C   s   t | ƒ ¡ S r   )r$   Úlowerr    r   r   r   Ú_normalize_lookup_key1   s    r&   c                 C   s*   t | ƒ}|sdS d dd„ | d¡D ƒ¡S )Nr   Ú-c                 s   s   | ]}|  ¡ V  qd S r   )Ú
capitalize)Ú.0Úpartr   r   r   Ú	<genexpr>9   s     z(_normalize_title_part.<locals>.<genexpr>)r$   ÚjoinÚsplit)r!   Úcleanedr   r   r   Ú_normalize_title_part5   s    r/   c                 C   s   d  t|ƒt|ƒt| ƒg¡S ©Nr'   )r,   r&   ©ÚregionÚareaÚcentror   r   r   Ú_build_center_lookup<   s    ýÿr5   c                 C   s   t t| ƒt|ƒt|ƒƒS r   )r   r/   r1   r   r   r   Ú_build_center_displayF   s
    ýr6   c                  C   s   t jdd�} t| tƒr| S i S )NT)Úsilent)r   Úget_jsonr   r   )Úpayloadr   r   r   Ú_read_json_payloadN   s    r:   c                  C   s@   t ƒ } | sd S tj dd¡ ¡ }|| kr,d S tddddœƒdfS )NzX-Agent-Secretr   FÚ	forbiddenzInvalid internal agent secret.©ÚokÚerrorÚdetailé“  )r   r   Úheadersr   r   r   )Zconfigured_secretZprovided_secretr   r   r   Ú_authorize_internal_requestS   s    ýÿørB   c                 C   s   |   d¡}t|tƒr|S i S )NÚquery©r   r   r   )r9   rC   r   r   r   Ú_extract_queryh   s    
rE   c                 C   s   |   d¡}t|tƒr|S i S )NZviewContextrD   )r9   Úview_contextr   r   r   Ú_extract_view_contextm   s    
rG   c                 C   s   |   d¡}t|tƒr|S i S )NZclientContextrD   )r9   Úclient_contextr   r   r   Ú_extract_client_contextr   s    
rI   c                 C   s`   t | ƒ}|  d¡}t|tƒr6t| d¡tƒr6| d¡ni }t| d¡pX| d¡pX|  d¡ƒ}|S )NZvisibleDigestÚidentityÚusername)rI   r   r   r   r$   )r9   rH   Zvisible_digestrJ   rK   r   r   r   Ú_extract_usernamew   s    
(ÿrL   c                 C   s&   t ƒ }|t j}| r"| d| i¡S d S )NrK   )r
   r	   ÚusersÚfind_one)rK   ÚclientrM   r   r   r   Ú
_load_user�   s    
rP   c                 C   sÚ   t | tƒr|  d¡ni }tƒ }tƒ }tƒ }t |tƒs>|||fS | ¡ D ]ˆ\}}t|ƒ}t |tƒsbqF|rp| |¡ | ¡ D ]T\}}	t|ƒ}
|
sŽqx| |› d|
› �¡ t |	tƒrx|	D ]}t|ƒ}|r°| |¡ q°qxqF|||fS )NÚpermisosr'   )r   r   r   ÚsetÚitemsr&   ÚaddÚlist)Úuser_documentrQ   Úallowed_centersÚallowed_areasÚallowed_regionsr2   Zarea_mapÚ
region_keyr3   ÚcentersÚarea_keyÚ	center_idÚ
center_keyr   r   r   Ú _flatten_user_center_permissions‡   s.    




r_   c                 C   s^   t | ƒ}|s&d d tddddœƒdffS t|ƒ}|sTd d tddd|› d�dœƒd	ffS ||d fS )
NFZmissing_usernamezBA username is required in visibleDigest.identity or clientContext.r<   é�  Zunknown_userúUser 'z' was not found.é”  )rL   r   rP   )r9   rK   rV   r   r   r   Ú_ensure_user_and_permissions¤   s.    ýÿø
ýÿørc   c                 C   s   t | ƒ\}}}t|||ƒ|kS r   )r_   r5   )rV   r2   r3   r4   rW   Ú_r   r   r   Ú_check_center_permissionÂ   s    re   c                 C   s(   t | ƒ\}}}t|ƒ› dt|ƒ› �|kS r0   )r_   r&   )rV   r2   r3   rd   rX   r   r   r   Ú_check_area_permissionÇ   s    rf   c                 C   s0   t | ƒ\}}}t|  d¡ƒ}|tkp.t|ƒ|kS )NÚcargo)r_   r&   r   ÚREGION_ANALYTICS_ROLES)rV   r2   rd   rY   rg   r   r   r   Ú_check_region_permissionÌ   s    ri   c                 C   sT  t | ƒ}t| ƒ}t| d¡tƒr*| d¡ni }t| d¡tƒrH| d¡ni }t| d¡tƒrf| d¡ni }t| d¡p~| d¡ƒt| d¡p”| d¡ƒt| d¡pª| d¡ƒt| d¡pÀ| d¡ƒt| d¡pÖ| d¡ƒ| d	¡pî| d	¡pîd
t| d¡�p| d¡ƒt| d¡ƒt| d¡tƒ�r.| d¡ng t| d¡tƒ�rL| d¡ng dœ
S )NÚentitiesÚfiltersÚdiasr2   r3   r4   Ú	startDateÚendDateÚdayRangeé   ÚselectedDayÚ
entityNamer[   Úareas)
r2   r3   r4   rm   rn   ro   rq   rr   r[   rs   )rE   rG   r   r   r   r$   rU   )r9   rC   rF   rj   rk   rl   r   r   r   Ú_resolve_scope_queryÒ   s     ört   c                 C   s@   z$t  t| ƒd¡}t |j|j|jƒW S  tk
r:   Y d S X d S )Nú%d-%m-%Y)r   Ústrptimer$   ÚyearÚmonthÚdayÚ
ValueError)Zstart_day_textZ
date_valuer   r   r   Ú_parse_start_dayç   s
    r{   c              	   C   s:   zt | ƒ}|dkr|nd W S  ttfk
r4   Y d S X d S ©Nr   )ÚintÚ	TypeErrorrz   )r!   Úparsedr   r   r   Ú_parse_day_rangeï   s
    r€   c                 C   sn   t |  d¡ƒ}t|  d¡ƒ}|r$|s>d d tddddœƒdffS |t|d d	� }||  d¡| d
¡|dœd fS )Nrm   ro   FZinvalid_time_rangezFstartDate must use DD-MM-YYYY and dayRange must be a positive integer.r<   r`   rp   ©Údaysru   ©rm   rn   ro   )r{   r   r€   r   r   Ústrftime)rC   Ú	start_dayZ	day_rangeÚend_dayr   r   r   Ú_build_time_range÷   s(    ýÿøýùr‡   c                 C   sV   t | tƒsi S t| ƒ}d|kr4d|kr4| d¡|d< d|krRd|krR| d¡|d< |S )NZvisitas_coutÚvisitas_countZperdidos_coutÚperdidos_count)r   r   Úpop)r!   Z
next_valuer   r   r   Ú_normalize_metric_value  s    
r‹   c              	   C   sŒ   t | tƒr| }n"t | tƒr.dd„ |  ¡ D ƒ}ng S g }|D ]@}t |tƒsJq:t| d¡ƒ}|s^q:| |t| di ¡ƒdœ¡ q:t|dd„ d�S )	Nc                 S   s   g | ]\}}||d œ‘qS ©©ry   r!   r   )r)   ry   r!   r   r   r   Ú
<listcomp>"  s     z-_normalize_values_summary.<locals>.<listcomp>ry   r!   r�   c                 S   s   | d S ©Nry   r   ©Úitemr   r   r   Ú<lambda>/  ó    z+_normalize_values_summary.<locals>.<lambda>©Úkey)	r   rU   r   rS   r$   r   Úappendr‹   Úsorted)Úvalues_summaryÚentriesÚ
normalizedÚentryry   r   r   r   Ú_normalize_values_summary  s    


rœ   c              	   C   s‚   |   |¡}t|tƒrT|  d¡d k	r4t|  d¡p0dƒS |  d¡d k	rTt|  d¡pPdƒS zt|p^dƒW S  ttfk
r|   Y dS X d S )Nr!   r   Úalarmg        )r   r   r   Úfloatr~   rz   )r!   r•   Zbandr   r   r   Ú_read_alarm_band_value2  s    

rŸ   c              	   C   sª   t | tƒr| }n"t | tƒr.dd„ |  ¡ D ƒ}ng S g }|D ]^}t |tƒsJq:t| d¡ƒ}| d¡}|r:t |tƒsrq:| |t|dƒt|dƒt|dƒdœ¡ q:t|d	d
„ d�S )Nc                 S   s   g | ]\}}||d œ‘qS rŒ   r   )r)   ry   Úinnerr   r   r   rŽ   C  s     z*_normalize_alarm_bands.<locals>.<listcomp>ry   r!   ÚbajaÚmediaÚalta)ry   r¡   r¢   r£   c                 S   s   | d S r�   r   r�   r   r   r   r’   X  r“   z(_normalize_alarm_bands.<locals>.<lambda>r”   )	r   rU   r   rS   r$   r   r–   rŸ   r—   )r!   r™   rš   r›   ry   r    r   r   r   Ú_normalize_alarm_bands?  s*    



üÿ	r¤   c                 C   sn   t | tƒsg S g }| D ]R}t |tƒs&qt| d¡ƒ}| d¡}|rt |tƒsNq| |dd„ |D ƒdœ¡ q|S )Nry   r!   c                 S   s.   g | ]&}t |tƒr&| d ¡s| d¡s|‘qS )Z	syntheticZvisualBoundary©r   r   r   )r)   Úpointr   r   r   rŽ   g  s
    
 
 
ÿz*_normalize_time_series.<locals>.<listcomp>r�   )r   rU   r   r$   r   r–   )r™   rš   r›   ry   Úvaluesr   r   r   Ú_normalize_time_series[  s    


r¨   c              	   C   sx   g }|   ¡ D ]f\}}| d¡rt|ttfƒr| |t|tƒrNt| d¡pJ|ƒn|tt|tƒr`|n| d¡ƒdœ¡ q|S )NÚgraph_activityÚnameÚdata©r•   rª   r«   )	rS   Ú
startswithr   r   rU   r–   r$   r   r¨   )ÚnodeÚseriesr•   r!   r   r   r   Ú_pick_graph_activityl  s    ýÿr°   c                    sê  ddddœ}t | ¡ ƒddddd	d
ddddddddddhB }t| ƒt|  d¡ƒt|  d¡ƒt|  d¡ƒt|  d¡ƒdœ}|  d¡}dd„ t|tƒr–|ng D ƒ}t t	¡}|  d¡}t|tƒrÀ|ng D �]}t|t
ƒsÖqÄ| d¡| d¡ ‰}	t|	tƒsÄt|	ttfƒrÄt |	¡rÄ|	d k �rqÄ| ˆ¡}
t|
t
ƒ�rBt|
 d!¡tƒ�sX| d"|  d#¡ˆ¡ qÄi ‰t|
d! ƒD ]j\‰}z2t|tƒ�rŒt d$|¡�s’tƒ ‚ˆˆt |¡< W n, tk
�rÎ   | d%|  d#¡ˆ|¡ Y nX �qhi ‰|
 ¡ D ]r\}}||k�rö�qàt|tƒ�rt|ƒt|
d! ƒk�r2| d&|  d#¡ˆ|¡ �qà|d'k‰ ‡ fd(d)„|D ƒˆ|< �qà| ¡ D ]ž\}‰‡‡‡fd*d)„tˆƒD ƒ}|d+k�rÒ|| D ] }‡fd,d)„|d- D ƒ|d-< �q�||  d.d.ˆ|d/œgd0œ¡ n&‡fd1d)„|| D ƒˆ|d/œg ||< �q\|d2 D ]Þ}|d ˆk�r�qg }|d D ]°}t|t
ƒ�s:�q&d3d„ | ¡ D ƒ}zˆ t | d4d5¡¡¡‰W n ttfk
�r†   d6‰Y nX ˆd6k�r°| d7|  d#¡ˆ| d4¡¡ n‡fd8d„ˆ ¡ D ƒ|d9< | |¡ �q&||d< �qqÄ|S ):uS   Proyecta v5 por dÃ­a para el asistente; conserva el formato legacy de la respuesta.Úactivity_avgZtasaZperdidos)ÚgraphActivityÚgraphFeedingÚgraphPerdidosÚactivityZ
detectadosZalarm_thresholdÚdepthZhorizontal_positionZo2Zso2ÚcsÚcdÚtempZtasa_pfmZtasa_kgtonminZtasa_ppvÚfeeding_activeÚwinche_connectedÚpatrol_activeZgraph_feedingZgraph_perdidosZtasa_valuesZalarms_data)r²   r³   r´   Ú
tasaValuesÚ
alarmsDataZgraph_columnsc                 S   s(   i | ] }t |tƒr| d ¡| d¡“qS r�   r¥   )r)   r›   r   r   r   Ú
<dictcomp>ˆ  s     
  z'_analytics_timeline.<locals>.<dictcomp>Zanalytics_schema_versionry   r!   é   Útimeu.   AnalÃ­tica v5 sin graph_columns vÃ¡lido: %s %srª   z1\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?u,   AnalÃ­tica v5: timestamp invÃ¡lido: %s %s %ru,   AnalÃ­tica v5: columna desalineada: %s %s %s)rº   r»   r¼   c                    sF   g | ]>}ˆ rt |tƒr>n"t |ttfƒr>t |tƒs>t |¡r>|nd ‘qS r   )r   Úboolr}   rž   ÚmathÚisfinite)r)   r!   )Úbooleanr   r   rŽ   ¥  s   þÿÿÿz'_analytics_timeline.<locals>.<listcomp>c                    sB   g | ]:}ˆˆ krˆ ˆ ˆ|  d k	r|  ¡ ˆ ˆ ˆ|  dœ‘qS )N)rÁ   r!   )Ú	isoformat)r)   rÁ   )ÚcolumnsÚmetricÚrowsr   r   rŽ   ©  s     ÿr²   c                    s   g | ]}|d  ˆ kr|‘qS ©ry   r   ©r)   r‘   rÊ   r   r   rŽ   ­  s      r«   r©   r�   r¬   c                    s   g | ]}|d  ˆ kr|‘qS rÊ   r   rË   rÊ   r   r   rŽ   °  s      r¾   c                 S   s   i | ]\}}|d kr||“qS )Úsnapshotr   )r)   r•   r!   r   r   r   r¿   ¸  s       Ústartr   Nu*   AnalÃ­tica v5: apertura sin fila: %s %s %sc                    s"   i | ]\}}|d kr||ˆ  “qS )r±   r   )r)   r•   r§   )Úindexr   r   r¿   À  s       rÌ   )rR   r§   r°   r¨   r   r   rU   ÚloggingÚ	getLoggerÚ__name__r   rÂ   r}   rž   rÃ   rÄ   ÚwarningÚ	enumerater#   ÚreÚ	fullmatchrz   r   ÚfromisoformatrS   Úlenr—   r–   r~   )r®   ZgraphsÚmetricsÚtimeliner™   Zcolumns_by_dayÚloggerZversionsr›   ÚversionÚsourcer!   r•   r§   ZgraphZpointsrµ   ZalarmsÚeventsr�   Úeventr   )rÅ   rÇ   ry   rÎ   rÈ   rÉ   r   Ú_analytics_timelinez  s              þû



,
 
"
þÿ
 *

rß   Úrootc                    s0   g ‰ ‡ ‡‡fdd„‰ˆt | tƒr$| ni g ƒ ˆ S )Nc              	      sÀ   t ˆ tƒsd S t‡ fdd„dD ƒƒr�tˆ  d¡pB|r<|d nˆpBˆƒ}ˆ d |¡pZ|pZˆ|tˆ  d¡ƒtˆ  d¡p|ˆ  d	¡ƒt	ˆ ƒd
œ¡ d S ˆ  
¡ D ]"\}}t |tƒr˜ˆ|||g ƒ q˜d S )Nc                 3   s   | ]}|ˆ kV  qd S r   r   ©r)   r•   ©r®   r   r   r+   Í  s     z9_collect_nested_entities.<locals>.walk.<locals>.<genexpr>)r˜   Úalarms_by_tasaÚtasa_summaryrª   éÿÿÿÿú:r˜   rã   rä   )ÚentityIdrr   ÚvaluesSummaryÚ
alarmBandsrÙ   )r   r   Úanyr$   r   r–   r,   rœ   r¤   rß   rS   )r®   ÚpathÚentity_namer•   r!   ©rj   Úscope_labelÚwalkrâ   r   rï   É  s     
"ûÿ	
z&_collect_nested_entities.<locals>.walkr   )Úanalytic_datarî   r   rí   r   Ú_collect_nested_entitiesÆ  s    rñ   c                 C   s´   g }| D ]¦}dd„ |  dg ¡D ƒ}|  dg ¡D ]~}||  d¡|  d¡|  d¡dœ}| |  d	i ¡¡ |  |  d¡¡}|r¢|  d
¡|d< |  d¡|d< |  d¡|d< | |¡ q.q|S )Nc                 S   s   i | ]}|d  |“qS rÊ   r   rË   r   r   r   r¿   å  s      z%_build_daily_rows.<locals>.<dictcomp>ré   rè   rr   rç   ry   )Úscoperr   rç   ry   r!   r¡   Zalarm_band_bajar¢   Zalarm_band_mediar£   Zalarm_band_alta)r   Úupdater–   )rj   Ú
scope_namerÉ   ÚentityZalarm_by_dayr‘   ÚrowZ	alarm_rowr   r   r   Ú_build_daily_rowsâ  s"    ür÷   c                 C   sÊ   |d t … }tdd„ |D ƒƒ}tdd„ |D ƒƒ}tdd„ |D ƒƒ}	t|ƒt|ƒt|ƒt|	ƒdœ}
| ||||| d¡| d¡| d¡d	œ||
t|ƒt|ƒkt|ƒ|d d
… dœ}t|tƒrÆ|rÆ| |¡ |S )Nc                 S   s   h | ]}|  ¡ D ]}|’qqS r   )Úkeys)r)   rö   r•   r   r   r   Ú	<setcomp>ù  s     
  z"_build_snapshot.<locals>.<setcomp>c                 S   s    h | ]}|  d ¡r|  d ¡’qS ©rr   ©r   ©r)   rö   r   r   r   rù   ú  s     
 c                 S   s    h | ]}|  d ¡r|  d ¡’qS rÊ   rû   rü   r   r   r   rù   û  s     
 ©ÚrowCountZreturnedRowCountZentityCountZdayCountrm   rn   ro   rƒ   é   ©ÚschemarÜ   rC   rÉ   rÇ   Z	timeRangeZentityScopeÚstatsÚ	truncatedrþ   Úsample)ÚMAX_SNAPSHOT_ROWSr—   r×   r   r   r   ró   )r  rÜ   rC   Zentity_scoperÉ   ÚextraZlimited_rowsrÇ   Zentity_namesZ
day_valuesr  rÌ   r   r   r   Ú_build_snapshot÷  s6    üý
ñ
r  c              	      s„   | sg S ddddddg}g }|D ]V‰ ‡ fdd„| D ƒ}|s<q t |‡ fd	d
„d�}| ˆ | d¡| d¡| ˆ ¡dœ¡ q |d d… S )NÚalarms_countr‰   rˆ   Ú	sfr_valueÚalarms_by_tonÚalarms_by_visitsc                    s$   g | ]}t | ˆ ¡ttfƒr|‘qS r   )r   r   r}   rž   rü   r”   r   r   rŽ   )  s      z%_build_highlights.<locals>.<listcomp>c                    s   |   ˆ ¡pdS r|   rû   )rö   r”   r   r   r’   ,  r“   z#_build_highlights.<locals>.<lambda>r”   rr   ry   )rÈ   rr   ry   r!   é   )Úmaxr–   r   )rÉ   Znumeric_keysÚ
highlightsZrankedÚtopr   r”   r   Ú_build_highlights  s.    úüÿr  c                    s:   g ‰ ‡ ‡‡fdd„‰| pi   ¡ D ]\}}ˆ||g ƒ q ˆ S )Nc                    s
  t ˆ tƒsd S t‡ fdd„dD ƒƒrÔˆ| d |¡|r<|d nˆˆ  d¡dœ}ˆ  ¡ D ]*\}}t |tttt	fƒsv|d krT|||< qTˆ  d¡}t |tƒrÆd	D ],}t | |¡ttfƒr˜| |¡|d
|› �< q˜ˆ 
|¡ d S ˆ  ¡ D ](\}}t |tƒrÜˆ| ||t|ƒg ƒ qÜd S )Nc                 3   s   | ]}|ˆ kV  qd S r   r   rá   râ   r   r   r+   ?  s     z9_build_feeder_score_rows.<locals>.walk.<locals>.<genexpr>)ÚscoreÚstatusrò   Zn_jaulas_scoredræ   rå   rò   )rò   ry   rç   rr   ZfeederScopeÚreaction_time)ÚminÚavgZmean_secZp95_secZmax_secr  ÚnZreaction_time_)r   r   rê   r,   r   rS   r#   r}   rž   rÂ   r–   )ry   r®   rë   rö   r•   r!   r  ©rÉ   rô   rï   râ   r   rï   ;  s,    
û




z&_build_feeder_score_rows.<locals>.walk)rS   )Úfeeder_score_datarô   ry   r9   r   r  r   Ú_build_feeder_score_rows8  s
    r  c           	   
   C   s®  g }|   di ¡}dD ]z}|  |g ¡D ]h}|r<|  d¡|kr<q$|  dg ¡D ]B}|   d¡|   d¡|  d¡|dœ}t|tƒr€| |¡ | |¡ qHq$q|  dg ¡D ]h}|r´|  d¡|kr´qœ|  dg ¡D ]B}|   d¡|   d¡|  d¡ddœ}t|tƒrø| |¡ | |¡ qÀqœ|  d	g ¡D ]–}|  d
g ¡D ]‚}|�r@|  d¡|k�r@�q"|  dg ¡D ]T}|   d¡|   d¡|  d¡|  d¡|  d¡dœ}t|tƒ�r”| |¡ | |¡ �qL�q"�q|S )NrÙ   )r³   r´   r½   ry   r!   rr   rç   )rr   rç   ry   r¯   r¾   r²   r«   r•   rª   )rr   rç   ry   r¯   ZactivityLabel)r   r   r   ró   r–   )	rõ   Zselected_dayrÉ   rÙ   Zseries_namer¯   r¦   rö   rµ   r   r   r   Ú_build_time_window_rows[  sT    ü

ü

û
r  c                 C   sH   | sd S |s| d S t |ƒ}| D ]}t | d¡ƒ|kr |  S q | d S )Nr   rr   )r&   r   )rj   rì   Zentity_name_lowerrõ   r   r   r   Ú_pick_entity_for_time_window�  s    
r  z!/internal/agent-data/scapp/schemaÚPOST)Úmethodsc                  C   s  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S 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œ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œg}d d!i |d"d#d$d%gd d&d'it|ƒt|ƒd(d(d)œdt|ƒg d*œ}|d+ d d,… |d-< td.||d/œƒd0fS )1NÚtraceIdZdelivered_foodzAlimento entregadoÚsum)rÈ   ÚlabelÚaggregationr	  ÚSFRÚaverager  ZAlarmasr‰   ZPPArˆ   ZVisitasr
  zAlarmas por toneladaZsum_of_visible_daily_metricr  zAlarmas por visitaF)rÈ   r   r!  ÚformulaConfirmedzfeeder_score.scorezPuntuacion de alimentadorzfeeder_score.QzCalidad FeederScorezfeeder_score.sfr_bonuszBono SFR FeederScorezfeeder_score.porc_entregadozPorcentaje entregadozfeeder_score.reaction_time_avgzTiempo de reaccion promediozscapp.schema.v1zinternal.agent.schemarÈ   r   r!  r$  Úkindr  r   rý   r   rÉ   rÿ   r  T©r=   r  rÌ   éÈ   )rB   r:   rc   r$   r   r×   r   )Ú
auth_errorr9   rd   Ú
user_errorÚtrace_idrÉ   rÌ   r   r   r   Úscapp_schemaœ  s�    ýýýýýýüýýýýýÇ@
õr+  z+/internal/agent-data/scapp/center-analyticsc               
   C   s‚  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|d }|d }	t|||	gƒsztddddœƒd	fS t||||	ƒsªtdd
d|› d|	› d�dœƒdfS t	|ƒ\}
}}|rÀ|S z t
t|||	ƒ|
|d i dƒ}W n@ tk
�r  } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t| d|¡|	ƒ}t|dƒ}tdd|d|||	dœ|t|ƒdd„ |D ƒdœƒ}td||dœƒdfS )Nr  r2   r3   r4   FÚinvalid_scopeú%region, area and centro are required.r<   r`   r;   ra   ú' has no Scapp access to Ú.r@   ro   TÚbackend_failureéô  rð   Úcenterzscapp.analytics.center.v1zinternal.agent.center©r%  r2   r3   r4   c                 S   s   g | ]}|  d ¡‘qS rú   rû   ©r)   rõ   r   r   r   rŽ   .  s     z*scapp_center_analytics.<locals>.<listcomp>©r  ZentityNamesr&  r'  )rB   r:   rc   r$   r   rt   Úallr   re   r‡   r   r6   Ú	Exceptionr#   rñ   r÷   r  r  )r(  r9   rK   rV   r)  r*  rC   r2   r3   r4   r…   Ú
time_rangeÚ
time_errorÚraw_datar>   rj   rÉ   rÌ   r   r   r   Úscapp_center_analyticsù  s\    "
û.
üþõr;  z)/internal/agent-data/scapp/area-analyticsc               
   C   sr  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|d }t||gƒsptddddœƒdfS t|||ƒsžtdd	d
|› d|› d�dœƒdfS t	|ƒ\}	}
}|r´|S z&t
t|ƒ› dt|ƒ› �|	|
d ƒ}W n@ tk
�r } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t||ƒ}t|dƒ}tdd|
d||dœ|t|ƒdd„ |D ƒdœƒ}td||dœƒdfS )Nr  r2   r3   Fr,  úregion and area are required.r<   r`   r;   ra   ú' has no Scapp access to area r/  r@   r'   ro   r0  r1  zscapp.analytics.area.v1zinternal.agent.area©r%  r2   r3   c                 S   s   g | ]}|  d ¡‘qS rú   rû   r4  r   r   r   rŽ   e  s     z(scapp_area_analytics.<locals>.<listcomp>r5  Tr&  r'  )rB   r:   rc   r$   r   rt   r6  r   rf   r‡   r   r/   r7  r#   rñ   r÷   r  r  )r(  r9   rK   rV   r)  r*  rC   r2   r3   r…   r8  r9  r:  r>   rj   rÉ   rÌ   r   r   r   Úscapp_area_analytics5  sT    "ý.

ýþör?  z+/internal/agent-data/scapp/region-analyticsc               
   C   s`  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|s`tddddœƒdfS t||ƒsŒtddd	|› d
|› d�dœƒdfS t|ƒ\}}	}
|
r¢|
S z(t	ƒ }|t
 }t|t|ƒ||	d ƒ}W n@ tk
�r
 } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t||ƒ}t|dƒ}tdd|	d|dœ|t|ƒdd„ |D ƒdœƒ}td||dœƒdfS )Nr  r2   Fr,  úregion is required.r<   r`   r;   ra   ú ' has no Scapp access to region r/  r@   ro   r0  r1  zscapp.analytics.region.v1zinternal.agent.region©r%  r2   c                 S   s   g | ]}|  d ¡‘qS rú   rû   r4  r   r   r   rŽ   �  s     z*scapp_region_analytics.<locals>.<listcomp>r5  Tr&  r'  )rB   r:   rc   r$   r   rt   r   ri   r‡   r
   r   r   r/   r7  r#   rñ   r÷   r  r  )r(  r9   rK   rV   r)  r*  rC   r2   r…   r8  r9  rO   Úscapp_dbr:  r>   rj   rÉ   rÌ   r   r   r   Úscapp_region_analyticsl  sV    
"ü.

þþ÷rD  z./internal/agent-data/scapp/feeder-score-centerc               
   C   st  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|d }|d }	t|||	gƒsztddddœƒd	fS t||||	ƒsªtdd
d|› d|	› d�dœƒdfS t	|ƒ\}
}}|rÀ|S z:t
ƒ }|t }t|t t|||	ƒ|
|
t|d d� ƒ}W n@ tk
�r: } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t|dƒ}tdd|d|||	dœ|ƒ}td||dœƒdfS )Nr  r2   r3   r4   Fr,  r-  r<   r`   r;   ra   r.  r/  r@   ro   r�   r0  r1  zfeeder-score-centerzscapp.feeder-score.center.v1z"internal.agent.feeder-score-centerr2  r3  Tr&  r'  )rB   r:   rc   r$   r   rt   r6  r   re   r‡   r
   r   r   r   r6   r   r7  r#   r  r  )r(  r9   rK   rV   r)  r*  rC   r2   r3   r4   r…   r8  r9  rO   rC  Úfeeder_scorer>   rÉ   rÌ   r   r   r   Úscapp_feeder_score_center¤  sN    "
ü.
ûrF  z,/internal/agent-data/scapp/feeder-score-areac               
   C   sb  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|d }t||gƒsptddddœƒdfS t|||ƒsžtdd	d
|› d|› d�dœƒdfS t	|ƒ\}	}
}|r´|S z6t
ƒ }|t }t|t|ƒ› dt|ƒ› �|	|
d ƒ}W n@ tk
�r* } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t|dƒ}tdd|
d||dœ|ƒ}td||dœƒdfS )Nr  r2   r3   Fr,  r<  r<   r`   r;   ra   r=  r/  r@   r'   ro   r0  r1  zfeeder-score-areazscapp.feeder-score.area.v1z internal.agent.feeder-score-arear>  Tr&  r'  )rB   r:   rc   r$   r   rt   r6  r   rf   r‡   r
   r   r   r/   r7  r#   r  r  )r(  r9   rK   rV   r)  r*  rC   r2   r3   r…   r8  r9  rO   rC  rE  r>   rÉ   rÌ   r   r   r   Úscapp_feeder_score_areaÖ  sL    "ü.

ûrG  z./internal/agent-data/scapp/feeder-score-regionc               
   C   s@  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|s`tddddœƒdfS t||ƒsŒtddd	|› d
|› d�dœƒdfS t|ƒ\}}	}
|
r¢|
S z(t	ƒ }|t
 }t|t|ƒ||	d ƒ}W n@ tk
�r
 } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t|dƒ}tdd|	d|dœ|ƒ}td||dœƒdfS )Nr  r2   Fr,  r@  r<   r`   r;   ra   rA  r/  r@   ro   r0  r1  zfeeder-score-regionzscapp.feeder-score.region.v1z"internal.agent.feeder-score-regionrB  Tr&  r'  )rB   r:   rc   r$   r   rt   r   ri   r‡   r
   r   r   r/   r7  r#   r  r  )r(  r9   rK   rV   r)  r*  rC   r2   r…   r8  r9  rO   rC  rE  r>   rÉ   rÌ   r   r   r   Úscapp_feeder_score_region  sJ    
"ü.
ûrH  z*/internal/agent-data/scapp/compare-centersc               
      s°  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}dd„ | dg ¡D ƒ}t|ƒdk rvtdddd	œƒd
fS t|ƒ\‰ }}‡ fdd„|D ƒ}	|	rÂtddd|› dd 	|	¡› d�d	œƒdfS t
|ƒ\}
}}|rØ|S z\g }|D ]N}t||
|d i dƒ}t| d|¡|ƒ}t|dƒD ]}||d< | |¡ �qqâW n@ tk
�rt } z tddt|ƒd	œƒdf W Y ¢S d }~X Y nX tdd|d|i–ddi|dt|ƒiƒ}td||dœƒdfS )Nr  c                 S   s   g | ]}t |ƒrt |ƒ‘qS r   ©r$   rË   r   r   r   rŽ   C  s      z)scapp_compare_centers.<locals>.<listcomp>r[   é   Fr,  z"At least two centers are required.r<   r`   c                    s   g | ]}t |ƒˆ kr|‘qS r   ©r&   rË   ©rW   r   r   rŽ   H  s      r;   ra   ú' has no Scapp access to: ú, r/  r@   ro   Trð   zcompare-centersÚcomparisonTargetr0  r1  z"scapp.analytics.compare-centers.v1zinternal.agent.compare-centersr%  r  r&  r'  )rB   r:   rc   r$   r   rt   r×   r   r_   r,   r‡   r   rñ   r÷   r–   r7  r#   r  r  )r(  r9   rK   rV   r)  r*  rC   Z
center_idsrd   Údeniedr…   r8  r9  rÉ   r]   r:  rj   rö   r>   rÌ   r   rL  r   Úscapp_compare_centers6  sL    (.

ú	rQ  z(/internal/agent-data/scapp/compare-areasc               
      s¼  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}dd„ | dg ¡D ƒ}t|ƒdk rvtdddd	œƒd
fS t|ƒ\}‰ }‡ fdd„|D ƒ}	|	rÂtddd|› dd 	|	¡› d�d	œƒdfS t
|ƒ\}
}}|rØ|S zhtƒ }|t }|d }g }|D ]D}t|||
|d ƒ}t||ƒ}t|dƒD ]}||d< | |¡ �q"qøW n@ tk
�r€ } z tddt|ƒd	œƒdf W Y ¢S d }~X Y nX tdd|d|i–ddi|dt|ƒiƒ}td||dœƒdfS )Nr  c                 S   s   g | ]}t |ƒrt |ƒ‘qS r   rI  rË   r   r   r   rŽ   t  s      z'scapp_compare_areas.<locals>.<listcomp>rs   rJ  Fr,  z At least two areas are required.r<   r`   c                    s   g | ]}t |ƒˆ kr|‘qS r   rK  rË   ©rX   r   r   rŽ   y  s      r;   ra   rM  rN  r/  r@   Údata_analyticro   zcompare-areasrO  r0  r1  z scapp.analytics.compare-areas.v1zinternal.agent.compare-areasr%  r  Tr&  r'  )rB   r:   rc   r$   r   rt   r×   r   r_   r,   r‡   r
   r   r   rñ   r÷   r–   r7  r#   r  r  )r(  r9   rK   rV   r)  r*  rC   Zarea_idsrd   rP  r…   r8  r9  rO   rC  Ú
collectionrÉ   Úarea_idr:  rj   rö   r>   rÌ   r   rR  r   Úscapp_compare_areasg  sR    (
.

ú	rV  z'/internal/agent-data/scapp/live-summaryc                   C   s   t ddddœƒdfS )NFÚgonez,Live summary fue dado de baja el 2026-07-29.r<   iš  )r   r   r   r   r   Úscapp_live_summary›  s    ýürX  z&/internal/agent-data/scapp/time-windowc                  C   sº  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|d }|d }	t|||	gƒsztddddœƒd	fS t||||	ƒsªtdd
d|› d|	› d�dœƒdfS t	|ƒ\}
}}|rÀ|S z t
t|||	ƒ|
|d i dƒ}W n@ tk
�r  } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t| d|¡|	ƒ}t|| d¡ƒ}|�s^tddddœƒdfS t|| d¡ƒ}tdd|| d¡| d¡dœ–d|||	| d¡dœ|ƒ}td||dœƒdfS ) Nr  r2   r3   r4   Fr,  r-  r<   r`   r;   ra   r.  r/  r@   ro   Tr0  r1  rð   rr   Úemptyz5No timeline data was found for the current selection.rb   rq   zscapp.analytics.time-window.v1zinternal.agent.time-window)rq   rr   ztime-window)r%  r2   r3   r4   rr   r&  r'  )rB   r:   rc   r$   r   rt   r6  r   re   r‡   r   r6   r7  r#   rñ   r  r  r  )r(  r9   rK   rV   r)  r*  rC   r2   r3   r4   r…   r8  r9  r:  r>   rj   rõ   rÉ   rÌ   r   r   r   Úscapp_time_window¤  s^    "
û.ûõrZ  )rà   )N)UÚjsonrÃ   r   rÔ   rÏ   Úcollectionsr   r   r   Úflaskr   r   r   Úshared_db_utilsr   r	   r
   ÚAnalytic.Scapp_analyticsr   r   r   r   ÚAnalytic.centro_idsr   ÚAnalytic.Scapp_feeder_scorer   r   r   r   rÑ   Úagent_data_bpr}   r   r   r  rh   r   r"   r$   r&   r/   r5   r6   r:   rB   rE   rG   rI   rL   rP   r_   rc   re   rf   ri   rt   r{   r€   r‡   r‹   rœ   rŸ   r¤   r¨   r°   rß   rñ   r÷   r  r  r  r  r  Úrouter+  r;  r?  rD  rF  rG  rH  rQ  rV  rX  rZ  r   r   r   r   Ú<module>   s’   


L

$#4
\
;
6
7
1
0
.
0
3
