Ë
    #¤Kj™  ã                  óÀ   — d Z ddlmZ ddlZddlZddl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 dd	lmZmZmZmZ  ej.                  e«      Z G d
„ d«      Zy)zALead writer: creates/updates dgred clients from pipeline results.é    )ÚannotationsN)ÚSettings)ÚDgredClient)ÚMatchNotifier)Úgenerate_reply_proposal)ÚMatchResultÚ	PartQueryÚPost)ÚSTATUS_MATCHEDÚSTATUS_NO_MATCHÚSTATUS_REVIEWÚ
map_statusc                  ó‚   — e Zd ZdZd	d„Z	 	 	 	 	 	 	 	 d
d„Zedd„«       Zdd„Z	 	 	 	 	 	 	 	 	 	 dd„Z		 	 	 	 	 	 	 	 	 	 dd„Z
y)Ú
LeadWriterz*Writes pipeline results to dgred as leads.c                ó˜   — || _         || _        t        |«      | _        i | _        |j                  t        t        t        g«      | _	        y )N)
ÚdgredÚsettingsr   ÚnotifierÚ_client_cacheÚensure_statusesr   r   r   Ú_status_map)Úselfr   r   s      úE/var/www/html/agent.samochodowy/src/agent_samochodowy/dgred/writer.pyÚ__init__zLeadWriter.__init__   sC   € ØˆŒ
Ø ˆŒÜ% hÓ/ˆŒà35ˆÔà ×0Ñ0ÜœM¬?ð2
ó ˆÕó    c                óì  — t        || j                  «      }| j                  ||«      }| j                  ||||«      }| j                  j                  ||«       | j                  j                  |«      }|r| j                  j                  |d|i«       |t        k(  r |j                  r| j                  ||||«       t        j                  d|||j                  |j                  |j                   «       y)zWrite a single lead to dgred.ÚclientStatuszCLead written: client=%s status=%s confidence=%.2f method=%s post=%sN)r   r   Ú_find_or_create_clientÚ_build_noter   Úadd_noter   ÚgetÚupdate_clientr   ÚoffersÚ_save_reply_proposalÚloggerÚinfoÚ
confidenceÚmethodÚpost_id)r   ÚpostÚqueryÚresultÚstatus_nameÚ	client_idÚnote_contentÚ	status_ids           r   Ú
write_leadzLeadWriter.write_lead!   sÔ   € ô ! ¨¯©Ó7ˆð ×/Ñ/°°eÓ<ˆ	ð ×'Ñ'¨¨e°V¸[ÓIˆØ�
‰
×Ñ˜I |Ô4ð ×$Ñ$×(Ñ(¨Ó5ˆ	ÙØ�J‰J×$Ñ$ Y°ÀÐ0KÔLð œ.Ò(¨V¯]ª]Ø×%Ñ% i°°u¸fÔEä�‰ØQØ�{ F×$5Ñ$5°v·}±}ÀdÇlÁlõ	
r   c                ó8  — t        | «      dk  r| S t        j                  d| «      xs t        j                  d| «      }|r$d|j                  d«      › �}t        |«      dk  r|S dt	        j
                  | j                  «       «      j                  «       dd z   S )	zÛShorten a profile URL to fit dgred's 50-char externalId limit.

        Extracts the numeric FB user ID when possible (e.g. 'fb:100004747195200'),
        otherwise falls back to a deterministic SHA-256 prefix.
        é2   zprofile\.php\?id=(\d+)zfacebook\.com/(\d+)zfb:é   zfbh:Né-   )ÚlenÚreÚsearchÚgroupÚhashlibÚsha256ÚencodeÚ	hexdigest)ÚurlÚmÚshorts      r   Ú_shorten_external_idzLeadWriter._shorten_external_id?   s‰   € ô ˆs‹8�rŠ>ØˆJä�I‰IÐ/°Ó5Ò_¼¿¹ÐCYÐ[^Ó9_ˆÙØ˜!Ÿ'™' !›*˜Ð&ˆEÜ�5‹z˜RÒØ�àœŸ™ s§z¡z£|Ó4×>Ñ>Ó@ÀÀ"ÐEÑEÐEr   c                óž  — | j                  |j                  «      }|| j                  v r| j                  |   S | j                  j	                  |«      }|r2|j                  d|j                  d«      «      }|| j                  |<   |S i }|j                  r|j                  |d<   |j                  r|j                  |d<   |j                  r|j                  |d<   |j                  r|j                  |d<   |j                  r|j                  |d<   |j                  rdj                  |j                  «      |d	<   |j                  |d
<   |j                  |d<   |j                  |d<   |j                  |dddœgdœ}||d<   | j                  j!                  |«      }|j                  d|j                  dd«      «      }|| j                  |<   |S )z8Find existing client by profile URL or create a new one.ÚidÚ_idÚmarkaÚmodelÚrocznikÚ	kategoriaÚkod_silnikaú, Ú	numery_oeÚ	fb_profilÚ	url_postaÚgrupazFB Agentr4   )ÚtagÚcolor)ÚnameÚcustomFieldsÚtagsÚ
externalIdz
dry-run-id)rA   Úauthor_profile_urlr   r   Úfind_client_by_external_idr!   ÚbrandrF   ÚyearÚcategoryÚengine_codeÚ
oe_numbersÚjoinÚpost_urlr9   Úauthor_nameÚcreate_client)	r   r*   r+   Úexternal_idÚexistingÚcidÚcustom_fieldsÚclient_datar,   s	            r   r   z!LeadWriter._find_or_create_clientQ   s²  € à×/Ñ/°×0GÑ0GÓHˆð ˜$×,Ñ,Ñ,Ø×%Ñ% kÑ2Ð2ð —:‘:×8Ñ8¸ÓEˆÙØ—,‘,˜t X§\¡\°%Ó%8Ó9ˆCØ.1ˆD×Ñ˜{Ñ+ØˆJð ˆØ�;Š;Ø%*§[¡[ˆM˜'Ñ"Ø�;Š;Ø%*§[¡[ˆM˜'Ñ"Ø�:Š:Ø',§z¡zˆM˜)Ñ$Ø�>Š>Ø).¯©ˆM˜+Ñ&Ø×ÒØ+0×+<Ñ+<ˆM˜-Ñ(Ø×ÒØ)-¯©°5×3CÑ3CÓ)DˆM˜+Ñ&à%)×%<Ñ%<ˆ�kÑ"Ø%)§]¡]ˆ�kÑ"Ø!%§¡ˆ�gÑð ×$Ñ$Ø)Ø'°!Ñ4Ð5ñ
ˆð %0ˆ�LÑ!à—‘×)Ñ)¨+Ó6ˆØ�j‰j˜˜vŸz™z¨%°Ó>Ó?ˆà*-ˆ×Ñ˜;Ñ'Øˆ
r   c                óì   — t        |||«      }| j                  j                  |d|d   |d   |d   dœi«       t        j	                  d||d   «       | j
                  j                  |||||d   «       y)	z8Generate and save a reply proposal for Dopasowano leads.rR   Ú
