
    CidA                     *   d dl mZmZ d dlZd dlmZmZmZ d dlmZ  ej                  e
      Z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mZmZ  ej*                  d
dg      d        Z ej*                  ddg      d        Z ej*                  ddg      d        Z ej*                  ddg      d        Z ej*                  ddg      d        Z ej*                  ddg      d        Zd dlmZ  ej*                  ddg      d        Zd dlmZ d dlm Z  d dlmZ  ej*                  ddg      d        Z! ej*                  d dg      d!        Z" ej*                  d"dg      d#        Z# ej*                  d$dg      d%        Z$y)&    )jsonifyrequestN)datedatetime	timedelta)api_bpi  )
SyncEngine)SessionLocal	SystemLog)descz/sync/listingsPOST)methodsc                  <   	 t               } | j                          	 | j                          | j                          t        ddd      S # t        $ r}t	        d|        Y d }~:d }~ww xY w# t        $ r#}t        dt        |      d      dfcY d }~S d }~ww xY w)NzTiny sync warning: TzSync completed successfully.successmessageFr   error  )r	   sync_adssync_tiny_stock	Exceptionprintsync_metricsr   str)enginee_tinyes      D/var/www/hypershopcomercio.com.br/hyper-ai/app/api/endpoints/sync.pysync_listingsr!      s    A	2""$ 	44RSTT	  	2'x011	2
  A53q6:;S@@AsE   A/ A A/ 	A,A'"A/ 'A,,A/ /	B8BBBz/sync/stock/mlc                      	 t               } | j                          t        ddd      S # t        $ r#}t        dt	        |      d      dfcY d }~S d }~ww xY w)NTzML Stock Sync Triggeredr   Fr   r   )r	   r   r   r   r   r   r   s     r    sync_ml_stockr$      sU    A44MNOO A53q6:;S@@As   '* 	AAAAz/sync/listings/<ml_id>c                     	 t               }t        ddd      S # t        $ r#}t        dt        |      d      dfcY d }~S d }~ww xY w)NTz"Single sync triggered (Check logs)r   Fr   r   )r	   r   r   r   )ml_idr   r   s      r    sync_singler'   )   sO    A  44XYZZ A53q6:;S@@As    	AAAAz/sync/metricsc                      	 t               } | j                          t        ddi      S # t        $ r#}t        dt	        |      d      dfcY d }~S d }~ww xY w)Nr   TFr   r   r	   r   r   r   r   r#   s     r    sync_metrics_todayr*   ;   sV    B	4()) BECF;<cA	AB   &) 	AA
AAz/sync/metrics/<target_date>c                     	 t               }|j                  |       }t        |      S # t        $ r#}t        dt	        |      d      dfcY d }~S d }~ww xY w)N)target_dateFr   r   r)   )r-   r   resr   s       r    sync_metrics_dater/   D   sW    B,""{";	 BECF;<cA	ABr+   z/sync/metrics/rangec                  6   	 t         j                  } | j                  d      }| j                  d      }|r|st        ddi      dfS t	               }|j                         }t        |      S # t        $ r#}t        dt        |      d      dfcY d }~S d }~ww xY w)	N	startDateendDater   zstartDate and endDate requiredi  Fr   r   )r   jsongetr   r	   r   r   r   )datastartendr   r.   r   s         r    sync_metrics_ranger8   N   s    A||%hhy!CG%EFGLL !!#s| A53q6:;S@@As$   AA, $A, ,	B5BBBz
/sync/tinyc                      t               } 	 | j                          t        ddd      S # t        $ r#}t        dt	        |      d      dfcY d }~S d }~ww xY w)NTzTiny ERP Sync Triggeredr   Fr   r   )r	   r   r   r   r   r#   s     r    	sync_tinyr:   b   sW    \FA 44MNOO A53q6:;S@@As   * 	AAAA)
OAuthToken)Ad)r   z
/sync/logsGETc                  v   t               } 	 t        t        j                  j	                  dd            }t        t        j                  j	                  dd            }| j                  t              j                  t        j                  j                  ddg            }t        j                  j	                  d      }|dk(  r#|j                  t        j                  d	k(        }n'|d
k(  r"|j                  t        j                  dk(        }|j                         }|j                  t        t        j                              j                  |      j!                  |      j#                         }g }|D ]  }|j%                  |j&                  |j                  j)                         d|j                  v sd|j                  v rdnd|j                  |j                  |j*                  |j,                  |j.                  d        t1        ||d      | j3                          S # | j3                          w xY w)Nlimit2   offsetr   r!   r   statusr   ERRORr   INFOmelisynczMercado LivreSystem)id	timestampsourcetypelevelr   detailsduration)totalr5   )r
   intr   argsr4   queryr   filtermodulein_rL   countorder_byr   rI   rA   r?   allappendrH   	isoformatr   rM   duration_msr   close)	dbr?   rA   rR   rB   rO   logsresultslogs	            r    get_sync_logsra   o   s   	B"GLL$$Wb12W\\%%h23 #**9+;+;+?+?R`@a+bc!!(+WLLG!;<Ey LLF!:;E~~d9#6#678??GMMeTXXZ 
	CNNff ]]446-3szz-AVszzEY/_g

