
    i/                         d Z ddlZddlZddlZddlmc mZ ddlZddl	m
Z
 ddlmZ  ej                  e      Z ej                   dd      Z ej                   dd	      Zd
Zdedee   fdZdedee   fdZdefdZy)u=   
Servicio de sincronización de productos desde XML a Neo4j.
    N)neo4j_client   )SyncProductsResponseMARCIMEX_XML_URLz*https://www.marcimex.com/XMLData/botai.xmlMARCIMEX_PROMOTIONS_URLz1https://www.marcimex.com/XMLData/catalogo_bot.xmlz{http://base.google.com/ns/1.0}xml_contentreturnc                    t        j                  |       }g }|j                  d      D ]  dt        dt        dz  ffd}|j	                  i 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        |S )z4Parsea el XML de productos y retorna lista de dicts.itemtagr	   Nc                 x    j                  |       }|&|j                  r|j                  j                         S y )N)findtextstrip)r   elemr   s     9/opt/lhia/marcimex/agent/app/api/services/sync_service.pyget_textz%_parse_products_xml.<locals>.get_text   s0    99S>DDIIyy((    
product_idsku_idtitledescriptionproduct_descriptionsummarycategoryglobal_categorysub_categoryproduct_typebrandrpx_codelink
image_linkpriceproduct_price_with_taxin_stockavailabilitystatusproduct_statuscolorspecifications)r)   r*   )ET
fromstringfindallstrappend)r   rootproductsr   r   s       @r   _parse_products_xmlr2      s   ==%DHV$ 	# 	#* 	 	 
(<0
hx(
 Xg&
 8$9:	

 x	*
 ,
 x(9:
 H^4
 H^4
 Xg&
 ,
 HV$
 (<0
 X67
 ,
  H^4!
" h/0#
$ g&&'78'
 	8 Or   c                 X   t        j                  |       }|j                  d      }||j                  d      n|j                  d      }g }|D ]X  }|j                  t         d      }||j
                  s+|j
                  j                         }|sH|j                  |       Z |S )z<Parsea el XML de promociones y retorna lista de product IDs.channelr   z.//itemr   )r+   r,   r   r-   _G_NSr   r   r/   )r   r0   r4   items	promo_idsr   pid_elempids           r   _parse_promo_ids_xmlr:   7   s    ==%Dii	"G'.':GOOF#Y@WEI &99wj12HMM--%%'C  %& r   c            	        K   t        j                          } t        j                  d       t        j                  dt        j                                 t        j                  d       t        j
                         }t        j                  d| d       t        j                  dt         d       t        j                          }t        j                  d	      4 d
{   }|j                  t               d
{   }|j                          |j                  }d
d
d
      d
{    t        j                  dt        j                          |z
  ddt               d       t        |      }t        j                  dt        |       d       t        j                  dt        |       d       t        j                          }t        j                  |      }t        j                  dt        j                          |z
  dd|        d}	 t        j                  dt         d       t        j                          }t        j                  d	      4 d
{   }|j                  t               d
{   }	|	j                          |	j                  }
d
d
d
      d
{    t        j                  dt        j                          |z
  ddt        
       d       t!        |
      }t        j                  dt        |              t        j"                          t        j$                  |      }t        j                  d| d       |dkD  r:t        j&                  d      }t        j                  d| dt        |       d       ||d!<   t        j                          | z
  }t        j                  d"|dd#t        |       d$| d%       t-        d&i |S 7 7 7 # 1 d
{  7  sw Y   xY w7 7 7 b# 1 d
{  7  sw Y   sxY w# t(        $ r"}t        j+                  d |        Y d
}~d
}~ww xY ww)'u   
    Sincroniza productos desde XML a Neo4j e incluye actualización de promociones.

    - Si la BD está vacía: sube todos los productos con estado 'nuevo'
    - Si ya hay datos: sincronización incremental
    u!   🚀 === INICIO sync_products ===u   🗄️ Usando base de datos: uE   🔧 PASO 0: Inicializando campo promotion en productos existentes...u(   🏷️ Campo promotion inicializado en z productos existentesu$   🌐 PASO 1: Descargando XML desde 'z'...g      ^@)timeoutNu   ✅ XML descargado en z.2fzs (z bytes)u   📦 XML parseado: z' productos encontrados para sincronizaru   🌿 PASO 2: Sincronizando z productos con Neo4j...u(   ✅ Sincronización Neo4j completada en zs: r   u6   🏷️ PASO 3: Descargando XML de promociones desde 'g      N@u%   ✅ XML de promociones descargado en u4   🏷️ Productos en promoción encontrados en XML: u   ✅ Promociones actualizadas: z& productos marcados con promotion=truezMATCH (p:Product) WHERE p.promotion = true OPTIONAL MATCH (p)-[:BELONGS_TO]->(c:Category) OPTIONAL MATCH (p)-[:MADE_BY]->(b:Brand) RETURN p.id AS id, p.name AS name, b.name AS brand, c.name AS category, p.price AS price ORDER BY p.nameu"   🏷️  PRODUCTOS EN PROMOCIÓN (z en Neo4j / z IDs en XML):u*   ⚠️ No se pudo actualizar promociones: promotions_updatedu*   🏁 === FIN sync_products. Tiempo total: zs | productos=z, promociones=z === )timeloggerinfor   get_current_databaseinitialize_promotion_field_URL_PRODUCTShttpxAsyncClientgetraise_for_statusr   lenr2   sync_products_from_xml_PROMOTIONS_URLr:   reset_all_promotionsset_promotions_by_idsexecute_query	Exceptionwarningr   )
start_timeupdatedt0clientresponser   r1   resultpromo_countpromo_response	promo_xmlr7   promo_products	promo_errelapseds                  r   sync_productsr]   F   s     J
KK34
KK01R1R1T0UVW KKWX557G
KK:7)CXYZ KK6}oTJK	B  / $ $6M22!!#mm$ $ KK(r)9#(>c#kBRASSZ[\";/H
KK%c(m_4[\] KK-c(m_<STU	B00:F
KK:499;;KC:PPSTZS[\] KQL_L]]abcYY[$$T2 	, 	,f#)::o#>>N++-&++I	, 	, 	;DIIK"<LS;QQTUXYbUcTddklm(3	J3y>JZ[\))+"88C4[MAghi?)77"N KK<[MVYZcVdUeerst $/F iikJ&G
KK
4WSM B]O>+d	D  )&))k$2$ $ $ $(	,>	, 	, 	, 	,0  QCI;OPPQs   C!Q#O)$Q'O2 O, O2!Q,O/-C*QAP' #P$P' 'P P P!P' ,P-C,P' AQ,O2/Q2P8O;9P QP' PP' P$PP$P' '	Q0QQQQ)__doc__loggingosr?   xml.etree.ElementTreeetreeElementTreer+   rE   rag_service.neo4j_clientr   modelsr   	getLogger__name__r@   getenvrD   rK   r5   r.   listdictr2   r:   r]   r>   r   r   <module>rk      s     	  " "  1 )			8	$		,.Z["))57jk) S  T$Z  Fc d3i H*1 H*r   