reply_textÚ	offer_urlÚauthor_profile)Úpropozycja_odpowiedziÚlink_ofertyÚlink_profiluz+Reply proposal saved: client=%s template=%dÚtemplate_idN)r   r   r"   r%   r&   r   Únotify_match)r   r.   r*   r+   r,   Úproposals         r   r$   zLeadWriter._save_reply_proposal‚   s‹   € ô +¨4°¸Ó?ˆØ�
‰
× Ñ  ØØ)1°,Ñ)?Ø'¨Ñ4Ø (Ð)9Ñ :ñð-
ô 	ô 	�‰Ø9Ø�x Ñ.ô	
ð 	�‰×"Ñ"Ø�%˜ ¨H°\Ñ,Bõ	
r   c                ó\  — d|j                   › �d|j                  › �d|j                  › �d|j                  j	                  «       › �dd|j
                  dd|› �d|j                  › �d	|j                  d
›�g}|j                  r|j                  d|j                  › �«       |j                  r|j                  d|j                  › �«       |j                  r|j                  d|j                  › �«       |j                  r|j                  d|j                  › �«       |j                  r-|j                  ddj                  |j                  «      › �«       |j                  r‰|j                  d«       |j                  d«       |j                  dd D ]U  }|j                  d|j                   › d|j"                  › d|j$                  › d|j&                  › d|j(                  › d�«       ŒW |j                  d«       |j                  d|j*                  › �«       dj                  |«      S )zBuild audit note content.z**Post z grupy:** z
**Link:** z**Autor:** z
**Data:** Ú u   **TreÅ›Ä‡ posta:**z**Status:** z**Metoda dopasowania:** u   **PewnoÅ›Ä‡:** z.0%z**Marka:** z**Model:** z**Kategoria:** z**Kod silnika:** z**Numery OE:** rJ   z**Dopasowane oferty:**Né   z- [z](z) (ú ú)z**Uzasadnienie:** ú
)r9   r]   r^   Ú	timestampÚ	isoformatÚtextr(   r'   rW   ÚappendrF   rY   rZ   r[   r\   r#   Útitler>   ÚplatformÚpriceÚcurrencyÚreason)r   r*   r+   r,   r-   ÚlinesÚoffers          r   r   zLeadWriter._build_noteœ   sõ  € ð ! §¡ Ð-Ø˜Ÿ™˜Ð(Ø˜$×*Ñ*Ð+Ð,Ø˜Ÿ™×1Ñ1Ó3Ð4Ð5ØØ Ø�I‰IØØ˜;˜-Ð(Ø& v§}¡} oÐ6Ø˜f×/Ñ/°Ð4Ð5ð
ˆð �;Š;Ø�L‰L˜; u§{¡{ mÐ4Ô5Ø�;Š;Ø�L‰L˜; u§{¡{ mÐ4Ô5Ø�>Š>Ø�L‰L˜?¨5¯>©>Ð*:Ð;Ô<Ø×ÒØ�L‰LÐ,¨U×->Ñ->Ð,?Ð@ÔAØ×ÒØ�L‰L˜?¨4¯9©9°U×5EÑ5EÓ+FÐ*GÐHÔIà�=Š=Ø�L‰L˜ÔØ�L‰LÐ1Ô2ØŸ™ r¨Ð*ò s�Ø—‘˜s 5§;¡; -¨r°%·)±)°¸CÀÇÁÐ?OÈrÐRW×R]ÑR]ÐQ^Ð^_Ð`e×`nÑ`nÐ_oÐopÐqÕrðsð 	�‰�RÔØ�‰Ð)¨%¯,©,¨Ð8Ô9à�y‰y˜ÓÐr   N)r   r   r   r   ÚreturnÚNone)r*   r
   r+   r	   r,   r   r€   r�   )r>   Ústrr€   r‚   )r*   r
   r+   r	   r€   ú	int | str)
r.   rƒ   r*   r
   r+   r	   r,   r   r€   r�   )
r*   r
   r+   r	   r,   r   r-   r‚   r€   r‚   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r1   ÚstaticmethodrA   r   r$   r   © r   r   r   r      s»   „ Ù4ó	ð
àð
ð ð
ð ð	
ð
 
ó
ð< òFó ðFó"/ðb
àð
ð ð
ð ð	
ð
 ð
ð 
ó
ð4* àð* ð ð* ð ð	* ð
 ð* ð 
ô* r   r   )r‡   Ú
__future__r   r:   Úloggingr7   Úagent_samochodowy.configr   Úagent_samochodowy.dgred.clientr   Ú agent_samochodowy.dgred.notifierr   Ú&agent_samochodowy.dgred.reply_proposalr   Úagent_samochodowy.modelsr   r	   r
   Úagent_samochodowy.statusr   r   r   r   Ú	getLoggerr„   r%   r   r‰   r   r   ú<module>r“      sJ   ðÙ Gå "ã Û Û 	å -Ý 6Ý :Ý Jß AÑ Aß _Ó _à	ˆ×	Ñ	˜8Ó	$€÷s ò s r   