;;;;OO	 	
	 
 
 	

s   H	H& &H8z/sync/statusc            	         t               } 	 | j                  t              j                  d      j	                         }d}d }|rt        j                         }|j                  }t        j                  d|j                          t        j                  d| d|        |s2t        j                  d       d}|j                  xs |j                  }n||j                  r|j                  d 	      }||t        d
      z   kD  }t        j                  d| d|t        d
      z    d|        |rd}|j                  xs |j                  }nd}g d}d}d }	|D ]#  }
| j                  t               j#                  t         j$                  |
k(        j'                  t)        t         j*                              j	                         }|sp|
dk(  r|j,                  dk7  r|}	|j,                  dk(  s|j*                  }t        j                         }|r|j                  r|j                  d 	      }|j                  r|j                  d 	      }||xs t
        j.                  z
  j1                         t2        k  s"d}& |	s{| j                  t               j#                  t         j$                  dk(  t         j,                  dk(        j'                  t)        t         j*                              j	                         }	ddlm} | j                  |      j#                  |j8                  dk(  |j,                  dk(        j'                  t)        |j:                              j	                         }| j                  |      j#                  |j8                  dk(  |j,                  dk(        j'                  t)        |j:                              j	                         }g }|	r'|	j*                  r|j=                  |	j*                         |r'|j:                  r|j=                  |j:                         |r'|j:                  r|j=                  |j:                         d }|r	 t?        |      }|r+|jC                         }|jE                  d      sd|vr|dz  }nd }| j                  tF              jI                         }ddl%m&} | j                  |      j                  d      j	                         }tO        |xr |jP                        }| j                  t               j#                  t         j$                  dk(        j'                  t)        t         j*                              j	                         }d}|r|j,                  dk(  r|j*                  }t        jR                         }|r|j                  r|j                  d 	      }|j                  r|j                  d 	      }||xs t
        j.                  z
  j1                         dk  rd}tU        |||||d|||r|j*                  jC                         nd |d d!      | jW                          S # t@        $ rB |D cg c]"  }|j                  r|j                  d 	      n|$ nc c}w }}t?        |      }Y 3w xY w# tX        $ rF}t[        d"|        tU        ddt]        |      d#ddd$d!      cY d }~| jW                          S d }~ww xY w# | jW                          w xY w)%Nmercadolivre)providerFz'[DEBUG_SYNC] Token found for provider: z[DEBUG_SYNC] now_ts (UTC): z, expires_ts (DB): z.[DEBUG_SYNC] No expires_at, assuming connectedT)tzinfo   )minutesz[DEBUG_SYNC] comparison: z > z | is_valid: )listingsvisitsordersmetrics_processingrh   runningr   r   )SyncJobrj   	completedadsZ+)SystemConfigTINY_API_TOKEN)keystockiX  )	connected	seller_id	last_sync	ads_countsyncing)rv   	has_tokenrx   rz   )mltinyzError in get_sync_status: )rv   rz   r   )rv   rz   )/r
   rR   r;   	filter_byfirstr   utcnow
expires_atloggerinford   rw   user_idre   replacer   r   rS   rT   rW   r   rI   rB   mintotal_secondsSYNC_TIMEOUT_SECONDSapp.models.syncrm   entityfinished_atrY   max	TypeErrorrZ   endswithr<   rV   app.models.system_configrr   boolvaluenowr   r\   r   r   r   )r]   tokenml_connectedrw   now_ts
expires_tsis_validmodulesis_syncing_mllast_log_mlmodr`   log_tsnow_nowrm   last_job_orderlast_job_ads
candidatesfinal_last_synccnaive_candidateslast_sync_isory   rr   tiny_configtiny_connectedlast_log_tinyis_syncing_tinyr   s                                r    get_sync_statusr      sP   	BU$...GMMO	 oo'V**Z[[B5>>BRST[[6vh>QR\Q]^_ MN $"__= %%","4"4D"4"AZ '&9Q3G*GH8CQZcdQeHeGffst|s}~$(\!&!AEMMY$)\ I 	-C((9%,,Y-=-=-DENNtT]TgTgOhiooqC
 *$y)@#&[::* ]]F&oo/G&--!'t!<~~")///">6#9X\\:IIKNbb(,)	-. 88I.55i6F6F*6TV_VfVfjsVst}}  C  DM  DW  DW  X  Y  _  _  a[ 	,'*11'..H2Lgnn`kNkluuvz  |C  |O  |O  wP  Q  W  W  Yxx(//%0G[fIfgppquv}  wJ  wJ  rK  L  R  R  T 
;00k334n88n889L44|778 8"%j/ ,668]!**3/C}4L#%!]HHRL&&(	 	:hh|,66;K6LRRTk?k.?.?@+2293C3Cw3NOXXY]^g^q^qYrsyy{]11Y>#--V||~W6== ...5"??$?7F2hll3BBDsJ#')&*&( ,+DQ]44>>@W[*	
 . 	
q  8Wa#bRSahhAIITI$:A$M#b#b #b"%&6"78`  *1#./ %%#a&I"'E:
  	
 	
 	
su   G Z! %Z! 3B
Z! ?GZ! Y *GZ! Z 'ZZZ! ZZ! !	[0*+[+[0[3 +[00[3 3\z/jobs/trigger-syncc                     ddl m}  ddlm} t	               }	 ddlm}  |dddt        j                               }|j                  |       |j                          |j                           | |
      }|j                          t        ddi      dfS # t        $ r}t        d	|        Y d }~Td }~ww xY w# |j                          w xY w)Nr   Thread)run_daily_syncr   rh   rl   zManual Trigger)rT   rB   r   rI   zFailed to pre-log sync status: targetr   z Sync job triggered in background   )	threadingr   app.scheduler.tasksr   r
   app.models.system_logr   r   r   addcommitr   r   r\   r6   r   )r   r   r]   r   r`   r   threads          r    trigger_sync_manualr   0  s     2 
B3 $lln	
 	s
		 	
>*F
LLNIABCSHH  5/s3445 	
s*   AB 	B6B1,B9 1B66B9 9Cz/jobs/triggerc                      ddl m}  d }	 t        j                  xr  t        j                  j	                  dd      }|r( | |      }|j                          t        ddi      d	fS t               }|j                  d
       |j                          t        ddd      dfS # t        $ rQ}ddl}ddl} |j                  d|        |j                          t        dt        |      dd      dfcY d}~S d}~ww xY w)zCQuick sync - fetches recent orders and visits without full ad sync.r   r   c                     	 t               } | j                  d       | j                          y # t        $ r#}dd l} |j
                  d|        Y d }~y d }~wt        $ r#}dd l} |j
                  d|        Y d }~y d }~ww xY w)N0   lookback_hoursr   Quick sync error: )r	   sync_orders_incrementalsync_visitsr   loggingr   )r   r   r   s      r    quick_sync_taskz+trigger_quick_sync.<locals>.quick_sync_taskS  s|    	4\F**"*=  	4GMM.qc233 	4GMM.qc233	4s    ,/ 	BAB"B  BasyncTr   r   z"Quick sync triggered in backgroundr   r   r   zQuick sync completed)r   r      Nr   FzSync failed gracefully)r   r   r   )r   r   r   r3   r4   r6   r   r	   r   r   r   r   	tracebackr   	print_excr   )r   r   is_asyncr   r   r   r   r   s           r    trigger_quick_syncr   N  s     !4 +f0 <<CGLL$4$4Wd$CO4V\\^Y(LMNPSSS &&b&9#9dKLcQQ f*1#./53q6F^_`beeefs%   AB# ';B# #	C=,AC82C=8C=)%flaskr   r   r   r   r   r   app.apir   	getLogger__name__r   r   app.services.sync_enginer	   app.core.databaser
   r   r   
sqlalchemyr   router!   r$   r'   r*   r/   r8   r:   app.models.oauth_tokenr;   app.models.adr<   ra   r   r   r        r    <module>r      s   "  . . 			8	$  / * +  . .1A 2A 1A 2A &9A :A" ox0B 1B +fX>B ?B #fX6A 7A" 0lVH-A .A .  lUG,$ -$L nug.W /Wr "VH5I 6I: ox0?f 1?fr   