
    O"j                   )   U 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	 d dl
mZm
Z
mZmZmZ d dlmZ d dlZd dlZd d	lmZ d dlZd dlZd d
lmZ d dlmZ d dlZd dlmZ d dlmZ d dlZd dl m!Z!m"Z"m#Z#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z= d dl>m?Z? eZ@ ej                  eB      ZCdZDdZEdZFdZGh dZHh dZIh dZJdZKh dZL ej                  dej                        ZO ej                  d ej                        ZP ej                  d!ej                  ej                  z        ZR ej                  d"ej                        ZSd#ZTd$ZUd%ZVd&ZWd'ZXd(ZYd)ZZd d*d*d*d+d,d-dd.d/d0d1d2d3Z[i d4d*d5d*d6d*d7d*d8d+d9d+d:d+d;d+d<d,d=d,d>d,d?d,d@d-dAd-dBd-dCd-dDdi dEddFddGddHd.dId.dJd.dKd.dLd/dMd/dNd/dOd/dPd0dQd0dRd0dSd0dTd1dUd1d1d1d2d2d2d2dVZ\d*d+d,d-dd.d/d0d1d2dWdXdYZ] ej                  dZd[j                  d\ e]D              z   d]z         Z_d^d_hd`hdadbhh dcdddehdfdghdhdihdjdkhdldmhdndohdp
Z`dqeadr<   h dsh dth duh dvh dwh dxh dyh dzh d{h d|dp
Zbdqead}<   h d~Zch dZdedh dz  Zeedh dz  Zfedh dz  Zgegh dz  ZhdZidZj ej                  dej                        Zk ej                  d      ZldZmdZndZodZpdZqh dZr G d de!      Zsed   Zt G d de!      Zue	 G d d             Zve	 G d d             Zw G d de!      Zx G d de!      Zy G d de!      Zz G d de!      Z{ G d de!      Z| G d de!      Z} G d de!      Z~ G d de!      Z G d de!      Z G d de!      Z G d de!      Z G d de!      Z G d de!      Z G d de!      Z G d de!      Z G d de!      Z G d de!      Z G d de!      Z G d de!      Z G d de!      Z G d de!      Z G d de!      Z G d de!      Z G dĄ de!      Z G dƄ de!      Z G dȄ de!      Z G dʄ de!      Z G d̄ de!      Z G d΄ de!      Ze	 G dЄ dѫ             Zdd҄ZddӄZddԄZddՄZddքZddׄZdd؄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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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ZÐdd ZĐd dZed!d       Zed!d       ZǐdZȐdZ ej                  dej                        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ddddddddd
Zאdead<   h d Zh d!Zِd.d"Zڐd/d#Z	 	 	 	 	 	 	 	 d0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d0Zdd1Zdd2Zdd3Zdd4Zd1d5Zd2d6Zd3d7Zd4d8Zd5d9Zdd:Zdd;Zdd<Zdd=Zd6d>Zdd?Zd@dAd7dBZd8dCZd8dDZd9dEZd:dFZd;dGZd<dHZd=dIZd>dJZ d?dKZd@dLZdAdMZdBdNZdCdOZdDdPZdEdQZdFdRZ	 	 	 	 	 	 	 	 	 	 dGdSZ	ddTZ
d dUZdHdVZd dWZdIdXZdJdYZdJdZZdKd[ZdLd\ZdMd]ZdNd^ZdJd_ZdJd`ZdOdaZdPdbZdQdcZdRddZdSdeZdTdfZdUdgZdVdhZdWdiZdXdjZ dYdkZ!dZdlZ"	 	 	 	 	 	 	 	 	 	 d[dmZ#d\dnZ$d]doZ%	 	 	 	 	 	 	 	 	 	 	 	 d^dpZ&d_dqZ'd`drZ(dsdtdaduZ)ddv	 	 	 	 	 	 	 	 	 dbdwZ*dcdxZ+dddyZ,	 	 	 	 	 	 	 	 dedzZ-dfd{Z.	 	 	 	 	 	 	 	 	 	 dgd|Z/dhd}Z0did~Z1djdZ2dkdZ3dldZ4ddd	 	 	 	 	 	 	 	 	 	 	 dmdZ5dndZ6dodZ7dddpdZ8dqdZ9dsd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 drdZ:dsdZ;dtdZ<dudZ=dvdZ>dwdZ?	 	 	 	 	 	 dxdZ@dydZAdzdZB	 	 	 	 	 	 d{dZCdzdZDd|dZE	 	 	 	 	 	 d}dZF	 	 	 	 	 	 d{dZG	 	 	 	 	 	 d{dZH	 	 	 	 	 	 d~dZI	 	 	 	 	 	 d}dZJddZKddZLdzdZM	 	 	 	 	 	 d{dZNddZOddZPddZQddZR	 	 d	 	 	 	 	 	 	 	 	 ddZSddZTdd	 	 	 	 	 	 	 ddZU	 	 	 	 	 	 ddZV	 	 	 	 	 	 ddZWdd	 	 	 	 	 	 	 ddZXddZYddZZddZ[dAdZ\dAdZ]ddZ^	 	 	 	 	 	 ddZ_ddZ`	 	 	 	 	 	 	 	 ddZaddZbddZcddZddd	 	 	 	 	 	 	 ddZed dZfddZgddZhddZiddZjddZkddZlddZmddZnddZoddÄZpddĄZqddńZrddƄZsddǄZtddȄZuddɄZvddʄZwdsd˜dd̄Zxdd̈́ZydsdΜddτZzddЄZ{ddфZ|dd҄Z}d6dӄZ~	 	 	 	 	 	 	 	 ddԄZddՄZddքZ	 d	 	 	 	 	 	 	 ddׄZdd؜	 	 	 	 	 	 	 	 	 ddلZdddڜ	 	 	 	 	 	 	 	 	 	 	 	 	 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ZddZddZddZddZddZddZddZ	 d	 	 	 	 	 ddZddZddd	 	 	 	 	 	 	 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Zddddd	 	 	 	 	 	 	 	 	 	 	 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	Zdd
Zd5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Zd
dZd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%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d0Zאdd1Zؐdd2Zِdd3ZڐdÐd4ZېdÐd5ZܐdÐd6ZݐdÐd7ZސdĐd8ZߐdĐd9ZdĐd:ZdÐd;ZdÐd<ZdÐd=ZdÐd>Zdd?Zdd@ZdŐdAZdƐdBZddCZdǐdDZdȐdEZdɐdFZddGZdÐdHZdÐdIZdÐdJZddKZdĐdLZdʐdMZdːdNZdÐdOZd̐dPZd͐dQZdƐdRZddSZddTZdΐdUZdsdVdϐdWZdАdXZdÐdYZddZZ dd[Zdd\Zdd]Zdd^Zdd_Zdd`ZddaZdѐdbZdҐdcZ	dddZ
ddeZddfZddgZdӐdhZdӐdiZdԐdjZdՐdkZdӐdlZd֐dmZd֐dnZ	 d	 	 	 	 	 	 	 dאdoZ	 d	 	 	 	 	 	 	 dؐdpZ	 d	 	 	 	 	 	 	 dِdqZ	 d	 	 	 	 	 	 	 dِdrZddsZ	 d	 	 	 	 	 	 	 ddtZ	 d	 	 	 	 	 	 	 dduZ	 d	 	 	 	 	 	 	 dؐdvZ	 d	 	 	 	 	 	 	 dאdwZ	 d	 	 	 	 	 	 	 ddxZddyZdԐdzZ dd{Z!	 	 	 	 	 	 dڐd|Z"dd}Z#dԐd~Z$	 d	 	 	 	 	 	 	 ddZ%dېdZ&dܐdZ'dڐdZ(d͐dZ)	 d	 	 	 	 	 	 	 	 	 dݐdZ*	 d	 	 	 	 	 	 	 ddZ+ddZ,	 d	 	 	 	 	 	 	 ddZ-	 d	 	 	 	 	 	 	 ddZ.	 	 	 	 	 	 	 	 dސdZ/	 	 	 	 	 	 	 	 dސdZ0	 	 	 	 	 	 	 	 	 	 	 	 dߐdZ1ddZ2ddZ3dÐdZ4dƐdZ5ddZ6dڐdZ7ddZ8dddd	 	 	 	 	 	 	 	 	 ddZ9dddd	 	 	 	 	 	 	 	 	 ddZ:ddZ;dddddd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ<ddddZ=ddZ>ddZ?ddZ@ddddZAdddZBdddZCdddZDddZEddZFdѐdZGdd؜	 	 	 	 	 	 	 	 	 ddZHddZIddZJddZKddZLddZMddZNddZOddZPddZQddZRddZSddZTddZUddZVd;dZWddZXddZYddZZddZ[ddZ\	 	 	 	 	 	 	 	 ddZ]ddZ^ddZ_ddZ`ddZaddd	 	 	 	 	 	 	 ddZbdzdÄZcddĄZdddńZeddƄZfddǄZgddȄZhddɄZidydʄZjdd˄Zkdd̄Zldd̈́Zmdd΄ZnddτZoh dУZpd dфZqdd҄ZrddӄZsddԄZtddՄZuddքZv	 	 	 	 	 	 	 	 ddׄZwdd؄ZxdydلZyddڄZzddۄZ{dd܄Z|dd݄Z}ddބZ~dd߄Zd dddZdsdd	dZd
dZd dddZddZddZddZh 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ZddZdd؜	 	 	 	 	 	 	 	 	 ddZdd؜	 	 	 	 	 	 	 	 	 ddZy(      )annotations)
monthrange)Counter)contextmanager)	dataclass)datedatetimetime	timedeltatimezone)SequenceMatcherN)Path	monotonic)Literal)ZoneInfo)HTTPException)	BaseModelFieldValidationErrormodel_validator)CatalogProduct_build_catalog_doc_preview_build_catalog_sheet_preview_create_google_doc_create_google_sheet_extract_catalog_bucket_generate_preview_product_bucket_labels)get_settings)GoogleWorkspaceCreateRequestGoogleWorkspaceDocumentPreviewGoogleWorkspacePreviewRequest)&get_active_google_workspace_connection)describe_llm_http_errorrequest_llm_chat_completion)SessionIdentityTenantStaffUserCreatePayloadTimeclockOverviewQueryget_tenant_storelist_allowed_tools_for_profile        p  >   upsert_productget_sales_goalswrite_sales_goalwrite_shared_notecreate_reservationdelete_reservationmanage_tenant_userupdate_reservationupdate_venue_profilewrite_suspended_orderupdate_module_settings create_google_workspace_document>g   aeilosadaialcecidadihahoilinlalelilominesisuuncehchechicoicondaldeidelglihaimiamiemionelperpuotraunaallaalloannomieipuoisonoavetecostadalladeglidelladelledellohannomarcaneglinellanellenellopossoqualequalitengotienevoltemarchemostramostrinostranostrenostrinostropoteteprezziprezzoquantaquantequantiquantoscorsascorsoteneteultimiultimoabbiamocostanocostarepassatapassatostaserateniamoacquisticompraremostramipossiamo	compriamo
effettuati
effettuatoacquistiamo>   GINRUMVINOACQUAAMAROBIRRACAFFESUCCOVODKABITTERBRANDYSUCCHIWHISKYLIQUORETEQUILASCIROPPOVERMOUTH	APERITIVO))appletonzbrand noto jamaicano: Appleton)zj wrayzbrand noto jamaicano: J. Wray)wrayz#brand noto jamaicano: Wray & Nephew)hampdenzbrand noto jamaicano: Hampden)zworthy parkz!brand noto jamaicano: Worthy Park)zsmith crossz#brand noto jamaicano: Smith & Cross)myerszbrand noto jamaicano: Myers's)myerz$brand noto jamaicano: Myer's/Myers's)corubazbrand noto jamaicano: Coruba)xaymacaz$indicazione Jamaica/Xaymaca nel nome)jamaicaz#origine Jamaica dichiarata nel nome)jamaicanz$origine Jamaican dichiarata nel nome>   moetdiageolaconiveliermartinireduzzi	cavallaro
montenegroz:^\s*(ciao|buongiorno|buonasera|salve|hey|ehi)\s*[.!?]*\s*$zN^\s*(confermo|conferma|si confermo|ok|va bene|procedi|salva pure)\s*[.!?]*\s*$z```(?:json)?\s*(\{.*\})\s*```z\b(ordine sospeso|sospeso)\b)prenotcoperttavolpostoposticapienzsalapiantinr   domanioggiserapranzo)r   r   r   r   r   r   r   r   )rw   r   fornitorprodotcompracquistordinspesimporteurocostovaloresucchginrumvodkabirravino)
	cartellintimbrturnlavoratz	ore lavorentratuscitzinizio turnoz
fine turnopresenz)manciamancetips)magazzingiacenzrimanenzscortstock
inventario	inventari)homemadeprebatchpreparazionepreparazioni                     	   
   )zerorV   unorh   duetrequattrocinqueseisetteottonovedieciprimoprimaprimiprimesecondosecondasecondisecondeterzoterzaterziterzequartoquartaquartiquartequintoquintaquintiquintesestosestasestisestesettimosettimasettimisettimeottavoottavaottaviottavenononona)noninonedecimodecimadecimidecime      )gennaiofebbraiomarzoaprilemaggiogiugnoluglioagosto	settembreottobrenovembredicembrez\b(|c              #  F   K   | ]  }t        j                  |        y wNreescape).0labels     >apps/backend-hub/app/services/operational_assistant_service.py	<genexpr>rK  Z  s     =Eryy=   !zU)(?:\s+(20\d{2}|scorso|scorsa|passato|passata|corrente|attuale|prossimo|prossima))?\br   vodker   r   rhum>   whiskywhiskeywhiskeyswhiskiestequilatequilemezcalmezcalsamaroamarir   vinir   birresuccosucchi)
r   r   r   rO  rS  rU  rW  r   r   r[  zdict[str, set[str]]_PRODUCT_FAMILY_QUERY_TERMS>   42 below	ketel one
grey gooseskyytitocirocketelstolir   belugaabsolutwyborowa	belvederestolichnaya>   	monkey 47r   mareoxleybombayseatrushendrick	tanqueray>	   don papasanta teresar   havanazacapabacardigosling
plantationdiplomatico>   
angel envy
blue labelblack labeljack danielmaker's markjohnnie walkerrO  rP  taliskerwoodford	lagavulin>   	don juliopatronvolcanrS  	casamigos	herradura>   casamigos mezcalvidarU  >   rW  avernabrancalucanoyuntakur   
ramazzotti>   r   pinotmerlotcabernetprosecco	champagne	trebbiano
chardonnay>   st stefanusipar   lagerperoni>   naty'snatyyogaderbyr[  r\  derblue	derbyblue_PRODUCT_FAMILY_PRODUCT_HINTS>   clltmlra   rb   rc   rl   litrilitrofruttafruttolocaler   r   r   r   volumevolumiarticoliarticolocatalogoprodottiprodotto>   r=   r@   rB   rC   rD   rE   rF   r  rJ   r  r  vsrX   fair`   neird   piusuisulrg   ri   allerj   rk   cosacosecreadatidatomenopackrigasolounitvedialcunro   cercadammidimmifammifattafattefattifattor  r  rw   r8  rx   ry   rz   r{   packspezzipezzor  r  righesuglisullasullesullotrovatrovituttatuttetuttituttounitsr   r=  alcunaalcunealcunir9  dentror;  r<  r:  r   r   r   ordineordinir   r   r   r   r   totaletotalivedereversusr  r  r   cercamicercarer6  r?  r   r   periodiperiodoqualcheritornasospesostoricotrovamitrovareaggiungir  contienerA  r7  r   r@  ordinareordinataordinatiordinatoparlandor  r  quantitarispetto	cataloghi	confronta	confronto	fornitore	fornitori	qualsiasi	ritornamir>  
aggiungere
contengono
effettuata
effettuater   r   r   confrontarepercentualepercentuali>   btctikpzalleurnonorar   mesemesir-  r/  r.  r,  r   costir   r  r  r  r  listamercer  r  r  r  questr!  r#  r"  r   soldispesaspesostatastatestatistator  r  r  r  voltaadessoalloracompracontror1  r3  r2  r0  elencaelencofinoraordinaordinor)  r+  r*  r(  r   r   quandor  r  r  r  questaquestequestiquestor  r  r  r  ultimaultimer   r   r   valorivogliovorreiattualeattualicostosacostosecostosicostosoimportiimportor  r  r  r  r%  r'  r&  r$  r   acquistor  r  r   compratacompratecompraticompratoelencamiordinanoordinater  prodittir  separataseparateseparatiseparatospenderer  	confrontir  	economica	economici	economico	ordiniamo	penultima	penultime	penultimi	penultimo	riispetto	settimana	settimane
acquistare
acquistata
acquistate
acquistati
acquistato
economicheattualmentecomprensivacomprensivecomprensivicomprensivoconfrontamir  >,   r  casar  sottor   unitausatausateusatiusator  r   giornigiornoscortascortecartonecartoniconsumiconsumosingolasingolesingolisingolor;  giacenzagiacenze	bottiglia	bottiglie	consumata	consumate	consumati	consumato	inferiore	inferiorir   	magazzini	magazzino	rimanenza	rimanenzer   disponibiledisponibilidisponibilita>%   barr  tipr   r   r  r   presapresepresosommarc  rd  r   soricor  r  calcolasommanosommarer  caricatacaricatecaricaticaricatogiornatagiornateprendere	calcolami	incassata	incassate	incassati	incassato
consegnata
consegnate
consegnati
consegnato>E   r?   rL   rN   rO   rQ   rV   r[   csvdocr_   ra   rb   rc   rh   r  r  filerl   nomeognixlsxdriver  salvasheetstaffr  r  r  r  creamir   fogliofoldergoogler   reporttitolor,  r-  analisipreparapreparisalvamisalvaretabellacartellachiamalachiamalochiamatachiamatodettaglir   	dettaglio	documenti	documento	preparami	preparare	prospetto	resoconto	riepilogo
dipendente
dipendenti
rendiconto
situazionedettagliatadettagliatedettagliatidettagliato)zanalisi mancezelenco mancezlista mancezprospetto mancezrendiconto mancezreport mancezresoconto mancezriepilogo mancezsituazione mancezstorico mancezstorico delle mancezdettaglio mancezdettaglio delle mancezmance dettaglio)	zper ogni dipendentezper ciascun dipendentezper dipendentezper tutti i dipendentizper tutto lo staffzper ogni membro dello staffzper ogni personazper ciascunoz
per ognunoz+\b[A-Z0-9._%+\-]+@[A-Z0-9.\-]+\.[A-Z]{2,}\b(\+?\d[\d\s().\-\/]{5,}\d))z,per creare la prenotazione mi servono ancoraz*dimmi quale devo usare per la prenotazione)zper registrare il prodottozse li hai, aggiungi anchez+se qualche dato ti manca, lo salvo comunquezrestano da completarezaggiorno subito la schedaz quante unita contiene un cartone)z:per aggiungere un nuovo obiettivo di vendita avrei bisognoz9per impostare un nuovo obiettivo di vendita avrei bisognoz(per salvare un obiettivo mi serve almenoz6per questo obiettivo mi serve anche il target numericozRper un obiettivo numerico indicami almeno il prodotto o il fornitore da monitorarez/per un doppio target mi servono target primarioz-per essere preciso vuoi impostare l obiettivozDA COMPLETARE>   rR   rV   rh   r  r  devoaltraaltromettinuovanuovor  servecrearer,  r-  metterer  servonor  r  r  r  inserirer  r  registra	inseriscir  
registrarec                  4    e Zd ZU ded<    ee      Zded<   y)PlannedToolCalla  Literal['get_locale_profile', 'search_products', 'upsert_product', 'get_purchase_overview', 'compare_purchase_periods', 'get_purchase_frequency', 'get_purchase_batches', 'get_purchase_history', 'get_suspended_order', 'write_suspended_order', 'get_sales_goals', 'write_sales_goal', 'list_shared_notes', 'write_shared_note', 'get_reservations_snapshot', 'list_reservations', 'create_reservation', 'update_reservation', 'delete_reservation', 'create_google_workspace_document', 'get_module_settings', 'update_module_settings', 'list_fiscal_documents', 'list_tenant_users', 'get_timeclock_summary', 'get_inventory_consumption', 'get_homemade_recipe', 'manage_tenant_user', 'update_venue_profile', 'describe_tenant_schema', 'run_tenant_query']tooldefault_factorydict[str, object]	argumentsN)__name__
__module____qualname____annotations__r   dictr       rJ  r  r    s       B $)#>I >r  r  )home	documentsc                      e Zd ZU ded<   dZded<    ee      Zded<    edd	d
      Zded<   dZ	ded<    e
d      dd       Zy)AssistantPlanzLiteral['reply', 'tool']modeN
str | Nonereplyr  list[PlannedToolCall]
tool_calls              ?defaultgerO   float | None
confidenceFboolneeds_clarificationafter)r  c                    | j                   dk(  r3| j                  r| j                  j                         st        d      | S | j                  st        d      | S )Nr  z$reply obbligatoria in modalita replyz(tool_calls obbligatorie in modalita tool)r  r  strip
ValueErrorr  )selfs    rJ  validate_planzAssistantPlan.validate_plan2  sM    99::TZZ%5%5%7 !GHHKGHHr  )returnz'AssistantPlan')r  r  r  r  r  r   listr  r  r  r   r  r  r  rJ  r  r  +  sW    
""E:(-d(CJ%C$TccBJB %%'" #r  r  c                  D    e Zd ZU ded<   ded<   ded<   ded<   dZded	<   y)
OperationalAssistantRunstrr  modelrouter  traceNdict[str, object] | Nonethread_state)r  r  r  r  r  r  r  rJ  r  r  >  s"    JJJ-1L*1r  r  c                  6    e Zd ZU ded<   ded<   ded<   ded<   y)	GoogleWorkspacePreviewRunr"   previewr  r  r   r  r  N)r  r  r  r  r  r  rJ  r  r  G  s    ++JJr  r  c                  <    e Zd ZU dZded<    eede      Zded<   y)	SearchProductsArgs r  queryr   r  intlimitN)r  r  r  r  r  r   _CHAT_LIST_LIMITr  r  r  rJ  r	  r	  O  s     E3O/A:JKE3Kr  r	  c                  $   e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded	<    e	dd
      Z
ded<    e	dd
      Zded<    e	dd
      Zded<    e	dd
      Zded<   dZded<   dZded<    e	dd
      Zded<    e	dd
      Zded<   y)ProductWriteArgsupsertLiteral['upsert', 'delete']	operationNr  product_namelot_codesupplier_nameproduct_coder   r  r  r  final_price_vatvat_rate	weight_kgunit_price_per_kgcategorynotesunits_per_packliters_per_unit)r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r   r  r  rJ  r  r  T  s    -5I*5#L*#Hj $M:$#L*#$)$1$=O\="4A6Hl6#DQ7I|7&+DQ&?|?HjE:#(!#<NL<$)$1$=O\=r  r  c                      e Zd ZU dZded<    eddd      Zded	<    edd
d      Zded<   dZded<   dZ	ded<    ee
d
e
      Zded<   y)PurchaseOverviewArgsr
  r  r  N  4  r  
int | Noneyearr   r5  monthdate | None
start_dateend_dater  r  r  r  r  r  r  r   r&  r'  r)  r*  r  r  r  r  rJ  r"  r"  d  Z    E3OTdt<D*<dqR8E:8"J" Hk /A:JKE3Kr  r"  c                      e Zd ZU dZded<    edd      Zded<    ed	d
d      Zded<    edd      Zded<    ed	d
d      Z	ded<   d	Z
ded<   dZded<    eed
e      Zded<   y	)PurchaseComparisonArgsr
  r  r  r#  r$  r  rO   r  primary_yearNr   r5  r  r%  primary_monthsecondary_yearsecondary_month:Literal['products', 'orders', 'quantity', 'amount'] | None
focus_hintFr  percentage_requestedr  )r  r  r  r  r  r   r0  r1  r2  r3  r5  r6  r  r  r  r  rJ  r.  r.  m  s~    E3O$/L#/ %dqR @M:@4D1NC1"'r"BOZBMQJJQ!&$&/A:JKE3Kr  r.  c                      e Zd ZU dZded<    eddd      Zded	<    edd
d      Zded<   dZded<   dZ	ded<    ee
d
e
      Zded<   y)PurchaseFrequencyArgsr
  r  r  Nr#  r$  r  r%  r&  r   r5  r'  r(  r)  r*  r  r  r+  r  r  rJ  r8  r8  x  r,  r  r8  c                      e Zd ZU dZded<    eddd      Zded	<    edd
d      Zded<   dZded<   dZ	ded<    ee
d
e
      Zded<   y)PurchaseHistoryArgsr
  r  r  Nr#  r$  r  r%  r&  r   r5  r'  r(  r)  r*  r  r  r+  r  r  rJ  r:  r:    r,  r  r:  c                      e Zd ZU dZded<    edd      Zded<   dZd	ed
<    eddd      Zded<    eddd      Z	ded<   dZ
d	ed<   dZd	ed<   dZded<    eede      Zded<   y)PurchaseBatchesArgsr
  r  r  Nr   r  r%  batch_idr(  target_dater#  r$  r  r&  r5  r'  r)  r*  latestzLiteral['latest', 'earliest']
sort_orderr  r  )r  r  r  r  r  r   r=  r>  r&  r'  r)  r*  r@  r  r  r  r  rJ  r<  r<    s    E3O !4Hj4#K#Tdt<D*<dqR8E:8"J" Hk 08J-8/A:JKE3Kr  r<  c                      e Zd ZU dZded<   y)SuspendedOrderReadArgsNr  r  )r  r  r  r  r  r  r  rJ  rB  rB    s    E:r  rB  c                  H    e Zd ZU  ed      Zded<    edd      Zded<   y	)
SuspendedOrderItemArgsr   )
min_lengthr  product_query  r/  r  quantityN)r  r  r  r   rF  r  rH  r  r  rJ  rD  rD    s"    !,M3,Q3'Hc'r  rD  c                  4    e Zd ZU dZded<   ded<   dZded<   y)	SuspendedOrderWriteArgssetzLiteral['set', 'add']r  zlist[SuspendedOrderItemArgs]itemsNr  r  )r  r  r  r  r  r  r  r  rJ  rJ  rJ    s    ',I$,''E:r  rJ  c                  .    e Zd ZU  eddd      Zded<   y)SalesGoalsArgsNr#  r$  r  r%  r&  )r  r  r  r   r&  r  r  r  rJ  rN  rN    s    Tdt<D*<r  rN  c                  .    e Zd ZU  eede      Zded<   y)SharedNotesArgsr   r  r  r  N)r  r  r  r   r  r  r  r  r  rJ  rP  rP    s    /A:JKE3Kr  rP  c                  f    e Zd ZU dZded<   dZded<   dZded<   d	Zd
ed<    ee	de	      Z
ded<   y)ReservationsSnapshotArgsNr(  r>  time | Nonetarget_timeall_dayz&Literal['all_day', 'lunch', 'evening']time_windowr
  r  customer_queryr   r  r  r  )r  r  r  r>  r  rT  rV  rW  r   r  r  r  r  rJ  rR  rR    s@    #K##K#:CK7CNC/A:JKE3Kr  rR  c                      e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded	<    e	dd
d      Z
ded<    e	dd
d      Zded<   dZded<   dZded<   dZded<   dZded<   y)ReservationCreateArgsNr  customer_namecustomer_phonecustomer_emailr(  reservation_daterS  
start_timer   x   r  r%  guestsX  r  duration_minutesr  area_preference	confirmedzNLiteral['pending', 'confirmed', 'seated', 'completed', 'cancelled', 'no_show']statusmanualz$Literal['manual', 'whatsapp', 'web']source)r  r  r  rZ  r  r[  r\  r]  r^  r   r`  rb  r  rc  re  rg  r  r  rJ  rY  rY    s     $M:$!%NJ%!%NJ%$(k("J"tc:FJ:!#!<c<E:"&OZ&]hFZh3;F0;r  rY  c                     e Zd ZU dZded<   dZded<   dZded<   dZd	ed
<   dZded<   dZ	ded<   dZ
ded<   dZded<   dZd	ed<   dZded<    eddd      Zded<    eddd      Zded<   dZded<   dZded<   dZded<   y)ReservationUpdateArgsNr%  reservation_idr
  r  rW  r  r[  r(  r>  rS  rT  new_customer_namenew_customer_phonenew_customer_emailnew_reservation_datenew_start_timer   ra  r  new_duration_minutesr_  
new_guests	new_notesnew_area_preferencezULiteral['pending', 'confirmed', 'seated', 'completed', 'cancelled', 'no_show'] | None
new_status)r  r  r  rj  r  rW  r[  r>  rT  rk  rl  rm  rn  ro  r   rp  rq  rr  rs  rt  r  r  rJ  ri  ri    s    !%NJ%NC!%NJ%#K##K#$(z(%)
)%)
)(,+,"&NK&',TaC'H*H"4A#>J
> Iz &**hlJelr  ri  c                  T    e Zd ZU dZded<   dZded<   dZded<   dZd	ed
<   dZded<   y)ReservationDeleteArgsNr%  rj  r
  r  rW  r  r[  r(  r>  rS  rT  )	r  r  r  rj  r  rW  r[  r>  rT  r  r  rJ  rv  rv    s4    !%NJ%NC!%NJ%#K##K#r  rv  c                  v    e Zd ZU dZded<    edd      Zded<    edd	      Zded
<    edd      Zded<   y)GoogleWorkspaceDocumentArgsr  Literal['doc', 'sheet']kindN   r  
max_lengthr  titlei  prompt   destination_folder_id)	r  r  r  rz  r  r   r~  r  r  r  r  rJ  rx  rx    sA    $)D
!)ds;E:;t=FJ=(-ds(K:Kr  rx  c                  T    e Zd ZU dZded<   dZded<   dZded	<   dZd
ed<   dZd
ed<   y)SharedNoteWriteArgscreatez%Literal['create', 'update', 'delete']r  Nr%  note_idr
  r  
match_textr  textauthor)	r  r  r  r  r  r  r  r  r  r  r  rJ  r  r    s5    7?I4?GZJD*FJr  r  c                      e Zd ZU dZded<   dZded<    eddd	      Zded
<   dZded<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<    edd      Zded<    edd      Zded<   dZded<   dZded<   y)SalesGoalWriteArgsr  r  r  Nr%  goal_idr#  r$  r  r&  r  name;Literal['quantity', 'liters', 'liters_dual', 'note'] | None	goal_typedescriptionproduct_matchsecondary_product_matchsupplier_matchr   r  r  targetsecondary_target
unit_labelbonus_label)r  r  r  r  r  r  r   r&  r  r  r  r  r  r  r  r  r  r  r  r  rJ  r  r    s    -5I*5GZTdt<D*<D*MQIJQ"K" $M:$*.Z.!%NJ% !4FL4%*4A%>l>!J
!"K"r  r  c                      e Zd ZU dZded<   y)GetModuleSettingsArgsr  z>Literal['ordini', 'prenotazioni', 'whatsapp', 'fiscal', 'llm']moduleN)r  r  r  r  r  r  r  rJ  r  r    s    MUFJUr  r  c                  8    e Zd ZU dZded<    ee      Zded<   y)UpdateModuleSettingsArgsprenotazioniz4Literal['prenotazioni', 'whatsapp', 'fiscal', 'llm']r  r  r  settingsN)r  r  r  r  r  r   r  r  r  r  rJ  r  r     s    CQF@Q"'"=H=r  r  c                  <    e Zd ZU dZded<    eede      Zded<   y)ListReservationsArgsNzCalendarDate | Noner   r   r  r  r  )r  r  r  r   r  r   r  r  r  r  rJ  r  r    s"     $D
$/A:JKE3Kr  r  c                      e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded	<   dZ	ded
<   dZ
ded<    ee      Zded<   y)ManageTenantUserArgsr  zLiteral['create', 'delete']r  Nr  user_idr  usernameemailphone_numberpasswordr  	list[str]permissions)r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  rJ  r  r  
  sX    -5I*5GZD*HjE:#L*#Hj"48K8r  r  c                      e Zd ZU dZded<   dZded<   dZded	<   dZded
<   dZded<    e	e
de
      Zded<   dZded<   y)TimeclockSummaryArgsr
  r  
query_texttodayz)Literal['today', 'week', 'all', 'active']scopeNr(  r>  r)  r*  r   r  r%  r  Fr  include_entries)r  r  r  r  r  r  r>  r)  r*  r   r  r  r  r  r  rJ  r  r    sT    J7>E4>#K#"J" Hk &61AQRE:R!OT!r  r  c                  X    e Zd ZU dZded<   dZded<   dZded<    eede	      Z	d
ed<   y)InventoryConsumptionArgsr
  r  r  Nr(  r)  r*  r   r  r  r  )
r  r  r  r  r  r)  r*  r   r  r  r  r  rJ  r  r    s4    E3O"J" Hk /A:JKE3Kr  r  c                  :    e Zd ZU dZded<    edd      Zded<   y)	HomemadeRecipeArgsr
  r  r  Nr   )r  gtr  target_liters)r  r  r  r  r  r   r  r  r  rJ  r  r  &  s    E3O"'";M<;r  r  c                      e Zd ZU  edd      Zded<    edd      Zded<    edd      Zded	<    edd      Zded
<   y)UpdateVenueProfileArgsNr{  r|  r  
venue_name  address2   r  whatsapp_number)	r  r  r  r   r  r  r  r  r  r  r  rJ  r  r  +  sF    "4C@J
@=GZ=$TbAL*A"'"DOZDr  r  c                      e Zd ZU dZded<   y)DescribeTenantSchemaArgsTr  include_examplesN)r  r  r  r  r  r  r  rJ  r  r  2  s    !d!r  r  c                  L    e Zd ZU  edd      Zded<    eede      Zded<   y	)
RunTenantQueryArgsr   r0   )rE  r}  r  sqlr  r  r  N)r  r  r  r   r  r  r  r  r  r  rJ  r  r  6  s(    d3C3/A:JKE3Kr  r  c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   d	ed<   d	ed<   ded<   d	ed<   d	ed<   ded<   dZded<   dZded<   y)ProductCandidater  idr  r  r  r  r  r  r  r  r  r  r  r  r   floatscoreNlast_ordered_atr   total_quantity)r  r  r  r  r  r  r  r  rJ  r  r  ;  s[    GM!!##  !!L"&OZ&NCr  r  c                 <    t        t               j                        S rD  )r   r    assistant_timezoner  r  rJ  _assistant_timezoner  M  s    LN5566r  c                 <    t        j                  t                     S rD  )r	   nowr  r  r  rJ  _now_in_timezoner  Q  s    <<+-..r  c                 2    t               j                         S rD  )r  r   r  r  rJ  _today_in_timezoner  U  s    ""$$r  c                   t        j                  d| xs d      j                  dd      j                  d      }|j	                         }dd}t        j                  d||      }|j                  dd      }t        j                  d	d
|      }t        j                  dd|      }t        j                  dd|      }d
j                  |j                               S )NNFKDr
  asciiignorec                    | j                  d      j                  dd      }	 t        |      dz  }|dj	                  d      j	                  d      }| dS # t        $ r | j                  d      cY S w xY w)	Nr   ,.      Y@r   .2f0r@   )groupreplacer  r  rstrip)match
raw_numberlitersrendereds       rJ  convert_centilitersz,_normalize_text.<locals>.convert_centiliters]  s|    [[^++C5
	":&.F S\))#.55c:1~  	";;q>!	"s   A A54A5z(\d+(?:[.,]\d+)?)\s*cl\b   ’'z
[^a-z0-9]+ z\bdom\s*perignon\bz
 dom peri z\bdp\b)r  zre.Match[str]r  r  )
unicodedata	normalizeencodedecodelowerrF  subr  joinsplit)value
normalizedloweredr  s       rJ  _normalize_textr  Y  s    &&vu{;BB7HU\\]deJ G ff02EwOGooeS)Gff]C1Gff*L'BGffYg6G88GMMO$$r  c                    dj                  | xs dj                               j                  d      }|sy|j                         }d|v sd|v sd|v ryd	|v sd
|v sd|v ryt	        |      dkD  ry|S )Nr  r
  z .z-Richiesta non completabile in modo affidabilezerrore comunicazione llmzendpoint llmzservizio llmz@In questo momento il servizio AI non e disponibile correttamentez<htmlz	<!doctypengrok   zIIn questo momento non riesco a completare la richiesta in modo affidabile)r  r  r  casefoldlen)detailcleanedr  s      rJ  "_humanize_operational_error_detailr  n  s    hh"++-.44T:G> G!W,'0I^_fMfQ'[G3w'7IQ
7|cZNr  c                    t        |       j                  d      D cg c]  }|s|t        vs| }}|r|S t        |       j                  d      D cg c]  }|s|	 c}S c c}w c c}w )Nr  )r  r  
_STOPWORDS)r  tokentokenss      rJ  _tokenize_queryr  }  sg    !0!7!=!=c!BhePU]gPgehFh.u5;;C@JeEEJJ i Ks   A#A#A#A(A(c                   | j                         }t        |      dk  r|S |j                  d      rt        |      dkD  r|d d S |j                  d      rt        |      dkD  r|d d S |j                  d      r|d d S |S )Nr   )rY   ghirX   gher.   rB   )r=   r>   r?   rA   )r  r  endswith)r  r  s     rJ  _token_stemr    s    kkmG
7|q45#g,:Js|W!1s|,-s|Nr  c                    g }| t        |       fD ]+  }|j                         }|s||vs|j                  |       - |S rD  )r  r  append)r  variants	candidates      rJ  _query_token_variantsr
    sI    H[/0 '	OO%	(2OOI&' Or  c                   | |k(  ryt        |       }t        |      }t        |      dk\  r||k(  ryt        t        |       t        |            }|dk\  r3|dk\  rdnd}| d | |d | k(  rt        d | |      j	                         dk\  ryy)	NTr   r.   r   r   r   g)\(?F)r  r  minr   ratio)leftright	left_stem
right_stemminimum_lengthprefix_lengths         rJ  _tokens_matchr    s    u}D!IU#J
9~yJ6TCJ/N+q0a5-#88_TSWY^=_=e=e=gko=or  c                    t        | |      }t        |       }|s|S t        |      }||z  }|r|dt        |      z  z  }|S )N      @)_score_text_match#_extract_requested_product_families_detect_product_familiesr  )r  
searchabler  requested_familiesproduct_familiesfamily_matchess         rJ  _score_product_matchr    sS    eZ0E<UC/
;'*::Ns>***Lr  c                   t        |       D cg c]6  }|r2t        j                  d|      s|t        vrt	        d |D              r|8 }}t        |      dk  r|S |D cg c]  }t        |      r| }}|xs |S c c}w c c}w )N20\d{2}c              3  <   K   | ]  }|j                           y wrD  isalpharH  	characters     rJ  rK  z2_purchase_query_required_tokens.<locals>.<genexpr>  s     ;		!!#;   r   )r  rF  	fullmatch_PURCHASE_QUERY_IGNORED_TOKENSanyr  _is_product_family_query_token)r  r  r  distinctive_tokenss       rJ  _purchase_query_required_tokensr,    s     %U+Z/77;U;; 	F  6{Q-3aE;YZ_;`%aa'' bs   ;A<B0Bc                    t        |       j                         }g }t        ||dd        D ]F  \  }}t        j                  d|      st        j                  d|      s4|j                  ||f       H |S )Nr   z\dz\d{1,2})r  r  ziprF  r'  r  )r  r  formatsr  r  s        rJ  _purchase_query_decimal_formatsr0    sl    U#))+F%'G66!":. *e<<t$j%)HNND%=)* Nr  c                    |\  }}t        |       }dt        j                  |       dt        j                  |       d}t        t        j                  ||            S )N\bz\s+0*z(?:\s*(?:l|lt|litro|litri))?\b)r  rF  rG  r  search)r  decimal_formatr  r  r  patterns         rJ  "_searchable_matches_decimal_formatr6    sS     KD% ,JBIIdO$E"))E*:);;YZG		':.//r  c                ~     t        |      }|rt         |      syt        |      }|rt         fd|D              syy)NFc              3  6   K   | ]  }t        |        y wrD  )r6  )rH  r4  r  s     rJ  rK  z5_searchable_matches_purchase_query.<locals>.<genexpr>  s       # 	+:~F#   T)r,  $_searchable_matches_all_query_tokensr0  r	  )r  r  required_tokensdecimal_formatss   `   rJ  "_searchable_matches_purchase_queryr=    sG    5e<OCJP_`5e<Os #-#   r  c                T    | j                         rt        ||       syt        | |      S )Nr  )r  r=  r  )r  r  s     rJ  _score_purchase_product_matchr?    s%    {{}?
ERz22r  c                ~    t        |       D cg c]$  }|r t        j                  d|      s
|t        vr|& c}S c c}w )Nr   )r  rF  r'  _PRODUCT_QUERY_IGNORED_TOKENS)r  r  s     rJ  _catalog_query_tokensrB    sC     %U+Z/66	 	  s   ):c                P     t         fdt        j                         D              S )Nc              3  F   K   | ]  }t        fd |D                yw)c              3  6   K   | ]  }t        |        y wrD  r  rH  aliasr  s     rJ  rK  z;_is_product_family_query_token.<locals>.<genexpr>.<genexpr>  s     =EM%'=r9  Nr)  )rH  aliasesr  s     rJ  rK  z1_is_product_family_query_token.<locals>.<genexpr>  s$       	=W==s   !)r)  r]  values)r  s   `rJ  r*  r*    s&     299;  r  c                    t        |       }t        |      dk  r|S |D cg c]  }t        |      r| }}|xs |S c c}w Nr   )rB  r  r*  )r  r  r  r+  s       rJ  !_significant_catalog_query_tokensrN    sJ    "5)F
6{Q-3aE;YZ_;`%aa'' bs   ==c                \    t        |       t        |      xr t        fd|D              S )Nc              3  H   K   | ]  t        fd D                yw)c              3  6   K   | ]  }t        |        y wrD  rF  )rH  searchable_tokenquery_tokens     rJ  rK  zA_searchable_matches_all_query_tokens.<locals>.<genexpr>.<genexpr>  s     c=MM+'78cr9  NrI  )rH  rS  searchable_tokenss    @rJ  rK  z7_searchable_matches_all_query_tokens.<locals>.<genexpr>
  s%      & 	cQbcc&s   ")r  r  r	  )r  query_tokensrT  s     @rJ  r:  r:    s4    '
3 # &'& # r  c                T    	 t        |       }|dk  ry |S # t        t        f$ r Y y w xY wNr   )r  	TypeErrorr  )r  parseds     rJ  _coerce_positive_floatrZ    s:    u {M	 z" s    ''c                    | j                         j                  dd      }dD ]G  \  }}t        j                  ||      }|s	 t	        |j                  d            }||z  }|dkD  sE|c S  y # t        $ r Y Vw xY w)Nr  r  ))z((\d+(?:\.\d+)?)\s*(?:lt|litri|litro|l)\br  )z(\d+(?:\.\d+)?)\s*cl\b{Gz?)z(\d+(?:\.\d+)?)\s*ml\bgMbP?r   r   )r  r  rF  r3  r  r  r  )r  r  r5  
multiplierr  amountr  s          rJ  _extract_liters_from_textr_    s    &&sC0J  
 		':.	5;;q>*F *$A:M   		s   A..	A:9A:c                ^    t        |      }||S || fD ]  }t        |xs d      }||c S  y Nr
  )rZ  r_  )r  r  r   explicitrg  	estimateds         rJ  _resolve_liters_per_unitrd  .  sJ    %o6H\* -fl;	  r  c                d    t        |||      }|y t        |      xs d}|t        |       z  |z  S )N)r  r  r   r  )rd  rZ  r  )rH  r  r  r  r   resolved_litersr]  s          rJ  _estimate_total_litersrg  9  sE     /!'O
 '7>3JU8_,z99r  c                (    t        | xs d      }|dv S )Nr
  >   r  cassacasserg  rh  r  )r  r  s     rJ  _lot_requires_units_per_packrl  L  s     R0JGGGr  c                    t        | j                  d            }|y t        t        | j                  d      xs d            s|S t        | j                  d            }|||z  S d S )Nr  r  r
  r  )rZ  getrl  r  )itemrH  r  s      rJ  _purchase_item_equivalent_unitsrp  Q  sh    %dhh/?&@AH'DHHZ,@,FB(GH+DHH5E,FGN(6(B8n$LLr  c                N     t         fddD              xs t         dddd      S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rH  fragmentr  s     rJ  rK  z%_is_liters_request.<locals>.<genexpr>\  s     W(x:%W   )zquanti litrizquanto litror  r  r  r  r)  _contains_normalized_wordr  s   `rJ  _is_liters_requestry  [  s4    W6VWW [t\ r  c                Z     t         fddD              ryt         dddddd	d
dddd      S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z._is_purchase_amount_request.<locals>.<genexpr>f  s       	Jru  )	zquanto ho spesozquanto abbiamo spesozspesa totaleztotale spesozvalore ordinizvalore acquistizimporto ordinizimporto acquistizin euroTr  r  rC  r   r
  r5  r4  r   r+  r   r  rv  rx  s   `rJ  _is_purchase_amount_requestr|  e  sP    
 

  $ r  c                ^    t        |       st        |       ryt        | dddddddd	d
ddd      S )NFr   r   r   r   r  r  r  r^  rq  rr  rg  rh  )ry  r|  rw  rx  s    rJ  _is_purchase_quantity_requestr~    sI    *%)DZ)P$ r  c                    t        |      syt        |dd      rt        |dddddd	d
dddd      syt        |ddddddddddddd	      S )NFr  r  pagatopagatapagatipagatefatturafatturebollabolleddtr  r  r  r  rC  r   r  r5  r4  )r|  rw  messager  s     rJ  _is_fiscal_spend_requestr    s    &z2 Xx@IbJ $ r  c                    t        |       j                         xs4 t        |       j                         xs t        |       j                         S rD  )_extract_purchase_queryr  _extract_catalog_query_extract_product_queryr  s    rJ  _extract_fiscal_spend_queryr    sD    (..0 	3!'*002	3!'*002r  c                    t        | dd        D ]P  }|j                  d      dk7  rt        |j                  d      xs d      }t        |      }t	        ||      sN|c S  y)Nroleusercontentr
  )reversedrn  r  r  r  )conversationro  r  r  s       rJ  $_latest_fiscal_spend_request_messager    sg    cd+, 88Fv%dhhy)/R0$W-
#GZ8N r  c                    d| d| d| dS )Nz-(lower(COALESCE(d.supplier_name, '')) LIKE '%1%' OR lower(COALESCE(d.display_name, '')) LIKE '%z1%' OR lower(COALESCE(d.summary_text, '')) LIKE '%%')r  )rH  r  s     rJ   _fiscal_document_token_conditionr    s1    	77<g >99> @99> @	r  c                T    d| d| d| d| d| d}| dk(  rd}d	}d
| d| d| dS |S )Nz+(lower(COALESCE(i.description, '')) LIKE '%z1%' OR lower(COALESCE(i.product_code, '')) LIKE '%z1%' OR lower(COALESCE(i.raw_row_text, '')) LIKE '%z2%' OR lower(COALESCE(d.supplier_name, '')) LIKE '%r  r  krugzi(lower(COALESCE(d.supplier_name, '')) LIKE '%moet%' OR lower(COALESCE(d.display_name, '')) LIKE '%moet%')z(lower(COALESCE(i.description, '')) = 'kg' OR lower(COALESCE(i.description, '')) LIKE 'kg %' OR lower(COALESCE(i.raw_row_text, '')) LIKE '% kg %')(z OR ( AND z))r  )rH  r  base_conditionmoet_document_conditionmoet_kg_line_conditions        rJ  _fiscal_line_token_conditionr    s    	55:G <99> @99> @::? A99> @	   	  	  *+51G0H I	
 r  c                r     d vryt         fddD              ryt         ddd      xr t         dd	      S )
Nr  Fc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z)_is_total_only_request.<locals>.<genexpr>  s       	Jru  )zsolo il totalezsolo totalezsoltanto il totalezsolamente il totalez
dammi soloz
dimmi soloz
fammi solozsenza dettagliozsenza dettaglizniente dettagliozniente dettagliznon dettagliareznon fare elencoznon farmi elencoznon fare listaznon farmi listaTr  soltanto	solamenter  rv  rx  s   `rJ  _is_total_only_requestr    sT    z!
 
 * $Z[Q VoW r  c                    | y t        |       dj                  d      j                  d      j                  dd      }| dS )Nr  r  r  r   L)r  r  r  r  r  s     rJ  _format_litersr    sG    },s#++C077<DDS#NHZr?r  c           	         | y t        t        t        t        |       dz              d      }|dz  }|dz  }| d|ddS )N<   r   zh 02dm)maxr  roundr  )r  total_minuteshoursminutess       rJ  _format_duration_hoursr  #  sR    }E%,"345q9MREb GWBwsm1%%r  c                    t        | t              r| j                  d      S t        | xs d      j	                         }|sy	 t        j
                  |d d       j                  d      S # t        $ r |cY S w xY w)N%d/%m/%Yr
  r   )
isinstancer   strftimer  r  fromisoformatr  r  r  s     rJ  _format_italian_date_labelr  ,  ss    %~~j))u{!!#D!!$s),55jAA s   &A* *A87A8c                N    t        |      }|y t        t        |       |z  d      S rM  )rZ  r  r  )rH  r  resolved_prices      rJ  _estimate_total_amountr  8  s+    +O<Nx>1155r  c                    t        |       }t        |      }|r|sy|j                  dd      }|j                  dd      }d}|r|r||k(  rd}n||v rd}t        |       }|j                         t	        fd|D              }d|v r||v rdnd}	d}
|D ]+  t              dk  rt        fd	D              s'|
d
z  }
- |r|dk(  r
|	s|
s|dk  ryt        d ||      j                         }|dz  |	z   |
z   |z   |z   S )Nr  r  r
        @      ?c              3  N   K   | ]  t        fd D              sd  yw)c              3  6   K   | ]  }t        |        y wrD  rF  rH  candidate_tokenr  s     rJ  rK  z._score_text_match.<locals>.<genexpr>.<genexpr>Q  s       5D_n]5/5Z  5Dr9  r   NrI  )rH  r  candidate_tokenss    @rJ  rK  z$_score_text_match.<locals>.<genexpr>Q  s2       E  5D  sC  5D  2D!  Es   %%       @r   c              3  @   K   | ]  }|j                          y wrD  
startswithr  s     rJ  rK  z$_score_text_match.<locals>.<genexpr>W  s     Y_))%0Y   r  r   )	r  r  r  r  sumr  r)  r   r  )r  r	  normalized_querynormalized_candidatecollapsed_querycollapsed_candidatecollapsed_bonusrU  overlapphrase_bonustoken_prefix_bonusr  r  r  s               @@rJ  r  r  @  sK   &u-*95#7&..sB7O.66sB?O.11!O 33!O"5)L+113  E  E  EG!116FJ^6^3dgL &u:>YHXYY#%	&
 1\BTYhlmYmD"24HIOOQES=<'*<<NQVVVr  c                    t        | xs d      }|syt        j                  dd|      j                         }t        j                  dd|      j                         }|S )Nr
  z^(?:target|obiettivo|goal)\s+z\b20\d{2}\b$)r  rF  r  r  )r  r  s     rJ  _goal_name_anchorr  _  sS     "-J8"jIOOQJZ8>>@Jr  c                    t        t        | j                  | j                  | j                  | j
                  | j                  | j                  | j                              S )Nr  r  r  r  r  r  r  )	r   r   r  r  r  r  r  r  r  )products    rJ  $_product_bucket_labels_for_candidater  h  sT    !zz --%%!// --#33%%	

 
r  c                <   t        |       }|s
t               S t               }g }|D ]f  t        v rd }t        j	                         D ].  \  }}t        fd|D              s|}|j                  |        n |V|j                         h |r
t               S |S )Nc              3  6   K   | ]  }t        |        y wrD  rF  rG  s     rJ  rK  z6_extract_requested_product_families.<locals>.<genexpr>  s     D5=.Dr9  )r  rK  _PRODUCT_FAMILY_IGNORED_TOKENSr]  rL  r)  addr  )r  rU  r  residual_tokensmatched_familyfamilyrJ  r  s          @rJ  r  r  v  s    "5)Lu#&5!#O 
*22:@@B 	OFGDGDD!'"&&v.		
 !""5)
* ur  c                :   t        |       }|j                         }t               }t        j	                         D ]]  \  }}|D ]S  }t        |      sdv r|v s|j                  |        5t        fd|D              sB|j                  |        ] _ |S )Nr  c              3  6   K   | ]  }t        |        y wrD  rF  )rH  r  normalized_hints     rJ  rK  z+_detect_product_families.<locals>.<genexpr>  s     n]?ODnr9  )r  r  rK  r  rL  r  r)  )r  normalized_searchablerT  detectedr  hintshintr  s          @rJ  r  r    s    +J7-335H6<<>  
	D-d3O"o%"&;;LL(n\mnnV$
	 Or  c                   t        j                  d| j                               D cg c]  }|s|	 }}|sy |r*|d   t        v r|j	                  d       |r|d   t        v rg }|D ]A  }t        j
                  d|      r n)|dv r n#|j                  |       t        |      dk\  sA n |sy dj                  |      j                         S c c}w )Nz[^A-Za-z0-9']+r   z\d+(?:[.,]\d+)?[A-Z]*>   GLBTCLCTKGLTMLr   r  )
rF  r  upper_GENERIC_PRODUCT_TOKENSpopr'  r  r  r  r  )r  r  
raw_tokensbrand_tokenss       rJ  _extract_likely_brandr    s    %'XX.?ASASAU%V`EZ_%`J`
A*AAq A*AA !L <<0%8BBE"|! 88L!''))' as
   CCc                   | j                         }|st        d      t        j                  |      }|r|j	                  d      j                         }	 t        j                  |      }t        |t              r|S 	 |j                  d      }|j                  d      }|dk(  s
|dk(  s||k  rt        d      t        j                  |||dz          }t        |t              st        d      |S # t
        j                  $ r Y w xY w)NzRisposta JSON vuotar   {}r  zOggetto JSON non trovatoz!Il payload JSON non e' un oggetto)r  r  _JSON_BLOCK_PATTERNr3  r  jsonloadsr  r  JSONDecodeErrorfindrfind)raw_textr  r  rY  startends         rJ  _parse_json_objectr    s    nnG.//&&w/E++a.&&(G$fd#M $
 LLE
--
C{cRi3%<344ZZa01Ffd#<==M  s   &C1 1DDc                J   d| v r| S d| v r,dd | j                  d      | j                  d      xs i dgdS | j                  d      }t        |t              rdd |dS | j                  d      }t        |t              r$|j	                         rd|j	                         g dS | S )Nr  r  r  r  r  )r  r  r  r  r  )rn  r  r  r  r  )payloadr  r  s      rJ  _normalize_plan_payloadr    s     $KK/!([!9!?R	
 		
 \*J*d#$
 	
 KK E%%++-%++-rJJNr  c                    | j                   xs( | j                  xs | j                  xs | j                  }|j	                         j                         S rD  )	user_namer  
user_emailtenant_namer  r  )session	raw_values     rJ  _default_staffr    sD    !!bW%5%5b9K9KbwObObI??""$$r  c                ,    | y | j                  dd      S )Nr  Tr  r  s    rJ  _serialize_datetimer    s    }==c""r  c              #     K   t        | j                        }t        j                  |      }t        j                  |_        |j                  d       	 | |j                          y # |j                          w xY ww)NzPRAGMA foreign_keys = ON;)r   database_pathsqlite3connectRowrow_factoryexecutecloser  r  
connections      rJ  _connect_orders_databaser#    sb     ../M/J$[[J23
s   AA>A) A>)A;;A>c              #    K   t        | j                        j                         }t        j                  d| dd      }t        j
                  |_        	 | |j                          y # |j                          w xY ww)Nzfile:z?mode=roT)uri)r   r  resolver  r  r  r  r   r!  s      rJ  !_connect_orders_database_readonlyr'  	  sg     ../779M5x!@dKJ$[[J
s   ABA, B,A>>B      @r{  z\b(insert|update|delete|drop|alter|create|replace|truncate|attach|detach|pragma|vacuum|reindex|grant|revoke|begin|commit|rollback)\bc                D    dt        |       j                  dd      z   dz   S )N"z"")r  r  )r  s    rJ  _quote_sqlite_identr+    s#    T""3--33r  c                    | y t        | t              rt        |       S t        | t        t        t        f      r| S t        | t
        t        t        f      r| j                         S t        j                  | d      S )NFensure_ascii)r  r  r  r  r  r   r	   r
   	isoformatr   dumpsr  s    rJ  _json_safe_cellr1     sc    }%5z%#uc*+%$$/0  ::e%00r  c                    d}d}| D ]?  }|t        |t              rd}t        |t              rd},t        |t              rd}? y |ry|ryy)NFTTEXTREALINTEGER)r  r  r  r  )rK  has_realhas_intr  s       rJ  _infer_sqlite_column_typer8  ,  sm    HG =eT"GeS!GeU#H r  c           	        |sy g }t               }|D ]>  j                         D ])  }||vs|j                  |       |j                  |       + @ |sy g }|D ]Q  }|D cg c]  }t	        |j                  |             }}|j                  t        |       dt        |              S | j                  dt        |       ddj                  |       d       dj                  d |D              }	dj                  d |D              }
|D cg c]  t        fd|D               }}| j                  d	t        |       d|
 d
|	 d|       y c c}w c c}w )Nr  CREATE TABLE  (, )c              3      K   | ]  }d   yw?Nr  rH  _s     rJ  rK  z0_create_query_table_from_rows.<locals>.<genexpr>W  s     7QS7   c              3  2   K   | ]  }t        |        y wrD  r+  )rH  keys     rJ  rK  z0_create_query_table_from_rows.<locals>.<genexpr>X  s     M/4M   c              3  R   K   | ]  }t        j                  |               y wrD  )r1  rn  rH  rF  rows     rJ  rK  z0_create_query_table_from_rows.<locals>.<genexpr>Y  s     Ks_SWWS\2K   $'zINSERT INTO 
) VALUES ()rK  keysr  r  r1  rn  r+  r8  r  r  tupleexecutemany)r"  
table_namerowscolumn_namesseenrF  definitionsrJ  rK  placeholderscolumns_sqlr  s          `    rJ  _create_query_table_from_rowsrW  C  sw    LUD )88: 	)C$##C(	))
 K ^;?@C/#''#,/@@1#67q9RSY9Z8[\]^ '::'F&Gr$))T_J`Iaabcd997,77L))MMMKW[\PSuKlKK\G\
*:67r+jQ]P^^_` A ]s   "!EEc                    t        | |      ry dj                  d |D              }| j                  dt        |       d| d       y )Nr<  c              3  B   K   | ]  \  }}t        |       d |   ywr  NrE  )rH  column_namecolumn_types      rJ  rK  z&_ensure_query_table.<locals>.<genexpr>g  s-      $K {+
,Ak];s   r:  r;  r=  )_table_existsr  r  r+  )r"  rP  columnsrT  s       rJ  _ensure_query_tabler_  `  sS    
 Z,)) (/ K '::'F&Gr+VWXYr  c                L    | j                  d|f      j                         }|d uS )NzESELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1)r  fetchoner"  rP  rJ  s      rJ  r]  r]  n  s2    


O	 hj  d?r  c                    t        | |      sg S | j                  dt        |             j                         D cg c]  }t	        |       c}S c c}w )NzSELECT * FROM )r]  r  r+  fetchallr  rb  s      rJ  _rows_from_sqlite_tablere  v  sL    Z0	!+!3!3nEXYcEdDe4f!g!p!p!rs#DIssss   Ac                6    t               j                  | |      S rD  r*   session_has_assistant_scope)r  
permissions     rJ  _tenant_query_allows_permissionrj  |  s    99':NNr  c                    t        | t              r| S t        | xs d      j                         }|sy 	 t        j                  |      S # t
        $ r Y y w xY wra  )r  r   r  r  r  r  r  raws     rJ  _safe_iso_datern    sV    %
ekr

 
 
"C!!#&& s   A	 		AAc                   t        | xs d      j                         }|sg S 	 t        j                  |      }t        |t              r|j                  d      nt        |t              r|ng }t        |t              sg S g }t               }|t        d      z
  }|t        d      z   }|D ]   }t        |t              st        |j                  d            xs |}	t        |j                  d            xs |}
|	|
kD  rW|j                  d      }t        |t              r|ng D ch c]:  }t        |t        t        f      r"dt        |      cxk  rd	k  rn nt        |      < }}|j                  |	t        |
|	t        d
      z         |xs t!        t#        d            d        |S # t        j                  $ r g cY S w xY wc c}w )Nr
  rulesi  daysr)  r*  weekdaysr   r   iG  r   )r)  r*  rs  )r  r  r   r  r  r  r  rn  r  r  r   rn  r  r  r  r  rK  range)r  rm  decodedrp  normalized_rulesr  fallback_startfallback_endro  r)  r*  raw_weekdaysweekdayrs  s                 rJ  ,_homemade_calendar_rules_from_settings_valuer{    s   
ekr

 
 
"C	**S/ %/w$=GKK jY`bfNg7moEeT"	02 EYC00N9#..L 
$%#DHH\$:;M~
!$((:"67G< xx
+ -7|T,JLPR
'C<0Q#g,5K!5K L
 

 	(*yd7K*KL$5E!H	

( ;  	"
s   F1 )?G1G	G	c                   | r| d   ni }t               }g }dD ]  \  }}t        |j                  |            }|D ]  }|d   }|d   }	|d   }
t        |t              r t        |	t              rt        |
t               sC||	k  sI|j                         |
v rI||j                         f}||vr3|j                  |       |j                  ||j                         d       |t        d      z  }||	k  rp  |S )	Nr   ))r  bar_calendar_json)
restaurantrestaurant_calendar_jsonr)  r*  rs  )usage_scopeoperational_dater   rq  )
rK  r{  rn  r  r   rz  r/  r  r  r   )settings_rowsr  rS  rQ  r  
field_namerp  rulecurrentr*  rs  rF  s               rJ  _homemade_operational_day_rowsr    s   #0}QbH!$D$&D$ -Z =X\\*=UV 	-D<(GJ'HJ'Hgt,Jx4NV`aiknVoX%??$0&(9(9(;<C$KU\UfUfUh$ij9!,, X%	--$ Kr  c                    t               }g }|j                  | d      r|j                  d       |j                  | d      r|j                  d       |s| j                  dv rddgS |S )N	tips_salar   tips_barr  >   ownersuper_admin)r*   rh  r  r  )r  storeallowed_areass      rJ   _tenant_query_allowed_tips_areasr    sj    E!M((+>V$((*=U#W\\-EEr  OrdiniPrenotazioni	DocumentiMenuHomemadezDocumenti fiscaliTurni
Inventarioz
Mance salaz	Mance bar)
r  r  r  menur   fiscal_documents	timeclock	inventoryr  r  zdict[str, str]_ASSISTANT_SCOPE_LABELS>   r1   r2   search_productsr3   list_shared_notesr4   get_suspended_orderget_purchase_batchesget_purchase_historyget_purchase_overviewr:   get_purchase_frequencycompare_purchase_periods>   list_reservationsr5   r6   r8   get_reservations_snapshotc                6    t               j                  | |      S rD  rg  )r  r  s     rJ  _assistant_scope_allowsr    s    99'5IIr  c                    | D cg c]  }t         j                  ||       }}|syt        |      dk(  r|d   S t        |      dk(  r|d    d|d    S dj                  |d d        d|d    S c c}w )Nzquesta funzioner   r   r    e r<  r  )r  rn  r  r  )scopesr  labelss      rJ  _format_assistant_scope_labelsr  	  s    EKLE%))%7LFL 
6{aay
6{a)Cq	{++iis$%S55 Ms   A1c                    t        |      }t        |      dk(  rdnd}t        d| d| dddd	|d
|t        |       d|       S )Nr   
abilitarlo
abilitarliz8Non possiedi l'autorizzazione per usare l'Assistente su z*. Chiedi all'amministratore del locale di z dal pannello Account.policyzassistant-scope-access-deniedr  assistant_scope_missing)surfacer  reasonmissing_scopesthread_state_beforer  r   r  r  r  )r  r  r  _snapshot_trace_value)normalized_thread_stater  r  allowed_labelverbs        rJ  "_assistant_scope_access_denied_runr  	  sp     3>BM~.!3<D"F}o V77;f<RT -/,#89P#Q
 - r  c           	          t         fdt        D              ryt         d      syt         fddD              ryt         ddd	d
dd      xr t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rH  keywordr  s     rJ  rK  z(_is_timeclock_request.<locals>.<genexpr>'	       
DW7j 
Dru  ToreFc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z(_is_timeclock_request.<locals>.<genexpr>+	  s       	Jru  )z
quante orez
quanto orez	ore hannozore haz	ore fattoz	ore fattaz	ore fattiz	ore fattez
ore totaliz
totali oreztotale delle oreztotali delle orezore di lavoroztotale ore di lavoroztotali ore di lavoroz
totale orezore dei ragazzizore dei dipendentizore del personalezore i ragazziragazzir  r  r  	personaleteamc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z(_is_timeclock_request.<locals>.<genexpr>G	  s       y8J&  yru  )r   ierir   rN  r  rk   r  r  r  r  r  singolarmente)r)  _TIMECLOCK_KEYWORDSrw  rx  s   `rJ  _is_timeclock_requestr  &	  s{    

D0C
DD$Z7
 
 2 !*i,P\^ikqr 	y  y  8x  y  yr  c                8    t        fdt        D              syy)Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z#_is_tips_request.<locals>.<genexpr>L	  s     Cw*$Cru  FT)r)  _TIPS_KEYWORDSr  s    `rJ  _is_tips_requestr  K	  s    CNCCr  c                d     t         fddD              xs d v xr t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z)_is_tips_total_request.<locals>.<genexpr>R	  s       	Jru  )	z	in totaleztotale manceztotale delle mancezsomma del totalefai la sommafammi una sommazsomma totalezquanto abbiamo fatto in totalezquanto abbiamo preso in totaler  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z)_is_tips_total_request.<locals>.<genexpr>a	  s     Z':%Zru  )r   r   r   r  rI  rx  s   `rJ  _is_tips_total_requestr  Q	  sC     

   	J 	[Z5YZZr  c           	         t              ryt              ryt        fddD              syt        dddddd	      ryt	        |       }|ry
t        fdt
        j                         D              S )NFc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z4_is_inventory_consumption_request.<locals>.<genexpr>j	  s     rw*$rru  )consumatrj  usatfinitefinitor  r  r  r6  r   r:  r   Tc              3  4   K   | ]  }|D ]  }|v  
  y wrD  r  )rH  r  r  r  s      rJ  rK  z4_is_inventory_consumption_request.<locals>.<genexpr>q	  s%     hebghZ^tz!h!hs   )&_is_homemade_stock_consumption_request,_is_inventory_consumption_estimation_requestr)  rw  _extract_inventory_queryr  rK  r  r  r  s    ` rJ  !_is_inventory_consumption_requestr  e	  so    -j93J?r4qrr XxZYcepq$W-Eh/L/S/S/Uhhhr  c                     t               ryt         fddD              }d v r|ry|rt         fddD              ryy)NFc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z?_is_inventory_consumption_estimation_request.<locals>.<genexpr>w	  s       	Jru  )	stimgiornalrd  z	al giorno	quotidianmediomediacalcolprevedconsumTc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z?_is_inventory_consumption_estimation_request.<locals>.<genexpr>	  s      	" 	J	"ru  )non come giacenzaznon la giacenzaznon giacenzastorico ordinistock iniziale)r  r)  )r  has_estimation_cues   ` rJ  r  r  t	  sY    -j9 

  :"4c 	"
	" 	 r  c                    t        |       t        |       yt        |       st        |       yt	        fddD              S )NTc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z;_has_explicit_inventory_estimation_scope.<locals>.<genexpr>	         	Jru  )r   r   r   r   r   r  zstock finaler  r  r  r   comprat)_extract_reference_year_extract_reference_month_extract_reference_periods_extract_reference_week_ranger)  r  s    `rJ  (_has_explicit_inventory_estimation_scoper  	  sO    w'37OPW7X7d!'*.KG.T.` 
  r  c                ,     t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z._is_homemade_context_switch.<locals>.<genexpr>	        
 	J
ru  r   r   preppreparazzfatte in casazfatta in casarI  rx  s   `rJ  _is_homemade_context_switchr  	       


 
 
r  c                     t         fddD              }|syt         fddD              ryt         ddd	d
      xr t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z9_is_homemade_stock_consumption_request.<locals>.<genexpr>	  s      
 	J
ru  r  Fc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z9_is_homemade_stock_consumption_request.<locals>.<genexpr>	        
 	J
ru  )r  cnsumscaric	andamento
come vannocome vaTr  r  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z9_is_homemade_stock_consumption_request.<locals>.<genexpr>	  s       d 	Jdru  )r   r  giornrN  r  rk   r  rv  )r  has_homemade_subjects   ` rJ  r  r  	  su     


 
  
 


 
 $Zl[ `c d
d a r  c                ,     t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z*_is_capability_question.<locals>.<genexpr>	  r  ru  )zsei in gradozsaresti in gradozriesci aze possibilesi puopotrestirI  rx  s   `rJ  _is_capability_questionr  	  r  r  c           
     
   t        |dddd      syt        |dddd	d
dd      syt        |      s/t        | |      s#t        |      st	        | |      st        | |      ryt        |dddddd      ryt        t        |             S )Nr   r   r   r   Fr   rK   r`   restarestanorimane	rimangonor  r  r6  r   r:  r9  )rw  _is_fiscal_documents_requestr  r  _is_prenotazioni_request_is_homemade_requestr  r  r  s     rJ  $_is_inventory_stock_quantity_requestr  	  s    $Z8XxX$ZD%R[]egrs$Z0GZ0 ,#GZ84 XxZYceop(122r  c                    t              ryt        |       ryt              ryt        fdt        D              ryt        |       ryt        |       rydd dv xs dv S )NFTc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z(_is_inventory_request.<locals>.<genexpr>

  r  ru   in casar  za magazzino)r  r  _is_inventory_author_requestr)  _INVENTORY_KEYWORDS_is_historical_purchase_requestr  r  s    `rJ  _is_inventory_requestr   
  sp    3J?(*=#J/

D0C
DD&w
;+GZ@1ZL**Imz.IIr  c                    t        fdt        D              ryt        dddd      rt        |       ryt        dd      ryt        fd	d
D              rt	        |       rydv rt        fddD              ryy)Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z'_is_homemade_request.<locals>.<genexpr>
  s     
CW7j 
Cru  Tricettaricetter   r   r  batchc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z'_is_homemade_request.<locals>.<genexpr>
  s     
gh8z!
gru  )zcome faccioz
come si faparti
proporzionc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z'_is_homemade_request.<locals>.<genexpr>
  s       'M(x:'=  'Mru  )r   r   r  r   r   r~   F)r)  _HOMEMADE_KEYWORDSrw  _extract_homemade_queryr_  r  s    `rJ  r  r  
  s    

C0B
CC Y	>Sabg~  @G  hH VW=

g2f
gg  mF  GN  mOJ3  'M  OL  'M  $Mr  c                ,     t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z/_is_fiscal_documents_request.<locals>.<genexpr>"
         	Jru  )fatturfiscaldocumenti fiscr  r  r  rI  rx  s   `rJ  r  r  !
  s     W  r  c                d    t              ryt              ryt        fdt        D              S )NTc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z+_is_prenotazioni_request.<locals>.<genexpr>-
  s     Jw*$Jru  )_is_reservation_write_request_is_reservation_subject_requestr)  _RESERVATION_KEYWORDSr  s    `rJ  r  r  (
  s+    $Z0&z2J4IJJJr  c                ,     t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z#_is_menu_request.<locals>.<genexpr>1
         	Jru  )cocktailzcocktail listdrinkpiatt
abbinamentr  z
carta vinizwine pairingrI  rx  s   `rJ  _is_menu_requestr>  0
       	
  r  c                   t        |       s/t        |       s#t        |       st              st	        |       ryt              st        |       st              ryt        fdt        D              ryt        t        |       t        |       t              t              t              t              t!        |       t#              t%              t'              t)              t+              t-              t/              t1              t3              t5              t7        |       t9        |       t;              f      ryt=        |       }t?        | |      S )NFc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z%_is_orders_request.<locals>.<genexpr>K
       
AW7j 
Aru  T) r   r  r  r>  r  r  r  r  r)  _ORDERS_KEYWORDSr  _is_purchase_comparison_request_is_purchase_history_request!_is_purchase_product_list_request_is_latest_batches_request_is_purchase_time_request!_is_purchase_batch_detail_request_is_price_request_is_lowest_price_request_is_price_per_weight_request!_is_missing_catalog_price_request_is_catalog_data_request_is_units_per_pack_request_is_sales_goal_write_request_is_sales_goal_read_request_is_sales_goal_graph_request_is_note_write_request!_is_suspended_order_write_request_is_product_write_request_contains_goal_keywordr  _is_catalog_requestr  s    ` rJ  _is_orders_requestrX  @
  s;   gz24#GZ8J'#GZ8#J/3CGZ3X\qr|\}

A0@
AA
+GZ@+GZ@(4-j9&z2%j1-gzBj)$Z0(4-j9$Z0&z2(4'
3(4":.-gzB%gz:":.)	
0 "7+Ew
E::r  c                H   g dfd}t        |      r |d       t        |      rt        | |      r |d        |d       t        |      r |d       t	        | |      r |d       t        | |      r |d       t        |      r |d       t        | |      r |d       t        |      r |d       t        | |      r |d       t        |      r |d	       t        | |      r |d       t        | |      r"d
|v rd|vr
 |d       S d|v rd
|vr |d       S )Nc                2    | vrj                  |        y y rD  r  )r  requireds    rJ  r  z4_assistant_required_scopes_from_message.<locals>.addm
  s     OOE" !r  r   r  r  r  r  r  r  r  r   r  r  r  )r  r  r  None)r  r  r  r  r   r  _is_document_create_requestr  r  r  r>  rX  r  )r  r  r  r\  s      @rJ  '_assistant_required_scopes_from_messager_  j
  s'   H# .j9J3J?Dlmt  wA  EBKHZ(KWj1KGZ0J":.K4#J/4N
#F':.H,ZE$; O j V:%=
OOr  c                ^    t        ||      }|D cg c]  }t        | |      r| c}S c c}w rD  )r_  r  )r  r  r  r\  r  s        rJ  %_assistant_missing_scopes_for_messagera  
  s-    6w
KH'We/FwPU/VEWWWs   **c                   | j                   }|t        v rdgS |t        v rdgS |dk(  rdgS |dk(  rdgS |dk(  rdgS |d	k(  rd
gS |dk(  rdgS |dk(  r4t        t	        | j
                  j                  d      xs d            rdgS |dk(  s|dk(  r[t	        | j
                  j                  d      xs d      j                         j                         }|dv rdgS |dk(  rdgS |dk(  rdgS g S )Nr  r  r<   r  list_fiscal_documentsr  get_timeclock_summaryr  get_inventory_consumptionr  get_homemade_reciper   run_tenant_queryr  r
  get_module_settingsr;   r  >   whatsappr  r0  )	r  _ORDERS_ASSISTANT_TOOLS_PRENOTAZIONI_ASSISTANT_TOOLS_sql_targets_homemade_stockr  r  rn  r  r  )	tool_call	tool_namemodule_names      rJ  (_assistant_required_scopes_for_tool_callrp  
  s5   I++z1166}++"##++}//}))|&&+Fs9K^K^KbKbchKiKomoGp+q|))Y:R-R)--11(;ArBHHJPPR66"##("&''(":Ir  c                ~    g }|D ]5  }t        |      D ]%  }||vst        | |      r|j                  |       ' 7 |S rD  )rp  r  r  )r  r  missingrm  r  s        rJ  (_assistant_missing_scopes_for_tool_callsrs  
  sO    G &	=iH 	&EG#,CGU,Su%	&& Nr  c           	        | j                         }t               }d|v r|t        d      z
  S d|v sd|v sd|v r|S t        j                  d|       }|rK	 t        j                  |j                  d       d|j                  d	       d|j                  d
             S t        j                  d|       }|sy t        |j                  d            }t        |j                  d	            }|j                  d
      }||j                  }n(t        |      d	k(  rdt        |      z   }nt        |      }	 t        |||      S # t        $ r Y y w xY w# t        $ r Y y w xY w)Nr  r   rq  r   r   questa sera\b(20\d{2})-(\d{2})-(\d{2})\b-r   r   &\b(\d{1,2})/(\d{1,2})(?:/(\d{2,4}))?\b  r  r  r   rF  r3  r   r  r  r  r  r&  r  )	r  r  today_local	iso_matchslash_match	day_valuemonth_value
year_valuer&  s	            rJ  _extract_tips_dater  
  sl    G$&KYA...I0MW4L		:GDI	%%);(<Aiooa>P=QQRS\SbSbcdSeRf&ghh ))EwOKK%%a()Ik''*+K""1%J	ZA	c*o%:D+y11%  		&  s%   A	E 5E 	EE	EEc           
        t        |       }t        |      st        |      ryt        |       }t	               }|~|j                  t        |j                        |j                  dt        |j                        |j                  dt        |j                        t        |j                        dd  h       t        j                  dd| t        j                        }t        j                  dd|t        j                        }t        j                  dd|t        j                        }t        j                  d	d|t        j                        }t        j                  d
d|t        j                        }t        |      D cg c](  }|r$|t        vr||vrt        j                  d|      s|* }}dj!                  |d d       j#                         S c c}w )Nr
  r  r  \b20\d{2}\br  flags2\b\d{1,2}\s*[/-]\s*\d{1,2}(?:\s*[/-]\s*\d{2,4})?\bz>\b(?:nel|nella|su|sul|sulla)?\s*(?:mio|mia|tuo|tua)?\s*drive\bz9\b(?:nella|nel|su|sulla|sul)?\s*(?:cartella|folder)\s+.+$a  \b(?:mancia|mance|tips?|quanto|quanta|quanti|quante|totale|totali|storico|sorico|resoconto|riepilogo|report|rendiconto|prospetto|situazione|analisi|lista|elenco|tabella|salva|salvami|crea|creami|sheet|file|drive|cartella|folder|tutta|tutte|tutti|tutto|un|una|uno|il|lo|la|le|gli|i|mio|mia|miei|mie|ha\s+preso|hanno\s+preso|abbiamo\s+preso|preso|presa|prese|ha|hanno|abbiamo|nel|del|della|dei|delle|di|da|con|sala|bar)\br   r   )r   _is_tips_staff_breakdown_request_is_tips_report_requestr  rK  updater  dayr'  r&  rF  r  
IGNORECASEr  !_TIPS_PERSON_QUERY_IGNORED_TOKENSr'  r  r  )r  r  explicit_datedate_tokensr  r  r  s          rJ  _extract_tips_queryr  
  s    )J'
37Nz7Z&w/MEK M%%& $$S)M''( &&s+M&&'M&&',		
 ff^S'GGffJCQX`b`m`mnGffVX[]dlnlylyzGffQSVX_gigtgtuGff 	omm	G %W-::$Z/ 	F  88F2AJ%%''s   -Gc                V     t         fdt        D              ryt         ddddd      S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z3_is_tips_staff_breakdown_request.<locals>.<genexpr>  s     
Rh8z!
Rru  Tr  r  r  ognunociascuno)r)  _TIPS_STAFF_BREAKDOWN_FRAGMENTSrw  rx  s   `rJ  r  r    s,    

R2Q
RR$Z|WV^`jkkr  c                     t         fdt        D              ryd v rt         dddd      ryd v rt         dd	d
ddd      ryd v xr t         ddddddddd
      S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z*_is_tips_report_request.<locals>.<genexpr>  s     
Ih8z!
Iru  Tmancr  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  )r)  _TIPS_REPORT_FRAGMENTSrw  rx  s   `rJ  r  r    s    

I2H
II 9*gwX_ah i 9! Z $=% r  c                   t        j                  dd| t         j                        }dD ]<  }t        j                  ||t         j                        }|s+|j	                  d      } n t        j                  dd|      }t        j                  dd|t         j                        }t        j                  d	d|      j                  d
      }|S )Nz0(\d+(?:[.,]\d+)?)\s*(?:lt|litri|litro|l|cl|ml)\br  r  )zT\b(?:ricetta|prep|preparazione|homemade)\s+(?:di|del|della|dello|dei|delle)?\s*(.+)$z\b(?:come\s+faccio|come\s+si\s+fa|preparami|fammi|calcola(?:mi)?|quanto\s+mi\s+serve\s+per|quanto\s+serve\s+per|mi\s+dai)\s+(.+)$r   z^[\s:;,.!?-]+|[\s:;,.!?-]+$r
  z\b(?:ricetta|ricette|prep|preparazione|preparazioni|homemade|litri|litro|parti|proporzioni|proporzione|voglio|vorrei|fammi|preparami|dammi|mostrami|mostra|calcola|calcolami|come|faccio|si|fa|per|di|del|della|dei|delle)\b\s+ .,!?:;)rF  r  r  r3  r  r  )r  r  r5  r  s       rJ  r+  r+  (  s    ffH#w^`^k^klG  		'7BMM:kk!nG ff3RAGff 	hmm	G ffVS'*00;GNr  c                *   t        |       j                         }|sy|j                         D cg c]  }|s|	 }}|D cg c].  }|dvr(|j                         st	        j
                  d|      r|0 }}|syt        d |D              S c c}w c c}w )NF>	   r>   rI   r]   r^   re   rs   rt   r  r  z[a-z]c              3  8   K   | ]  }t        |      d k\    yw)r   Nr  )rH  r  s     rJ  rK  z0_is_meaningful_homemade_query.<locals>.<genexpr>K  s     >5s5zQ>   )r  r  r  isdigitrF  r3  r)  )r  r  r  r  meaningful_tokenss        rJ  _is_meaningful_homemade_queryr  =  s     '--/J!+!1!1!3=ue=F= \\IIh&	 	  >,=>>> >s   BB3Bc                &    | j                  dd      S )Nr  z''r  r  s    rJ  _escape_sql_literalr  N  s    ==d##r  r
  
key_prefixc          	        g }t        |t              rK|j                         D ]6  \  }}|r| d| n
t        |      }|j	                  t        | ||             8 |S t        |t              r:t        |      D ]*  \  }}| d| d}|j	                  t        | ||             , |S |j                  | ||d n
t        |      t        j                  |d      d       |S )Nr  r  []Fr-  )r  setting_key
value_text
value_json)r  r  rL  r  extend_flatten_settings_rowsr  	enumerater  r   r0  )r  r  r  rQ  rF  r  next_keyindexs           rJ  r  r  R  s    $&D'4 !--/ 	TJC0:*Qse,CHKK.vuRS	T '4 %g. 	TLE5$QugQ/HKK.vuRS	T KK%")/$s7|**W5A		
 Kr  c                    g }| D ]A  }t        |      }|j                  d      }|j                  d|       |j                  |       C |S )Nr  r  )r  rn  
setdefaultr  )rQ  normalized_rowsrJ  r  r  s        rJ  #_supplier_catalog_rows_with_aliasesr  i  sS    /1O +#Y
"7fm4z*	+
 r  c                   g }| D ]  }t        |      }|j                  d|j                  d             |j                  d|j                  d             |j                  d|j                  d             |j                  d|j                  d             |j                  d	|j                  d
             |j                  |        |S )Nr  source_namer  source_lot_coder  source_supplier_name	price_vatr  supplier_catalog_id
catalog_id)r  r  rn  r  )rQ  r  rJ  r  s       rJ  (_supplier_catalog_item_rows_with_aliasesr  s  s    /1O +#Y
njnn].KLj*..9J*KLoz~~>T/UVk:>>:K+LM3Z^^L5QRz*+ r  c                Z-  K   t        j                  d      }t         j                  |_        t	               }|j                  | j                        5  	 d d d        t        |       5 }t        |dt        |d             t        |dt        |d             t        | d      rOt        |d      }t        |d      }t        |d      }t        |d      }t        |d	      }t        |d
      }	t        t        |d            }
t        t        |d            }t        |d|       t        |d|       t        |d|       t        |d|       t        |d	|       t        |d
|	       t        |d|
       t        |d|       t        |d|       t        |d|       t        |d|       t        |d|       t        |d|       t        |d|       t        |d|	       t        |d|
       t        |d|       t        |dg d       t        |dg d       g d}dD ]  }t        |||        	 d d d        t        |       }t        |d|g       t        |d|g       | j                  dv r+|j!                  |       }t        |d|       t        |d|       t        | d      rt#        j$                  t&        j(                        }g }|j+                  | | j                  dv rd n| j,                  d       D ]  }|j/                  ||!      }|j1                  i ||j3                  d"      |j3                  d#      xs$ |j3                  d$      xs |j3                  d%      |j3                  d"      |j3                  d#      xs$ |j3                  d$      xs |j3                  d%      t5        |j3                  d&      xs d'      d(        |D cg c]  }|j3                  d)      | }}t        |d*|       t        |d+|       t        |d|       t        |d,|       t        | d-      rst        |       5 }d.D ]  }t        ||t        ||              	 d d d        g }g }g }|j7                  |       }t9        |t:              r|j3                  d/      ng }t9        |t<              r|D ]  }t9        |t:              st?        |j3                  d0      xs d1      jA                         }t?        |j3                  d2      xs d1      jA                         }t9        |j3                  d3      t:              r|j3                  d3      ni }t?        |j3                  d0      xs d1      jA                         }|j1                  ||tC        |j3                  d4      xs d'      t5        |j3                  d5      xs d'      |j3                  d6      |xs d |j3                  d7      |j3                  d8      |j3                  d9      |j3                  d:      |j3                  d;      tC        |j3                  d<      xs d'      t5        |j3                  d5      xs d'      tC        |j3                  d=      xs d'      d>       |s|rY|jE                  | ||      } t9        | j3                  d?      t:              r| j3                  d?      ni }!|!j3                  d@      }"d3}#n|jG                  | |      } d }"dA}#t9        | j3                  dB      t<              r| j3                  dB      ng }$|$D ]  }%t9        |%t:              s|%j3                  dC      }&|j1                  |||xs d |"|#t9        |&tB        t4        f      rtC        |&      nd t?        |%j3                  dD      xs d1      t?        |%j3                  dE      xs d1      t5        |%j3                  d5      xs d'      tC        |%j3                  dF      xs d'      dG
       t9        |%j3                  dH      t<              r|%j3                  dH      ng D ]  }'t9        |'t:              s|j1                  |||xs d |"|#t9        |&tB        t4        f      rtC        |&      nd t?        |%j3                  dD      xs d1      t?        |%j3                  dE      xs d1      t?        |'j3                  dI      xs d1      t5        |'j3                  dJ      xs d'      |'j3                  dK      t5        |'j3                  dK            nd t5        |'j3                  dL      xs d'      dM          t        |dN|       t        |dO|       t        |dP|       t        |dNg dQ       t        |dOg dR       t        |dPg dS       t        | dT      rCt        |       5 }(t        |(dU      })t        |(dV      }*t        |(dW      }+t        |(dX      },t        |(dY      }-d d d        dU)fdZ|)fd[|)fdV*fd\|*fd]|*fdW+fd^|+fd_|+fdX,fd`|,fda|,fdY-fdb|-fdc|-ffD ]  \  }}.t        |||.        tI        |-      }/ddD ]  }t        |||/        g de}0g df}1g dg}2g dh}3g di}4djdkg}5dlD ]  }t        |||0        dmD ]  }t        |||1        dnD ]  }t        |||2        doD ]  }t        |||3        dpD ]  }t        |||4        ddD ]  }t        |||5        tK        |       }6|6rt        |       5 }7t        |7dq      D 8cg c]2  }8t?        |8j3                  dr      xs d1      jA                         |6v r|84 }9}8t        |7ds      D 8cg c]2  }8t?        |8j3                  dr      xs d1      jA                         |6v r|84 }:}8|:D 8ch c][  }8t?        |8j3                  d0      xs d1      jA                         s0t?        |8j3                  d0      xs d1      jA                         ] };}8t        |7dt      D 8cg c]`  }8t?        |8j3                  dr      xs d1      jA                         |6v r0t?        |8j3                  du      xs d1      jA                         |;v r|8b }<}8t        |7dv      D 8cg c]2  }8t?        |8j3                  du      xs d1      jA                         |;v r|84 }=}8d d d        t        |dq9       t        |ds:       t        |dt<       t        |dv=       t        |dw|9       t        |dx|:       t        |dy|<       t        |dz|=       t        |d{|9       t        |d||:       t        |d}|<       t        |d~|=       t        |dsg d       t        |dtg d       t        |dqg d       t        |dvg d       t        |dxg d       t        |dyg d       t        |dwg d       t        |dzg d       t        |d|g d       t        |d}g d       t        |d{g d       t        |d~g d       t        | d      r|jM                  | jN                        D >cg c]  }>|>jP                  |>jR                  |>jT                  |>jV                  |>jX                  |>jZ                  |>j\                  |>j^                  |>j`                  |>jb                  |>jd                  |>jf                  |>jh                  |>jj                  d }?}>t        |d|?       t        |d|?       |jM                  | jN                        D @%cg c]&  }@|jm                  | jN                  |@jP                        D ]  }%i d0|%jP                  d|%jn                  d|%jp                  d|%jr                  d|%jt                  d|%jv                  d|%jx                  d|%jz                  d|%j|                  dJ|%j~                  d|%j                  d|%j                  d|%j                  d|%j                  d|%j                  d|%j                  d|%j                  |%jh                  |%jj                  d ) }A}@}%t        |d|A       t        |d|A       |j                  | jN                        D >cg c]  }>|>jP                  |>j                  |>j                  |>j                  |>j                  |>j                  |>j                  |>j                  |>j                  |>jn                  |>j                  |>jh                  |>jj                  d }B}>t        |d|B       t        |d|B       |j                  | jN                        }Ct        |d|CjN                  |Cj                  |Cjj                  dg       t        |d|CjN                  |Cj                  |Cjj                  dg       t        | d      r|j                  | jN                        D Dcg c]h  }D|DjP                  |DjR                  |Dj                  |Dj                  |Dj                  |Dj                  |Dj`                  |Djh                  |Djj                  d	j }E}Dt        |d|E       t        |d|E       g }Ft        | d      r:	 t        | t        d             d {   }GFj                  t        d|G             t        | d      r3	 t        | t        d             d {   }HFj                  t        d|H             	 t        | t        d             d {   }IFj                  t        d|I             	 t        | t        t                     d {   }Jt9        Jt:              rJj3                  d      ng }Kt9        |Kt<              riKD %LMcg c]@  }%t9        |%t:              s|%j                         D LMci c]  \  }L}Mt?        |L      |M c}M}LB }N}L}%}Mt        |d|N       t        |d|N       | j                  dv r:	 t        | t        d             d {   }OFj                  t        d|O             t        | d      r:	 t        | t        d             d {   }PFj                  t        d|P             t        |dF       t        |d|F       |j                  d       |S # 1 sw Y   PxY w# 1 sw Y   xY wc c}w # 1 sw Y   nxY w# 1 sw Y   
xY wc c}8w c c}8w c c}8w c c}8w c c}8w # 1 sw Y   ?xY wc c}>w c c}%}@w c c}>w c c}Dw 7 # t        $ r2 t        j                  d| jN                  | j                  d       Y w xY w7 # t        $ r2 t        j                  d| jN                  | j                  d       Y w xY w7 # t        $ r2 t        j                  d| jN                  | j                  d       Y w xY w7 # t        $ r4 i }Jt        j                  d| jN                  | j                  d       Y w xY wc c}M}Lw c c}M}L}%w 7 # t        $ r2 t        j                  d| jN                  | j                  d       Y 7w xY w7 # t        $ r2 t        j                  d| jN                  | j                  d       Y 2w xY ww)Nz:memory:tenant_profiletenant_module_settingsr  ordini_productsordini_batchesordini_itemsordini_seasonal_goalsordini_shared_notesordini_suspended_orderssupplier_catalogssupplier_catalog_itemsproductspurchase_batchespurchase_itemssales_goalstenant_sales_goalsshared_notessuspended_ordersfornitori_cataloghifornitori_cataloghi_items)r  r5  r  r3  r  r3  r  r3  )r  )r&  r5  r  r3  )r  r3  )r  r3  )r  r3  )r  r3  )r  r3  )r  r4  )r  r4  )r  r3  )r  r3  )r  r  r  venue_profileprofile>   r  r  tenant_usersusersr  ry  )r  r  )reference_nowr  r  r  r  duration_hoursr   )staff_id
staff_nameemployee_idemployee_namer  ended_attenant_timeclock_entriestimeclock_entriesactive_timeclock_entriesr  )tenant_inventory_warehousestenant_inventory_stock_itemstenant_inventory_stock_lotstenant_inventory_sessionstenant_inventory_session_itemstenant_inventory_session_lotstenant_inventory_movements#tenant_inventory_daily_consumptions'tenant_inventory_estimated_consumptions*tenant_inventory_consumption_product_statstenant_inventory_snapshotstenant_inventory_snapshot_itemstenant_inventory_snapshot_lots
warehousesr  r
  r  latest_inventoryproduct_counttotal_equivalent_unitslatest_inventory_daterI  created_by_user_idcreated_by_name
created_at
updated_attotal_productsinventory_session_count)warehouse_idwarehouse_namer  current_total_equivalent_unitsr  latest_inventory_session_idlatest_inventory_label#latest_inventory_created_by_user_id latest_inventory_created_by_namelatest_inventory_created_atlatest_inventory_updated_atlatest_inventory_total_products'latest_inventory_total_equivalent_unitsr  r  inventory_datecurrent_stockrL  
product_idr  r  	lot_count)
r  r  
session_idr  inventory_sourcer
  r  r  r  r  lotsr  rH  r  equivalent_units)r  r  r  r  r  r
  r  r  r  rH  r  r  inventory_warehousesinventory_latest_itemsinventory_latest_lots)r  r3  r  r3  )r  r5  )r  r4  )r  r3  )r   r3  )r  r3  )r  r3  )r  r3  )r  r3  )r  r3  )r  r5  )r  r4  )r  r5  )
r  r  r  r3  r  r3  r  r3  r
  r5  r  r  )r  r4  )r  r5  )r  r  r  r  r  r  r  r  r  rH  r4  )r  r4  )r  r4  r   tenant_homemade_recipes tenant_homemade_stock_warehousestenant_homemade_stock_itemstenant_homemade_stock_movementstenant_homemade_stock_settingshomemade_recipesprep_recipeshomemade_stock_warehousesprep_stock_warehouseshomemade_stock_itemsprep_stock_itemshomemade_stock_movementsprep_stock_movementshomemade_stock_settingsprep_stock_settings) tenant_homemade_operational_dayshomemade_operational_daysprep_operational_days)r  r3  r  )name_lookupr3  measurement_unitr3  )r  r3  )total_partsr4  )ingredient_countr5  r  r3  r  r3  r  r3  r  r3  )preparation_dater3  )yield_ingredient_namer3  )yield_ingredient_lookupr3  )yield_input_amountr4  )yield_input_unitr3  )yield_output_mlr4  r  r3  )r,  r  r4  r5  )	r,  r  	recipe_idr3  recipe_namer3  recipe_lookupr3  r.  r  r4  r5  )r,  r  r  r=  r?  rA  r.  )quantity_beforer4  )quantity_afterr4  )delta_quantityr4  )added_quantityr4  )consumed_quantityr4  )movement_typer3  )occurred_atr3  r2  r3  r4  )r,  )minimum_stock_daysr4  r4  r5  )r}  r3  )r  r3  r<  )r  r3  )r  r  r   )r  r!  r"  )r  r#  r$  )r  r%  r&  )r  r'  r(  tenant_tips_roster_entriesareatenant_tips_runstenant_tips_run_entriesrun_idtenant_tips_run_history_sourcestips_roster	tips_runstips_run_entriestips_history_sourcesmance_roster
mance_runsmance_entriesmance_history_sources)r,  rL  r3  )tip_dater3  )total_tip_amountr4  )tip_pos_amountr4  )tip_pos_effective_amountr4  )tip_cash_amountr4  )total_scorer4  )historical_total_amountr4  )payable_total_amountr4  )present_staff_countr5  )absent_staff_countr5  )payout_statusr3  )
settled_atr3  )settled_by_namer3  )saved_by_user_idr3  )saved_by_namer3  r4  r5  )r,  rO  r3  rY  r  r3  staff_lookupr3  r  r4  )
is_presentr5  )amount_todayr4  )historical_amountr4  )total_amountr4  r4  r5  )r,  rY  rj  rk  rm  )r@  r5  r4  r5  )r,  ri  )source_run_idr3  )source_tip_dater3  r4  r5  r  )r  display_namedocument_typedocument_numberdocument_dater  rq  currencyre  matching_statusreview_statussummary_textr  r  tenant_fiscal_documentsdocument_id
line_indexr  iso_coder  category_code	unit_code
pack_countgross_quantitytare_quantitynet_quantity
unit_price
line_totalvat_coderaw_row_text)r  r  tenant_fiscal_document_itemsfiscal_document_items)r  
message_idattachment_idsubjectsenderreceived_atattachment_name	mime_typesync_statusr}  error_detailr  r  "tenant_fiscal_document_inbox_itemsfiscal_inbox_itemstenant_fiscal_document_settings)	tenant_idinbound_emailr  fiscal_settingsr  )	r  rt  original_namer  rz  file_size_bytesre  r  r  tenant_menu_assetsmenu_assets)r  0tenant_query_sandbox_ordini_settings_unavailable)r  tenant_slug)extrar  6tenant_query_sandbox_prenotazioni_settings_unavailableri  2tenant_query_sandbox_whatsapp_settings_unavailable)r  -tenant_query_sandbox_reservations_unavailablereservationstenant_reservationsllm-tenant_query_sandbox_llm_settings_unavailabler0  0tenant_query_sandbox_fiscal_settings_unavailabletenant_runtime_settingsr  zPRAGMA query_only = ON;)dr  r  r  r  r*   _connect_tenant_databaser  r'  rW  re  rj  r  r  r_  _get_locale_profiler  list_tenant_usersr	   r  r   utc_read_timeclock_entriesr  _serialize_timeclock_entryr  rn  r  list_inventory_warehousesr  r  r  r  r  r  &get_inventory_warehouse_session_detailget_inventory_warehouse_detailr  r  rc  r  r  rt  ru  rv  rw  r  rq  rx  re  ry  rz  r{  r  r  list_fiscal_document_itemsr}  r~  r  r  r  r  r  r  rH  r  r  r  r  r  r  r   list_fiscal_document_inbox_itemsr  r  r  r  r  r  r  r  r  get_fiscal_document_settingsr  list_menu_assetsr  rz  r  _get_module_settingsr  r  r  r   loggerwarningr  _list_reservations_fullr  r  rL  r  )Qr  r"  r  orders_connectionproduct_rows
batch_rows	item_rows	goal_rowsshared_note_rowssuspended_order_rowssupplier_catalog_rowssupplier_catalog_item_rowssales_goal_columnsrP  locale_profile	user_rowsr  r  entryserialized_entryr  inventory_connectioninventory_warehouse_rowsinventory_latest_item_rowsinventory_latest_lot_rowsinventory_payloadwarehouse_items	warehouser  r  r  latest_session_iddetail_payloadsession_payloadr  source_kindsession_itemsro  r
  lothomemade_connectionhomemade_recipe_rowshomemade_stock_warehouse_rowshomemade_stock_item_rowshomemade_stock_movement_rowshomemade_stock_settings_rowsrQ  homemade_operational_day_rowshomemade_recipe_columns homemade_stock_warehouse_columnshomemade_stock_item_columnshomemade_stock_movement_columnshomemade_stock_settings_columns homemade_operational_day_columnsallowed_tips_areastips_connectionrJ  tips_roster_rowstips_run_rowsallowed_run_idstips_entry_rowstips_history_rowsrecordr  documentr  r  r  assetr  module_rowsordini_settingsprenotazioni_settingswhatsapp_settingsreservations_payloadr  rF  r  reservation_rowsllm_settingsfiscal_module_settingssQ                                                                                    rJ  _build_tenant_query_sandboxr    s    ,J$[[JE		'	'(=(=	>  
+7	3 BL7H%j2BD[\mo  EA  	B%j2JLcdu  xP  MQ  	R*7H=23DFWXL01BDTUJ/0A>RI/0ACZ[I67HJ_`#:;LNg#h $GH_`q  tG  IH  %I!)QRij{  ~V  SW  *X&)*6GV)*6F
S)*niP)*6MyY)*6KM]^)*6OQef)*6IK`a)*6NPjk)*j,O)*6H*U)*6F	R)*mYO)*6JIV)*nFVW)*6HJ^_)*6KMbc)*6QSmn		
 			

 Y 	LJ
J8JK	LCBLH )1N!*o?OP!*i.9IJ||//++G4	%j.)L%j'9E&w< X\\222#LL,DDD'// 3 
 	E
  %??Ub?c$$& 0 4 4Y ?"2"6"6{"C  #NGWG[G[\fGg  #Nk{kk  AM  lN#3#7#7	#B%5%9%9+%F  &QJZJ^J^_iJj  &Qn~  oC  oC  DP  oQ"#3#7#78H#I#NQO		  8I#jeEIIV`LaLiE#j #j%j2LN_`%j2EGXY%j+?PQ%j2LNfg&w<.w7 	A;O A
 .j*F]^rt~F  AA	A$ =? >@"=?!!;;GDAKL]_cAd+//=jlot,, I	!)T2"9==#6#<"=CCE!$Y]]6%:%@b!A!G!G!IHRS\S`S`asStvzH{9==1C#D  BD $'(8(<(<T(B(Hb$I$O$O$Q!(//(4*8),Y]]?-K-Pq)Q:?	Nf@g@lkl:m1:?V1W7H7PD2B2F2Fw2O?O?S?STh?i<L<P<PQb<c7G7K7KL7Y7G7K7KL7Y;>?O?S?STd?e?jij;kCHIYI]I]^vIwI|{|C}36y}}E^7_7dcd3e$ $$%*%Q%QRY[giz%{NGQR`RdRdenRoquGvn&8&8&C|~O%4%8%89I%JN"4K%*%I%I'S_%`N%)N"1K?I.J\J\]dJegk?l 2 27 ;rt) $D%dD1 !%,!7J.55,8.<*;*Ct.<0;=G
UXZ_T`=a#j/gk,/0H0NB,O-0/1J1Pb-Q6;DHHE]<^<cbc6d),TXXk-B-Ga)H 4>dhhv>NPT3Utxx/[] )#t4$1880<2@.?.G42@4?AKJY\^cXdAec*oko03DHH^4L4RPR0S14TXXo5N5TRT1U,/
0C0Ir,J,1#''*2E2J,KVYV]V]^nVoV{%@P8Q2R  BF49#''BT:U:ZYZ4[%$KIV 	&j2HJbc%j2JLfg%j2IKde"	
( 	$	
  	#	
& 'w
;.w7 	z;N#:;NPi#j ,CDWY{,|)'>?RTq'r$+BCVXy+z(+BCVXx+y(	z '(<=!5612/1NO(*GH$&CD*,DE#%=>!9:.0LM')EF#%AB-/KL&(DE"$@A!
 	HJ" **j$G#	H& )GGc(d%t 	aJ)*jB_`	a#
(,
(
'
#+
'&+
' $(,
( Z 	QJ
J8OP	Qt 	ZJ
J8XY	Ze 	UJ
J8ST	Uq 	YJ
J8WX	Yn 	YJ
J8WX	Yt 	ZJ
J8XY	Z :'B.w7 	? 3?D`a swwv,"-3359KK     3?DVWswwv,"-3359KK M 
 LY}C\_`c`g`ghl`m`sqs\t\z\z\|s3774=#6B7==?}O} 3?D]^swwv,"-3359KKPSTWT[T[\dTeTkikPlPrPrPt  yH  QH O  3?Def!swwx(.B/557?J ! !#	. 	&j2NP`a%j2DmT%j2K_]%j2SUfg%j-AQR%j+}M%j2DoV%j2HJ[\%j.BRS%j,N%j/?S%j2IK\]	
2 	%	
$ 	(		
 	-	
 		
2 		
$ 			
 	"	
 		
2 		
$ 			
 	#	
 'w0BC$  55g6G6GH#
"  ii & 3 3!'!5!5#)#9#9!'!5!5!'!5!5 & 3 3"OO --#)#9#9!'!5!5 & 3 3$//$//
 
& 	&j2KM]^%j2DFVW0 "778I8IJ-!
 !
, 889J9JHKKX/!
. -dggt// doo  1 1	
 DMM t//  !3!3 T^^ doo DMM !$"5"5  !3!3  1 1 doo doo  DMM!"  1 1#$ #oo"oo'!
!
 !
2 	&j2PRgh%j2IK`a$  @@ARARS!
   ii$//!'!5!5!>> --%11#)#9#9#--%11%11 & 3 3$//$//
 
$ 	&j2VXjk%j2FHZ[<<W=N=NO%- "1!:!:%4%B%B"1"<"<
	
 	& "1!:!:%4%B%B"1"<"<
	
 'w7 //0A0AB
  hh % 2 2!&!4!4"__

#(#8#8,,#..#..

 
 	&j2FT%j-M+-K&w9	$8BW_gBh$iiO5hPQ 'w?	*>wH]esHt*u$u!5nF[\]	&:7DYakDl&m m5jBSTU	)@J^euJv)w#w  DNNbdhCi+//?oqlD)]i   E   EUYmwx|  C  nD4::< PZS%S5 P   E   E)*6KM]^)*nFVW||//	!5g?T\a?b!ccL5e\JK 'w0BC	+?I^fnIo+p%p"5h@VWX "*.GU!*j+F01{ BL BL@ $k	A 	A|	z 	zd 

 ~
!#	 	j
,!
8
\
( j 	NNB$+$5$5gFYFYZ  	 %v 	NNH$+$5$5gFYFYZ  	 !n 	NND$+$5$5gFYFYZ  	 $x 	#% NN?$+$5$5gFYFYZ  	 !Q   E
 d 	NN?$+$5$5gFYFYZ  	 &q 	NNB$+$5$5gFYFYZ  	s(  AAZ+AR"AZ+'GAR/)F#AZ+AR<#AR<'AAZ+5ASU AZ+5=AS2DAZ+AS47ASAS47AS AS41AS%.AS%9AS4	A%AS*.AS4>7AS/5AS47FAZ+9B$AT:AZ+D,ATA:AZ+A=BATDC AZ+GA-ATI*AZ+I.AT JATJAT J'AZ+J5AU KAUKAU K/AV LAVL	AV L)AW MAWMAW M9AZ+NAX"NAX"N-AXOAX"O	,AZ+O6AX, PAX)PAX, P/AZ+P<AY- QAY*QAY- Q5-AZ+R"AR,R'AZ+R/AR9R4AZ+SASSAZ+SASSAZ+SAS4S4AS>S9AZ+TAT T7AUUAZ+UAUUAZ+UAU U7AVVAZ+VAVVAZ+VAV V7AWWAZ+WAWWAZ+WAW W9AXXAZ+XAXXAZ+XAX"X"AZ+X)AX, X,7AY'Y#AZ+Y&AY'Y'AZ+Y*AY- Y-7AZ(Z$AZ+Z'AZ(Z(AZ+c           	        | j                  d      j                         }g }|D ]  }t        |d         }| j                  dt        |       d      j                         D cg c]#  }t        |d         t        |d   xs d      d% }}| j                  dt        |             j	                         }|j                  ||t        |d	   xs d
      nd
|d        |g dg ddS c c}w )NzbSELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name ASCr  PRAGMA table_info(r=  typer3  )r  r  zSELECT COUNT(*) AS total FROM totalr   )table	row_countr^  )z"Usa solo SELECT o WITH ... SELECT.zBLe tabelle disponibili dipendono dai permessi del tenant corrente.z6Per risultati grandi applica filtri, ORDER BY e LIMIT.zI cataloghi fornitori salvati separatamente dal catalogo prodotti del locale sono nelle tabelle supplier_catalogs e supplier_catalog_items.zPer bolle e fatture usa tenant_fiscal_documents per la testata documento e tenant_fiscal_document_items per le righe merce estratte.zPer mance usa tenant_tips_runs per le giornate salvate, tenant_tips_run_entries per il dettaglio dipendente e tenant_tips_roster_entries per la lista staff configurata.z|Per consumi delle prep/homemade usa tenant_homemade_stock_movements; per stock attuale prep usa tenant_homemade_stock_items.zoPer medie giornaliere delle prep usa tenant_homemade_operational_days come calendario operativo bar/ristorante.)	zvSELECT supplier_name, COUNT(*) AS products FROM ordini_products GROUP BY supplier_name ORDER BY products DESC LIMIT 10zSELECT items.source_supplier_name, items.source_name, items.final_price_vat FROM supplier_catalog_items AS items WHERE lower(items.source_name) LIKE '%vodka%' ORDER BY items.final_price_vat ASC LIMIT 20zSELECT items.source_name, GROUP_CONCAT(DISTINCT items.source_supplier_name) AS suppliers FROM supplier_catalog_items AS items WHERE lower(items.source_name) LIKE '%cointreau%' GROUP BY lower(items.source_name) LIMIT 20zsSELECT document_type, supplier_name, total_amount FROM tenant_fiscal_documents ORDER BY document_date DESC LIMIT 20a]  SELECT d.document_date, d.supplier_name, i.description, COALESCE(i.net_quantity, i.quantity, i.pack_count) AS delivered_quantity, i.unit_code, i.line_total FROM tenant_fiscal_documents AS d JOIN tenant_fiscal_document_items AS i ON i.document_id = d.id WHERE d.document_type = 'delivery_note' ORDER BY d.document_date DESC, i.line_index ASC LIMIT 50zSELECT reservation_date, start_time, customer_name, guests FROM tenant_reservations ORDER BY reservation_date DESC, start_time DESC LIMIT 20zSELECT user_name, SUM(COALESCE(duration_seconds, 0)) AS total_seconds FROM tenant_timeclock_entries GROUP BY user_id ORDER BY total_seconds DESC LIMIT 20a  SELECT e.staff_name, SUM(COALESCE(e.amount_today, 0)) AS total_mance_giornata FROM tenant_tips_run_entries AS e JOIN tenant_tips_runs AS r ON r.id = e.run_id WHERE substr(r.tip_date, 1, 4) = '2025' GROUP BY e.staff_lookup, e.staff_name ORDER BY total_mance_giornata DESC LIMIT 20a  SELECT movements.recipe_name, SUM(movements.consumed_quantity) AS consumed_pz, COUNT(DISTINCT days.operational_date) AS giorni_operativi FROM tenant_homemade_stock_movements AS movements LEFT JOIN tenant_homemade_recipes AS recipes ON recipes.id = movements.recipe_id LEFT JOIN tenant_homemade_operational_days AS days ON days.usage_scope IN (COALESCE(recipes.usage_scope, 'both'), CASE WHEN COALESCE(recipes.usage_scope, 'both') = 'both' THEN 'bar' ELSE COALESCE(recipes.usage_scope, 'both') END, CASE WHEN COALESCE(recipes.usage_scope, 'both') = 'both' THEN 'restaurant' ELSE COALESCE(recipes.usage_scope, 'both') END) WHERE movements.consumed_quantity > 0 GROUP BY movements.recipe_lookup, movements.recipe_name ORDER BY consumed_pz DESC LIMIT 20)tablesr  example_queries)r  rd  r  r+  ra  r  r  )r"  
table_rowsr  rJ  rP  columnr^  	total_rows           rJ  _describe_sqlite_schemar    s$   ##lhj  ')F 
V%
 %,,/ABUV`BaAbbc-dennp

  F6N+F6N4f5
 
 &&)GH[\fHgGh'ijssu	#=F=RS7!3!8q9XY"	

$ 	


 
s   #(C-c                \   t        j                  dd| t         j                        }t        j                  dd|      }|j                         j	                  d      j                         }t        j                  dd|t         j
                        }dd	d
ddd}|j                         D ],  \  }}t        j                  |||t         j
                        }. t        j                  d|t         j
                        rGdddddd}|j                         D ],  \  }}t        j                  |||t         j
                        }. |st        dd      d|v rt        dd      t        j                  d|      st        dd      t        j                  |      rt        dd      |S )Nz	/\*.*?\*/r  r  z
--[^\n\r]*;z	\bILIKE\bLIKEzsci.source_namezsci.source_lot_codezsci.final_price_vatzsci.catalog_idzsc.supplier_name)z\bsci\.product_name\bz\bsci\.lot_code\bz\bsci\.price_vat\bz\bsci\.supplier_catalog_id\bz\bsc\.name\bz8\b(?:supplier_catalog_items|fornitori_cataloghi_items)\br  r  r  r  r  )z(?<!\.)\bproduct_name\bz(?<!\.)\blot_code\bz(?<!\.)\bsupplier_name\bz(?<!\.)\bprice_vat\bz(?<!\.)\bsupplier_catalog_id\br  zQuery SQL vuota.status_coder  z+E' consentita una sola query SQL per volta.z(?is)^(select|with)\bz"Sono consentite solo query SELECT.z0La query contiene istruzioni SQL non consentite.)rF  r  DOTALLr  r  r  rL  r3  r   r   _TENANT_QUERY_DISALLOWED_PATTERN)r  r  compatibility_replacementsr5  replacementsupplier_catalog_column_aliasess         rJ  _normalize_sql_readonly_queryr    s   ff\3299=Gff]C1Gmmo$$S)//1Gff\67"--HG"334)9+" !; @ @ B M&&+wbmmLM	yyLg]_]j]jk(5$5)?%6/;+
' %D$I$I$K 	Q G[ffWk7"--PG	Q4FGG
g~4abb88,g64XYY'..w74fggNr  c                     t         j                  t         j                  t         j                  t         j                  ht        t         dd       }|j                  |       d fd}|S )NSQLITE_FUNCTIONc                r    | t         j                  k(  rt        |xs d      }|v s|dk(  r	S S | v r	S S )Nr
  sqlite_master)r  SQLITE_READr  )
action_codearg1arg2db_nametrigger_namerP  allowed_actionsallowed_tablessqlite_deny	sqlite_oks
         rJ  
authorizerz,_tenant_query_authorizer.<locals>.authorizer  sJ    '---TZRJ *n <
o@]9ncnn'?:yKKr  )r  r  r  r  r  r  r  r  r  r  r  r  )r  	SQLITE_OKSQLITE_DENYSQLITE_SELECTr  getattrr  )r  function_coder  r  r  r  s   `  @@@rJ  _tenant_query_authorizerr"    sk    !!I%%KO G%6=M M*L L r  c                   K   t        |        d {   }	 t        |      }|j                  s|j                  dd        ||j	                          S 7 @# |j	                          w xY ww)Nr  )r  r  r  r  r   )r  argssandboxschemas       rJ  _describe_tenant_schema_toolr'    sW     /88G(1$$JJ($/ 9 	s&   A)AA)*A A)A&&A)c                  K   t        |j                        }t        |        d {   }	 |j                  d      j	                         D ch c]  }t        |d          }}|j                  t        |             t               t        z   dfd}|j                  |d       |j                  |      }|j                  xs g D cg c]  }t        |d          }	}|j                  |j                  dz         }
t        |
      |j                  kD  }|
d |j                   }|D cg c]4  }t        t        |	            D ci c]  }|	|   t!        ||          c}6 }}}t"        j%                  d| j&                  | j(                  t        |      ||       ||	|t        |      ||j                  t+        |      d|j-                          S 7 c c}w c c}w c c}w c c}}w # t.        j0                  $ r5}d	t        |      j3                         v rd
nd| }t5        d|      |d }~ww xY w# |j-                          w xY ww)NzPSELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'r  c                 &    t                kD  rdS dS )Nr   r   r   )deadlines   rJ  _progress_handlerz1_run_tenant_query_tool.<locals>._progress_handler%  s    !h.15A5r    r   r   z:tenant_query tenant=%s user=%s rows=%s truncated=%s sql=%s)r  r^  rQ  r  	truncatedr  available_tablesinterruptedzQuery interrotta per timeout.zErrore SQL: r  r  )r  r  )r  r  r  r  rd  r  set_authorizerr"  r   _TENANT_QUERY_TIMEOUT_SECONDSset_progress_handlerr  	fetchmanyr  r  rt  r1  r  infor  r  sortedr   r  OperationalErrorr  r   )r  r$  r  r%  rJ  r  r+  cursorro  r^  raw_rowsr-  rQ  r  rendered_rowsexcr  r*  s                    @rJ  _run_tenant_query_toolr;    s-    
'
1C/88G- bhj	
 F
 
 	7GH;!>>	6 	$$%6=%-3-?-?-E2GD3tAw<GG##DJJN3MDJJ.	$**% 
 GLCPWLFYZUWU^_SZ88Z
 
 	H	
 !]+"ZZ &~ 6
 	] 9
 H
 [
* ## E4ASX^^EU4U0]ijmin[oF;DE 	s   $IGI!G- G#A(G- G AG- ,G'G" G'%AG- I
G- "G''G- -H5 0H00H55H8 8I

Ic                    | j                  d| d      j                         }|D ch c]  }t        |d          c}S c c}w )Nr  r=  r  )r  rd  r  )r"  rP  rQ  rJ  s       rJ  _orders_table_columnsr=  J  sB     2:,a@AJJLD(,-CF---s   A c                2    | y 	 | |   S # t         $ r Y y w xY wrD  )	Exception)rJ  rF  s     rJ  _row_getr@  O  s*    
{3x s   
 	c                x   t               j                  | j                        }|d   r|d   d   nd }t        |       5 }|j	                  d      j                         }t        |j	                  d            }d d d        |d   j                  |d   j                  ||j                  n|d   j                  t        |dd      xs dt        |dd       t        |d	d       |d
   n| j                  ||d   n| j                  D cg c]  }t        |d         dk(  s|d    c}d	S # 1 sw Y   xY wc c}w )Nvenuesr   z$SELECT * FROM tenant_profile LIMIT 1zJSELECT * FROM tenant_module_settings ORDER BY enabled DESC, module_key ASCtenantr  r
  r  r  
admin_nameadmin_emailenabledr   
module_key)	r  r  r  r  r  r  rD  rE  enabled_modules)r*   get_tenant_contextr  r#  r  ra  r  r  slugr   r  r  r  )r  tenant_contextvenuer"  r  r  rJ  s          rJ  r  r  X  sG   %'::7;L;LMN+9(+CN8$Q'E	!'	* }j#++,RS\\^:--.z{|}
 &h/44%h/44$)$5ejj>(;S;X;X5)R06B~t<"5*;TB6D6Pn\2V]VgVg8F8R~m4X_XjXj9Da#CPYNH[_`H`C-a
 
	} } bs   :D+D7D7+D4c                   t        |       5 }t        |d      }d|v rdnd}d|v rdnd}d|v rd	nd
}d|v rdnd}d|v rdnd}d|v rdnd}d|v rdnd}	dD 
cg c]  \  }
}||v r|
 }}
}dj                  ddddg|      }|j                  d| d| d| d| d| d| d|	 d| d      j	                         }d d d        D cg c]a  }t        t        |d          |d!   |d"   |d#   |d   |d   |d   |d   |d   |d   |d   t        |d$   xs d%      t        |d&         d'(      c c}S c c}}
w # 1 sw Y   |xY wc c}w ))Nr  r  products.product_codezNULL AS product_coder  products.final_price_vatzNULL AS final_price_vatr  products.weight_kgzNULL AS weight_kgr  products.unit_price_per_kgzNULL AS unit_price_per_kgr  products.categoryzNULL AS categoryr  products.units_per_packNULL AS units_per_packr   products.liters_per_unitNULL AS liters_per_unit))rN  r  rO  r  )rP  r  )rQ  r  )rR  r  rS  r  rU  r   ,
                zproducts.idzproducts.product_namezproducts.lot_codezproducts.supplier_namez
            SELECT
                products.id,
                products.product_name,
                products.lot_code,
                products.supplier_name,
                a  ,
                COALESCE(SUM(items.quantity), 0) AS total_quantity,
                MAX(batches.confirmed_at) AS last_ordered_at
            FROM ordini_products AS products
            LEFT JOIN ordini_items AS items ON items.product_id = products.id
            LEFT JOIN ordini_batches AS batches ON batches.id = items.batch_id
            WHERE products.active = 1
            GROUP BY zo
            ORDER BY products.supplier_name ASC, products.product_name ASC, products.lot_code ASC
            r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  )r#  r=  r  r  rd  r  r  r  )r  r"  product_columnsselect_product_codeselect_final_price_vatselect_weight_kgselect_unit_price_per_kgselect_categoryselect_units_per_packselect_liters_per_unitclauser[  group_by_optionalgroup_by_sqlrQ  rJ  s                   rJ  _load_product_candidatesrg  m  sC   	!'	* 6j/
<MN9G?9Z5`v?PTc?c!;  jC3>/3Q/WjCVZiCi#?  pK 1;1N-Tf=MQ`=` 9f~?PTc?c!;  jC(
# o- 
 
 -11'#(	
 #
 !! %% &'( )!" #)* + ! "&' ('( ) #^ $'
. (*/ 	?6R #" ! 	3t9~^,_o.^, 12+&!"56_/0 12s#349:/4E0FG	
 _
6 6ps&   A
D3D-&AD3A&D?-D33D<c                D   |j                         s	|| d | S | S t        |      }g }| D ]6  }dj                  t        d |j                  |j
                  |j                  |j                  xs d|j                  xs dg            }t        ||      }|rt        |      }||v r||dkD  rdndz  }|dk  r|j                  t        |j                  |j                  |j
                  |j                  |j                  |j                  |j                  |j                   |j                  |j"                  |j$                  |j&                  |j(                  |             9 t+        |      }	t-        t/        |            dk\  r||	rz|D cg c]h  }t1        dj                  t        d |j                  |j
                  |j                  |j                  xs d|j                  xs dg            |	      r|j }
}|
r|
}ng }|j3                  d        ||d | S |S c c}w )	Nr  r
  r   r  r[  r   c                    | j                    | j                   | j                  j                         | j                  j                         | j
                  j                         fS rD  )r  r  r  r  r  r  ro  s    rJ  <lambda>z _rank_products.<locals>.<lambda>  sR    ZZK   $$&##%MM!
 r  rF  )r  r   r  filterr  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  rN  r  rB  r:  sort)r  r  r  requested_bucketrankedr  r  r_  bucket_labelssignificant_tokensexact_rankeds              rJ  _rank_productsrt    sH   ;;=#(#4xB(B.u5%'F %
XX(($$))((.B$$*	

 +5*=@IM=0kAos3>!::$11 ))%33$11 ' 7 7!++")";"; ))&55 ' 7 7&55 ' 7 7!	
)%
N ;5A
 '(A-2D "
3#00#,,#11#006B#,,2	 # 
 
& !F
 F
KK
   #.6&5>:F:I
s   A-Hc                l   t        |       }t        ||j                  d       }|d |j                   }t	        t        |j                              }|j                  t        |      ||D cg c]  }|j                  |j                  t        |j                        |j                  |j                  |j                  |j                  |j                  |j                  |j                   |j"                  |j$                  |j&                  |j(                  t+        |j,                  d      d c}dS c c}w )Nr   )r  r  likely_brandr  r  r  r  r  r  r  r  r   total_quantity_orderedr  match_score)r  countfamily_requestrL  )rg  rt  r  r  r5  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  )r  r$  r  
ranked_allrp  rz  r  s          rJ  _search_productsr|    s   '0H$**d;J$**%F?

KLNZ(& "%
$ ! jj ' 4 4 5g6J6J K#,,!(!6!6 ' 4 4#*#:#:$..%,%>%>#,,")"8"8#*#:#:*1*@*@#*#:#:$W]]A6
	 
s   *CD1
c                     | dd| dz   ddfS )N04dz-01-01 00:00:00r   r  r&  s    rJ  _year_boundsr  1  s#    Cj(TAXcN/*JKKr  c                    t        | |d      }|dk(  rt        | dz   dd      }nt        | |dz   d      }|j                  d      |j                  d      fS )Nr   r5  %Y-%m-%d %H:%M:%S)r	   r  )r&  r'  r  r  s       rJ  _month_boundsr  5  sZ    T5!$E{taxA&tUQY*NN./>Q1RSSr  c                   | }|}t        |t              rt        |t              r||j                  }|t        d      z
  }|>|j                  |j                  k(  r%|j                  |j                  k(  r|j                  }||t        j                  |t
        j                  j                               j                  d      t        j                  |t
        j                  j                               j                  d      fS ||t               j                  }||t        ||      \  }}||||fS |t        |      \  }}||||fS ||d d fS )Nr   rq  r  )r  r   r&  r   r'  r	   combiner  r
   r  r  r  r  )	r&  r'  r)  r*  effective_yeareffective_monthinclusive_endstart_bound	end_bounds	            rJ  _resolve_purchase_period_boundsr  >  sQ    NO*d#
8T(B!'__N 9!#44"z-:L:L'LQ[QaQaerexexQx(..OZ):):)<=FFGZ[Xx||'8'8':;DDEXY	
 	
 ^3+-22!e&7!.~u!EYYFF!!-n!=YYFF?D$66r  c                :    dj                  d | xs dD              S )Nr
  c              3  B   K   | ]  }|j                         s|  y wrD  r  )rH  chars     rJ  rK  z _phone_digits.<locals>.<genexpr>b  s     DDT\\^4D   r  r  s    rJ  _phone_digitsr  a  s    77DU[bDDDr  c                    | xs dj                         }|sy t        j                  d|      sy |j                  d      }dj	                  d |D              }t        |      dk  st        |      dkD  ry |rd| S |S )Nr
  z[\d\s()+\-./]++c              3  B   K   | ]  }|j                         s|  y wrD  r  r$  s     rJ  rK  z,_normalize_customer_phone.<locals>.<genexpr>m  s     O99;L;L;NYOr  r      )r  rF  r'  r  r  r  )r  r  has_plus_prefixdigitss       rJ  _normalize_customer_phoner  e  s|    {!!#G<<)73((-OWWOOOF
6{Q#f+**Qvh<66r  c                    | y t        | t              r| j                  d      S t        |       j	                         }t        |      dk\  r|d d S |S )N%H:%Mr.   )r  r
   r  r  r  r  r  s     rJ  _format_clockr  s  sP    }%~~g&&u:D4yA~48/4/r  c                4    | y | j                         }|xs d S rD  r  r  r  s     rJ  _clean_optional_textr  |  s    }kkmG?dr  c                    | j                         j                         }|j                         rt        |      S t        j                  |      S rD  )r  r  r  r  _ITALIAN_SMALL_NUMBERSrn  r  s     rJ  _parse_small_number_tokenr    s;    kkm$$&G7|!%%g..r  c                p    t         j                  |       }|sy |j                  d      j                         S rW  )_EMAIL_PATTERNr3  r  r  incoming_textr  s     rJ  _extract_explicit_emailr    s/    !!-0E;;q>!!r  c                f    t         j                  |       }|sy t        |j                  d            S Nr   )_PHONE_PATTERNr3  r  r  r  s     rJ  _extract_explicit_phoner    s+    !!-0E$U[[^44r  c           	     P   | j                         }t               }d|v r|t        d      z   S d|v r|t        d      z   S d|v sd|v sd|v r|S t        j                  d	|       }|rK	 t        j                  |j                  d       d
|j                  d       d
|j                  d             S t        j                  d|       }|sy t        |j                  d            }t        |j                  d            }|j                  d      }||j                  }n(t        |      dk(  rdt        |      z   }nt        |      }	 t        |||      }	|"|	|k  r	 t        |j                  dz   ||      }	|	S |	S # t        $ r Y y w xY w# t        $ r Y y w xY w# t        $ r Y y w xY w)N
dopodomanir   rq  r   r   r   ru  r   rv  rw  r   rx  ry  rz  )
r  r  r{  r|  r}  r~  r  r  r&  resolveds
             rJ  _extract_explicit_dater    s   $$&G$&KwYA...7YA...G}76W;L		:MJI	%%);(<Aiooa>P=QQRS\SbSbcdSeRf&ghh ))E}UKK%%a()Ik''*+K""1%J	ZA	c*o%:k95 h4	K,,q0+yIH O8O7  		&    		s7   (A	E; F
 F ;	FF
	FF	F%$F%c                   g }t               }t        j                  d|       D ]p  }t        |j	                  d            }t        |j	                  d            }|dd|d}||v rE|j                  |       |j                  t        ||             r | j                         t        j                  d| t        j                        D ]  }t        |j	                  d            }|dk  r t        fdd	D              r|dk(  rdn|dz   }|dk  r|dd
}n|dd
}||v rY|j                  |       |j                  t        j                  |              |S )N!\b([01]?\d|2[0-3])[:.]([0-5]\d)\br   r   r  :z+\balle\s+([01]?\d|2[0-3])(?!\s*[:.]\d{2})\br5  c              3  &   K   | ]  }|v  
 y wrD  r  )rH  r  r  s     rJ  rK  z*_extract_explicit_times.<locals>.<genexpr>  s     #dEW$4#dru  )r   r   
pomeriggioz:00)rK  rF  finditerr  r  r  r  r
   r  r  r)  r  )r  matchesrS  r  
hour_valueminute_valuer  r  s          @rJ  _extract_explicit_timesr    sW   GUDA=Q 7Q(
5;;q>*"3'qc(:;
tJ567 $$&GK]\^\i\ij 7Q(
#dBc#d d)R/Z"_J&s+3/J&s+3/Jt))*567 Nr  c                    g d}|D ]J  }t        j                  || t         j                        }|s+t        |j	                  d            }|H|c S  y )N)z\bsiamo in (\d{1,3})\bz5\bper (\d{1,3}) (?:persone|persona|coperti|coperto)\bz1\b(\d{1,3}) (?:persone|persona|coperti|coperto)\bzJ\bsiamo in (un|una|uno|due|tre|quattro|cinque|sei|sette|otto|nove|dieci)\bzi\bper (un|una|uno|due|tre|quattro|cinque|sei|sette|otto|nove|dieci) (?:persone|persona|coperti|coperto)\bze\b(un|una|uno|due|tre|quattro|cinque|sei|sette|otto|nove|dieci) (?:persone|persona|coperti|coperto)\br   )rF  r3  r  r  r  )r  patternsr5  r  rY  s        rJ  _extract_explicit_guest_countr    sX    H  		'="--@*5;;q>:M r  c                n    | sy| j                         j                         dv ryt        d | D              S )NF>   unknownsconosciutoc              3  <   K   | ]  }|j                           y wrD  r"  r$  s     rJ  rK  z&_is_meaningful_name.<locals>.<genexpr>  s     :yy  ":r&  )r  r  r)  r  s    rJ  _is_meaningful_namer    s4    {{}#==:E:::r  c                    g d}|D ]n  }t        j                  || t         j                        }|s+t        j                  dd|j	                  d            j                  d      }t        |      sl|c S  y )N)uo   \ba\s+nome\s+di\s+([A-Za-zÀ-ÿ][A-Za-zÀ-ÿ' .-]{1,80}?)(?=\s+(?:per|il|domani|oggi|dopodomani|alle)\b|[,.]|$)uj   \ba\s+nome\s+([A-Za-zÀ-ÿ][A-Za-zÀ-ÿ' .-]{1,80}?)(?=\s+(?:per|il|domani|oggi|dopodomani|alle)\b|[,.]|$)ur   \bper\s+conto\s+di\s+([A-Za-zÀ-ÿ][A-Za-zÀ-ÿ' .-]{1,80}?)(?=\s+(?:per|il|domani|oggi|dopodomani|alle)\b|[,.]|$)uf   \bnome\s+([A-Za-zÀ-ÿ][A-Za-zÀ-ÿ' .-]{1,80}?)(?=\s+(?:per|il|domani|oggi|dopodomani|alle)\b|[,.]|$)r  r  r    .,-)rF  r3  r  r  r  r  r  )r  r  r5  r  r	  s        rJ  _extract_explicit_namer    sn    H  		'="--@FF63A7==fE	y) r  c                   t        |       }|r|S | }t        j                  dd|      }t        j                  d|      }t        j                  dd|      }t        j                  dd|t        j                        }t        j                  dd|      }t        j                  dd|      }t        j                  dd|t        j                        }t        j                  d	d|t        j                        }t        j                  d
d|      }t        j                  dd|      j                  d      }t        |      sy |S )Nr  r  r  z\balle\s+([01]?\d|2[0-3])\br  rv  z \b\d{1,2}/\d{1,2}(?:/\d{2,4})?\ba)  \b(?:aggiungi|aggiungere|crea|creare|inserisci|inserire|prenota|prenotare|prenotazione|prenotazioni|modifica|modificare|sposta|spostare|cambia|cambiare|annulla|annullare|cancella|cancellare|elimina|eliminare|domani|oggi|dopodomani|stasera|questa|sera|per|alle|di|il|la|una|un|sig|signor|signora)\bzq\b(?:un|una|uno|due|tre|quattro|cinque|sei|sette|otto|nove|dieci|\d{1,3})\s+(?:persone|persona|coperti|coperto)\bu   [^\wÀ-ÿ' -]+r  r  )r  rF  r  r  r  r  r  )r  rb  r  s      rJ  "_extract_reservation_customer_namer    s   %m4HGff2CAG  g.Gff93HGff3S'WGff5sGDGff8#wGGff	e 	mmG ff	1mmG ff&W5GffVS'*008Gw'Nr  c                n   t        | t        j                        r~| j                  }	 |j	                         }t        |t              r|j                  d      }t        |t              rg }|D ]f  }t        |t              st        |j                  d      xs |j                  d      xs d      j                         }|sV|j                  |       h |rdj                  |      S t        |t              r |j                         r|j                         S |j                  d      }t        |t              r |j                         r|j                         S |j                  j                         }|r"dj                  |j                               d d S t        |       S # t
        $ r d }Y zw xY w)Nr  msgr  r
  r  i,  )r  httpxHTTPStatusErrorresponser   r?  r  rn  r  r  r  r  r  r  r  r%   )	r:  r  r  r  messagesro  item_messager  bodys	            rJ  _extract_http_error_detailr  0  s[   #u,,-<<	mmoG gt$[[*F&$'" :D!$-'*488E?+Wdhhy>Q+WUW'X'^'^'`'$OOL9	:
 88H--&#&6<<>||~%kk),G'3'GMMO}}&}}""$88DJJL)$3//"3''+  	G	s   F% %F43F4c                z	   g }g }t        |j                  |j                  |j                  |j                        \  }}}}|&|$|j                  d       |j                  ||g       |rddj                  |       nd}t        |       5 }	t        |	d      }
t        |	d      }d|
v rd	nd
}d|v rdnd
}d|v rdnd
}| d}| d}d|
v rdnd}d|
v rdnd}dD cg c]  \  }}||
v s||v r| }}}dj                  ddddg|      }|	j                  d| d| d| d| d| d | d!| d"| d#| d$| d%| d&| d'|      j                         }d d d        g }D ]z  }|d(    d)|d*    d)|d+    }|j                  j                         rt        |j                  |      nd,}|j                  j                         r|d-k  rh|j                  ||f       | |j                  d. /       d0}d-}d-}d-}d-} d-}!|D ]f  \  }"}t!        |d1   xs d-      }#t#        |d2         }$|$|d3z  }||#z  }n
|d3z  }||$z  }| t!        |d4   xs d-      z  } |!t!        |d5   xs d-      z  }!h |d |j$                   }%t'        d6 |%D              }&t'               }'|%D ]3  \  }"}t)        |d(         }(|(s|'|(xx   t!        |d1   xs d-      z  cc<   5 i d7|j                  d8|d9|d:t+        |j                  t,              r|j                  j/                         nd d;t+        |j                  t,              r|j                  j/                         nd d<t1        |      d=t1        |%      d>|rt3        |d?      nd d@|dA|dB|d4| d5|!dC|r|!d-k(  rdDndEdF|&j5                         dG|'j5                         D (#cg c]
  \  }(}#|(|#dH c}#}(dI|%D cg c]  \  }}|dJ   |d(   t)        |d(         |d*   |d+   |d   |d   n|d   |d   t!        |d1   xs d-      t#        |d2         t!        |dK   xs d-      |d   |d   t7        t!        |d1   xs d-      t9        |d(   xs d      t9        |d*   xs d      |d   |d   L      t;        |dM         t3        |dN      dO c}}S c c}}w # 1 sw Y   WxY wc c}#}(w c c}}w )PNr&  r'  r)  r*  6batches.confirmed_at >= ? AND batches.confirmed_at < ?WHERE r  r
  r  r  r  rO  NULLfinal_price_vat_snapshotitems.final_price_vat_snapshotestimated_line_totalitems.estimated_line_total AS final_price_vat AS final_price_vat_snapshotr  rS  rT  r   rU  rV  )rW  )r  r  rX  rY  r<  zitems.product_iditems.product_namezitems.lot_codeitems.supplier_namez
            SELECT
                items.product_id,
                items.product_name,
                items.lot_code,
                items.supplier_name,
                rZ  zW,
                SUM(items.quantity) AS total_quantity,
                SUM(CASE WHEN zW IS NOT NULL THEN 1 ELSE 0 END) AS snapshot_priced_rows,
                SUM(CASE WHEN z IS NULL AND zV IS NOT NULL THEN 1 ELSE 0 END) AS fallback_priced_rows,
                SUM(COALESCE(z, CASE WHEN z# IS NOT NULL THEN items.quantity * as   ELSE NULL END)) AS total_amount_sum,
                COUNT(DISTINCT items.batch_id) AS order_count,
                MAX(batches.confirmed_at) AS last_ordered_at
            FROM ordini_items AS items
            JOIN ordini_batches AS batches ON batches.id = items.batch_id
            LEFT JOIN ordini_products AS products ON products.id = items.product_id
            z
            GROUP BY z
            r  r  r  r  r  r   c                    | d    t        | d   d   xs d       | d   d   j                         | d   d   j                         fS )Nr   r   r  r  r  )r  r  r  s    rJ  rk  z$_purchase_overview.<locals>.<lambda>  sV    1XIq*+0q11!H_%++-!H^$**,	
 r  rl  r  r  total_amount_sumr   snapshot_priced_rowsfallback_priced_rowsc              3  ,   K   | ]  \  }}|d      yw)r  Nr  )rH  rB  rJ  s      rJ  rK  z%_purchase_overview.<locals>.<genexpr>  s     K3s?3Ks   r  r&  r'  r)  r*  matched_country  estimated_total_amountr   priced_variant_countmissing_price_variant_countmissing_price_quantitypricing_basisorder_snapshotsnapshot_or_current_catalogtop_supplierslikely_brands)brandr  rL  r
  order_countrH  r  r  r  r   r  r   )r
  r  rv  r  r  r  r  r  r  r  r  r   total_litersr  rx  )r  r&  r'  r)  r*  r  r  r  r#  r=  r  rd  r  r  r?  rn  r  rZ  r  r   r  r  r   r/  r  r  most_commonrg  r  r  ))r  r$  filtersparamsr  r  r  r  where_clauser"  r\  item_columns
price_exprsnapshot_price_exprline_total_exprr^  select_snapshot_pricerb  rc  rd  r[  re  rf  rQ  rp  rJ  r  r  r  r  r  r  r  r  rB  rH  estimated_amountselectedsupplier_counterbrand_counterr  s)                                            rJ  _purchase_overviewr  M  s   GF>]YYjj??	?;NO[) 9#8OP{I./7>VGLL123BL	!'	* 6j/
<MN,ZH3D3W/]c
B\`lBl>rx:PT`:`6fl$.</B!C#6"77S T=MQ`=` 9f~?PTc?c!;  jC(

# o-l* 

 

 yy"$ %	
 #
 !! (( )&' (&' ('( )./ 0./}ZL I-.l:,Fijtiu v N "^ $), /
0 (*1 	=6p /1F $N+,Ac*o->aO@T?UV
IMIYIYI[-djj*Ead::%1*ucl#$ KK
   !"# 
F3s+,121#6H2IJ#'1,'"h." A% "&66"C(>$?$D1 EEC(>$?$D1 EE
F l

#HK(KKIM D3%c.&9:% C,<(=(B$CC D
+++ 	+ 	ZQU5Vdoo//1\`	+
 	DMM41PDMM++-VZ+ 	V+ 	X+ 	!FZ%(>"B`d+ 	 4+ 	&'B+ 	!"8+ 	 4+ 	 4+ 	-AFZ^_F_)  fC+ 	)557+  	^k^w^w^yz?5RZEXFz!+" 	0 '1
0 s- ",/ #N 3 5c.6I J
O!$_!5FIJdFeFq3'A#Bwz  |M  xN,/0J,K"%c*:&;&@q"A*@EWAX*Y"3}#5#:;"%&6"7#&'8#9 6 %5!6!;!<!$S%8%>B!? Z!6B7#&'7#8$'(9$:! $7s;L7M#N$UA+
#+ +s

6 6f {
s-   AR$R0AR$0R1
	CR7
R$$R.c                    d fd} |j                   j                        } |j                  j                        }j                  j                   j                  j                  j                  j
                  j                  ||t        |d         t        |d         z
  t        |d         t        |d         z
  t        |d         t        |d         z
  dS )Nc                H   |t        | |      n
t        |       \  }}t              5 }t        |d      }t        |d      }d|v rdnd}d|v rdnd}d|v rd	nd}	| d
}
| d}|	 d}|j	                  d|
 d| d| d||f      j                         }d d d        g }t               }i }D ]  }|d    d|d    d|d    }j                  j                         rt        j                  |      nd}j                  j                         r|dk  ri|j                  |       |j                  t        |d                t        |d         t        |d         t        |d         f}|j                  ||d   |d   |d   t               ddddt        |d         d	      }|d   }t!        |t              r|j                  t        |d                t        |d   xs d      }t        |d         |z   |d<   t#        |d         }|t%        ||d         }|d|d <   |d|d!<   t'        |d"         |z   |d"<   t        |d         xs d#}|s|t        |d$   xs d#      kD  s||d$<    g }|j)                         D ]  }t!        |d   t              r|d   n	t               }|j                  |d   t+        t        |d               |d   |d   t-        |      t        |d         |d!   rt/        t'        |d"         d%      nd |d$   d&        |j1                  d' (       t3        d) |D              }|D cg c]  }|j5                  d"      | }}| |j                  t-        |      t-        |      t-        |      ||rt/        t3        d* |D              d%      nd t3        d+ |D              t3        d, |j)                         D              |r"t7        d- |j)                         D              sd.nd/|d j8                   d0S # 1 sw Y   xY wc c}w )1Nr  r  r  rO  r  r  r  r  r  r  r  z AS estimated_line_totala  
                SELECT
                    batches.id AS batch_id,
                    batches.confirmed_at,
                    items.product_name,
                    items.lot_code,
                    items.supplier_name,
                    items.quantity,
                    z,
                    az  
                FROM ordini_items AS items
                JOIN ordini_batches AS batches ON batches.id = items.batch_id
                LEFT JOIN ordini_products AS products ON products.id = items.product_id
                WHERE batches.confirmed_at >= ? AND batches.confirmed_at < ?
                ORDER BY batches.confirmed_at DESC, items.product_name ASC
                r  r  r  r  r  r   r=  r  Fconfirmed_at)	r  r  r  distinct_batch_idsr  r  has_price_datauses_fallback_pricer  r	  rH  r  rH  r  Tr	  r	  r  r
  r  r   )r  rv  r  r  r  r  r  r  c                t    t        | d          t        | d          t        | d         j                         fS Nr  r  r  r  r  r  rj  s    rJ  rk  zB_purchase_period_comparison.<locals>.load_period.<locals>.<lambda>I  s@    T-())T*+,,D()//1 r  rl  c              3  8   K   | ]  }t        |d            ywr  Nr  rH  ro  s     rJ  rK  zC_purchase_period_comparison.<locals>.load_period.<locals>.<genexpr>O  s     YTS&6!78Yr  c              3  X   K   | ]"  }t        |j                  d       xs d       $ yw)r  r  Nr  rn  r	  s     rJ  rK  zC_purchase_period_comparison.<locals>.load_period.<locals>.<genexpr>Y  s&     /}eidhh?W6X6_\_0`/}   (*c              3  D   K   | ]  }|j                  d       d  yw)r  Nr   rn  r	  s     rJ  rK  zC_purchase_period_comparison.<locals>.load_period.<locals>.<genexpr>Z  s"     .TTXT\T\]uTvT~q.     c              3  D   K   | ]  }|j                  d       sd  yw)r	  r   Nr	  r	  s     rJ  rK  zC_purchase_period_comparison.<locals>.load_period.<locals>.<genexpr>[  s     /sdSWS[S[\qSr/sr	  c              3  >   K   | ]  }|j                  d         yw)r	  Nr	  r	  s     rJ  rK  zC_purchase_period_comparison.<locals>.load_period.<locals>.<genexpr>\  s#       MLquTXXVkMl  MLs   r  r  )r&  r'  r  distinct_ordersdistinct_productsmatched_rowsr  r  r  fallback_price_variant_countr  r  )r  r  r#  r=  r  rd  rK  r  r  r?  r  r  r  r  r  r  r  rZ  r  r  rK  r  r  r  rn  r  rn  r)  r  ) r&  r'  r  r  r"  r\  r  r  r  r  r^  r  select_line_totalrQ  r	  r	  r  rJ  r  r  rF  r  	batch_idsrH  r  current_valueserialized_variantsr  ro  priced_variantsr$  r  s                                  rJ  load_periodz0_purchase_period_comparison.<locals>.load_period  s   383D]4/,W[J\
s%g. 	*3J@QRO0^LL7HO7[3agJF`dpFp"Bv|>TXd>d:jpO(2|3F%G"':&;;W$X!#2"33K L%% ,, -*+ ,&' (" %& hj' 	< +-'*uBD %	9C/0#j/1B!CDXCYZJMQZZM]M]M_1$**jIehEzz!eqj$""3s:#78s>*+SZ-A3s?G[C\]C''$'$7 #J%(%9*-%&'.1&++0':3~;N'O
E 23I)S)c#j/233z?/a0H&)%0@*A&BX&ME"#5c:P6QR'#98]`ar]s#t #/37E/0+*.&'27>V8W2X[k2k.//N0CDJMU;L5M5SQS1T!T+8'(K%	9N !__& 	E7A%H\B]_b7c23ilinI&&$).$9$9#eN>S:T$U %j 1%*?%;#&y>&)%0@*A&BbghxbyeE%@X:Y4Z\].^  @D',->'?		 	   	! 	
 YEXYY,?rD488LdCeCq4rrZZ"#56!$%8!9-, FUeC/}m|/},}  @A  'B  [_+..=P.+,//shoo>O/s,s1@  ML  zB  zI  zI  zK  ML  JL-  Ro+Ldjj9
 	
C	 	@ ss   A,PPPPr	  r	  r  )r  r0  r1  r2  r3  r5  r6  primary	secondarydelta_productsdelta_ordersrE  )r&  r  r'  r%  r  r  )r0  r1  r2  r3  r  r5  r6  r  )r  r$  r	  r 	  r!	  s   ``   rJ  _purchase_period_comparisonr$	    s    p
d $++T-?-?@GD//1E1EFI))++--//oo $ 9 9g&9:;c)L_B`>aaG$567#iHY>Z:[[g&6783yIY?Z;[[ r  c                	   g }g }t        |j                  |j                  |j                  |j                        \  }}}}|&|$|j                  d       |j                  ||g       |rddj                  |       nd}t        |       5 }	t        |	d      }
d|
v rdnd	}d
|
v rdnd}|	j                  d| d| d| d|      j                         }d d d        g }t               }i }D ]  }|d    d|d    d|d    }|j                  j                         rt        |j                  |      nd}|j                  j                         r|dk  ri|j                  |       |j!                  t#        |d                t%        |d         t%        |d         t%        |d         f}|j'                  ||d   |d   |d   t               ddt)        |d         t)        |d         |d   |d
   d
      }|d   }t+        |t              r|j!                  t#        |d                t#        |d         t#        |d   xs d      z   |d<   t-        t#        |d   xs d      t%        |d   xs d      t%        |d   xs d      |d   |d
         }|t/        |d         |z   |d<   t%        |d    xs d      }t%        |d!   xs d      }t)        |d         xs d}|r||k  r||d <   |r||kD  s	||d!<    g }|j1                         D ]  }t+        |d   t              r|d   n	t               }|j                  |d   t3        t%        |d               |d   |d   t5        |      t#        |d         t/        |d         dkD  rt7        t/        |d         d"      nd |d   |d
   |d    |d!   d#        |j9                  d$ %       t;        d& |D              }t;        d' |D              }t=        d( |D        d )      }t?        d* |D        d )      }|j                  ||t+        |j                  t@              r|j                  jC                         nd t+        |j                  t@              r|j                  jC                         nd t5        |      t5        |      ||dkD  rt7        |d"      nd |||d |jD                   d+S # 1 sw Y   xY w),Nr  r  r  r  r
  r  r  rS  rT  r   rU  rV  z
            SELECT
                batches.id AS batch_id,
                batches.confirmed_at,
                items.product_name,
                items.lot_code,
                items.supplier_name,
                items.quantity,
                rZ  z
            FROM ordini_items AS items
            JOIN ordini_batches AS batches ON batches.id = items.batch_id
            LEFT JOIN ordini_products AS products ON products.id = items.product_id
            T
            ORDER BY batches.confirmed_at DESC, items.product_name ASC
            r  r  r  r  r  r   r=  r  r	  )
r  r  r  r	  r  r  first_ordered_atr  r  r   r	  r  rH  r  r  r'	  r  r   )r  rv  r  r  r  r  r  r  r   r'	  r  c                t    t        | d          t        | d          t        | d         j                         fS r	  r		  rj  s    rJ  rk  z%_purchase_frequency.<locals>.<lambda>  s@    m$%%&'((^$%++-
 r  rl  c              3  8   K   | ]  }t        |d            ywr	  r	  r	  s     rJ  rK  z&_purchase_frequency.<locals>.<genexpr>  s     UT"234Ur  c              3  d   K   | ](  }|j                  d       t        |d    xs d       * yw)r  Nr  )rn  r  r	  s     rJ  rK  z&_purchase_frequency.<locals>.<genexpr>  s;       Cd]a]e]eft]u  ^BuT.18S9  Cs   00c              3  \   K   | ]$  }|j                  d       st        |d           & yw)r'	  Nrn  r  r	  s     rJ  rK  z&_purchase_frequency.<locals>.<genexpr>  s*     zd]a]e]efx]yC%7 89z   ,,)r  c              3  \   K   | ]$  }|j                  d       st        |d           & yw)r  Nr,	  r	  s     rJ  rK  z&_purchase_frequency.<locals>.<genexpr>  s*     wD[_[c[cdu[v3t$567wr-	  )r  r&  r'  r)  r*  r	  r	  r  r  r'	  r  r  )#r  r&  r'  r)  r*  r  r  r  r#  r=  r  rd  rK  r  r  r?  r  r  r  r  r  r  rg  r  rK  r  r  r  rn  r  r  r  r   r/  r  ) r  r$  r  r  r  r  r  r  r  r"  r\  rb  rc  rQ  r	  r	  r  rJ  r  r  rF  r  r	  line_litersfirst_value
last_valuer	  r	  r  r  r'	  r  s                                    rJ  _purchase_frequencyr2	  r  s   GF>]YYjj??	?;NO[) 9#8OP{I./7>VGLL123BL	!'	* j/
<MN=MQ`=` 9f~?PTc?c!;  jC!! '' ('( ) N   #
$ (*% 		0 ')L#&5>@H *5N+,Ac*o->aO@T?UV
IMIYIYI[-djj*Ead::%1*C s3z?343~&'S_)=s3CW?XY## #N 3
O!$_!5&)e"# #$7N8K$L#6s>7J#K"%&6"7#&'8#9
 ./	i%MM#c*o./"%e,<&=">S_EYXYAZ"Z,Z-A.S06B7Z.B//0 12
 "$)%*?$@;$NE.!% 239r:017R8
+C,?@FBmk9(5E$%]Z7'4E#$U*5X " 
3=eDX>Y[^3_E./ehej	"" %n 5 5c%:O6P Q!*-!&!7"9~"%e,<&=">JOPUVdPeJfijJjeE.,A&BA Fpt"'(8"9#():#;$)*<$=#():#;	

$ 
   UATUUN  CFY  C  CLzFYz  EI  JwDWw  BF  GO  5?QU5Vdoo//1\`1;DMM41PDMM++-VZ12L)(2>2BlA.,*'$**5 O s   AS

Sc                   g }g }|j                   }|j                  }|j                  ,|j                  d       |j                  |j                         |j                  |j                  t        j                  |j                  t
        j                  j                               j                  d      }t        j                  |j                  t
        j                  j                               t        d      z   j                  d      }|j                  d       |j                  ||g       np|j                  dt        |j                   |j                  |j                  |j                        \  }}}}	|&|	$|j                  d       |j                  ||	g       |rddj                  |       nd	}
t!        |       5 }t#        |d
      }t#        |d      }t#        |d      }d|v rdnd}d|v rdnd}d|v rdnd}d|v rdnd}|j%                  d| d| d| d| d|
 d|j&                  dk(  rdnd d|      j)                         }d d d        i }D ]  }t+        |d          }|d!    d"|d#    d"|d$    }|j,                  j/                         rt1        |j,                  |      nd%}|j3                  |||d&   t5        |d'         t7        |d         d(d(t9               g g d(d(d(d)|j,                  j/                         rd*nd%d+      }t+        |d,         dz   |d,<   t+        |d-   xs d(      }t+        |d.         |z   |d.<   t7        |d         }|t;        ||d   /      }|d0|d1<   |Vt+        |d2         dz   |d2<   |j=                  d      Et7        |j=                  d3            xs d*}t?        ||z   d4      |d3<   nt+        |d5         dz   |d5<   |d6   }tA        |t8              r|jC                  tE        |d$                |d7   |d!   tG        |d!         |d#   |d$   |t7        |d         t7        |d         |d8	}|d9   j                  |       |j,                  j/                         rK|d(kD  rF|j=                  d:      }tA        |tH              r|j                  |       t+        |d;         |z   |d;<   |j,                  j/                         s|tK        |d<         kD  s||d<<    g } |jM                         D ]T  }tK        |d<         }|j,                  j/                         r|d(k  r2tA        |d6   t8              rtO        d= |d6   D              ng }!tA        |d9   tH              r|d9   ng }"t7        |j=                  d            }#|#t7        |j=                  d3            }#| j                  |d    |d&   |d'   |#|d,   |d.   |!|d2   |d5   |#tQ        |j=                  d1            sd>nd?|"tA        |j=                  d:      tH              r|j=                  d:      ng t+        |j=                  d;      xs d(      t?        |d@      dA       W |j,                  j/                         r6| jS                  dB |j&                  dk7  C       | jS                  dD d0C       n!| jS                  dE |j&                  dk7  C       | d |jT                   } |j,                  |j                  tA        |j                  tV              r|j                  jY                         nd ||tA        |j                  tV              r|j                  jY                         nd tA        |j                  tV              r|j                  jY                         nd |j&                  t[        |       | dF
S # 1 sw Y   jxY w)GNzbatches.id = ?r  r   rq  r  r  r  r  r
  r  r  r  total_estimated_amountzbatches.total_estimated_amountr  r  r  r  r  r  rO  z
            SELECT
                batches.id AS batch_id,
                batches.staff,
                batches.confirmed_at,
                z AS total_estimated_amount,
                items.product_id,
                items.product_name,
                items.lot_code,
                items.supplier_name,
                items.quantity,
                z. AS final_price_vat_snapshot,
                z* AS estimated_line_total,
                z AS final_price_vat
            FROM ordini_batches AS batches
            JOIN ordini_items AS items ON items.batch_id = batches.id
            LEFT JOIN ordini_products AS products ON products.id = items.product_id
            z+
            ORDER BY batches.confirmed_at earliestASCDESCz, items.id ASC
            r=  r  r  r  r  r  r  r	  r   Fr  )r=  r  r	  r4	  total_linesr  supplier_namesrL  matched_itemsmatched_total_quantitypriced_linesmissing_price_linesr	  rx  r8	  rH  r  r	  Tr	  r<	  _calculated_total_amountr   r=	  r9	  r
  )	r
  r  rv  r  r  rH  r  r  r  rL  r:	  r;	  rx  c              3  2   K   | ]  }t        |        y wrD  r  rH  r  s     rJ  rK  z$_purchase_batches.<locals>.<genexpr>v  s     NdD	NrG  r  r  r   )r=  r  r	  r4	  r8	  r  r9	  r<	  r=	  r  rL  r:	  r;	  rx  c                &    t        | d   xs d      S Nr	  r
  r@	  r%  s    rJ  rk  z#_purchase_batches.<locals>.<lambda>      E.4I4OR0P r  rF  reversec                    t        | d         S )Nrx  r  rD	  s    rJ  rk  z#_purchase_batches.<locals>.<lambda>  s    eM6J0K r  c                &    t        | d   xs d      S rC	  r@	  rD	  s    rJ  rk  z#_purchase_batches.<locals>.<lambda>  rE	  r  )
r  r=  r>  r&  r'  r)  r*  r@  ry  batches).r&  r'  r=  r  r>  r	   r  r  r
   r  r   r  r  r)  r*  r  r#  r=  r  r@  rd  r  r  r  r?  r  r  rZ  rK  r  rn  r  r  r  r  r  r  r  rK  r5  r  rn  r  r   r/  r  )$r  r$  r  r  r  r  r  r  r  r  r  r"  batch_columnsr  r\  batch_total_exprr  r  current_price_exprrQ  rK	  rJ  r=  r  r  r%  rH  item_estimated_line_totalrunning_totalcast_suppliersitem_payloadr:	  selected_batchesr9	  rL  r4	  s$                                       rJ  _purchase_batchesrT	    s   GFYYNjjO}} '(dmm$#(=  !1!18<<3D3D3FGPPQde 0 0(,,2C2C2EFXYIZZddexyOPucl#		Ba**]]	C
?i "y'<NNSTMM;	237>VGLL123BL	!'	* j-j:JK,ZH/
<MN?W[h?h;ntB\`lBl>rx:PT`:`6fl;LP_;_7ek!!
 "" # %% & ! "#$ % N +48OOz4Q5W]*^ _%( +
, (*- 	@ -/G <)s:'N+,Ac*o->aO@T?UV
IMIYIYI[-djj*Ead""$W 3C4G H*@E]A^*_ "#"%%!#*+ !'(',&*jj&6&6&8sc
&  #5#781<ms:+!,"%e,<&=">"I$:3?U;V$W!$,(>befwbx(y%(4/3+,$0$'n(=$>$BE.!yy12: 6uyyA[7\ ] dad49-Jc:cef4g01+.u5J/K+Lq+PE'(/0nc*s3#789l+/1#n2EFJ 1 (>sC]?^(_5c:K6LM$=

 	gl+::%!)!IIo6M-.$$\2.1%8P2Q.RU].]E*+::%%m0D*E"E#(E- y<)| ! 
eM*+::%1*R\]bcs]tvyRzNe<L6MNN  AC",U7^T"Bg!7		BZ8[!\!)%;EIIF`<a%b"!*-w %n 5*@$]3"'(8"9"0 %n 5',-B'C)5d599MbCc>d "22?I%))TcJdfj?k?!;qs*-eii8P.Q.VUV*W$UA!	

< zz"PZ^ZiZimwZwx"KUYZ"PZ^ZiZimwZwx'$**5 MM7A$BRBRTX7Yt''113_c 5?QU5Vdoo//1\`1;DMM41PDMM++-VZoo%&# K s   B	^99_c                   g }g }t        |j                  |j                  |j                  |j                        \  }}}}|&|$|j                  d       |j                  ||g       |rddj                  |       nd}t        |       5 }	|	j                  d| d|      j                         }
d d d        g }
D ]z  }|d    d	|d
    d	|d    }|j                  j                         rt        |j                  |      nd}|j                  j                         r|dk  rh|j                  ||f       | |j                  d d       |j                  d d       |d |j                   }|j                  ||t!        |j                  t"              r|j                  j%                         nd t!        |j                  t"              r|j                  j%                         nd t'        |      t'        |      |D cg c]V  \  }}|d   |d   t)        |d         |d   |d   t+        |d         |d
   |d   t-        |d   xs d      t/        |d      d
X c}}dS # 1 sw Y   xY wc c}}w )Nr  r  r  r  r
  a  
            SELECT
                batches.id AS batch_id,
                batches.staff,
                batches.confirmed_at,
                items.product_id,
                items.product_name,
                items.lot_code,
                items.supplier_name,
                items.quantity
            FROM ordini_items AS items
            JOIN ordini_batches AS batches ON batches.id = items.batch_id
            r&	  r  r  r  r  r  r   c                $    t        | d   d         S )Nr   r	  r@	  r  s    rJ  rk  z#_purchase_history.<locals>.<lambda>  s    Ca(@$A r  TrF	  c                    | d   S rW  r  r  s    rJ  rk  z#_purchase_history.<locals>.<lambda>  s
    E!H r  r=  r  r	  r
  rH  r   )
r=  r  r	  r
  r  rv  r  r  rH  rx  )r  r&  r'  r)  r*  ry  total_matchesrL  )r  r&  r'  r)  r*  r  r  r  r#  r  rd  r  r  r?  rn  r  r  r   r/  r  r  r  r  r  )r  r$  r  r  r  r  r  r  r  r"  rQ  filteredrJ  r  r  r  s                   rJ  _purchase_historyrZ	    s   GF>]YYjj??	?;NO[) 9#8OP{I./7>VGLL123BL	!'	* j!! N  !
" (*# 	( 13H &N+,Ac*o->aO@T?UV
IMIYIYI[-djj*Ead::%1*%& MMA4MPMM,dM;$**%H 5?QU5Vdoo//1\`1;DMM41PDMM++-VZXX '
 s  
OW 3C4G H!,/ #N 3 5c.6I J
O!$_!5J 415$UA
 ? N
s   %I"AI/"I,c                J   t        | t              r	 t        j                  |       } t        | t
              si S i }| j                         D ]%  \  }}	 t        |      }|dkD  s||t        |      <   ' |S # t        j                  $ r i cY S w xY w# t        t        f$ r Y Vw xY wrW  )
r  r  r   r  r  r  rL  r  rX  r  )raw_payloadr  rF  r  rH  s        rJ  _normalize_suspended_payloadr]	    s    +s#	**[1K k4(	!#J!'') ,
U	5zH a<#+Js3x ,  ## 	I	 :& 		s#   A5 B5BBB"!B"c           
     (   |j                   xs t        |       j                         j                         }t	        |       5 }|j                  d|f      j                         }||dg dcd d d        S t        |d         }|rP|j                  ddj                  dgt        |      z         dt        d	 |D                    j                         ng }|D ci c]  }t        |d
         | }}d d d        g }	j                         D ]K  \  }
}j                  |
      }|	j                  t!        |
      |||d   nd ||d   nd ||d   nd d       M |	j#                  d        d   dt%        |d         |	dS c c}w # 1 sw Y   xY w)NzNSELECT staff, payload, updated_at FROM ordini_suspended_orders WHERE staff = ?F)r  existsrL  r  zSSELECT id, product_name, lot_code, supplier_name FROM ordini_products WHERE id IN (r  r@  r=  c              3  2   K   | ]  }t        |        y wrD  r	  )rH  r
  s     rJ  rK  z(_read_suspended_order.<locals>.<genexpr>  s     <j#j/<rG  r  r  r  r  )r
  rH  r  r  r  c                L    | d   xs dj                         t        | d         fS )Nr  r
  r
  )r  r  rj  s    rJ  rk  z'_read_suspended_order.<locals>.<lambda>  s)    $~"6"<"!C!C!Es4P\K]G^ _ r  rl  r  Tr  )r  r_	  r  rL  )r  r  r  r  r#  r  ra  r]	  r  r  rN  rd  r  rL  rn  r  r  rn  r  )r  r$  r  r"  rJ  r  r  r  products_by_idrL  r
  rH  s               rJ  _read_suspended_orderrc	    s   ZZ2>'299;AACE	!'	* 
Sj  !qtys{|  F  F  H;"ebA
S 
S
 /s9~>   "))abebjbjlokpsvw~sk  cA  bB  BC  D<G<<
 (*R 	 FRR'#gdm,g5RR
S E ' 


H $$Z0!*o$;B;N 7TX3:3FGJ/D=D=P!9VZ	


 
JJ_J`W)#l*;<	 ! S
S 
Ss%   )F4A&FF0FFFc                
   t        | |d      }|sdd g fS t        |      dk(  rd|d   |fS |d   }|d   }|j                  |j                  dz   k\  rd||fS t        |      }|r|t        |j                        k(  rd||fS dd |fS )Nr.   	not_foundr   matchedr   r  	ambiguous)rt  r  r  r  r  )r  r  rp  topsecondr  s         rJ  _resolve_single_productrj	  &  s    HeQ/FD"$$
6{a&)V++
)CAYF
yyFLL3&&#v%%&u-,@P@P0QQ#v%%f$$r  c               L    t        |       }|syt        |      t        |      k(  S NT)r  r  r  placeholderr  s      rJ  "_is_pending_product_identity_valuero	  :  s'    "5)G7#{'CCCr  c               $    t        |       }|xs |S rD  )r  rm	  s      rJ  !_normalize_product_identity_valuerq	  A  s    "5)G!k!r  c                    g }t        | t              r|j                  d       t        |t              r|j                  d       |S )Nrn	  lottor  )ro	  _PENDING_PRODUCT_LOT_CODEr  _PENDING_PRODUCT_SUPPLIER_NAME)r  r  missing_fieldss      rJ  #_incomplete_product_identity_fieldsrx	  F  s?     "N)(@YZg&)-Ecdk*r  c                  t        |t              }t        |t              }| j                  d|||f      j	                         }||S | j                  d|f      j                         }|sy t        |d d      }|D ]j  }	t        |	d   t              }
t        |	d   t              }t        |
t              st        |t              sN|r|
|t        hvr[|r||t        hvrh|	c S  y )	Nrs	  z
        SELECT *
        FROM ordini_products
        WHERE product_name = ? AND lot_code = ? AND supplier_name = ?
        ORDER BY id DESC
        LIMIT 1
        z
        SELECT *
        FROM ordini_products
        WHERE product_name = ?
        ORDER BY updated_at DESC, id DESC
        c                    t        t        | d   t                    t        t        | d   t                    t        | d         fS )Nr  rs	  r  r  )r  ro	  ru	  rv	  rJ  s    rJ  rk  z3_find_existing_product_for_upsert.<locals>.<lambda>t  s?    23z?Pijk233GUstuD	N
 r  TrF	  r  r  )rq	  ru	  rv	  r  ra  rd  r5  ro	  )r"  r  r  r  target_lot_codetarget_supplier_nameexact
candidatesranked_candidatesr	  candidate_lot_codecandidate_supplier_names               rJ  !_find_existing_product_for_upsertr	  O  s.    8NghO<]Xvw	 
(<=	 hj 
 ##	 
 hj  

  ' 	>y?Tb{|"CIoD^  mK  #L./AOhi12IWuv*8=V2WW4]Lj<kk r  c                    t        t        | j                  t                     t        t        | j                  t
                     z   S )Nrs	  )r  ro	  r  ru	  r  rv	  r	  s    rJ  #_product_candidate_identity_qualityr	    sC    5i6H6HVoppqtw.y/F/FTrssu  r  c           	         | yt        t        t        | d      t                     t        t        t        | d      t                     z   S )Nr   r  rs	  r  )r  ro	  r@  ru	  rv	  r{	  s    rJ  _product_row_identity_qualityr	    sM    
{5hsJ6O]vwwx{~.x_/M[yzz|  r  c               P   |s|s|j                         syt        t        |       |d      }|sy|j                  d d       |d   }|j                  dk  ryt        |      }t        |      }|dk  rut        |      dk  rg|D 	cg c]  }	t        |	      |kD  s|	 }
}	t        |
      d	k(  r|
d   }n5t        |
      d	kD  r'|
d   j                  |
d	   j                  d
z   k\  r|
d   }t        |      d	kD  r|d	   nd }|ut        |      }t        |      }|j                  |j                  dz   k\  }||kD  xr7 |dk  xr0 |j                  |j                  k\  xs t        |      dk  xr |dk(  }|s|sy|j                  d|j                  f      j                         }|dfS c c}	w )NNFr   c                    | j                   t        |       | j                  t        t	        | j
                              fS rD  )r  r	  r  r  r  r  r	  s    rJ  rk  z6_resolve_existing_product_for_update.<locals>.<lambda>  s4    OO/	:$$Y../0	
 r  TrF	  r   r   r   r   r  g      ?rl	  z2SELECT * FROM ordini_products WHERE id = ? LIMIT 1F)r  rt  rg  rn  r  r	  r  r  r  r  ra  )r  r"  r  r  r  rp  bestbest_identityrU  r	  richer_candidatesri	  second_identityclearly_betterclearly_more_specificrJ  s                   rJ  $_resolve_existing_product_for_updater	    s    =(:(:(<4W=|QOF
KK
    !9DzzQ7=M"<0LqS.!38>  B9BefoBp  tA  CAY  B  B !Q&$Q'D"#a',=a,@,F,FJ[\]J^JdJdgjJj,j$Q'Df+/VAYtF;DA=fEv||d'::O+ !# 

fll* C%*A}/A 	 &;


QTXT[T[S]
^
g
g
iC:/ Bs   F#F#c                   t        |j                  xs d      j                         }t        |j                        }t        |j
                        }t        |j                        }|sddgddS t        |       5 }|dk(  r|j                  d|||||f      j                         }|sdd	d
cd d d        S t        |      dkD  r|s|sddd
cd d d        S |d   }|j                  dt        |d         f       |j                          dt        |d         |d   |d   |d   t        |d      t        |d      t        |d      t        |d      ddcd d d        S t        ||||      }	t        |d      }
t        |j                         |j"                  |j$                  |j&                  |j(                  t        |j*                        t        |j,                        |j.                  |j0                  d	}|j3                         D ci c]  \  }}||
v s|| }}}t5        d |j7                         D              }t9        |t:              }t9        |t<              }|r^|s\|sZt?        | ||||      \  }}|r|	ddd
cd d d        S |3|	d u xs tA        |	      tA        |      k  }|r|}	t        |	d         xs |}|	:g d }|||dg}|j3                         D ]*  \  }}|	|jC                  |       |jC                  |       , d!jE                  d" |D              }|j                  d#d!jE                  |       d$| d%tG        |             |j                          |j                  d&|||f      jI                         }|tK        d'd()      tM        |d   |d   *      }d+|t        |d         |d   |d   |d   t        |d      t        |d      t        |d      t        |d      dd,cd d d        S d-d.g}g }|xs t9        |	d   t:              }|xs t9        |	d   t<              }t        |	d         |k7  r"|jC                  d/       |jC                  |       t        |	d         |k7  r"|jC                  d0       |jC                  |       t        |	d         |k7  r"|jC                  d1       |jC                  |       |j3                         D ]-  \  }}|	|jC                  | d2       |jC                  |       / t        |      d3kD  r?|j                  d4d!jE                  |       d5tG        |t        |	d         gz                n|j                  d6t        |	d         f       |j                          |j                  d7t        |	d         f      jI                         }|tK        d'd8)      tM        |d   |d   *      }d9|t        |d         |d   |d   |d   t        |d      t        |d      t        |d      t        |d      dd,cd d d        S c c}}w # 1 sw Y   y xY w):Nr  clarification_requiredznome prodottozPer registrare il prodotto scrivimi almeno il nome prodotto. Se li hai, aggiungi anche lotto, fornitore, codice, prezzo, iva, categoria e note. Se qualche dato ti manca, lo salvo comunque e lo completiamo dopo.re  rw	  r  deletea2  
                SELECT *
                FROM ordini_products
                WHERE active = 1
                  AND product_name = ?
                  AND (? IS NULL OR lot_code = ?)
                  AND (? IS NULL OR supplier_name = ?)
                ORDER BY updated_at DESC, id DESC
                re	  z9Non trovo un prodotto attivo corrispondente da eliminare.re  r  r   zjHo trovato piu varianti del prodotto. Indicami almeno lotto o fornitore per eliminarlo in modo affidabile.r   zRUPDATE ordini_products SET active = 0, updated_at = CURRENT_TIMESTAMP WHERE id = ?r  deletedr  r  r  r  r  r  r  )r  r  r  r  r  r  r  r  )re  r  r  r  r  r  )	r  r  r  r  r  r  r  r  r   c              3  $   K   | ]  }|d u 
 y wrD  r  rH  r  s     rJ  rK  z"_upsert_product.<locals>.<genexpr>!  s     #\%E$5#\   rs	  zHo trovato piu prodotti compatibili con l'aggiornamento. Indicami il nome completo oppure aggiungi lotto o fornitore per aggiornare la variante giusta.)r  r  r  activer<  c              3      K   | ]  }d   ywr?  r  rA  s     rJ  rK  z"_upsert_product.<locals>.<genexpr>E  s     $:QS$:rC  zINSERT INTO ordini_products (rL  r=  z
                SELECT *
                FROM ordini_products
                WHERE product_name = ? AND lot_code = ? AND supplier_name = ?
                ORDER BY id DESC
                LIMIT 1
                rG  z#Prodotto creato ma non ricaricabiler  )r  r  created)re  pending_fieldsr  z
active = 1zupdated_at = CURRENT_TIMESTAMPzproduct_name = ?zlot_code = ?zsupplier_name = ?z = ?r   zUPDATE ordini_products SET z WHERE id = ?zRUPDATE ordini_products SET active = 1, updated_at = CURRENT_TIMESTAMP WHERE id = ?z*SELECT * FROM ordini_products WHERE id = ?z'Prodotto aggiornato ma non ricaricabileupdated)'r  r  r  r  r  r  r  r#  r  rd  r  r  commitr@  r	  r=  r  r  r  r  r  r  r  r  r   rL  r)  rK  rq	  ru	  rv	  r	  r	  r  r  rN  ra  r   rx	  )r  r$  r  r  r  r  r"  candidate_rows
target_rowexistingr\  optional_fieldsr  r  update_fields_presentnormalized_lot_codenormalized_supplier_nameresolved_existingambiguous_resolutionshould_replace_existingr^  rK  rU  product_rowr	  assignmentsr  next_lot_codenext_supplier_names                                rJ  _upsert_productr	    s&   DNN.h/557I'(9(9:L#DMM2H(););<M../U	
 	
 
"'	* w
j '// x=-P hj  ""-9tuw
 w
  >"Q&6 K#w
 w
* (*JdZ%&( #j./$.~$> *: 6%/%@$,Z$H'/
<M'N)1*>Q)R (Z @	7w
 w
R 5%'	
 0
<MN 11B1BC#33!%!7!7,T]];)$**5"11#33

 GVF[F[F]1BUako~a~:u, ##\?CYCYC[#\ \?Vop#D]`~#  -6Z)!+733 $(86yUw
 w
b !,*2d*: +1(;>[\m>nn ( +0H#78P#Q#aUaLMG$02EG_ab#cF%4%:%:%< %!
E=z*e$	%
  99$:'$::L/		'0B/C:l^[\]f $,, 24LM	 hj  "#<abb@$Z0)/:N
 $"0k$/0$/$? +J 7%0%A$,[.$I'/=N'O)1+?R)S (j A	ow
 w
L #/0P!Q!   C$EhzFZ  iB  %C*  W.OPXYhPi  xV  /W 89\I12MM,' 45F~.MM-( 9:>PP23MM,-!0!6!6!8 	!J}*T23MM% 		!
 {a-dii.D-E]SfHTN 3445
 dXd^$& 	 (()UX[\dei\jXkWmnwwyC8abb< ,%o6

  ,+d+, +N ;'
3!,_!= (n E#+K9J#K%-k;N%O$[*=	
Uw
 w
x @yw
 w
sG   ;1X66X6A>X6B/X6X0X0A&X6E(X6H%X60X66X?c                   |j                   xs t        |       j                         j                         }t	        |       }g }g }g }|j
                  D ]   }t        ||j                        \  }}	}
|dk(  rL|	J|j                  |	j                  |	j                  |	j                  |	j                  |j                  d       o|dk(  r)|j                  |j                  |j                  d       |j                  |j                  |j                  |
D cg c]1  }|j                  |j                  |j                  |j                  d3 c}d        |s|rd||||dS t        |       5 }|j                  d	|f      j!                         }|t#        |d
         ni }|j$                  dk(  ri n
t'        |      }|D ]T  }t)        |d         }t+        |d         }|j$                  dk(  r"t+        |j-                  |d            |z   ||<   P|||<   V |*|j                  d|t/        j0                  |d      f       n,|j                  dt/        j0                  |d      |d   f       |j3                          d d d        t5        | t7        |            }d|d<   |j$                  |d<   ||d<   |S c c}w # 1 sw Y   ?xY w)Nrf	  )r
  r  r  r  rH  re	  rF  rH  )r
  r  r  r  )rF  rH  optionsr	  )re  r  resolved_itemsmissing_itemsambiguous_itemszKSELECT id, payload, updated_at FROM ordini_suspended_orders WHERE staff = ?r  rK  r
  rH  r  r   zBINSERT INTO ordini_suspended_orders (staff, payload) VALUES (?, ?)Fr-  z[UPDATE ordini_suspended_orders SET payload = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?r  )r  r	  re  r  added_or_set_items)r  r  r  r  rg  rL  rj	  rF  r  r  r  r  r  rH  r#  r  ra  r]	  r  r  r  r  rn  r   r0  r	  rc	  rB  )r  r$  r  all_productsr	  r	  r	  ro  re  matched_productrp  r	  r"  current_rowcurrent_payloadnext_payloadr
  rH  results                      rJ  _write_suspended_orderr	    s   ZZ2>'299;AACE+G4L.0N-/M/1O

  
*A,PTPbPb*c'Y?#>!!"1"4"4$3$@$@ / 8 8%4%B%B $ [   43E3ESWS`S`!ab!%!3!3 MM &, " '0ll(1(>(>$-$6$6)2)@)@		
% 
D .,*.
 	
 
"'	* j ((YH
 (* 	 S^Ri6{97MNoq!^^u4r$:O" 	4DT,/0J4
+,H~~&+.|/?/?
A/N+ORZ+ZZ(+3Z(	4 T

<eDE
 mLu={4?PQ 	58 #7,B,OPF F8..F;#1F Mk* s   6J8.DJ==KFr!	  c               &   |r|d   n|d   }|r|syt        t        |t              r|nd       }|r5t        | d   xs d      j                         t	        fd|D              sy|d   }|r$|j                         | d   j                         vryy	)
Nr  r  Fr  r
  c              3  B   K   | ]  }|j                         v   y wrD  )r  )rH  termr  s     rJ  rK  z _goal_matches.<locals>.<genexpr>  s     JD4::<</J   r  r  T)_split_goal_match_termsr  r  r  r)  )ro  goalr!	  r  product_termsr  r  s         @rJ  _goal_matchesr	    s    7@D23d?F[M+ZWZ=[MaefM4/526<<>JMJJ*+N...0_8M8S8S8UUr  )r  c          	        | j                  d      j                         }|||d}g }t               }|D ]  }t        ||      s|rt        ||d      s t	        t        |d   xs d            s<t        |d         Kt        |d         t        |d         t        |d	         f}	|	|v ry|j                  |	       |j                  t        |d   xs d      t        |d   xs d      t        |d	   xs d      d
        |S )Nz
        SELECT product_name, lot_code, supplier_name, units_per_pack
        FROM ordini_products
        WHERE active = 1
        ORDER BY supplier_name ASC, product_name ASC, lot_code ASC
        )r  r  r  Tr	  r  r
  r  r  r  r	  )	r  rd  rK  r	  rl  r  rZ  r  r  )
r"  r  r  r  rQ  	goal_likerr  rS  rJ  rF  s
             rJ  $_find_liters_goal_missing_pack_sizesr	    s*    	 hj 	 '#:(I
 %'G&)eD 
c9-2Im\_ajvzN{+CJ0E2,FG!#&6"78D3~&'S_)=s3CW?XY$; #C$7$=2 >J 526!$S%9%?R!@	

$ Nr  c                R   |j                   xs t               j                   }t        |      \  }}t        |       5 }t	        |d      }d|v rdnd}d|v rdnd}|j                  d|f      j                         }	|j                  d|z   d	z   |z   d
z   ||f      j                         }
d d d        g }	D ]  }|d   dk(  r$|j                  |d   |d   d|d   xs dd       0|d   dk(  rd}d}
D ]u  }t        t        |d   xs d      t        |d   xs d      t        |d   xs d      |d   |d         }||dk  rQt        ||      r||z  }t        ||d      sq||z  }w |j                  |d   |d   d|d   xs d|d   xs dt        |d      t        |d      |d    |d   xs dd!	       d}
D ]{  }t        ||      s|d   d"k(  rOt        t        |d   xs d      t        |d   xs d      t        |d   xs d      |d   |d         }|a||z  }g|t        |d   xs d      z  }} |j                  |d   |d   |d   |d   xs dt        |d      |d#   xs |d   d"k(  rd$nd%|d    |d   xs dd&        |t        |      |d'S # 1 sw Y   xY w)(Nr  r  rS  r  r   rU  z
            SELECT *
            FROM ordini_seasonal_goals
            WHERE year = ?
            ORDER BY CASE WHEN goal_type = 'note' THEN 1 ELSE 0 END ASC, id ASC
            z
            SELECT
                items.*,
                batches.confirmed_at,
                COALESCE(items.units_per_pack, zO) AS effective_units_per_pack,
                COALESCE(items.liters_per_unit, a9  ) AS effective_liters_per_unit
            FROM ordini_items AS items
            JOIN ordini_batches AS batches ON batches.id = items.batch_id
            LEFT JOIN ordini_products AS products ON products.id = items.product_id
            WHERE batches.confirmed_at >= ? AND batches.confirmed_at < ?
            r  noter  r  r  r
  )r  r  r  r  liters_dualr  rH  r   r  r  effective_units_per_packeffective_liters_per_unitr  Tr	  r  r  r   r  )	r  r  r  target_greytarget_patronprogress_greyprogress_patronbonusr  r  r  r  r  )r  r  r  r  progressr  r	  r  )r&  ry  goals)r&  r  r  r#  r=  r  rd  r  rg  r  r  r	  r  r  )r  r$  target_yearr  r  r"  r\  select_product_units_per_packselect_product_liters_per_unitr	  rL  serialized_goalsr	  r 	  r!	  ro  r  r	  s                     rJ  _sales_goalsr	  /  s   ))81388Kk*JE3	!'	* j/
<MNEUYhEh(Ant%GX\kGk)Cqw&"" N
 (* 	 ""3
 ,,44 -- CL!
" (*# 	@  H
&##t* L"#'#6#<"	 -GI (/ j!1!6Q7!$T.%9%?R!@ j!1!7R8#'(B#C$()D$E >Vq[ t,v%G tt<'I( ##t* L)#'>#6Q%)*<%=%B%*7A%6',Y':!-0#'#6#<"
  	7D t,K H,/ j!1!6Q7!$T.%9%?R!@ j!1!7R8#'(B#C$()D$E >F"CZ 0 5A66	7  	4jV[)x.-A!(A.\*dd;6G86SsYcm,#M28b		
{H
T  #.>*?JZ[[W s   A,JJ&c                   t        |       5 }|j                  d|j                  f      j                         }d d d        t	              |D cg c]  }|d   |d   |d   t        |d         d  c}dS # 1 sw Y   ?xY wc c}w )NzfSELECT id, author, text, created_at FROM ordini_shared_notes ORDER BY created_at DESC, id DESC LIMIT ?r  r  r  r  r  r  r  r  )ry  rL  )r#  r  r  rd  r  r  )r  r$  r"  rQ  rJ  s        rJ  _shared_notesr	    s    	!'	* j!!tZZM
 (* 	 T 
  $ih-F1#l2CD	
  
s   ,A6#B6A?c                  t        |       5 }|Z|j                  d|f      j                         }|dd g fcd d d        S d||d   |d   |d   t        |d         dgfcd d d        S |j	                         }|sd	d g fcd d d        S |j                  d
      j                         }d d d        g }D ]3  }t        t        |d               }|dk  r!|j                  ||f       5 |sdd g fS |j                  d        |D 	cg c]!  \  }	}|d   |d   |d   t        |d         d# }
}	}t        |      dk(  s|d   d   |d   d   dz   k\  rd|d   d   |
fS dd |
fS # 1 sw Y   xY wc c}}	w )NISELECT id, author, text, created_at FROM ordini_shared_notes WHERE id = ?re	  rf	  r  r  r  r  r	  r	  zgSELECT id, author, text, created_at FROM ordini_shared_notes ORDER BY created_at DESC, id DESC LIMIT 25r   c                2    | d    t        | d   d          fS )Nr   r   r  r	  r  s    rJ  rk  z%_resolve_note_match.<locals>.<lambda>  s!    E!H9s58D>/B.B"C r  rl  r   r  rg	  )r#  r  ra  r  r  rd  r  r  r  rn  r  )r  r  r  r"  rJ  cleaned_matchrQ  scoredr  rB  r	  s              rJ  _resolve_note_matchr	    s    
"'	* j$$[
 hj  {"D",  c3t9HWZ[aWb  sF  GJ  KW  GX  sY  %Z  $[  [  #((*+T25  !!u

(* 	$ /1F $!-S[1ABA:ucl#	$ D"$$
KKCKD As 4yCM3v;Vijmnzj{V|}J  6{a6!9Q<6!9Q<#+==&)A,
22j((G :s#   *E$ E$)E$	E$	&E0$E-c           	     |   t        |j                        xs t        |       }|j                  dk(  rt        |j                        }|sdddS t        |       5 }|j                  d||f      }|j                          t        |j                        }|j                  d|f      j                         }d d d        dd   |d	   |d
   t        |d         ddS t        | |j                  |j                        \  }}}	|dk(  rdddS |dk(  rdddS |dk(  rdd|	dS |J t        |       5 }|j                  dk(  rN|j                  d|d   f       |j                          d|d   |d	   |d
   t        |d         ddcd d d        S t        |j                        }|sdddcd d d        S |j                  d|||d   f       |j                          |j                  d|d   f      j                         }
d d d        d
d   |
d	   |
d
   t        |
d         ddS # 1 sw Y   sxY w# 1 sw Y   5xY w)Nr  r	  z%Dimmi il testo della nota da salvare.r	  z<INSERT INTO ordini_shared_notes (author, text) VALUES (?, ?)r	  r	  r  r  r  r  r	  )re  r	  )r  r  z0Indicami quale nota vuoi modificare o eliminare.re	  z6Non trovo una nota che corrisponda alla tua richiesta.rg	  zDHo trovato piu note compatibili. Indicami meglio quale vuoi toccare.re  r  r	  r	  z,DELETE FROM ordini_shared_notes WHERE id = ?r	  z Dimmi il nuovo testo della nota.z@UPDATE ordini_shared_notes SET author = ?, text = ? WHERE id = ?r	  )r  r  r  r  r  r#  r  r	  r  	lastrowidra  r  r	  r  r  )r  r$  r  r  r"  r7  r  rJ  re  r	  r	  s              rJ  _write_shared_noter	    s   !$++.I.2IF~~!#DII.6Bijj%g. 
	*''NF &**+G$$[
 hj 
	  $ih-F1#l2CD	
 	
 2'4<<\`\k\klFC))2>pqq%1ijj.\$
 	
 ??	!'	* j>>X%MPSTXPY|\#d)!(mK"5c,6G"H		  $DII.6Bde! " 	NT3t9%	
 	$$WYL
 (* 	-8 $-h'FO-gl.CD	
 {
	 
	D s'   AH%/AH2H22AH2%H/2H;c          	     V   t        |       5 }|Q|j                  d|f      j                         }|dd g fcd d d        S d||d   |d   |d   |d   dgfcd d d        S t        |      }|sd	d g fcd d d        S g }d
}||dz  }|j	                  |       |j                  | d|      j                         }	d d d        g }
t              }	D ]T  }t        |d         }t        |      }|r|rt        ||      dk  r0t        ||      }|dk  rB|
j	                  ||f       V |
sdd g fS |
j                  d        |
D cg c]  \  }}|d   |d   |d   |d   d }}}t        |
      dk(  s|
d   d   |
d   d   dz   k\  rd|
d   d   |fS dd |fS # 1 sw Y   xY wc c}}w )N0SELECT * FROM ordini_seasonal_goals WHERE id = ?re	  rf	  r  r&  r  r  r  r&  r  r  r	  z#SELECT * FROM ordini_seasonal_goalsz WHERE year = ?z ORDER BY year DESC, id DESCr   c                T    | d    t        | d   d          t        | d   d          fS )Nr   r   r&  r  r	  r  s    rJ  rk  z%_resolve_goal_match.<locals>.<lambda>W  s6    E!H9s58F3C/D.Ds5QR8TX>GZFZ"[ r  rl  r   r  rg	  )r#  r  ra  r  r  rd  r  r  r  rn  r  )r  r  r&  r  r"  rJ  cleaned_namer  r  rQ  r	  cleaned_anchorrow_name
row_anchorr  rB  r	  s                    rJ  _resolve_goal_matchr	  /  s>    
"'	* ]j$$%WZaYcdmmoC{"D",	] ]
 c3t9c&kSVW]S^mpq|m}$~#] ] ,D1+T25] ]  "5&&EMM$!!UG+G"H&QZZ\!]$ /1F&|4N $s6{#&x0
j->~z-Z^_-_!,9A:ucl#$ D"$$
KK[K\ |B  CqwqrtwTCKV[^_j[kl  CJ  C
6{a6!9Q<6!9Q<#+==&)A,
22j((K] ]D Cs#   *F F F;?FF%F"c                8
   |j                   xs t               j                   }t        |j                        }|.t	        |j
                  |j                  |j                  |d      }t        | |j                  |j                   |nd |      \  }}}|j                  dk(  rs|dk(  rdddS |dk(  rdddS |d	k(  rdd
|dS |J t        |       5 }|j                  d|d   f       |j                          d d d        d|d   |d   |d   |d   ddS |j                  xs% t        |j                        r|j                  dnd }||d}||sdddS |dv r|j                  |dddS |dk(  r2|j                  !|j                   t        |j"                        sdddS |dv r;t        |j                        s&t        |j
                        s|
|d   s
|d   sdddS |d	k(  rdd|dS ||xs	 ||d   nd |xs	 ||d   ndd |j$                  v rt        |j                        n||d    nd d|j$                  v rt        |j                        n||d   nd d!|j$                  v rt        |j"                        n||d!   nd d|j$                  v rt        |j
                        n||d   nd d"|j$                  v r|j                  n||d"   nd d#|j$                  v r|j                   n||d#   nd d$|j$                  v rt        |j&                        n||d$   nd d%|j$                  v rt        |j(                        n||d%   nd d&}	t        |       5 }|	d   d'v r`t+        |t        |	d         t        |	d         t        |	d!         (      }
|
r+d)j-                  d* |
D              }dd+| d,|
d-cd d d        S ||j                  d.|	d   |	d   |	d   |	d    |	d   |	d!   |	d   |	d"   |	d#   |	d$   |	d%   f      }|j                          t/        |j0                        }|j                  d/|f      j3                         }d0}nx|j                  d1|	d   |	d   |	d   |	d    |	d   |	d!   |	d   |	d"   |	d#   |	d$   |	d%   |d   f       |j                          |j                  d/|d   f      j3                         }d2}d d d        d   |d   |d   |d   |d    |d   |d!   |d   |d"   |d#   |d$   |d%   d3dS # 1 sw Y   xY w# 1 sw Y   LxY w)4N)r  r  r  r&  )r  r&  r  r	  r	  z4Indicami il nome o l'id dell'obiettivo da eliminare.r	  re	  z3Non trovo un obiettivo corrispondente da eliminare.rg	  zAHo trovato piu obiettivi compatibili. Dimmi quale vuoi eliminare.r	  z.DELETE FROM ordini_seasonal_goals WHERE id = ?r  r	  r&  r  r  r	  )re  r	  r	  rH  z@Per salvare un obiettivo mi serve almeno il nome dell'obiettivo.>   r  rH  z7Per questo obiettivo mi serve anche il target numerico.r	  zfPer un doppio target mi servono target primario, target secondario e il secondo prodotto da tracciare.>   r  rH  r	  r  r  zSPer un obiettivo numerico indicami almeno il prodotto o il fornitore da monitorare.zIHo trovato piu obiettivi compatibili. Dimmi meglio quale vuoi aggiornare.r  r  r  r  r  r  )r&  r  r  r  r  r  r  r  r  r  r  >   r  r	  r  r  r  r<  c              3  D   K   | ]  }|d     d|d    d|d    d  ywr  r;  r  r<  r  r=  Nr  r	  s     rJ  rK  z$_write_sales_goal.<locals>.<genexpr>  s;      $`dtN+,BtJ/?.@4CXBYYZ[$    jPer contare bene i litri mi serve sapere quante unita contiene il lotto cartone/cassa di questi prodotti: T. Aggiorna questo dato dal catalogo prodotti oppure dimmelo e poi salvo l'obiettivo.)re  r  missing_productsa6  
                INSERT INTO ordini_seasonal_goals (
                    year, name, goal_type, description, product_match, secondary_product_match,
                    supplier_match, target, secondary_target, unit_label, bonus_label
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                r	  r	  aQ  
                UPDATE ordini_seasonal_goals
                SET year = ?, name = ?, goal_type = ?, description = ?, product_match = ?,
                    secondary_product_match = ?, supplier_match = ?, target = ?, secondary_target = ?,
                    unit_label = ?, bonus_label = ?
                WHERE id = ?
                r	  )r  r&  r  r  r  r  r  r  r  r  r  r  )r&  r  r  r  _build_default_sales_goal_namer  r  r  r	  r  r  r#  r  r	  r  r  r  r  model_fields_setr  r  r	  r  r  r	  ra  )r  r$  r	  r	  match_statusmatched_goalr	  r"  r  fieldsmissing_pack_sizesr  r7  r  rJ  status_values                   rJ  _write_sales_goalr
  ^  s{   ))81388K'		2L5"&"5"5!%!3!3#//#	
 .A II1[t	.*L,
 ~~!336Bxyy;&)5jkk;&2](  '''%g. 	 *OR^_cRdQfg	   "4($V,$V,)+6	
 	
 v-A$BRBR-SX\XcXcXk6quI\1	L2  ?A  B  	B**t{{/B|G[2>wxxM!t{{':d>S>S>[cwx|  yU  yU  dV.~
 	
 99T//0 3 34$,*G<XhKi /k
 	

 {".a$
 	
 \9Qf!5W[i@X<#<^hANRVRgRgAg+D,<,<=  NZ  Nfnz  |I  oJ  lpETX\XmXmEm-d.@.@A  Vb  Vn  uA  BQ  uR  txYrvz  wL  wL  ZL#78T8T#U  ~J  ~V  S_  `y  Sz  \`GW[_[p[pGp.t/B/BC  Zf  Zr  xD  EU  xV  x|!)T-B-B!B$++coc{V^I_  BF5G4K`K`5`D11  LX  Ldgs  uG  hH  jn?KtOdOd?d*4??;  JV  Jbkw  yE  lF  hlANRVRgRgAg+D,<,<=  NZ  Nfnz  |I  oJ  lpF 
"'	* K%j+";;!E3F;K4LM26/3JK(<VD]=^(_	" ")) $hz$  7=") $mm
 );	K% K%. '' 6N6N;'=)?+45+,8$-.<(=)F* &**+G$$%WZaYcdmmoC$L 6N6N;'=)?+45+,8$-.<(=) &. $$%WZfgkZlYnoxxzC$LWK%\ d)KK[)}- 1'*+D'E!"23(m #$6 7l+}-
 O	  	 tK% K%s    'TATDTTTc                    	 t        j                  t        |       dk\  r| d d n|       }|dk(  r|t        dd      k  S |dk(  r|t        dd      k\  S y# t        $ r Y yw xY w)Nr.   Tlunch   r   evening   )r
   r  r  r  )raw_timerV  reservation_times      rJ  _time_window_matchesr

    sw    --c(mq>PhrlV^_ g$r1+--i4A;..  s   (A 	AAc                    t        | j                  d            }|sy 	 t        j                  |      S # t        $ r Y y w xY wNr^  )r  rn  r
   r  r  )ro  r
  s     rJ  _reservation_item_start_timer
  %  sC    TXXl34H!!(++ s   4 	A A c                   |yt        |       }|yt        | j                  d      xs d      }|dk  rd}|j                  dz  |j                  z   }|j                  dz  |j                  z   }||z   }||cxk  xr |k  S c S )NTFrb  r   r_  r  )r
  r  rn  hourminute)ro  rT  r^  rb  target_minutesstart_minutesend_minutess          rJ  !_reservation_overlaps_target_timer
  /  s    -d3J488$67<1=1 %%*[-?-??NOOb(:+<+<<M"22KN8[8888r  c                V   | j                  d      }t        |t              rt        |      S t        |t              r+|j	                         }|j                         rt        |      S t        | j                  d      t              r| j                  d      nd }|r-t        |j                  d      t              rt        |d         S t        | j                  d      t              r| j                  d      nd }|r-t        |j                  d      t              rt        |d         S y )Nroom_idassigned_tableassigned_combination)rn  r  r  r  r  r  r  )ro  r
  raw_room_idr
  r
  s        rJ  _reservation_room_idr
  >  s    hhy!G'37|'3mmo {##3=dhhGW>XZ^3_TXX./eiN*^%7%7	%BCH>),--?I$((SiJjlp?q488$:;w{
+?+C+CI+NPS T'	233r  )r  	json_bodyc          
       K   t               }|j                  j                  d      }	 t        j                  t        j
                  |j                  d            4 d {   }|j                  |j                         | | ||dd| j                   i       d {   }|j                          d d d       d {    j                  r|j                         ni }
t!        |
t"        t$        f      r|
S i S 7 7 ^7 @# 1 d {  7  sw Y   PxY w# t        j                  $ r}	t        dd	t        |	       
      |	d }	~	ww xY ww)N/r(  )r  )timeoutAuthorizationzBearer )r  r   headers  z/Impossibile contattare il modulo prenotazioni: r  )r    #assistant_prenotazioni_internal_urlr  r  AsyncClientTimeout&assistant_data_request_timeout_secondsrequestr  r  raise_for_status	HTTPErrorr   r  r  r   r  r  r  )r  methodpathr  r
  r  base_urlclientr  r:  r  s              rJ  _prenotazioni_requestr-
  R  sE     ~H;;BB3GH$$U]]8;j;jtw-xy 	( 	(  ~D#^^*TF#(GGMM?*CD ,  H %%'	( 	( "*!1!1hmmorG'D$<(I%	(	( 	( 	( 	( ?? DE_`cEdDef
 	s   &E9D "C>#D &;D!D "D6D DD 8E>D  DD D
DDD E,EEEc                   K   t        | dd       d {   }t        |t              rt        |j                  d      t              st        dd      t	        |d         S 7 Nw)NGET/booking-settingsr)
  r*
  venue_idr!
  z;Il modulo prenotazioni non ha restituito un venue_id validor  )r-
  r  r  rn  r  r   )r  r  s     rJ  _get_prenotazioni_venue_idr3
  r  sY     )'%FYZZGgt$Jw{{:7NPS,T4qrrwz"## [s   A%A#AA%c                "   t        | j                  d      t              r| j                  d      ni }t        | j                  d      t              r| j                  d      ni }t        | j                  d      t              r| j                  d      ni }| j                  d      t        |j                  d      xs d      j	                         |j                  d      |j                  d      | j                  d	      t        | j                  d
            | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      |j                  d      xs |j                  d      dS )Ncustomerr
  r
  r  r  r
  phoner  r]  r^  r`  re  rg  r  rc  )r  rZ  r[  r\  r]  r^  r`  re  rg  r  rc  
assignment)r  rn  r  r  r  r  )ro  r5
  r
  r
  s       rJ  _serialize_reservation_briefr8
  y  s8   '1$((:2F'Mtxx
#SUH3=dhhGW>XZ^3_TXX./egN?I$((SiJjlp?q488$:;wyhhtnX\\&17R8>>@",,w/",,w/ HH%78#DHH\$:;((8$((8$((8$'"88$56$((0T4H4L4LV4T r  r>  c                 K   |d|j                         ind }t        | dd|       d {   }t        |t              sg S |j	                  d      }t        |t
              sg S |D cg c]  }t        |t              s| c}S 7 Zc c}w w)Nr]  r/
  /reservationsr)
  r*
  r  rL  )r/  r-
  r  r  rn  r  )r  r>  r  r  	raw_itemsro  s         rJ  _list_reservations_rawr>
    s     >I>U +"7"7"9:[_F)'%o^deeGgt$	G$Ii&	&AT*T4*@DAA f Bs'   )BB=B)B?BBBc                :    t        |       }t        |d      |d<   |S )Nr   rx  )r8
  r  )ro  r  
serializeds      rJ  "_build_reservation_candidate_entryrA
    s"    -d3J %eQJ}r  )allow_inactivec                 K   |>t        | dd|        d {   }t        |t              sdd g fS d|t        |d      gfS |j	                         st        |      s	||dd g fS t        | |       d {   }||j                  d	 
       t        |      }	t        |      }
g }|D ]$  }t        |j                  d      xs d      }|s|dv r)t        |      }d}|j	                         r#|d    d|d   xs d }t        ||      }|dk  ri|
rQt        t        |j                  d      xs d            }|r"|j                  |
      s|
j                  |      s|dz  }|	r|j                  d      xs d|	k7  r|dz  }|4t        |j                  d      xs d      |j                         k(  r|dz  }|j                  ||f       ' |sdd g fS |j                  d 
       |D cg c]  \  }}t        ||       }}}t!        |      dk(  rd|d   d   |fS |d   d   }|d   d   }||dz   k\  rd|d   d   |fS dd |fS 7 37 c c}}w w)Nr/
  /reservations/r1
  re	  rf	  g     X@r	  r9
  c                z    t        | j                  d      xs d      t        | j                  d            xs dfS )Nr]  r
  r^  )r  rn  r  rj  s    rJ  rk  z,_resolve_reservation_match.<locals>.<lambda>  s6    DHH/06B7dhh|45; r  rl  re  r
  >   no_show	cancelled	completedr  rZ  r  r[  r   r(  r^  r  r]  r  c           
     Z   | d    t        | d   j                  d      xs d      t        | d   j                  d            xs dt        t        | d   j                  d      t              r| d   j                  d      xs i ni j                  d      xs d      j                         fS )Nr   r   r]  r
  r^  r5
  r  )r  rn  r  r  r  r  r  s    rJ  rk  z,_resolve_reservation_match.<locals>.<lambda>  s    1XIa/06B7%(,,|45;ZaZ@XZ^5_%(,,z*0begllmstzxz{  B  B  D	
 r  r   rg	  )r-
  r  r  rA
  r  r  r>
  rn  r  r  rn  r8
  r  r  r/  r  r  )r  rj  rW  r[  r>  rT  rB
  r  r=
  target_time_texttarget_phone_digitsr	  ro  r
  briefr  r  candidate_phone_digitsr	  	top_scoresecond_scores                        rJ  _resolve_reservation_matchrP
    s     !-geN[iZjJkll'4(b(('$FwPT$U#VVV!-*GKL_dodw'r11,W+NNI 	 	
 %[1'746F %488H-34,2W"W,T2!!/231U;K5L5RPR4STJ%njAEz%23uyyAQ7R7XVX3Y%Z")&//0CDH[HdHde{H|SLE		,'-22BBSLE"s5995G+H+NB'OS^ShShSj'jSLEudm$;%> D"$$
KK
   V\\keT4T5A\J\
6{a&)A,
22q	!I!9Q<LL3&&&)A,
22j((Q m On ]s6   IIAI7I8E:I2IAIIIc                4  K   g }t        |j                        s|j                  d       t        |j                        s|j                  d       |j                  |j                  d       |j
                  |j                  d       |j                  |j                  d       |rd|ddj                  |       d	d
S t        |        d {   }|t        |j                        t        |j                        t        |j                        |j                  j                         t        |j
                        |j                  |j                  |j                  |j                  t        |j                        t        |j                         d}	 t#        | dd|       d {   }t'        |t,              sdddS dt/        |      dS 7 7 *# t$        $ r5}dt'        |j(                  t*              r|j(                  nddcY d }~S d }~ww xY ww)Nznome clienteztelefono clientedataorarioznumero di personer	  z.Per creare la prenotazione mi servono ancora: r<  r  r	  )r2
  rZ  r[  r\  r]  r^  rb  r`  re  rg  r  rc  POSTr;
  r)
  r*
  r
  validation_errorzErrore validazione prenotazioner	  +Risposta non valida dal modulo prenotazionir	  )re  reservation)r  rZ  r  r[  r]  r^  r`  r  r3
  r\  r/  r  rb  re  rg  r  rc  r-
  r   r  r  r  r  r8
  )r  r$  rw	  r2
  r  r	  r:  s          rJ  _create_reservationrY
    s     "N 2 23n- 3 3401$f%h'{{12.,FtyyQ_G`Faabc
 	
 088H-d.@.@A.t/B/BC.t/B/BC 11;;=#DOO4 11++++++%djj1/0D0DEGJ,WV/elmm fd#,8eff0LV0TUU/ 9" n J,jQTQ[Q[]`Fa

  hI  J  	JJsU   CHGCHG *G+G /$HG 	H *H
HHHHc                $  K   t        | |j                  |j                  |j                  |j                  |j
                         d {   \  }}}|dk(  rdddS |dk(  rdddS |dk(  rdd|d	S |J i }d
|j                  v rt        |j                        |d<   d|j                  v rt        |j                        |d<   d|j                  v rt        |j                        |d<   d|j                  v r)|j                  |j                  j                         |d<   d|j                  v r$|j                  t        |j                        |d<   d|j                  v r|j                  |d<   d|j                  v r|j                   |d<   d|j                  v rt        |j"                        |d<   d|j                  v rt        |j$                        |d<   d|j                  v r|j&                  |d<   |sdddS 	 t)        | dd |j+                  d!       |"       d {   }t/        |t4              sd#d%dS d&t7        |      |d'S 7 7 +# t,        $ r5}d#t/        |j0                  t2              r|j0                  nd$dcY d }~S d }~ww xY ww)(Nrj  rW  r[  r>  rT  r	  zdPer capire quale prenotazione modificare mi serve almeno nome cliente, telefono, data oppure orario.r	  re	  CNon trovo una prenotazione attiva che corrisponda ai dati indicati.rg	  zjHo trovato piu prenotazioni compatibili. Indicami quale vuoi modificare con nome, data, orario o telefono.r	  rk  rZ  rl  r[  rm  r\  rn  r]  ro  r^  rp  rb  rq  r`  rr  r  rs  rc  rt  re  z,Dimmi cosa vuoi cambiare nella prenotazione.PUTrD
  r  rU
  rV
  z!Errore aggiornamento prenotazionerW
  r	  )re  rX
  applied_changes)rP
  rj  rW  r[  r>  rT  r	  r  rk  rl  rm  rn  r/  ro  r  rp  rq  rr  rs  rt  r-
  rn  r   r  r  r  r  r8
  )r  r$  re  rf	  r	  changesr	  r:  s           rJ  _update_reservationr`
  "  s    (B******$$$$) #FGZ )).|
 	
 %1vww. C$
 	
 !#Gd333#78N8N#O t444$89P9P$Q !t444$89P9P$Q !!6!664;T;T;`&*&?&?&I&I&K"#4000T5H5H5T -d.A.A B!6!66&*&?&?"#t,,, OOd+++/? 5 55%9$:R:R%S!"t,,, OO2>lmmL,!'++d"3!45	
 
 fd#,8eff3F;" y#b
  L,jQTQ[Q[]`Fa

  hK  L  	LLsU   AJ	I

F2J=$I !I"I &%JI 	J*JJJJJc                0  K   t        | |j                  |j                  |j                  |j                  |j
                         d {   \  }}}|dk(  rdddS |dk(  rdddS |dk(  rdd|d	S |J 	 t        | d
d|j                  d              d {   }t        |t              sdddS dt        |      |j                  d      dS 7 7 9# t        $ r5}dt        |j                  t              r|j                  nddcY d }~S d }~ww xY ww)Nr[
  r	  zcPer capire quale prenotazione eliminare mi serve almeno nome cliente, telefono, data oppure orario.r	  re	  r\
  rg	  ziHo trovato piu prenotazioni compatibili. Indicami quale vuoi eliminare con nome, data, orario o telefono.r	  DELETErD
  r  r1
  rV
  z Errore eliminazione prenotazionerW
  r	  r  )re  rX
  r  )rP
  rj  rW  r[  r>  rT  r-
  rn  r   r  r  r  r  r8
  )r  r$  re  rf	  r	  r	  r:  s          rJ  _delete_reservationrc
  f  sX    (B******$$$$) #FGZ )).{
 	
 %1vww. B$
 	
 K,WXn]d]h]him]n\oLpqq fd#,8eff3G<**X& =#0 r K,jQTQ[Q[]`Fa

  hJ  K  	KKsT   AD	C
+D6#C CC 4DC 	D*DD	DDDc                  K   |j                   xs
 t               }|j                         }|j                  j	                         }|j
                  |j
                  j                  d      nd }t        | ddd|i       d {   }t        |t              r|j                  dg       ng }t        | dd       d {   }|D 	cg c]  }	t        |	t              s|	 }
}	g }|
D 	ci c]Z  }	t        |	j                  d	      t              r9t        |	d	         t        |	j                  d
      xs d      j	                         \ }}	g }|D ]  }t        |t              st        |j                  d      xs d      }t        |j                  d      t              r|j                  d      ni }t        |j                  d
      xs d      j	                         }| d|j                  d      xs d }|rt        ||      dk  rt        ||j                        st!        |      }|j#                  |j                  d	      ||j                  d      ||j                  d      |j                  d      |j                  d      |j                  d      ||j                  |      t        |j                  d      t              r$|j                  d      xs i j                  d
      nd xsE t        |j                  d      t              r$|j                  d      xs i j                  d
      nd |j                  d      d        |j%                  d        |d |j&                   }t)        d |D              }t+        d |D              }|D cg c]  }t-        ||j
                        r| }}t+        d |D              }|
D ]  }	|	j                  d	      }t        |t              s&t        | dd||d       d {   }t        |t              sQt        |j                  d       t.              r|j                  d       ng }t        |j                  d!      t.              r|j                  d!      ng }|D cg c]  }t!        |      |k(  s| }}|D cg c]  }t-        ||j
                        s| }}|D cg c]/  }t        |t              rt1        |j                  d"d#            r|1 }}t+        d$ |D              } t+        d% |D              }!t3               }"|j
                  %|D ]  }#t        |#t              st        |#j                  d&      t.              r|#j                  d&      ng }$|$D ]  }%t        |%t              s	 t5        j6                  t        |%j                  d      xs d      d d'       }&t5        j6                  t        |%j                  d(      xs d      d d'       }'|&|j
                  cxk  r|'k  sn t        |#j                  d)      t              r|"j;                  t        |#d)                  ! nd|D #ch c]Y  }#t        |#t              rGt        |#j                  d)      t              r(t1        |#j                  d&            rt        |#d)         [ }"}#|j#                  |t        |	j                  d
      xs d      j	                         t=        |      | |j
                  |!nt+        d* |D              t?        | |j
                  |!nt+        d+ |D              z
  d      t=        |"      t?        t=        |      t=        |"      z
  d      |j
                  t=        |      n
t=        |      d,	        |||j                  |t=        |      ||t        |      ||d-
S 7 M7 c c}	w c c}	w c c}w 7 c c}w c c}w c c}w # t8        $ r Y |w xY wc c}#w w).Nr  r/
  r;
  r]  r<
  rL  z/roomsr1
  r  r  r
  r^  r5
  r  r6
  r   r`  rb  re  rg  r
  r
  r  )r  rZ  r[  r^  r`  rb  re  rg  r
  	room_namer7
  r  c                    t        | d         S r
  r@	  r  s    rJ  rk  z(_reservations_snapshot.<locals>.<lambda>  s    U<%8!9 r  rl  c              3  X   K   | ]"  }t        |j                  d       xs d       $ yw)re  r
  Nr  rn  r	  s     rJ  rK  z)_reservations_snapshot.<locals>.<genexpr>  s#     MtS(!3!9r:Mr	  c              3  X   K   | ]"  }t        |j                  d       xs d       $ ywr`  r   Nr  rn  r	  s     rJ  rK  z)_reservations_snapshot.<locals>.<genexpr>  s#     Fs488H-23Fr	  c              3  X   K   | ]"  }t        |j                  d       xs d       $ ywrj
  rk
  r	  s     rJ  rK  z)_reservations_snapshot.<locals>.<genexpr>  s#     OD3txx16Q7Or	  z/floor-plan)r   r
  r  table_states	is_activeTc              3  X   K   | ]"  }t        |j                  d       xs d       $ yw)	max_seatsr   Nrk
  )rH  r  s     rJ  rK  z)_reservations_snapshot.<locals>.<genexpr>  s#     W3uyy5:;Wr	  c              3  X   K   | ]"  }t        |j                  d       xs d       $ ywrj
  rk
  r	  s     rJ  rK  z)_reservations_snapshot.<locals>.<genexpr>  s#     %mtc$((8*<*A&B%mr	  occupancy_windowsr.   end_timetable_idc              3  X   K   | ]"  }t        |j                  d       xs d       $ ywrj
  rk
  r	  s     rJ  rK  z)_reservations_snapshot.<locals>.<genexpr>  s:       d`  FJdghlhphpqyhzh~  eA  d`r	  c              3  X   K   | ]"  }t        |j                  d       xs d       $ ywrj
  rk
  r	  s     rJ  rK  z)_reservations_snapshot.<locals>.<genexpr>  sV       xt  Z^x{  }A  }E  }E  FN  }O  }T  ST  yU  xtr	  )	r
  re
  table_countmax_capacityassigned_guestsavailable_seatsoccupied_tablesfree_tablesreservation_count)
r>  rT  rV  rW  total_reservationstotal_guestsslot_guest_totalstatus_breakdownroom_summariesrL  ) r>  r  r/  rW  r  rT  r  r-
  r  r  rn  r  r  r  r

  rV  r
  r  rn  r  r   r  r
  r  r  rK  r
   r  r  r  r  r  )(r  r$  
target_dayr>  rW  rJ
  r  r=
  	raw_roomsroomroomsr
  room_names_by_idrL  ro  r^  r5
  rZ  r  r
  limited_itemsstatus_counterr
  
slot_itemsr
  floor_plan_payloadroom_tablesrm
  room_reservationsoverlapping_room_reservationsr  active_tablesrx
  overlapping_guest_totaloccupied_table_idsr  rr
  windowstart_value	end_values(                                           rJ  _reservations_snapshotr
    s    !!9%7%9J&&(K((..0N=A=M=M=Yt''009_c)"K0	 G -7w,EGR(2I+GEQQI'Bd:dD+ATBEB.0N dhhtnc* 	DJTXXf-34::<<  &(E $
$%,/526
+5dhhz6JD+Q488J'WYHLL06B7==?%aW(=(C'DE
/
KqP#J0@0@A&t,hhtn!."*,,w"7(((8,$(HH-?$@((8,((8,"-11': "$((+;"<dC XX./52::6B	 "$((+A"BDI XX45;@@H'*+	
$
L 
JJ9J:,DJJ'MMuMMNFFFL ,T43C3CD 	J  OJOO =
((4.'3'#8'G<	$
 
 ,d3:DEWE[E[\dEegk:l(,,X6rtAKL^LbLbcqLrtxAy)--n=  @B.3]d7KD7QU\7\T]]:K  )J$Opquw{  xH  xH  PI  )J%  )J  +
%&4		+t0L+M 
 
 WWW"%%mOl%m"m'*u'% !%.FPQVQZQZ[nQoquFvEII.A$B|~!/ F%fd3 !&*&8&8VZZ=U=[Y[9\]_^_9`&a$($6$6s6::j;Q;WUW7XY[Z[7\$]	 #d&6&6BB%eii
&;SA.223uZ7H3IJ	& *"eT*z%))J:OQT/UZ^_d_h_hi|_}Z~ E*%&" " 	" &!1!7R8>>@"=1 ,>B>N>N>Z#:`c  d`  N_  d`  a`#&|RVRbRbRn7Ntw  xt  bs  xt  ut  (u  wx  $y#&'9#:"3}#5<N8O#OQRSKOK[K[KgS)F%Gmp  rC  nD
	
c=
@ #'''(!%j$, 0( C RBd
 ^ )J
$ & ! !"s   B `_9`<_=`__`'A_I`_7A`_$	A=`_'_'`$_, _,`
4_1>B`A(_6`A`$A`D```'`6	`	?``	`c                   t        j                  ddt        | xs d      j                               }|r|d d S t	               j                  d      }|dk(  rdnd}| d| S )	Nr  r  r
  r{  z%Y-%m-%d %H:%Mr  zFoglio operativozDocumento operativo)rF  r  r  r  r  r  )	raw_titlerz  r  	timestampprefixs        rJ  _normalize_document_titler
  !  si    ffVS#io2"6"<"<">?Gt} "++,<=I#'7?8MFXQyk""r  c           	         | j                         }|s|S dj                  |dt        j                  |dt              g      S )Nz

zgUsa SOLO i dati reali qui sotto per costruire il documento. Se un dato non e' presente, non inventarlo.Fr.  r  )r  r  r   r0  r  )base_promptprior_tool_resultsr  s      rJ  #_compose_document_generation_promptr
  *  sG    
  F;;uJJ)sK	
 r  c                    | j                  d      }| j                  d      }t        t        |t              r|nd       }|r
|rd| d| S |rd| S |rd| S y)Nr&  r'   per r   nel r
  )rn  _format_italian_monthr  r  )r	  r&  r'  month_labels       rJ  _format_purchase_result_scoper
  ;  sm    ::fDJJwE'E31GTRKt{m1TF++{m$$tf~r  c                    | yt        | t              rF| j                         rt        t	        |             S | dj                  d      j                  d      S t        |       S )Nr
  z.4fr  r  )r  r  
is_integerr  r  r  r  s    rJ  _stringify_query_preview_cellr
  H  sX    }%s5z?"$$S)0055u:r  c                    t        |j                  d      t              r|j                  d      ng }|D cg c]'  }t        |      j	                         st        |      ) }}t        |j                  d      t              r|j                  d      ng }|D cg c]  }t        |t
              s| }}|s+|r)|d   j                         D cg c]  }t        |       }}t        | j                  | j                        }	t        |j                  d      xs t        |            }
d|
 d}| j                  dk(  rY|xs d	g}|D cg c]*  }|D cg c]  }t        |j                  |             c}, }}}t        d|	|| j                  ||
      S | j                  xs dj	                  d      }| dg}|s|j!                  d       nj|D ]e  }g }|D ]5  }t        |j                  |            }|s |j!                  | d|        7 |j!                  d|rdj#                  |      nd        g t        d|	|| j                  dj#                  |            S c c}w c c}w c c}w c c}w c c}}w )Nr^  rQ  r   rz  r  Anteprima basata su z righe reali lette dal tenant.r  	risultatorz  r~  summaryr  r^  rQ  zRisultati reali del tenant :r  z- Nessuna riga trovata.: -  | 
Riga vuotar  
rz  r~  r
  r  r  )r  rn  r  r  r  r  rM  r
  r~  rz  r  r  r
  r"   r  r  r  r  )r$  r	  raw_columnsr   r^  r8  rJ  rQ  rF  r~  r  r
  effective_columnseffective_rowsheadinglinesrendered_cellscells                     rJ  $_build_tenant_query_document_previewr
  R  s_   
 ,6fjj6KT+R&**Y'XZK)4LvF8I8I8Ks6{LGL%/

60BD%Ivzz&!rH#=Cz#t'<C=D=t'+Aw||~63s866%djjtyyAEFJJ{+8s4y9I$YK/MNGyyG#4} 
 K\\*3776?;\
 
 ."&"<"<%
 	
 {{::AA$GGy]OE./ 	`CN! ?4SWWV_E"))VHBtf*=>? LL2Nejj8P\]^_	` *"88		%  M M=6 ]
s5   I&I&I+1I+I0	I:!I57I:5I:c                    | yt        | t        t        t        t        f      rt        |       S t        j                  | dt              S )Nr
  Fr
  )r  r  r  r  r  r
  r   r0  r  s    rJ  _preview_cell_from_tool_valuer
    s;    }%#sE401,U33::e%==r  c           	     x   d}|D ]e  }| j                  |      }t        |t              s%g }|D ]7  }t        |t              r|j	                  |       %|j	                  d|i       9 |c S  | j                         D ci c]'  \  }}t        |t        t        f      st        |      |) }}}|r|gS g S c c}}w )N)
rL  r  rK	  r  r  r  entriesr	  r  recipesr  )rn  r  r  r  r  rL  r  )r	  preferred_keysrF  r  rQ  ro  
scalar_rows          rJ  _rows_from_tool_result_payloadr
    s    N  	

3eT",.D 1dD)KK%KK$0	1
 K	 !,,.C%$. 	C%J 
 &J<-2-s    ,B6c                d   g }|D ]  }t        |t              st        |j                  d      xs d      j	                         }|dv rEt        |j                  d      t              r|j                  d      nd }|zt        |      }|s|j                  |xs d|f        |sy t        | j                  | j                        }t        d |D              }d| d}	| j                  d	k(  rd
g}
|D ]q  \  }}|D ]W  }|j                         D ]2  }t        |      }||
vr|
j                  |       t        |
      dk\  s2 n t        |
      dk\  sW n t        |
      dk\  sq n g }|D ]J  \  }}|D ]@  }|j                  |
D cg c]#  }|d
k(  r|nt        |j                  |            % c}       B L t        d	||	| j                  |
|      S | j                   xs dj	                  d      g}|D ]  \  }}|j                  d| d       |D ]d  }|j#                         D cg c]   \  }}t        |      r| dt        |       " }}}|j                  d|rdj%                  |      nd        f  t        d||	| j                  dj%                  |            S c c}w c c}}w )Nr  r
  >   describe_tenant_schemar<   r	  r
  c              3  8   K   | ]  \  }}t        |        y wrD  r  )rH  rB  rQ  s      rJ  rK  z?_build_generic_tool_results_document_preview.<locals>.<genexpr>  s     771dSY7r  z#Anteprima deterministica basata su z! righe reali restituite dai tool.r  source_tool(   r
  zDati reali del tenantr
  r
  r  r
  r
  r
  r
  r  r
  )r  r  r  rn  r  r
  r  r
  r~  rz  r  rM  r  r
  r"   r  r  rL  r  )r$  r
  sectionstool_resultrn  r	  rQ  r~  
total_rowsr
  r^  rB  rJ  rF  r   r9  r
  r  cellss                      rJ  ,_build_generic_tool_results_document_previewr
    s    
 ;=H) 9+t,/526<<>	VV.89RTX.Y*_c>-f5OOY0&$789 %djjtyyAE7h77J3J<?`aGyyG+_ 	GAt 88: C XFW,v.7|r) w<2% 7|r!	 *,' 	OIt $$ '." &,}%<	B_`c`g`ghn`oBpp	 ."&"<"<
 	
 kk44;;DABE# N	4r)A&' 	NC #&))+C07 %r7>?@E 
 LL25ejj/lKLM	NN *"88		%  1$s   (J'+%J,
c                   t        |j                  d      t              r|j                  d      ng }t        |      }t	        | j
                  | j                        }| j                  dk(  r?g d}g }|D ]  }t        |t              st        |j                  d      xs d      }t        |j                  d      xs d      j                  dd	      }	t        |j                  d
      xs d      j                         }
t        |j                  d      t              r|j                  d      ng }dj                  d |D              }t        |j                  d      xs d      }t        |j                  d      xs d      }t        |j                  d      t              r|j                  d      ng }|s|j                  ||	|
|||ddddg
       d|D ]  }t        |t              s|j                  ||	|
|||t        |j                  d      xs d      t        |j                  d      xs d      t        |j                  d      xs d      t        |j                  d      xs d      g
        	 dt        |       d| d}t        d||| j                  ||      S |rd| dgndg}|D ]h  }t        |t              st        |j                  d      xs d      j                  dd	      }	t        |j                  d
      xs d      j                         }
|j                  d      }|j                  d      }|j                  d|j                  d       d|	 d| d| d |
xs d! d       t        |j                  d      t              r|j                  d      ng }|D ]m  }t        |t              s|j                  d"|j                  d       d#|j                  d       d$|j                  d       d%|j                  d       d&	       o k t        d'|dt        |       d| d| j                  d(j                  |      )      S )*NrK	  r
  r  )
OrdineData	OperatorezFornitori ordinezRighe ordinezQuantita totale ordineProdottozFornitore rigaFormatoQuantitar=  r
  r	  r  r  r  r9	  r<  c              3  f   K   | ])  }t        |      j                         st        |       + y wrD  )r  r  rA	  s     rJ  rK  z;_build_purchase_batches_document_preview.<locals>.<genexpr>  s&     'bdPSTXPYP_P_PaD	'bs   11r8	  r  rL  r  r  r  rH  r
  z ordini reali del localer  r
  zOrdini reali del localer  zOrdini reali del locale:
- Ordine # del r
   righe, quantita totale , inserito da n/dz  -  x  da r;  r=  r  r
  r
  )r  rn  r  r
  r
  r~  rz  r  r  r  r  r  r  r  r"   r  )r$  r	  rK	  r  r~  r^  rQ  r%  r=  r	  r  r9	  suppliers_labelr8	  r  rL  ro  r
  r
  s                      rJ  (_build_purchase_batches_document_previewr
    sW   
 (2&**Y2G'Nfjj#TVG)&1E%djjtyyAEyyG
 !# 	EeT*599Z06B7Huyy8>B?GGSQL		'*0b1779E<FuyyQaGbdh<iUYY'78oqN"ii'bn'bbOeii6<"=K +;!<!BCN*4UYYw5G*NEIIg&TVEX|UO[Zhjlnprtvxyz !$- $'#&DHH^4:;DHH_5;<DHHZ06B7DHHZ06B7	> )W6NugUVW-"&"<"<
 	
 5:&ugQ/0@Z?[E %&599^4:;CCCMEIIg&,"-335ii.#34:./u\N"[MQijxiy  zH  IN  IW  RW  HX  XY  Z	
 '171CT&J		'"PR 	D$%488J/0DHH^4L3MTRVRZRZ[jRkQllnosowow  yC  pD  oE  EF  G	  *&s7|n4LUGSTU"88		%  r  c                
   t        |j                  d      t              r|j                  d      ng }t        |      }t	        | j
                  | j                        }| j                  dk(  r)g d}|D cg c]  }t        |t              rt        |j                  d      xs d      t        |j                  d      xs d      j                  dd	      t        |j                  d
      xs d      t        |j                  d      xs d      t        |j                  d      xs d      t        |j                  d      xs d      t        |j                  d      xs d      g }}t        d|dt        |       d| d| j                  ||      S |rd| dgndg}|D ]  }t        |t              st        |j                  d      xs d      j                  dd	      }	|j                  d|	 d|j                  d       d|j                  d       d|j                  d       d|j                  d       d        t        d|dt        |       d| d| j                  dj                  |            S c c}w )NrL  r
  r  )r
  r
  r
  r
  	Fornitorer
  r
  r=  r
  r	  r  r  r  r  r  r  rH  r
  z  righe storiche reali del localer  r
  zRighe storiche reali del localer  z Righe storiche reali del locale:r
  r
  r
  r
  r;  r=  r  r
  r
  )r  rn  r  r
  r
  r~  rz  r  r  r  r"   r  r  r  r  )
r$  r	  rL  r  r~  r^  ro  rQ  r
  r	  s
             rJ  (_build_purchase_history_document_previewr
  W  s   
 $.fjj.A4#HFJJwbE)&1E%djjtyyAEyyGa 
 $% DHHZ(.B/DHH^,23;;CEDHHW%+,DHH^,23DHH_-34DHHZ(.B/DHHZ(.B/
 
 .*3t9+5UV[U\\]^"&"<"<
 	
 =B.ugQ78HjGkE dD!txx7=2>FFsCPLLL\N"TXXj%9$:#dhh~>V=WW[\`\d\det\u[vvxy}  zB  zB  CM  zN  yO  OP  Q *&s5zl2RSXRYYZ["88		%  ;
s   7C4J c                   t        |j                        }|sy t        |      t        |      rft	        |      }t        |      }t        | t        d||||d n
t        |      ||d n
t        |      ||t        nd            }t        ||      S t        |      sy t        |      }t        |      }t        |      }||d   nd }	||d   nd }
t        |      }t        fddD              r,t!        | t#        ||||	|
t                    }t%        ||      S t        | t        ||||	|
t                    }t        ||      S )	Nr
  r   )r  r=  r>  r&  r'  r  r$  r	  r   c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  zH_build_grounded_purchase_document_preview_from_prompt.<locals>.<genexpr>  s     
kW7j 
kru  )r  r  r  lineeztotale rigar  r&  r'  r)  r*  r  )r  r  r  rI  _extract_purchase_batch_id_extract_purchase_batch_daterT	  r<  r  r  r  r
  _is_orders_document_requestr  r  r)  rZ	  r:  r
  )r  r$  r  r=  r>  r	  r&  r'  
week_ranger)  r*  purchase_queryr  s               @rJ  5_build_grounded_purchase_document_preview_from_promptr
    s{    "$++.F (J(<-f526:"!'%1[5LTRijpRq&2k6MdSklrSs*5*AhFV&\]

 8T&QQ&vz:"6*D$V,E.v6J","8AdJ * 6z!}DH,V4N

k0j
kk"$%!&

 8T&QQ !"	

F 4fMMr  c                b   |D ]  }t        |t              st        |j                  d      xs d      }t        |j                  d      t              r|j                  d      nd }|h|dk(  rt	        | |      c S |dk(  rt        | |      c S |dk(  rt        | |      c S |dk(  rVt        |j                  d	      t              r|j                  d	      ng }g }|D ]m  }t        |t              s	 |j                  t        t        |j                  d
      xs d      t        |j                  d      xs d      j                         t        |j                  d      xs d      j                         t        |j                  d      xs d      j                         |j                  d      (t        |j                  d            j                         nd |j                  d      t        |j                  d            nd |j                  d      (t        |j                  d            j                         nd              p t        | j                   t#        | j$                  | j                         | j&                  xs d| j(                        }t        |j                  d      xs d      j                         xs d }	| j                   dk(  rt+        |||	      c S t-        |||	      c S |dk(  st/        | |      c S  y # t        t        f$ r Y Jw xY w)Nr  r
  r	  r  r
  r  r  r  rL  r  r   r  r  r  r  r  r  r  r
  rz  r~  r  r  r  r  )r  r  rg  )r  r  r  rn  r
  r
  $_build_tenant_users_document_previewr  r  r   r  r  r  rX  r  r#   rz  r
  r~  r  r  r   r   r
  )
r$  r
  r
  rn  r	  r=
  r  ro  preview_payloadr  s
             rJ  3_build_grounded_workspace_preview_from_tool_resultsr
    s   
 * -R+t,/526	.89RTX.Y*_c>..;fUU..;fUU++7T&QQ))/9&**W:Mt/T

7+Z\I-/H! !$-OO&"488D>#6Q7),TXXn-E-K)L)R)R)T%(*)=)C%D%J%J%L*-dhh.G.M2*N*T*T*VRVRZRZ[iRjRvTXXn-E)F)L)L)N  }ARVRZRZ[lRmRyE$((;L2M,N  @DJN((S]J^JjS*)=%>%D%D%Fpt
	$ <YY/

K{{(b&*&@&@	O 

7+1r288:BdEyyE!1/H\abb/(Z_``**7T&QQ[-R\  ":. s   9ELL.-L.c                   g }| D ]  }t        |t              st        |j                  d      xs d      }t        |j                  d      t              r|j                  d      ni }|dk(  r1|j	                  t        |j                  d      xs d      dk(         |dk(  r1|j	                  t        |j                  d      xs d      dk(         |d	v rE|j	                  t        |j                  d
      xs |j                  d      xs d      dk(         |dk(  rE|j	                  t        |j                  d      xs |j                  d      xs d      dk(         d|dk(  rFt        |j                  d      t              r|j                  d      ng }|j	                  |        |dk(  s|j	                  t        |j                  d      xs d      dk(          t        |      xr t        |      S )Nr  r
  r	  rg  r  r   r  ry     r  r  r  r  rX	  r  rK	  r  )	r  r  r  rn  r  r  r  r  r	  )r
  empty_checksr
  rn  r	  rK	  s         rJ  $_document_grounded_sources_are_emptyr
    s   !L) D+t,/526	.89RTX.Y*_a**FJJ{$;$@q AQ FG++FJJw$7$<1 = BCMMFJJ$?$[6::gCV$[Z[ \`a ab00FJJ$?$[6::gCV$[Z[ \`a ab00/9&**Y:OQU/Vfjj+\^GG,--FJJw$7$<1 = BC#D& 3#l"33r  c                f    t        |       dv xr  t        fddD              xs
 dv xs dv S )Nr  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z7_document_prompt_wants_username_only.<locals>.<genexpr>  s     SgGz!Sru  r  r  r  lista degli usernamezelenco degli usernamer  r)  )r  r  s    @rJ  $_document_prompt_wants_username_onlyr
    sH     (J# S1RSS 	1!Z/	1"j0r  c                    t        | t              sy| D cg c]5  }t        |      j                         st        |      j                         7 }}dj	                  |      S c c}w )Nr
  r<  )r  r  r  r  r  )r  ro  r  s      rJ  _format_user_permissionsr
    sO    eT"16L#d)//:K3t9??$LKL99[!! Ms
   A#A#c                   |j                  dg       D cg c]  }t        |t              s| }}t        | j                  xs d      }t        | j                  | j                        }dt        |       d}| j                  dk(  rG|rUt        d||| j                  dg|D cg c]/  }t        |j                  d      xs d      j                         g1 c}	      S t        d||| j                  g d
|D cg c]  }t        |j                  d      xs d      j                         t        |j                  d      xs d      j                         t        |j                  d      xs d      j                         t        |j                  d      xs d      j                         t        |j                  d            g c}	      S |rdg}|j                  d |D               nGdg}|D ]>  }dt        |j                  d      xs d      j                          dt        |j                  d      xs d      j                          dt        |j                  d      xs d      j                          g}t        |j                  d            }	|	r|j                  d|	        t        |j                  d      xs( |j                  d      xs |j                  d      xs d      j                         }
|j                  d|
 ddj!                  d |D                      A t        d||| j                  dj!                  |            S c c}w c c}w c c}w )Nr  r
  r
  r
  z account reali del locale.r  Usernamer  r
  )Nomer  EmailRuoloPermessir  r  r  r  "Username degli account del locale:c              3  z   K   | ]3  }d t        |j                  d      xs d      j                           5 ywr
  r  r
  Nr  rn  r  rH  r  s     rJ  rK  z7_build_tenant_users_document_preview.<locals>.<genexpr>L  s4     Vr#dhhz28b9??ABCV   9;zAccount del locale:	username email ruolo z	permessi Accountr
  r
  ; c              3  &   K   | ]	  }|s|  y wrD  r  rH  parts     rJ  rK  z7_build_tenant_users_document_preview.<locals>.<genexpr>Y  s     /O$/O   r  r
  r
  )rn  r  r  r
  r  r
  r~  rz  r  r"   r  r  r  r
  r  r  r  )r$  r	  r  r  username_onlyr~  r
  r
  partsr  r  s              rJ  r
  r
  $  s   
 %jj"5PdD$9OTPEP89JKM%djjtyyAE$SZL0JKGyyG1&*&@&@#LQRDs488J/526<<>?R  ."&"<"<F "	  (.B/557,2399;)/R0668(.B/557,TXXm-DE	
 	
$ 56VPUVV&' 
	SDC 4 :;AACDETXXg.4"5;;=>?TXXf-34::<=>E
 3488M3JKKy67txx'a488J+?a488GCTaXabhhjDLL2dV2dii/O/O&O%PQR
	S *"88		%  e Q S	s   M M %4M%;CM*c                @    |dk(  rdnd}d| d|  j                         S )Nr  zgoogle sheet
google doczcreami un file r  r  )r  rz  
file_labels      rJ  )_build_document_request_message_for_toolsr  d  s+    #'7?JZL&288::r  c                    |t        |       v S rD  r+   )r  rn  s     rJ  _surface_allows_toolr  i  s    6w???r  c                Z    |D cg c]  }t        | |j                        s| c}S c c}w rD  )r  r  )r  r  rm  s      rJ  _filter_tool_calls_for_surfacer  m  s'    '1c)5I'S\SaSa5bIcccs   ((c                h  "#$%&'( t        |       &t        |       (t        |       $t        |       #t	        |       }t        |       }t        |       't        |       }t        |       }t        |xr t        | &|            }t        &      }t        &      }t        |       "t        |       %t        d |D              rg }	d}
|D ]q  }|j                   dk7  r|	j#                  |       $t%        | &t'        |j(                              }|	j#                  t+        d|             ||j(                  k7  spd}
s |
r|	S |S t-        &      rt/        |       gS t        d |D              rd&v rt/        |       gS t1        &      rt3        | &      rt5        |       gS t7        &      rt9        | &      rt;        d |D        d       }|t=        |       }t'        |j(                        }|j?                  d	      xs tA        &      |d	<   tC        |j?                  d
      xs tE        |             jG                         |d
<   tI        |       t+        d|      gS tK        | &      rtM        |       g }	d}
tO        |       }|D ]g  }|j                   dk(  rEtQ        tC        |j(                  j?                  d      xs d            r|	j#                  |       d}
W|	j#                  |       i |
r|	S tS        | &      rtU        |       }tW        |       }g }	|D ]  }|j                   dk7  r|	j#                  |       $t'        |j(                        }d|d<   ||d<   |d n!tY        |tZ              r|j]                         nd |d<   ||
d |d<   d |d<   ||t^        nd|d<   |	j#                  t+        d|              |	r|	S t        &fddD              xr ta        &dd      xr tc        &       }tc        &      }t        &fdtd        D              xr
 d&v xs d&v }tg        &      }ti        &      }tk        | &      }t7        &      rtm        | &      rto        |       S tq        | &      rts        |       gS tu        &      rtw        |       }||gS d:#$%'(fd}d:"#$'(fd}|s"t+        d |i             gS |s|s|s|s|s|s(|s|s
"$#|s|S g }	d}
|D 
]  }t'        |j(                        }|j                   dk(  r;t%        | &|      }|	j#                  t+        d|             ||j(                  k7  rd}
c|j                   dk(  rX	 ty        |j?                  d      xs t^              }t        t        |d      t^              }|j?                  d      |k7  r||d<   d}
|j                   d v r/$#+$$|d<   ##|d<   (
d |d!<   d |d"<   ||j(                  k7  rd}
|s|r|j                   d#v r|	j#                  t+        d$tC        |j?                  d      xs 'xs d      |j?                  d      xs $xs ((d%   j                  nd |j?                  d      xs #xs ((d%   j                  nd |j?                  d!      xs ((d%   j]                         nd |j?                  d"      xs ((d   j]                         nd t^        d&             d}
|s|r|j                   d$k(  rtC        |j?                  d      xs 'xs d      |d<   |j?                  d      xs $xs ((d%   j                  nd |d<   |j?                  d      xs #xs ((d%   j                  nd |d<   |j?                  d!      xs ((d%   j]                         nd |d!<   |j?                  d"      xs ((d   j]                         nd |d"<   t^        |d<   |	j#                  t+        d$|             d}
|r|j                   d'v r|	j#                  t+        d$'$xs ((d%   j                  nd #xs ((d%   j                  nd ((d%   j]                         nd ((d   j]                         nd t^        d&             d}
|r7|s5|j                   dk(  r&|	j#                  t+        d ||                   d}
|s"5|j                   dk(  r&|	j#                  t+        d ||                   d}
|s"4|j                   d(v r&|	j#                  t+        d ||                   d}
T|r6|s4|j                   d(v r&|	j#                  t+        d ||                   d}
(|j                   d v r|(d%   j]                         |d!<   (d   j]                         |d"<   |j?                  d      $xs (d%   j                  |d<   |j?                  d      #xs (d%   j                  |d<   d}
|r|j                   d)v rtC        |j?                  d      xs t        |       xs d      |d<   |j?                  d      xs $xs ((d%   j                  nd |d<   |j?                  d      xs #xs ((d%   j                  nd |d<   t^        |d<   |	j#                  t+        d*|             d}
|r|j                   d*k(  rtC        |j?                  d      xs t        |       xs d      |d<   |j?                  d      xs $xs ((d%   j                  nd |d<   |j?                  d      xs #xs ((d%   j                  nd |d<   t^        |d<   |	j#                  t+        d*|             d}
|j                   d+k(  rʉ'xs d}||d<   |rYt        |      d,k\  rK$xs |d%   d%   xs |d   d%   }|d%   d%   xs ||d-<   |d%   d   |d.<   |d   d%   xs ||d/<   |d   d   |d0<   nt        |      d,k\  r|d%   |d-<   |d   |d/<   t        &|      |d1<   t        &fd2d3D              |d4<   |	j#                  t+        d+|             d}
t|j                   d5k(  rE|&|j?                  d6      |j                  d6d        d}
n||j?                  d6      |k7  r||d6<   d}
|r|j                   dk(  r|r	 ||      }ntC        |j?                  d      xs d      |d<   |j?                  d      xs $xs ((d%   j                  nd |d<   |j?                  d      xs #xs ((d%   j                  nd |d<   t^        |d<   |	j#                  t+        d|             d}
|r|j                   d$k(  r|	j#                  t+        d|r ||      nzi |tC        |j?                  d      xs d      |j?                  d      xs $xs ((d%   j                  nd |j?                  d      xs #xs ((d%   j                  nd t^        d7             d}
	<|r|j                   d8k(  r|	j#                  t+        d|r ||      nzi |tC        |j?                  d      xs d      |j?                  d      xs $xs ((d%   j                  nd |j?                  d      xs #xs ((d%   j                  nd t^        d7             d}
	|r~|j                   d9k(  rot        |      } tC        |j?                  d      xs d      jG                         }!| rt        |!|       s||d<   d}
|j?                  d      t^        k7  rt^        |d<   d}
||j(                  k7  rd}
|	j#                  t+        |j                   |             
 |
r|	S |S # tz        t|        f$ r
 t^        }Y 
3w xY w);Nc              3  :   K   | ]  }|j                   d k(    ywrd  Nr  rH  rm  s     rJ  rK  z5_normalize_home_planned_tool_calls.<locals>.<genexpr>  s     
Q9>>44
Q   Frd  r
  Tc              3     K   | ]W  }|j                   d k(  xsB |j                   dk(  xr1 t        t        |j                  j	                  d      xs d             Y yw)rf  rg  r  r
  Nr  rl  r  r  rn  r#  s     rJ  rK  z5_normalize_home_planned_tool_calls.<locals>.<genexpr>  sg        	// 	}NN00{5PQTU^UhUhUlUlmrUsUywyQz5{	}s   AAr  c              3  @   K   | ]  }|j                   d k(  s|  ywr<   Nr"  r#  s     rJ  rK  z5_normalize_home_planned_tool_calls.<locals>.<genexpr>  s     k9innHj6jYks   rz  r  r<   rg  r  r
  r  r  r=  r>  r&  r'  r   r  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z5_normalize_home_planned_tool_calls.<locals>.<genexpr>  s     ygGz!yru  r   r   r  r;  r  r  r  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z5_normalize_home_planned_tool_calls.<locals>.<genexpr>  s     BgGz!Bru  quante voltequanti ordinic                "   t        |       }|d<   |d<   Zd   j                         |d<   d   j                         |d<   xs d   j                  |d<   xs d   j                  |d<   |S d |d<   d |d<   nd |d<   nd |d<   |S )	Nr  r  r   r)  r   r*  r&  r'  r  r/  r&  r'  )source_argumentslatest_argumentsexplicit_monthexplicit_yearlatest_batches_limitr
  r
  s     rJ  _latest_batches_argumentszE_normalize_home_planned_tool_calls.<locals>._latest_batches_arguments  s     01$2!$8!!-7]-D-D-F\*+5a=+B+B+DZ('4'J
18J8JV$(6(M*Q-:M:MW%##)-&'+$4A4M=SW 6D6PNVZ!r  c                4   t        |       }|d<   xs d|d<   d|d<   Zd   j                         |d<   d   j                         |d<   xs d   j                  |d	<   xs d   j                  |d
<   |S d |d<   d |d<   nd |d	<   nd |d
<   |S )Nr  r   r  r5	  r@  r   r)  r*  r&  r'  r/  )r0  first_argumentschronological_order_rankr2  r3  r
  r
  s     rJ  _first_batches_argumentszD_normalize_home_planned_tool_calls.<locals>._first_batches_arguments  s    /0#1 #;#@q (2%!,6qM,C,C,EOL)*4Q-*A*A*COJ'&3&Iz!}7I7IOF#'5'LA9L9LOG$""(,%&*
#3@3L-RV5C5O>UY r     r  r  r  r  r)  r*  >   r  r  r  r  r  r   r
     r  r  r  r  r  >   r  r  r     r  r  r  r  r  r   r0  r1  r2  r3  r5  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z5_normalize_home_planned_tool_calls.<locals>.<genexpr>  s      4+3J&4ru  )r  percentquanto percent%r6  rf  r  r  r&  r'  r  r  r  )r0  r  r  r  )Hr  r  r  r  r  _extract_reference_yearsr  r  r_  r  rW  rG  _is_first_batches_request!_extract_chronological_order_rank'_extract_requested_latest_batches_limitr)  r  r  #_normalize_timeclock_tool_argumentsr  r  r  r  +_build_homemade_stock_consumption_tool_callr  r  1_build_inventory_consumption_estimation_tool_callr^  r  next _build_document_create_tool_callrn  _extract_document_kindr  _extract_document_promptr  _build_tips_tool_callr   "_extract_inventory_total_threshold_build_inventory_tool_call_sql_targets_inventoryrI  r
  r
  r  r   r/  r  rw  rF  rC  r|  ry  rD  %_document_request_needs_grounded_data#_build_grounded_document_tool_callsr  _build_fiscal_spend_tool_call_is_supplier_catalog_request(_build_supplier_catalog_lookup_tool_callr  rX  r  r  r  r&  r'  r  _purchase_comparison_focusr  rN  r:  ))r  r  explicit_periodsexplicit_yearscatalog_queryexplicit_homemade_literswants_catalog_query_validationwants_latest_batcheswants_first_batchesnormalized_callschangedrm  normalized_argumentsdocument_tool_calldocument_argumentsinventory_threshold_tool_callr=  r>  r  wants_order_batcheswants_purchase_product_listwants_order_frequencywants_purchase_amountwants_purchase_literswants_purchase_comparisonsupplier_catalog_tool_callr5  r9  requested_limit
safe_limitcomparison_queryfallback_yearexpected_tokensplanned_queryr8  r2  r3  r4  r  r
  r
  s)                                     @@@@@@@rJ  "_normalize_home_planned_tool_callsrq  q  s    )J.w7J+G4M-g6N1':-g6N,W5N*73M8A%)-*s<OPWYcer<s%t"5jA3J?@IB7K

Qj
QQ24# 	I~~!88 ''	2#FwPZ\`ajatat\u#v ##O9P\p$qr#y':'::	 $+:
:-j9;GDEE
  $  j
 ;GDEE3J?Dlmt  wA  EBA'JKK":.3CGZ3X!k
k
 %!A'!J!"4">">?%7%;%;F%C%iG]^hGi6"'*+=+A+A(+K+pOghoOp'q'w'w'y8$!'*!COab
 	
 Wj16XY`6a6m24(B7(K%# 	/I~~!338NsS\SfSfSjSjkpSqSwuwOx8y ''(EF##I.	/ ##(*=-g627;24# 	gI~~!77 ''	2Y001I!#Ig$,Ij!/7/Cteop{  ~B  fC+J_J_Ja  IMIm$#{'>$(	&!%)	'"5@5LQYQa!1ghIg##O9O[d$ef	g ## 	y1xyy 	>%j(HE	>1*== 
 #DJ"OB1ABB 	Lz)J_
-J  8
C.z: ? T":.3XY`bl3m27;;4-g677#J/%Mg%V"%1.//   " $ 6B%;G_`bGcdee  +%%%)$#$,!"..0G x[	,,-	>>44#FwPZ\e#f ##O9P\p$qr#y':'::>>//3"%immG&<&P@P"Q S!46FGJ}}W%3%/	'">> 
 

 (N,F($1	&!)%3	'"!*.	,'(,	*%I///!%:	 S
 A
 ##0!$Y]]7%;%S~%SQS!T )f 5  !C  !Cakaw:VW=K]K]  ~B!*w!7  "G>  "Geoe{jYZmNaNa  BF&/mmL&A  'EcmcyjQRmF]F]F_  @D$-MM*$=  %A_i_u*Q-BYBYB[{!1
 G!%:	Ri@i!$Y]]7%;%S~%SQS!TIg )f 5  !C  !Cakaw:VW=K]K]  ~BIf!*w!7  "G>  "Geoe{jYZmNaNa  BFIg&/mmL&A  'EcmcyjQRmF]F]F_  @DIl#$-MM*$=  %A_i_u*Q-BYBYB[{Ij!!1Ig##O9P\e$fgG&9>> >
 ,
 ##0!/ - i
H^*Q-2D2Ddh!/!l:KaJqM4G4GgkCMCYjm&=&=&?_cAKAWJqM$;$;$=]a!1
 G(;	Rh@h##O9O[tu~[  %A  BG#;#GY^^_uMu##O9O[st}[~$  AG#;#GY^^ `
 N

 ##/6yA G(;	 S
 A

 ##/7	B G!inn 9
 '
 '1m&=&=&?Il#$.qM$;$;$=Ij!}}V$,$1$GZ]5G5G	&!}}W%-%3%Jz!}7J7J	'"G Y^^ 8
 &

 "%Y]]7%;%e?VW^?_%ece!fIg )f 5  !C  !Cakaw:VW=K]K]  ~BIf!*w!7  "G>  "Geoe{jYZmNaNa  BFIg!1Ig##O9Q]f$ghG Y^^7O%O!$Y]]7%;%e?VW^?_%ece!fIg )f 5  !C  !Cakaw:VW=K]K]  ~BIf!*w!7  "G>  "Geoe{jYZmNaNa  BFIg!1Ig##O9Q]f$ghG>>77-3!1IgC(8$9Q$> - a1A!1DQ1G aK[\]K^_`Ka,<Q,?,B,Sm	.)-=a-@-C	/*.>q.A!.D.U	*+/?/B1/E	+,^$),:1,=	.).<Q.?	*+&@M]&^Il#03 47h4 1I,- ##O9S_h$ijG>>22'/IMM/4R4^ot4)5)--:X\t:t-E	/*9>>5K#K#5i@	%(w)?)E2%F	'"$-MM&$9  %G]  %Geoe{zZ[}OaOa  BF	&!%.]]7%;  &K~  &KisiR\]^R_ReRe  FJ	'"%5	'"##O9O[d$efG9>>5L#L##/FZ7	B a#a!$Y]]7%;%Ar!B )f 5  !C  !Cakaw:VW=K]K]  ~B!*w!7  "G>  "Geoe{jYZmNaNa  BF!1a	 G9>>5K#K##/FZ7	B a#a!$Y]]7%;%Ar!B )f 5  !C  !Cakaw:VW=K]K]  ~B!*w!7  "G>  "Geoe{jYZmNaNa  BF!1a	 G)inn@Q.Q?NO	g 6 <"=CCEM'KM[j'k%2	'"}}W%)99%5	'"	+++GY^^y YZqx[r  '6J6] z* 3"23s   "~~10~1c                    t        |      }t        ||xs g |      }|r|}t        | |      }| dk(  rt        |||xs g |      S |S )Nr  r  r  )_build_direct_tool_calls_build_contextual_tool_callsr  &_apply_home_thread_state_to_tool_calls)r  r  r  r  direct_tool_callscontextual_tool_callss         rJ   _build_surface_direct_tool_callsry    sj     198,BTRTVbc16w@QR&5%+%	
 	
 r  c                   t        | j                  | j                        xs | j                  }t	        j
                  dd| j                  t        j                        }t	        j
                  dd|      j                  d      xs | j                  j                         }t        | j                  ||| j                        S )Nr
  zS\b(?:nominat[oa]|chiamat[oa]|chiamalo|chiamala|titolo|con\s+nome|nome\s+file)\s+.+$r  r  r  r  r
  )
_extract_document_titler  rz  r~  rF  r  r  r  r#   r  )r  effective_titleeffective_prompts      rJ  +_normalize_google_workspace_preview_requestr~  '  s    -gnn7<<PaT[TaTaOvv^mm	 vvfc+;<BB6JdgnnNbNbNd(\\%;;	 r  r  )r  c                 K   t        |j                  |j                        }t        |      }t	        ||      sy t        ||      }g }|d d D ]8  }|j                  dk(  r n'|j                  t        | ||       d {          : |sy t        |j                  |j                  |j                  |j                        }t        ||      S 7 Qw)Nr   r<   r
  r
  r$  r
  )r  r  rz  r  rQ  ry  r  r  _execute_tool_callrx  r~  r  r
  )	r  r  r  r  r  r  r
  rm  r$  s	            rJ  *generate_grounded_google_workspace_previewr  8  s      8UG )J0*E1'7CJ24^ w	>>??!!(:7Ibt(u"uvw
 &\\mm~~%;;	D ?-  #vs   A<C>C
?ACc                N   K   t        | |       d {   }|j                  S 7 wrD  )+prepare_google_workspace_preview_with_tracer  )r  r  outcomes      rJ   prepare_google_workspace_previewr  Y  s(      @QQG?? Rs   %#%c           
     F  K   t        |      }t        |j                  |j                        }t	        |      }d|j                  |j
                  |j                  |d}t        | t        |j                  |j
                  |j                  |j                              }|t        |dd|      S t        ||      rt        d|      }g }|d d D ]8  }	|	j                  dk(  r n'|j                  t        | |	|	       d {          : |rlt        t        |j                  |j
                  |j                  |j                        |
      }
|
(t        |
ddi |t!        |      t#        |      d      S t%        ||        d {   }t        |dd|      S 7 7 w)Nr  )r  rz  r~  r  normalized_messager
  z#documents-grounded-purchase-previewzdocuments-grounded)r  r  r   r  r   r<   r  r  zdocuments-grounded-preview)r  tool_resultsr  zdocuments-llm-previewzdocuments-preview-llm)r~  r  r  rz  r  r~  r
  rx  r  r  rQ  ry  r  r  r  r
  _trace_tool_calls_trace_tool_resultsr   )r  r  normalized_payloadr  r  grounded_tracedirect_purchase_previewr  r
  rm  grounded_previewr  s               rJ  r  r  a  s     EWM78J8Q8QSeSjSjkG )J"''#))$++()N T##(($**%,,"4"J"J		
 *(+7& 	
 	
 -WjA5k7K
68#BQ 	{I~~!CC%%,>w	fx,y&yz	{
 R0+00,22-44*<*R*R	 $6   +0,6.(&7
&C(;<N(O		 	 &&8'JJG$%%	 3 'z0 Ks%   C>F! F
BF!	F
F!F!r  c          	       K   t        |j                        }|sdddS |xs g }t        ||j                        }t	        |t        |            }d }t        |      rdddS |r|st        | |      }|dddS t        ||      }t        |j                  |j                        }		 t        |        d {   }
t!        ||
      }||}nb|t        | |      }||}nO|rt#        ||
      }|dddS |}n6t%        t'        |j                  |	||j(                        |        d {   }|j                  dk(  rEt+        t-        d|j                  |j(                  |j.                  xs d      |
       d {   }nKt1        t-        d|j                  |j(                  |j2                  |j4                        |
       d {   }d|j                  |j                  |j6                  |j8                  |j(                  |j:                  |j<                  ddS 7 k# t        $ r5}dt        |j                  t              r|j                  nd	dcY d }~S d }~ww xY w7 ;7 7 w)Nr	  zWPer creare il documento mi serve almeno il brief o la richiesta da trasformare in file.r	  zNon creo un file vuoto: la lettura dei dati reali del tenant ha restituito 0 righe. Riprova specificando meglio periodo, modulo o filtri.zNon creo file su Drive senza prima aver letto dati reali del tenant. Chiedimi una preview o specifica meglio quali dati devo includere.)r
  r
  r
  	not_readyzGoogle Workspace non collegator  zNon creo file operativi con contenuto generato dall'AI: per questa richiesta non ho un export deterministico basato su dati reali.r
  r  r  r
  )rz  r~  r  r  )r"  r  )rz  r~  r  r^  rQ  r	  )rz  r~  web_urlfile_idr  account_emailr
  )re  r  )r  r  r  rz  rQ  r  r
  r
  r
  r
  r~  r$   r   r  r  r  r
  r
  r   r#   r  r   r!   r  r   r^  rQ  r  r  r  r
  )r  r$  r
  r  prior_resultsrequest_messagegrounding_requiredprompt_grounded_previewenriched_promptr~  r"  r:  r  r  generic_previewr	  s                   rJ  !_create_google_workspace_documentr    s     "$++.F.o
 	

 ',"M?		RO>P_`oPpqEI+M:. b
 	
 -"WX_ae"f"*2 d 
 :(O &djjtyyAE
A'JJ
 K( #""*&[\cei&j#".-GJ#0O &6 c  &G--**.*D*D	   G ||u*(mm&-&C&C-2	 "
 
 -(mm&-&C&C\\ "	
 	
 LL]]%,%B%B$22
 } K 
!$.szz3$?cjjEe
 	

:
	
s|   B%I,(H$ 6H!7H$ ;A/I,*I%+AI,=I(>AI,	I*
AI,!H$ $	I"-*II"I,I""I,(I,*I,c           	       K   t               }|j                  }|dk(  rSt        |       5 }t        |j	                  d            }d d d        dD cg c]  }|d   t        |d         d c}dS |dv rXt        | dd	
       d {   }t        |t              s|i dS |j                         D 	ci c]  \  }}	d|vs||	 }
}}	||
dS |dk(  r&|j                  | j                  d      \  }}dd||dS |dk(  r5|j                  | j                        }d|j                  |j                  dS t        dd|       # 1 sw Y   xY wc c}w 7 c c}	}w w)Nr  zNSELECT module_key, enabled FROM tenant_module_settings ORDER BY module_key ASCrG  rF  )rG  rF  r  r  r  ri  r/
  r0
  r1
  access_tokenr  r  )r  r  configr  r0  r  r  r  r  zModulo non riconosciuto: r  )r*   r  r#  r  r  r  r-
  r  r  rL  get_llm_settingsr  r  r  r  r   )r  r$  r  r  r"  rQ  rJ  r  kvsafer  r  r  s                 rJ  r  r    s    E[[F%g. 	~*
**+{|}D	~ gkl`cL(9d3y>FZ[l
 	
 ---geJ]^^'4($"55!(LAN!4K1LL d33"33G4E4EvN
&FR\]]55g6G6GH"X5K5K[c[n[noo
C2KF80T
UU%	~ 	~ m _ MsM   'EEEE,EE,E3E EA=EEEEc                l  K   t               }|j                  }|j                  }|dv rot        |        d {   }t	        | dd| |       d {   }t        |t              s|ddS |j                         D ci c]  \  }}d|vs|| }	}}||	dS |d	k(  rU|j                  d
      }
|j                  | j                  |
rt        |
      nd       }d	|j                  |j                  dS |dk(  r#|j                  | j                  d|      }dd|dS t        dd|       7 7 c c}}w w)Nr  r]
  z/booking-settings/rU
  T)r  r	  r  r  r0  r  )r  r  r  r  )r  r  r  r  z-Modulo non modificabile tramite questo tool: r  )r*   r  r  r3
  r-
  r  r  rL  rn  upsert_fiscal_document_settingsr  r  r  r  upsert_llm_settingsr   )r  r$  r  r  r  r2
  r  r  r  r  r  r	  r  s                rJ  _update_module_settingsr  2  sT    E[[F}}H--3G<<-%hZ0	
 
 '4($66!(LAN!4K1LL d33 _5660=#m,4 7 
 #V5I5IY_YjYjkk..w/@/@&(S
&
KK
C2_`f_g0h
ii+ =
 Ms:   5D4D*D4D,,D4>D.D.BD4,D4.D4c                  K   i }|j                   |j                   j                         |d<   t        | dd|       d {   }t        |t              r@|j                  dg       }|j                  dt        |t              rt        |      nd      }ng }d}t        |t              r|d |j                   }||dS 7 |w)	Nr]  r/
  r;
  r<
  rL  r  r   )r  r  )	r   r/  r-
  r  r  rn  r  r  r  )r  r$  r  r  rL  r  s         rJ  r  r  O  s      "Fyy%)YY%8%8%:!")'%o^deeG'4 GR(G:eT3JSZPQR%l

#!E22 fs   >B? B=A=B?c                   t               }|j                  | j                        }t        |      |D cg c]~  }|j                  |j
                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  d c}dS c c}w )N)r  rt  ru  rv  rw  r  rq  rx  re  rz  r  )ry  r  )r*   rc  r  r  r  rt  ru  rv  rw  r  rq  rx  re  rz  r  )r  r  docsr  s       rJ  _list_fiscal_documents_toolr  _  s    E&&w'8'89DT 
  ff # 0 0!$!2!2#&#6#6!$!2!2!$!2!2 # 0 0LL**!$!2!2!nn
 
s   BB<c                    t               }|j                  |       }t        |      |D cg c]%  }|d   |d   |d   |d   |d   |d   |d   |d   d	' c}d
S c c}w )Nr  r  r  r  r  r  r  r  )r  r  r  r  r  r  r  r  )ry  r  )r*   r  r  )r  r  r  us       rJ  _list_tenant_users_toolr  w  s    E##G,EU 
  g&	jM7 !. 1&	 /o	
 
s   *Ac                b   | j                   dk(  ry| j                  | j                  | j                  | j                  fS | j                  | j                  | j                  fS t	               }| j                   dk(  r|t        |j                               z
  |fS | j                   dk(  ry||fS )Nr	  NNweekrq  r	  )r  r)  r*  r>  r  r   rz  )r$  r  s     rJ  _resolve_timeclock_date_ranger    s    zzX"dmm&?--#!1!111 EzzVyemmo66==zzU%<r  c                r   t        |      | j                  dvr;| j                  | j                  | j                  | j                  | j
                  dfS t        fddD              r;| j                  | j                  | j                  | j                  | j
                  dfS 	 t               j                  |       }g }|D ]%  }t        |j                  d      xs d      j                         t        |j                  d      xs d      j                         t        |j                  d	      xs d      j                         g}|D cg c]  }|st        |       }}t        fd
|D              r|j                  |       |D ]Y  }|j                         D cg c]  }t        |      dk\  s| }	}|	s2t!        fd|	D              sG|j                  |        % ( t        |      dk(  r%|d   }
t        |
j                  d      xs d      |
fS y# t        $ r Y yw xY wc c}w c c}w )N>   r  r  r  r  r  r  c              3  .   K   | ]  }|d  d v   ywrZ  r  )rH  rt  r  s     rJ  rK  z2_resolve_timeclock_subject_user.<locals>.<genexpr>  s!     
q88+,A..
q   z ho z io z mie z mio rl   ra   r  r  r
  r  r  c              3  .   K   | ]  }|xr |v   y wrD  r  )rH  fieldr  s     rJ  rK  z2_resolve_timeclock_subject_user.<locals>.<genexpr>  s     Ruu2"222Rr  r   c              3  &   K   | ]  }|v  
 y wrD  r  )rH  r  r  s     rJ  rK  z2_resolve_timeclock_subject_user.<locals>.<genexpr>  s     LEe'77Lru  r   r   r  )r  r  r  r  r  r  r)  r*   r  r  r  rn  r  r  r  r  r	  )r  r  r  r  r  r	  r  normalized_fieldsr  r  rf	  r  s              @rJ  _resolve_timeclock_subject_userr    s    'z2||33%%((''	!
 
 	
 
q?p
qq%%((''	!
 
 	
 "44W= (*G  &B'--/$*+113!'R(..0

 BHQ5_U3QQR@QRRNN4 & 	E).J#e*/eJFJ#LVLLt$		 7|q!*7;;t$*+W44-   R
 Ks*   &H  H/H/"H46H4 	H,+H,c                P   t               }t        |      \  }}t        | |j                        \  }}t	        dt        t        |j                  xs t              d            }|j                  | t        |||j                         nd ||j                         nd |            }t        |j                  d      t              r|j                  d      ng }	t        |j                  d      t              r|j                  d      ng }
t        |j                  d      t              r|j                  d      ng }d }|r?|=|	D ]8  }t        |t              st!        |j                  d      xs d      |k(  s6|} n |j"                  |j$                  |j$                  j                         nd ||j                         nd ||j                         nd ||d n|j                  d	      |d n|j                  d
      |d n|j                  d      d||	|
||j&                  d
S )Nr   r,  )r  r)  r*  r  summary_by_useractive_entriesr
  r  r
  r  r  r  r  )
r  r>  r)  r*  resolved_userselected_summaryr  r  r
  r  )r*   r  r  r  r  r  r  r  r  get_timeclock_overviewr)   r/  r  rn  r  r  r  r  r>  r  )r  r$  r  r)  r*  selected_user_idselected_usereffective_limitoverviewsummary_rowsactive_rows
entry_rowstarget_summaryrJ  s                 rJ  _get_timeclock_summary_toolr    s   E8>J&Egt&_#m!STZZ%C3C!DdKLO++$1;1Gz++-T-5-AX'')t!		
H 7AN_A`bf6g8<< 12moL4>x||L\?]_c4d(,,/0jlK,6x||I7NPT,Ui([]JNN2 	C#t$SWWY-?-E2)FJZ)Z!$	 7;7G7G7St''113Y]0:0Fj**,D,4,@H&&(d')1D}7H7H7P - 5=;L;LZ;X*2T8I8I'8R	
 +'%// r  c                  g }| D ]0  }	 |j                  t        j                  t        |                   2 |syt        t        |      d      }||D cg c]
  }||k  s	| }}|r|d   nd }n|d   }|y|D cg c]
  }||k  s	| }}||D cg c]
  }||k  s	| }	}|	r|	d   nd }
n	|r|d   nd }
|
|
j                         nd |j                         fS # t        $ r Y w xY wc c}w c c}w c c}w )Nr  T)rG	  r   )r  r   r  r  r  r5  rK  r/  )available_datesr)  r*  normalized_datesr  ro  end_candidatesselected_endolder_candidatesstart_candidatesselected_starts              rJ  $_resolve_inventory_consumption_datesr    s7    $&  	##D$6$6s5z$BC
 c"23TB+;P4tx?O$PP,:~a('*)9QTL=PQQ-=TTASDTT0@)!,d0@)!,d)7)C>##%|OeOeOggg+  		 Q RTs5   -C
C,"C,>
C1	C1
C6 C6	C)(C)c                	   t               }|j                  |       }t        |t              r|j	                  d      ng }|D cg c]j  }t        |t              rXt        |j	                  d      xs d      j                         r,t        |j	                  d      xs d      j                         l }}t        ||j                  |j                        \  }}|r|s|j                  g ||ddddS |j                  | |	      }	|j                  | |	      }
t        |	j	                  d
      t              r|	j	                  d
      ng }t        |
j	                  d
      t              r|
j	                  d
      ng }|D ci c]a  }t        |t              rOt        t        |j	                  d      xs d            t        t        |j	                  d      xs d            f|c }}|D ci c]a  }t        |t              rOt        t        |j	                  d      xs d            t        t        |j	                  d      xs d            f|c }}g }t        |      t        |      z  D ]  }t        |j	                  |      t              r|j	                  |      ni }t        |j	                  |      t              r|j	                  |      ni }t        |xs |j	                  d      xs d      }t        |xs |j	                  d      xs d      }dj                  d ||fD              j                         }|j                  j                         rt!        |j                  |      nd}|j                  j                         r|dk  r't#        |xs i j	                  d      xs d      }t#        |xs i j	                  d      xs d      }t%        ||z
  d      }|dk  r|j'                  |||t%        |d      t%        |d      |df        |j)                  d        |d |j*                   D cg c]  \  }}|	 }}}	 t-        t/        j0                  |      t/        j0                  |      z
  j2                  d      }|j                  |||t%        t7        d |D              d      ||dS c c}w c c}w c c}w c c}}w # t4        $ r d}Y Pw xY w)Nr
  r  r
  )r)  r*  r  r   insufficient_history)r  rL  start_inventory_dateend_inventory_datetotal_consumed_unitsperiod_daysr  )r  rL  r  r  r  c              3  &   K   | ]	  }|s|  y wrD  r  r  s     rJ  rK  z2_get_inventory_consumption_tool.<locals>.<genexpr>E   s     UtPTdUr  r  r  r   )r  r  opening_unitsclosing_unitsconsumed_unitsc                    | d    t        | d   d          t        | d   d         j                         t        | d   d         j                         fS )Nr   r   r  r  r  )r  r  r  r  s    rJ  rk  z1_get_inventory_consumption_tool.<locals>.<lambda>\   s[    1XI58,-..a)*002a()//1	
 r  rl  c              3  8   K   | ]  }t        |d            yw)r  NrI	  r	  s     rJ  rK  z2_get_inventory_consumption_tool.<locals>.<genexpr>o   s     )cD%5E0F*G)cr  )r  rL  r  r  r  r  available_history_dates)r*   list_inventory_totals_historyr  r  rn  r  r  r  r)  r*  r  get_inventory_totals_detailr  _normalize_lookuprK  r  r  r  r  r  rn  r  r  r   r  rr  r  r  )r  r$  r  history_payloadhistory_entriesr  r  r  r  opening_detailclosing_detailopening_itemsclosing_itemsro  opening_mapclosing_mapr	  rF  opening_itemclosing_itemr  r  r  r  r  r  r  rB  rJ  selected_itemsr  s                                  rJ  _get_inventory_consumption_toolr     s   E99'BO8B?TX8Yo)))4_aO %eT"s5995E+F+L"'M'S'S'U 	EII&'-2.446O 
 0T??0,,
  '9ZZ$8"4$',
 	
 66wOc6dN66wOa6bN3=n>P>PQX>Y[_3`N&&w/fhM3=n>P>PQX>Y[_3`N&&w/fhM "dD! 
3txx7=2>	?ARSVW[W_W_`oWpWvtvSwAxy{K  "dD! 
3txx7=2>	?ARSVW[W_W_`oWpWvtvSwAxy{K  ;=L;#k"22 
/9+//#:NPT/U{s+[]/9+//#:NPT/U{s+[]L8L==nMSQST\9\>>OUSUVXXUm/LUU[[]
@D

@P@P@R$TZZ<X[::%1*|1r667OPUTUV|1r667OPUTUV}}<a@Q$0%2%*=!%<%*=!%<&4		

6 
   )5\tzz(BCfacCNC4--.@ADDVDVWkDllrrtuv
  40 %c)cTb)c&cef g"#2 a4
T D  s-   A/R??A&S+A&S	S?S S"!S"c                ^   t               }|j                  dk(  rF|j                  st        dd      	 |j	                  | |j                         d|j                  ddS |j                  dk(  r|j                  xs dj                         }|j                  xs dj                         }|j                  xs dj                         }|j                  xs dj                         }|r|r|r|st        dd	      	 t        ||||j                  ||j                  
      }|j!                  | |      }	d|	dS t        dd|j                         # t
        t        f$ r}t        dt        |            |d }~ww xY w# t
        t        f$ r}t        dt        |            |d }~ww xY w)Nr	  r  z4user_id obbligatorio per eliminare un sotto-account.r  T)r  r  r	  r  r
  zEPer creare un sotto-account servono: name, username, email, password.)r  r  r  r  r  r  )r  r  zOperazione non supportata: )r*   r  r  r   delete_tenant_staff_userr  KeyErrorr  r  r  r  r  r  r(   r  r  create_tenant_staff_user)
r  r$  r  r:  r  r  r  r  r  r  s
             rJ  _manage_tenant_userr  u   s   E~~!||C8noo	K**7DLLA &$,,4PP~~!		R&&(MM'R..0!r((*MM'R..085^ 	K2!!..! ,,G 11'7CD &t44
C2MdnnM]0^
__5 H% 	KCCAsJ	K. H% 	KCCAsJ	Ks/   E =7F E>"E99E>F,F''F,c                   t        |j                  |j                  |j                  |j                  g      st        dd      	 t               j                  | |j                  |j                  |j                  |j                         t        |       S # t        t        f$ r}t        dt        |            |d }~ww xY w)Nr  z(Specifica almeno un campo da aggiornare.r  )r  r  r  r  )r)  r  r  r  r  r   r*   update_venue_infor  r  r  r  )r  r$  r:  s      rJ  _update_venue_profiler     s    t/@/@$BVBVWX4^__	G,,LL** 00 	- 	
 w'' ! GCH=3FGs   AB C&B==Cc                 K   |j                   dk(  rt        |       }n|j                   dk(  r+t        | t        j	                  |j
                              }n|j                   dk(  r+t        | t        j	                  |j
                              }n|j                   dk(  r+t        | t        j	                  |j
                              }nJ|j                   dk(  r+t        | t        j	                  |j
                              }n|j                   dk(  r+t        | t        j	                  |j
                              }n|j                   dk(  r+t        | t        j	                  |j
                              }n|j                   dk(  r+t!        | t"        j	                  |j
                              }nb|j                   d	k(  r+t%        | t&        j	                  |j
                              }n(|j                   d
k(  r+t)        | t*        j	                  |j
                              }n|j                   dk(  r+t-        | t.        j	                  |j
                              }n|j                   dk(  r+t1        | t2        j	                  |j
                              }nz|j                   dk(  r+t5        | t6        j	                  |j
                              }n@|j                   dk(  r+t9        | t:        j	                  |j
                              }n|j                   dk(  r3t=        | t>        j	                  |j
                               d {   }n|j                   dk(  r3tA        | tB        j	                  |j
                               d {   }n|j                   dk(  r3tE        | tF        j	                  |j
                               d {   }n@|j                   dk(  r3tI        | tJ        j	                  |j
                               d {   }n|j                   dk(  r5tM        | tN        j	                  |j
                        |       d {   }n|j                   dk(  r3tQ        | tR        j	                  |j
                               d {   }nx|j                   dk(  r3tU        | tV        j	                  |j
                               d {   }n6|j                   dk(  r3tY        | tZ        j	                  |j
                               d {   }n|j                   dk(  rt]        |       }n|j                   dk(  rt_        |       }n|j                   dk(  r+ta        | tb        j	                  |j
                              }n|j                   dk(  r+te        | tf        j	                  |j
                              }nH|j                   dk(  r+ti        | tj        j	                  |j
                              }n|j                   dk(  r*tm        | tn        j	                  |j
                              }n|j                   dk(  r*tq        | tr        j	                  |j
                              }n|j                   dk(  r2tu        | tv        j	                  |j
                               d {   }n[|j                   d k(  r2ty        | tz        j	                  |j
                               d {   }nt}        d!d"|j                    #      |j                   |j
                  |d$S 7 7 7 g7 (7 7 7 i7 *7 7 Sw)%Nget_locale_profiler  r1   r  r  r  r  r  r  r:   r2   r3   r  r4   r  r5   r8   r6   r<   r  rh  r;   r  rc  r  rd  re  rf  r7   r9   r
  rg  r  zTool non supportato: r  r  r  r	  )?r  r  r|  r	  model_validater  r	  r  r  r"  r$	  r.  r2	  r8  rT	  r<  rZ	  r:  rc	  rB  r	  rJ  r	  rN  r
  r  r	  rP  r	  r  r
  rR  rY
  rY  r`
  ri  rc
  rv  r  rx  r  r  r  r  r  r  r  r  r  r  r  r  _get_homemade_recipe_toolr  r  r  r  r  r'  r  r;  r  r   )r  rm  r
  r	  s       rJ  r  r     s     ~~--$W-	,	,!'+=+L+LYM`M`+ab	+	+ *:*I*I)J]J]*^_	2	2#G-A-P-PQZQdQd-ef	5	5,W6L6[6[\e\o\o6pq	3	3$W.C.R.RS\SfSf.gh	1	1"7,?,N,NyObOb,cd	1	1"7,?,N,NyObOb,cd	0	0&w0F0U0UV_ViVi0jk	2	2'1H1W1WXaXkXk1lm	,	,g~'D'DYEXEX'YZ	-	-"7,>,M,MiNaNa,bc	.	.w(F(FyGZGZ([\	.	.#G-@-O-OPYPcPc-de	6	6-g7O7^7^_h_r_r7stt	/	/*74I4X4XYbYlYl4mnn	/	/*74I4X4XYbYlYl4mnn	/	/*74I4X4XYbYlYl4mnn	=	=8'66y7J7JK1
 

 
0	0+G5J5Y5YZcZmZm5noo	3	3.w8P8_8_`i`s`s8tuu	.	..w8L8[8[\e\o\o8pqq	2	2,W5	.	.(1	2	2,W6J6Y6YZcZmZm6no	6	60:R:a:abkbubu:vw	0	0*74F4U4UV_ViVi4jk	/	/$W.B.Q.QR[ReRe.fg	1	1&w0F0U0UV_ViVi0jk	3	33G=U=d=denexex=yzz	-	--g7I7X7XYbYlYl7mnn6KINNK[4\]] (( Q unnn
 puq  {ns   M
]\1A]\4A]\7A]\:A]\=A]] A]]A]]F]6]	7A ]7]8:]4]7]:]=] ]]]	]]c                6    | xs dj                         }|xs d S ra  r  r  s     rJ  _clean_model_namer     s    {!!#G?dr  c                 n    t               } t        | j                        xs t        | j                        S rD  )r    r  assistant_planner_modelassistant_modelr  s    rJ  _assistant_planner_modelr   !  s,    ~HX==>mBST\TlTlBmmr  c                 n    t               } t        | j                        xs t        | j                        S rD  )r    r  assistant_synthesis_modelr  r  s    rJ  _assistant_synthesis_modelr  !  s,    ~HX??@oDUV^VnVnDoor  c                 (    dj                  g d      S )Nr  )z6search_products(query,limit): catalogo prodotti attivizTget_purchase_overview(query,year,month,start_date,end_date,limit): totali acquistatizPget_purchase_history(query,year,month,start_date,end_date,limit): righe acquistozcget_purchase_batches(query,year,month,start_date,end_date,batch_id,target_date,limit): ordini/batchzjcompare_purchase_periods(query,primary_year,primary_month,secondary_year,secondary_month,limit): confrontizTget_purchase_frequency(query,year,month,start_date,end_date,limit): frequenza ordiniz4run_tenant_query(sql,limit): SELECT SQLite read-onlyz<describe_tenant_schema(include_examples): schema disponibilez#list_tenant_users(): utenti/accountzgget_reservations_snapshot(target_date,target_time,time_window,customer_query,limit): stato prenotazioniz2list_reservations(date,limit): elenco prenotazionizPcreate_reservation/update_reservation/delete_reservation: scrittura prenotazionizQget_inventory_consumption(query,start_date,end_date,limit): consumi tra inventariz6get_homemade_recipe(query,target_liters): ricette prepzget_timeclock_summary(query_text,scope,target_date,start_date,end_date,limit,include_entries): turni/cartellini; scope solo today|week|all|active, per mese/anno usa start_date/end_datezAget_module_settings/update_module_settings: configurazioni modulizYcreate_google_workspace_document(kind,title,prompt,destination_folder_id): crea doc/sheetzupsert_product/manage_tenant_user/update_venue_profile/write_shared_note/write_sales_goal/write_suspended_order: scritture controllater  r  r  rJ  _planner_tool_catalog_summaryr  
!  s    99	
 r  c                 (    dj                  g d      S )Nr  )z~ordini_products: product_name, lot_code, supplier_name, product_code, final_price_vat, units_per_pack, liters_per_unit, activezGordini_items + ordini_batches: storico acquisti, confirmed_at, quantityzsupplier_catalog_items: source_name, source_lot_code, source_supplier_name, product_code, final_price_vat, units_per_pack, liters_per_unit, catalog_idz?supplier_catalogs: id, supplier_name, catalog_name, total_itemsz}inventory_latest_items: warehouse_name, product_name, supplier_name, total_equivalent_units, inventory_source, inventory_datezmtenant_inventory_daily_consumptions: consumi salvati per magazzino/prodotto/data, consumed_units, period_daysztenant_inventory_estimated_consumptions: consumi stimati globali per prodotto/data; formula deterministicamente opening_units + incoming_units - closing_units = consumed_unitsztenant_inventory_consumption_product_stats: medie consumi stimate per prodotto; average_daily_consumed_units = totale consumato stimato / giorni con almeno un consumo stimatoztenant_homemade_stock_movements: movimenti stock prep/homemade; consumed_quantity > 0 = prep consumata/scaricata, added_quantity > 0 = prep prodotta/caricata, occurred_at = data movimentoz]tenant_homemade_stock_items: stock corrente prep/homemade per frigo/magazzino, quantity in pzztenant_homemade_operational_days: giorni operativi derivati dai calendari stock homemade, usage_scope bar/restaurant e operational_datezStenant_homemade_recipes: ricette/prep homemade, name, measurement_unit, usage_scopez6tenant_users: name, username, email, role, permissionszUtenant_timeclock_entries: user_name, username, started_at, ended_at, duration_secondsa  tenant_tips_runs: id, area, tip_date, total_tip_amount, tip_pos_amount, tip_pos_effective_amount, tip_cash_amount, historical_total_amount, payable_total_amount, present_staff_count, payout_status. total_tip_amount e' il lordo raccolto; payable_total_amount e' il totale realmente da pagare, quindi usa il POS effettivo netto. payout_status indica pending/da consegnare, carried/caricata in altra giornata o settled/consegnata.z~tenant_tips_run_entries: run_id, area, staff_name, staff_lookup, amount_today, historical_amount, total_amount, score, presentr  r  r  rJ  _planner_schema_hintsr  #!  s    99	
 r  c                    dj                  dddddddd	d
dddddddddddddddt                dt                g      S )Nr
  zoSei il planner operativo di PowerUp. Non sei user-facing: devi decidere se rispondere o quali tool reali usare.a)  Output obbligatorio: SOLO JSON valido. Formato reply: {"mode":"reply","reply":"...","tool_calls":[],"confidence":0.0-1.0,"needs_clarification":false}. Formato tool: {"mode":"tool","reply":null,"tool_calls":[{"tool":"nome_tool","arguments":{...}}],"confidence":0.0-1.0,"needs_clarification":false}.zUsa i tool per ogni richiesta su dati o azioni del locale: prodotti, cataloghi, ordini, inventario, consumi, documenti fiscali, prenotazioni, turni, mance, homemade, note, utenti, impostazioni o file Google.zeNon inventare dati. Se mancano dettagli indispensabili, usa mode=reply e fai una sola domanda chiara.a   Il Contesto runtime nel messaggio utente contiene data/ora e locale: usalo per oggi, domani, dopodomani, questa settimana, settimana prossima, questo mese, mese prossimo, anno corrente e simili. Converti sempre in YYYY-MM-DD quando passi argomenti ai tool.a	  Follow-up: usa stato thread e conversazione recente per capire riferimenti brevi tipo 'e questo?', 'me li mostri tutti?', 'quanto costa?', ma riconosci cambi espliciti di dominio. Non restare su timbrature se la nuova domanda parla di inventario, catalogo o ordini.a)  Preferisci describe_tenant_schema + run_tenant_query per aggregazioni libere, join, classifiche, conteggi, totali, percentuali e domande non coperte perfettamente dai tool specializzati. Se usi run_tenant_query e non sei certo dello schema, includi anche describe_tenant_schema nello stesso piano.zSQLite: solo SELECT read-only; niente ILIKE, usa lower(colonna) LIKE '%termine%'. Scegli LIMIT piccoli: 1 per totali singoli, N per top/lista richiesta, 50 se non specificato. Non usare 5000 salvo richiesta di lista completa.zTimeclock/turni/ore: usa get_timeclock_summary o SQL sulle tabelle timeclock con start_date/end_date per mese, settimana, anno o periodi relativi.a+  Mance: usa SQL su tenant_tips_runs, tenant_tips_run_entries e tenant_tips_roster_entries; per report/storico non filtrare staff salvo persona specifica. Per totali da pagare usa payable_total_amount, non il lordo POS. Per mance ancora da consegnare filtra tenant_tips_runs.payout_status = 'pending'.a  Inventario/giacenze/magazzini: usa SQL su inventory_warehouses, inventory_latest_items, inventory_latest_lots. Per 'in casa' o senza magazzino aggrega su tutti i magazzini; per soglie globali usa GROUP BY product_name/supplier_name e HAVING SUM(total_equivalent_units) < soglia.z}Classifiche inventario: aggrega per prodotto/fornitore e ordina per SUM(total_equivalent_units) DESC o ASC secondo richiesta.zCataloghi fornitori: per 'chi vende', 'catalogo Laconi', prezzi fornitore o confronti fornitori usa supplier_catalogs/supplier_catalog_items, non search_products. search_products serve al catalogo prodotti del locale.zOrdini/acquisti/storico: usa i tool ordini o SQL su ordini_batches/ordini_items/ordini_products. Per richieste senza prodotto/fornitore esplicito usa query vuota, non parole generiche come 'finora', 'mese', 'ordine'.a,  Confronti ordini: se l'utente dice 'questo mese contro maggio 2025', interpreta 'questo mese' come mese corrente del Contesto runtime e 'maggio 2025' come secondo periodo. Se non nomina un prodotto o fornitore, passa query=''. Non inserire parole come allora/questo/mese/contro/confronta nella query.zDocumenti fiscali: usa tenant_fiscal_documents e tenant_fiscal_document_items per bolle, fatture, DDT, merce arrivata, discrepanze o valori documento.zSpese/pagato/importi reali: per 'quanto abbiamo speso/pagato' usa come fonte primaria tenant_fiscal_documents.total_amount, che rappresenta il totale documento IVA inclusa. Usa ordini solo per quantita ordinate o stime quando non esiste documento fiscale.zNei documenti fiscali supplier_name e' il fornitore normalizzato. Non prendere come fornitore il cliente/fatturazione presente nel testo OCR, per esempio Sammy Productions e' il destinatario del locale, non il fornitore MOET.zConsumi/stime: get_inventory_consumption solo per cali tra inventari. Per stime consumo medio usa dati reali da ordini + inventari/giacenze e dichiara la formula e gli eventuali limiti.a  Consumi prep/homemade/preparazioni: usa SQL su tenant_homemade_stock_movements, tenant_homemade_stock_items e tenant_homemade_operational_days. La media giornaliera va divisa per i giorni operativi calendario dell'area della prep: usage_scope restaurant usa il calendario ristorante, bar usa bar/club, both usa l'unione. Non usare get_inventory_consumption ne tenant_inventory_consumption_product_stats per prep/homemade.zhHomemade/prep/ricette: usa get_homemade_recipe solo per formule, ingredienti, dosi e rese delle ricette.zFile Google: se il file deve contenere dati reali, prima raccogli i dati con i tool corretti, poi create_google_workspace_document come ultimo step. Non creare file con dati finti.zScritture: per prenotazioni, prodotti, obiettivi, note, ordini sospesi, utenti o impostazioni usa solo i tool dedicati; mai dire che hai scritto/modificato se non hai chiamato il tool.zTool disponibili: zSchema rapido: )	r  r  r  r  r  r&  r'  r   r/  )r  r  tool_descriptionss      rJ  _planner_system_promptr  :!  s    99} X ^s O X x p a z e L h g { e N p H tv C G !>!@ AB35673	
 r  c           	        t               }t        |       }dj                  d|j                          dt	               j
                   dd|j                         j                          dt        j                  |d       g      S )	Nr
  Data e ora correnti: r;  r=  zData corrente ISO: Locale attivo: Fr-  )	r  r  r  r/  r    r  r   r   r0  r  r  contexts      rJ  _planner_runtime_contextr  "  s}    

C!'*G99#CMMO#4B|~7X7X6YYZ[!#((*"6"6"8!9:djjuEFG	
 r  c           	         | syg }| dd  D ]N  }|j                  d      dk(  rdnd}|j                  | d|j                  dd	      j                                 P d
j                  |      S )Nz(nessun messaggio precedente)r  r  r  Utente
Assistenter
  r  r
  r
  )rn  r  r  r  )r  r
  r  r  s       rJ  _build_recent_conversationr  "  sy    .E% F";;v.&8xlvRIr : @ @ BCDEF 99Ur  c                d    	 t        |       }d|cxk  rdk  r|S  d S # t        t        f$ r Y y w xY w)Nr#  r$  r  rX  r  )r  r&  s     rJ  _coerce_optional_yearr  "  sE    5z 4'4'41'T1 z"     //c                d    	 t        |       }d|cxk  rdk  r|S  d S # t        t        f$ r Y y w xY w)Nr   r5  r  )r  r'  s     rJ  _coerce_optional_monthr"  "  sE    E
 $"$5.$$. z" r   c                    t        | t              sy | j                         }|sy 	 t        j                  |      j                         S # t        $ r Y y w xY wrD  )r  r  r  r   r  r/  r  rl  s     rJ  _coerce_optional_iso_dater$  "  sQ    eS!
++-C!!#&0022 s   "A	 		AAc                   t        | t              si S i }| j                  d      }t        |t              r%|j	                         dv r|j	                         |d<   dD ]H  }| j                  |      }t        |t              s%|j	                         s6|j	                         ||<   J dD ]$  }t        | j                  |            }| |||<   & |S )Nr  >   r	  r  )r  r  r  r  r  r  )r  r  r  r  r  )r  r  rn  r  r  rZ  r  r  r  rF  r  s        rJ   _normalize_pending_product_stater'  "  s    gt$	$&JK(I)S!ioo&7;O&O"+//"3
;a ,C eS!ekkm#kkmJsO, c $&w{{3'78#JsO$ r  c                   t        | t              si S i }| j                  d      }t        |t              r%|j	                         dv r|j	                         |d<   dD ]H  }| j                  |      }t        |t              s%|j	                         s6|j	                         ||<   J dD ]$  }t        | j                  |            }| |||<   & dD ]$  }t        | j                  |            }| |||<   & |S )Nr  >   r	  r  )r  r  r  r  r  r  r  r  )r  r  )r  r  rn  r  r  r  rZ  r&  s        rJ  #_normalize_pending_sales_goal_stater)  "  s    gt$	$&JK(I)S!ioo&7;O&O"+//"3
; ,C eS!ekkm#kkmJsO,  $%gkk#&67#JsO$ . $&w{{3'78#JsO$ r  c                T   t        | t              si S i }| j                  d      }t        |t              r%|j	                         dv r|j	                         |d<   dD ]H  }| j                  |      }t        |t              s%|j	                         s6|j	                         ||<   J |S )Nre  >   r	  r	  r	  re	  r	  r	  )r  r  rn  r  r  )r  r  re  rF  r  s        rJ  #_normalize_last_product_write_stater+  "  s    gt$	$&J[["F&#6<<>5}#}%||~
8< ,C eS!ekkm#kkmJsO, r  c                   t        | t              si S i }dD ]H  }| j                  |      }t        |t              s%|j	                         s6|j	                         ||<   J t        |j                  d      xs d      j	                         }|rt        |      rz|j                  dd        | j                  d      }t        |t              rGt        |j                  d      xs d      j	                         |k(  rt        |      }d|d<   i | d|i} dD ]$  }t        | j                  |            }| |||<   & dD ]$  }t        | j                  |            }| |||<   & dD ]$  }t        | j                  |            }| |||<   & d	D ]$  }t        | j                  |            }| |||<   & t        |j                  d
      xs d      dvr|j                  d
d        t        | j                  d      t              r| d   |d<   | j                  d      }t        |t              ri }|j                  d      }t        |t              r#|j	                         r|j	                         |d<   dD ]$  }t        |j                  |            }| |||<   & dD ]$  }t        |j                  |            }| |||<   & |j                  d      }	t        |	t              r%|	j	                         dv r|	j	                         |d<   t        |j                  d      t              r|d   |d<   |r||d<   | j                  d      }
t        |
t              r%|
j	                         dv r|
j	                         |d<   t        | j                  d            }|r||d<   t        | j                  d            }|r||d<   t        | j                  d            }|r||d<   |S )N)rY  r
  purchase_view%inventory_consumption_estimation_mode&inventory_consumption_estimation_query	last_toolpurchase_first_ordered_atpurchase_last_ordered_atfiscal_spend_querytimeclock_query_texttimeclock_scopetimeclock_resolved_user_idtimeclock_resolved_user_nametimeclock_resolved_usernametimeclock_resolved_emailr
  r
  
comparisonr  )purchase_yearfiscal_spend_year).inventory_consumption_estimation_purchase_year/inventory_consumption_estimation_inventory_year)purchase_monthfiscal_spend_month)purchase_start_datepurchase_end_datefiscal_spend_start_datefiscal_spend_end_dater]  timeclock_target_datetimeclock_start_datetimeclock_end_dater5  >   r	  r  r  r	  timeclock_include_entries)r0  r2  )r1  r3  r5  >   r^  ordersr  rH  r6  pending_action>   product_writesales_goal_writepending_productpending_sales_goallast_product_write)r  r  rn  r  r  #_is_generic_purchase_followup_queryr  r  r"  r$  r  r'  r)  r+  )r  r  rF  r  r
  r:  cleaned_comparisoncomparison_rawr  r5  rJ  rM  rN  rO  s                 rJ  _normalize_home_thread_staterS  "  s   lD)	!E '"   %eS!ekkmE#J''* #34:;AACN=nM		"D)!%%l3
j$'C
w0G0M2,N,T,T,VZh,h!%j!1*,w'MlML:LML5 %l&6&6s&;<E#J
 u %l&6&6s&;<E#J
 8 &|'7'7'<=E#J
	  *,*:*:3*?@E#J 599&'-2.6XX		#T*,""#>?F-9:U-V)*!%%l3N.$'(*
""7+eS!ekkm"'++-Jw5 	(C).*<*<S*ABE "'
3	( 8 	(C*>+=+=c+BCE "'
3	( $''5
j#&:+;+;+=Am+m'1'7'7'9J|$n(()?@$G1?@V1WJ-.",E,!%%&67N.#&>+?+?+AEj+j"0"6"6"86|7G7GHY7Z[O#2 <\=M=MNb=cd&8"#<\=M=MNb=cd&8"#Lr  c                l   t        |       }|syi }|j                  d      r|d   |d<   |j                  d      s3|j                  d      s"|j                  d      s|j                  d      r|j                  d      |j                  d      xs d|j                  d      |j                  d      |j                  d      |j                  d	      |j                  d
      |j                  d      d|d<   t        |j                  d      t              r|d   |d<   |j                  d      s"|j                  d      s|j                  d      rZ|j                  d      xs d|j                  d      |j                  d      |j                  d      |j                  d      d|d<   |j                  d      rJ|j                  d      |j                  d      xs d|j                  d      |j                  d      d|d<   |j                  d      rd|j                  d      i|d<   |j                  d      s"|j                  d       s|j                  d!      r|j                  d      xs d|j                  d       |j                  d"      |j                  d#      |j                  d$      |j                  d%      |j                  d&      |j                  d!      |j                  d'      |j                  d(      d)d*|d+<   |j                  d,      }|d-k(  rd-|j                  d.      xs i d/|d,<   n |d0k(  rd0|j                  d1      xs i d/|d,<   |j                  d2      r|d2   |d2<   t        |j                  d3      t              r|d3   |d3<   t	        j
                  |d45      S )6Nz	(nessuno)rY  r-  r
  r;  r?  r
  rA  rB  r1  r2  )viewr  r&  r'  r)  r*  r'	  r  purchaser:  r3  r<  r@  rC  rD  )r  r&  r'  r)  r*  fiscal_spendr.  r/  r=  r>  )r  r  r;  inventory_year inventory_consumption_estimationr]  r   r  r4  r5  r7  rE  rF  rG  rH  r6  r8  r9  )r  r  r  r  )r  r  r>  r)  r*  r  r  r  rJ  rK  rM  )r  r  rL  rN  r0  rO  Fr-  )rS  rn  r  r  r   r0  )r  r  r
  rJ  s       rJ   _build_home_thread_state_summaryrZ  ^#  sk   (6E!#Gyy!#(#9 yy!UYY/?%@EIIoD^bgbkbkl|b}IIo.YY/06BIIo.YY/0))$9:		"56 %		*E F$yy)CD	

 %))L)40 %l 3yy%&%))4G*HEIIVjLkYY34:II12YY34))$=>		"9:#
 yy89IIEFYYGHNB"YY'WX#ii(YZ	7
23 yy#$#)5995G+H"Iyy'(EII6G,HEIIVtLu))$:;ArYY01 99%<=))$:;		"67$yy)DEii <=		"@A!II&CD#=>	 
 YY/0N(#yy!239r%
 ! 
-	-&yy!56<"%
 ! yy$[1%))0148(-.B(C$%::gE22r  c                    t        t        |       d ut        |       d ut        |       d ut	        t        |             t        t        |             dk\  f      S rM  )r)  r  r  r  r  r  r  rB  r  s    rJ  %_message_has_explicit_purchase_periodr\  #  s\    #G,D8$W-T9)'2$>+G45(12a7	
 r  c           
         t        t        |       |j                  d      t        |      t	        |      t        | |      f      S )Ne )r)  _is_short_followup_queryr  _is_purchase_followup_request$_is_purchase_expand_followup_requestrD  r  s     rJ   _should_inherit_purchase_contextrb  #  sD    $W-!!$')*50<+GZ@	
 r  until_todayc                   t        | |d      }t        | |t        | |      d         }|r*t               }|j                  | k(  r|j                  |k(  r|}||fS r  )r   r   r  r&  r'  )r&  r'  rd  r)  r*  r  s         rJ  _month_date_rangerf  #  s\    dE1%JD%D%!8!;<H"$::%++"6Hxr  c                8    | dz  |dz
  z   |z   }|dz  |dz  dz   fS )Nr5  r   r  )r&  r'  offset_monthsabsolute_months       rJ  _shift_year_monthrj  #  s3    RiEAI.>NR.2"5!:::r  until_reference_dayc               j    | t        | j                               z
  }|t        d      z   }|r| }||fS )Nrq  r   )r   rz  )reference_dayrl  r)  r*  s       rJ  _week_date_rangero  #  s<    0E0E0G!HHJI1--H xr  c                   t               }t        dd      st        fddD              ryt        |       }|t        d      r|t	        d      z
  }|d	|j                         d d fS t        |       }|6|\  }}|t	        d      z
  }d
d |j                         |j                         fS dv rt        fddD              rt        |t	        d      z         \  }}n@t        fddD              rt        |t	        d      z
        \  }}nt        |d      \  }}d
d |j                         |j                         fS dv rt        fddD              r4t        |j                  |j                  d      \  }}	t        ||	      \  }}nmt        fddD              r4t        |j                  |j                  d      \  }}	t        ||	      \  }}n%t        |j                  |j                  d      \  }}dd |j                         |j                         fS t        |       }	t        |       }|	?||j                  }t        ||	      \  }}dd |j                         |j                         fS |J||j                  k(  rt        fddD              r|nt        |dd      }dd |dd |j                         fS y )!Nr  r  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z:_timeclock_relative_period_from_message.<locals>.<genexpr>#  s     ](x:%]ru  )zin turnozturni attiviattivo)r	  NNNr  r   rq  r  r  settimanc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z:_timeclock_relative_period_from_message.<locals>.<genexpr>#       w(x:%wru  settimana prossimazprossima settimanazsettiman prossimr   c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z:_timeclock_relative_period_from_message.<locals>.<genexpr>#  s       LHZ'  Lru  settimana scorsazscorsa settimanazsettimana passatazpassata settimanaTrk  r  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z:_timeclock_relative_period_from_message.<locals>.<genexpr>#       h(x:%hru  mese prossimoprossimo mesezmes prossimc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z:_timeclock_relative_period_from_message.<locals>.<genexpr>#  s     wHZ'wru  mese scorsozscorso mesezmese passatozpassato meser  rc  r	  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z:_timeclock_relative_period_from_message.<locals>.<genexpr>$  s     6|RZx:7M6|ru  )
quest annoquesto annor5     r~  -01-01)r  rw  r)  r  r   r/  r  ro  rj  r&  r'  rf  r  r  r   )
r  r  r  r  r
  r)  end_exclusiver*  r&  r'  s
    `        rJ  '_timeclock_relative_period_from_messager  #  s    E 	"*h>]6\]])*73M!::v!N	q 11 //14==.w7J$.!
M 9!#44tZ113X5G5G5IIIZw6vww#3EI1<M4M#N J  L  9K  L  L#3EI1<M4M#N J#3Et#T JtZ113X5G5G5IIIh6ghh+EJJQGKD%#4T5#A Jw8vww+EJJRHKD%#4T5#A J#4UZZZ^#_ JdJ002H4F4F4HHH$W-E"7+D<::D0u=
HdJ002H4F4F4HHH EJJ.36|^{6|3|5  CG  HL  NP  RT  CUdtCj/1C1C1EEEr  c                P    t        |       }||S t        fddD              ryy)Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z1_timeclock_period_from_message.<locals>.<genexpr>$  s       Kh8z!  Kru  )r  in generalegeneraler  tutti i turnitutto il cartellino)r	  NNN)r  NNNr  r)  )r  r  relative_periods    ` rJ  _timeclock_period_from_messager  $  s<    =gzRO"
  K  3J  K  K&$r  c                F    t        |       yt        fddD              S )NTc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z9_message_has_explicit_timeclock_period.<locals>.<genexpr>$  r.  ru  )r  r  r  r  r  r  r  s    `rJ  &_message_has_explicit_timeclock_periodr  $  s-    .w
CO f  r  c                    t        |       j                         D cg c]  }|s|	 }}|syh dt        fd|D              S c c}w )NF>   r?   rL   rN   rO   rQ   r_   r  r  r  r  r  r  ragazzor  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  )rH  r  generic_tokenss     rJ  rK  z3_is_generic_timeclock_team_query.<locals>.<genexpr>6$  s     ;5u&;ru  )r  r  r	  )r  r  r  r  s      @rJ   _is_generic_timeclock_team_queryr   $  sL    !0!7!=!=!?I5eIFIN$ ;F;;;+ Js
   AAc                   t        |      }t        |j                  d      xs d      j                         }|dv r|nd}t	        |j                  d            }t	        |j                  d            }t	        |j                  d            }|dv xs |d uxs
 |d uxs |d u}t        |       s|st        |       \  }	}
}}n|xs d}	|}
|}|}|	|d<   |
|d<   ||d<   ||d<   t        |j                  d	      xs d      j                         }t        |      rd}|xs t              r| nd|d	<   	 t        |j                  d
      xs t              }t        dt        |t                    |d
<   t        |j                  d      t               st#        fddD              |d<   |S # t        t        f$ r	 t        }Y lw xY w)Nr  r
  >   r	  r  r  r	  r>  r)  r*  >   r	  r  r	  r  r  r  r   r  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z6_normalize_timeclock_tool_arguments.<locals>.<genexpr>_$  s      +
 
"+
ru  

timbraturer  r  r   r   r   r  r  rm  rn  )r  r  rn  r  r$  r  r  r  r  r  r  rX  r  r  r  r  r  r)  )r  r  r0  r  source_scopesource_target_datesource_start_datesource_end_datehas_source_periodr  r>  r)  r*  r  r  s    `             rJ  rF  rF  9$  s   
 %&Iy}}W-34::<L#/3U#U<[]L29==3OP1)--2MN/	j0IJO11 	'T)	'D(	' $&	  .gzBJ[3QRY[e3f0{J'(&
"Ig*Im(Il$IjY]]<06B7==?J'
3
(b8Mj8YW_aIl!IMM'*>.>? QE+; <=Igimm$56='* +
 V+
 (
	#$  z" ! !s   5"F, ,GGc                    t              ryt        |       sj                  d      syt        |       t	        |       yt        |       yt        fddD              S )NTr^  Fc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z<_is_timeclock_contextual_followup_request.<locals>.<genexpr>o$  s       	Jru  )r  r   rN  r  rk   r  r  r  r  r  r   r   r   r  rm  rn  r  r  r  )r  r_  r  r  r  r  r)  r  s    `rJ  )_is_timeclock_contextual_followup_requestr  f$  sj    Z($W-1F1Ft1Lw'37OPW7X7dg&2 
  r  c                   t              ryt        |       }t        |       }t        t	              xs t              t        |       t        |       t        |       t              t              t              t              xs t              t        dd      t              t!        |xr t#        | |            t#        | |      t        fdt$        D              f      S )NFnotar	  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z5_has_explicit_non_timeclock_domain.<locals>.<genexpr>$       F':%Fru  )r  r  r  r)  r5  r4  r  r   r  r  _is_tenant_user_list_request _is_module_settings_read_requestrQ  rP  rw  rT  r  rW  rC  r  r  rF  rY  s    `  rJ  "_has_explicit_non_timeclock_domainr  $  s    Z(*73M*73M+J7d;XYc;dWj1!':6 *5(4(4,Z8'
3_7ST^7_%j&&A(4Z#6w
M#Z[]CF5EFF	
 r  c                   t        |      }t        |      }t        |      }t        |       t        |      }t	        |       rg S t        |j                  d      xs d      j                         }|j                         xs t        |      r|j                         nd}t        |j                  d      xs d      dk(  }	|	r|s|rt	        ||      rd}	|	r|r|n|}
|	xs t        |      }|r|
sg S t        |       sg S t        |       }t        |j                  d      xs d      j                         }|dv r|nd}t        |j                  d            }t        |j                  d	            }t        |j                  d
            }|dv xs |d uxs
 |d uxs |d u}|rt        |       \  }}}}nZ|	r|r|xs |s|rdnd}|}|}|}nC|r0t        |t        |            rt        |t        |            \  }}}}nt        |       \  }}}}t        |j                  d            xs t        fddD              }t              r| n|
}t        d|||||t         |d      gS )Nr4  r
  r0  rd  Fr5  >   r	  r  r  r	  rE  rF  rG  >   r	  r  r	  r	  r  rH  c              3  &   K   | ]  }|v  
 y wrD  r  rH  rt  normalized_currents     rJ  rK  z9_build_contextual_timeclock_tool_calls.<locals>.<genexpr>$  s!      J 	&&Jru  r  )r  r  r>  r)  r*  r  r  r
  )rS  _latest_user_message!_latest_timeclock_request_messager  r  r  rn  r  r  r  r  r  r$  r  r)  r  r  )r  r  r  r  last_user_messagelatest_timeclock_messagenormalized_previousstate_query_textprevious_query_textstate_is_timeclockinherited_query_textprevious_was_timeclockexplicit_periodstate_scopestate_target_datestate_start_datestate_end_datestate_has_meaningful_periodr  r>  r)  r*  r  r  r  s                           @rJ  &_build_contextual_timeclock_tool_callsr  $  s   
 )6E,\:@N(1)*;<)'3EF	599%;<BCIIK288:  P\q  sF  ]G?P?V?V?X  MOUYY{39r:>UU":?PUw  yJ  L_  V`"/AFV+\o/L48K3L!)=	4W>PQ	<WFXYOeii 128b9??AK!,0R!R+XZK1%))<S2TU0;Q1RS.uyy9M/NON00 	&D(	&4'	& %	   3QRY[m3n0{J	 ;Y)9^QX'%
!	!&LMegv  xP  hQ  'R3Q$454
0{J
 4RRY[m3n0{J599%@AB c J RJ GO 22DEK_J 	((*($)#2	
 r  )r  c                  t        |      }|s|S t        |       }t        |       j                         }t	        |       j                         }t        |       }t        |       }	t        |       }
t        |       }t        |       }t        |      }t        |       }t        |       }t        | |      }|st        |dd      r|s|d}t        |j!                  d      xs d      j                         }t        |j!                  d      xs d      j                         }t#        |j!                  d            }t%        |j!                  d            }t'        |j!                  d	            }t'        |j!                  d
            }t)        |j!                  d      t*              r|j!                  d      ni }t        |j!                  d      xs d      j                         }t        |j!                  d      xs d      j                         }t-        |j!                  d            }|rEt/        |      r:t        |j!                  d      xs d      j                         }t1        | |      gS |rVt3        |       s"t        |dddd      sd|v sd|v sdd| v sd|v r)t5        |       xs t7        |       }|rt9        | ||      gS g }|D ]*  }t+        |j:                        }|j<                  } | dk(  rt?        | ||      }tA        |      }!tC        | |      }"tE        | |      }#t'        |j!                  d            }$t'        |j!                  d            }%t'        |j!                  d            }&t        |j!                  d      xs d      j                         }'|'d v xs |$d uxs
 |%d uxs |&d u}(|r5t        |j!                  d!      xs d      j                         r|"r|!s||d!<   |"r!|!st-        |j!                  d"            rd#|d$<   |"r|#s|(st        |j!                  d%      xs d      j                         })|)d&v r|)nd})t'        |j!                  d'            }*t'        |j!                  d(            }+t'        |j!                  d)            },|)d v xs |*d uxs
 |+d uxs |,d u}-|-r|)xs |+s|,rd*nd+|d<   |*|d<   |+|d<   |,|d<   |jG                  tI        | |,             !| d-v r`tK        ||      rTtM        |      rdn|xs tO        |      xs tQ        |      }.|.r)|jG                  tI        d.|.||||tR        d/,             | d0k(  r&tU        |      r0|r.|d.k(  r)|jG                  tI        d.|||||tR        d/,             tW        |      rc|d1v r_|jG                  tI        d2|xs ||xs ||	xs |||d3   jY                         n|||d4   jY                         n|tR        d/,             4|sI|rGt[        |      s7t]        |      s,t_        |      s!ta        |      stc        |      st3        |       r||d5<   t_        |      r	tR        |d6<   |jG                  tI        | |,             | d7v r|r||d5<   n)|r|r||d5<   nt        |dd      st        |d8d9      rd|d5<   |r||d6<   |r%| d2k(  r te        |       sd |d:<   d |d;<   d |d<   d |d<   n+|)te        |       s|r|||d:<   |||d;<   |||d<   |||d<   |jG                  tI        | |,             ]| d<k(  r|}/|/s2|r0t        |j!                  d5      xs |xs d      j                         }/|/|d5<   |
rtg        |
      d=k\  r{t#        |j!                  d>            xs" t#        |j!                  d?            xs |xs |}0|
d3   d3   xs |0}1|
d4   d3   xs |0}2|1|1|d><   |2|2|d?<   |
d3   d4   |d@<   |
d4   d4   |dA<   nCtg        |      d=k\  r|d3   |d><   |d4   |d?<   n$|r"|r dBD ]  }3|j!                  |3      }4|4|4||3<    |j!                  dC      s,|r*|j!                  dC      }5t)        |5t              r	|5dDv r|5|dC<   t)        |j!                  dE      t,              s)|r't)        |j!                  dE      t,              r|dE   |dE<   |jG                  tI        | |,             |jG                  tI        | |,             - |S )FNr  r  Fr
  r
  r-  r;  r?  rA  rB  r:  rY  r4  r.  r/  query_overrider   r   r   r   r  r  
 al giornor  r  r  r  rd  r>  r)  r*  r  >   r	  r  r	  r  rH  Tr  r5  >   r	  r  r  r	  rE  rF  rG  r	  r  r
  r;  r  r
  r  r<  r  r   r   r  r  r:  r  r  r&  r'  r  r   r0  r2  r1  r3  )r0  r1  r2  r3  r5  >   r^  rI  r  rH  r6  )4rS  r  r  r  r  r  r  r  rB  r  rG  rD  rE  rb  rw  r  rn  r  r"  r$  r  r  r  r  rG  r_  /_extract_inventory_consumption_estimation_queryr  rH  r  r  rF  r  r  r  r  r  +_is_missing_price_variants_followup_requestrP  _latest_purchase_subject_query_latest_purchase_overview_queryr  ra  r`  r/  rK  rL  rM  rJ  #_is_catalog_search_followup_requestr\  r  )6r  r  r  r  r  r  explicit_purchase_queryexplicit_product_queryr3  r2  rW  rX  r
  r\  r8  r4  should_inherit_purchasestate_purchase_querystate_purchase_viewstate_purchase_yearstate_purchase_monthr  r  comparison_statestate_catalog_querystate_timeclock_querystate_estimation_contextinherited_queryestimation_queryr^  rm  r  rn  has_current_timeclock_subjectcontextual_timeclock_followupexplicit_timeclock_periodarguments_target_datearguments_start_datearguments_end_datearguments_scopearguments_has_meaningful_periodstate_timeclock_scopestate_timeclock_target_datestate_timeclock_start_datestate_timeclock_end_dater  effective_purchase_queryrm  rn  r0  r2  rF  r  r5  s6                                                         rJ  rv  rv  $  s@
    )6E )J5g>DDF3G<BBD+G4M-g6N1':-g6N.w7J5jA@IB7K>w
S#%j(HE!%=%I"'uyy)9:@bAGGIeii8>B?EEG/		/0JK1%))<L2MN0;P1QR.uyy9L/MNN2<UYY|=TVZ2[uyy.aceii8>B?EEG		*@ A GRHNNP#EII.U$VW$?
$Keii(PQWUWX^^`;GTcdee )$Z8XxXz!
"Qzl++*,J7SxWopwWxA#3!&  /1 xV	,,-	NN	//;GZQZ[I,A*,M),UV]_i,j)(NwXb(c%$=immM>Z$[!#<Y]]<=X#Y !:9==;T!U!)--"8">B?EEGO#<< 2(42't32 &T1	 , %c)--2M2SQS.T.Z.Z.\a~  He*?	,',5RW[\a\e\e  gB  ]C  XD/3	+,,5NWv(+EII6G,H,NB(O(U(U(W%AVZ|A|(=  CE%.G		RiHj.k+-FuyyQgGh-i*+DUYYOcEd+e()-FF <2$><1=< 0t;	 , /)>  *QLf  kC5  IPIg&/JIm,.HIl+,DIj)##Oi$XY  O  O  T  @J  LX  TY 77KL )(o 0=	(o BaamAn	 %
 ( ''#4%=$7%9*:(6%5#
 ))3J?DX]p  uL  ^L ''#4%9$7%9*:(6%5#
 ,Z8=P  U^  >^ ''#3%<%T@T$1$H5H%3%K7KGQG]*Q-*A*A*CcsEOE[
1(?(?(Aao%5#
 *',Z83J?8D(4::F/8 &9	'"0<%5	'"##Oi$XY{{&%<	'"(-A%9	'"*:xJNghrt{  ~E  OF%'	'"#%9	'"#	5K(KTy  {B  UC$(	&!%)	'"*.	,'(,	*%#,QRY,Z_v&2(;If%'3)=Ig&#/.>Il+!-,:Ij)##Oi$XY226#(?#&'7';';G'D'bH\'b`b#c#i#i#k !1IgC(8$9Q$>)*:*>*>~*NO %,-=-A-ABR-ST%*% %	   0215F!1!!4Q!7!H=+0<In-!-2@I./-=a-@-C	/*/?/B1/E	+,^$),:1,=	.).<Q.?	*+(-=a /C,005E().	#/
 ==.3J-11,?
j#.:Am3m.8Il+imm,BCTJOf.223IJDQ8HI_8`I45##Oi$XYY) TUqxVr r  )r  r  c                X   t        |       }t        |      }|xs g }|dk(  rt        |      rt        |j	                  d      t
              r|j	                  d      ni }	t        |	j	                  d      xs d      j                         dk7  r+|j                  dd        |j                  dd        d|d	<   |S d
|d<   t        |||      |d<   d|d	<   |S |dk(  rt        |      xs t        |      }
d
|d<   t        |j	                  d            }|
{|j                  |
j	                  d      xs |j	                  d      |
j	                  d      xs |j	                  d      |
j	                  d      xs |j	                  d      d       ||d<   d|d	<   |S |dk(  rd|d<   t        |||      |d<   d|d	<   |S |dk(  r0t        |      r%t!        ||      \  }}d|d<   ||d<   ||d<   d|d	<   |S |D 	]U  }t        |j"                  t
              r|j"                  ni }|j$                  dk(  rDt        |j	                  d      xs d      j                         }|rt'        |      s||d<   d|d	<   |j$                  dv rW|j$                  |d	<   t)        |j	                  d      xs |j	                  d            }|||d <   |j                  d d        |j$                  d!v r |j$                  |d"<   |j$                  |d	<   t        |j	                  d      xs d      j                         |d#<   t+        |j	                  d$            }t-        |j	                  d%            }t)        |j	                  d&            }t)        |j	                  d'            }|||d(<   n|j                  d(d        |||d)<   n|j                  d)d        |||d*<   n|j                  d*d        |||d+<   |j                  d+d        |j$                  d,k(  rsd,|d	<   t        |j	                  d      xs d      j                         t+        |j	                  d-            t-        |j	                  d.            t+        |j	                  d/            t-        |j	                  d0            t        |j	                  d1      xs d      j                         xs( t/        |t        |j	                  d      xs d            t1        |j	                  d2            d3|d4<   t        |j	                  d      xs d      j                         |d#<   t+        |j	                  d-            |d(<   t-        |j	                  d.            |d)<   |j$                  d5k(  rAd5|d	<   t+        |j	                  d$            }|||d6<   t3               j4                  |d6<   |j$                  d7k(  rd7|d	<   t        |j	                  d8      xs |      j                         }t7        |      }t9        ||      }|r|s|r|j	                  d9      s||d9<   t        |j	                  d:      xs d;      j                         }|d<v r|nd;}|d=v xsX t)        |j	                  d            d uxs: t)        |j	                  d&            d uxs t)        |j	                  d'            d u}|xrg t;        ||       xrX | xrS t1        |j	                  d>      xs7 |j	                  d?      xs$ |j	                  d@      xs |j	                  dA            }|sC||d><   dBD ]9  \  }}t)        |j	                  |            } | | ||<   (|j                  |d        ; t        |j	                  dC      t0              s|dC   |dD<   |j$                  dEk(  rut=        t        |j	                  dF      xs d            rNt?        t        |j	                  dF      xs d            }!|!stA        |      }"tC        ||"      }!|!r|!|d<   dG|d	<   K|j$                  dEk(  rGtE        t        |j	                  dF      xs d            r dHD ]  }#|j                  |#d         dI|d	<   |j$                  dEk(  rtG        ||      s(tI        t        |j	                  dF      xs d            rt        |j	                  dF      xs d      }$tK        |      xs tM        |$d      }%|%rtO        |%      s|%|dJ<   tM        |$dK      }&tQ        jR                  dL|&      rtU        |&      nd }'tW        |      xs |'xs t+        |j	                  dM            }tY        |      xs t-        |j	                  dN            }t[        |      }(|||dM<   n|j                  dMd        |||dN<   n|j                  dNd        |(-|(dO   j]                         |dP<   |(dQ   j]                         |dR<   nmdS|&v r:|&j_                  dSdQ      \  })}*t)        |)      }+t)        |*      },|+<|,:|+|dP<   |,|dR<   n/ta        |      r$|j                  dPd        |j                  dRd        dJ|d	<   |j$                  dEk(  rBt        |      r7tc        |      }t!        ||      \  }}d|d<   ||d<   ||d<   |r||dT<   d|d	<   |j$                  dk(  r+|j                  dd        |j                  dd        d|d	<   	|j$                  dk(  s	-|j                  dd        |j                  dd        d|d	<   	X |sJ|rH|dU   }-t        |-t
              r3t        |-j	                  dV      xs d      j                         }.|.r|.|d	<   |D ]  }/t        |/t
              st        |/j	                  dV      xs d      j                         }.|/j	                  dW      }0|.dXv rt        |0t
              rt        |0j	                  dY      xs d      j                         }1t        |0j	                  dZ      xs d      j                         }2|1r|1|d[<   n|j                  d[d        |2r|2|d\<   n|j                  d\d        |.d7k(  st        |0t
              s
t        |0j	                  d]      t
              r|0j	                  d]      ni }3d^}4|4D ]\  \  }}|3j	                  |      } t        | t              r$| j                         r| j                         ||<   K|j                  |d        ^  |D ]  }/t        |/t
              r/t        |/j	                  dV      xs d      j                         dk7  rC|/j	                  dW      }0t        |0t
              set        |0j	                  d_      t
              r|0j	                  d_      ni }5te        |0j	                  d      |5j	                  d      |5j	                  d      |5j	                  d      d`      }	|	s|	|d<    |S )aN#deterministic-product-clarificationrO  re  r
  r	  rJ  rM  r1   r0  rK  %deterministic-pack-size-clarificationr  r  r  )r  r  r  &deterministic-sales-goal-clarificationrL  rN  r3   zdeterministic-capability1orders_minus_first_inventory_ignore_initial_stockr.  r=  r>  rY  r  r  rY     r  r  r>  r   r]  r:  r-  r
  r&  r'  r)  r*  r;  r?  rA  rB  r  r0  r1  r2  r3  r5  r6  )r  r0  r1  r2  r3  r5  r6  r:  r2   sales_goals_yearrd  r  r4  r  r  >   r	  r  r  r	  >   r	  r  r	  r5  rF  rG  rE  ))r>  rE  )r)  rF  )r*  rG  r  rH  rg  r  supplier_catalog_lookup)r.  r/  r=  r>  homemade_stock_consumptionr3  periodr   r<  r@  r   rC  r   rD   - r/  r  r  r	  r
  r'	  r  r1  r2  r  ))r  r6  )r  r7  )r  r8  )r  r9  r  )re  r  r  r  )3rS  r  '_is_relative_new_product_delete_requestr  rn  r  r  r  r  _merge_product_write_fragments_latest_pack_size_context$_latest_pack_size_context_from_stater'  r  !_merge_sales_goal_write_fragmentsr  '_inventory_consumption_estimation_yearsr  r  "_is_generic_catalog_followup_queryr$  r  r"  rV  r  r  r&  r  r  r  _sql_targets_supplier_catalog/_extract_supplier_catalog_lookup_query_from_sql(_extract_supplier_catalog_supplier_query'_extract_supplier_catalog_product_queryrl  r  _sql_is_fiscal_spend_queryr  _extract_sql_alias_literalrP  rF  r'  r  r  r  r  r/  r  r\  r  r+  )6previous_stater  executed_tool_callsr  r  r  r  r  recent_conversationrO  r  rM  r;  rX  rm  r  r  r]  r&  r'  r)  r*  explicit_goal_yearr  r  r  r  normalized_scopehas_argument_periodpreserve_existing_period
source_key	state_keyr  rY  supplier_queryrF  sql_textfiscal_queryperiod_labelperiod_yearr
  start_date_labelend_date_labelparsed_start
parsed_endlast_resultrn  r
  result_payloadr'	  r  r  user_field_mapproduct_payloads6                                                         rJ  _derive_home_thread_stater  %  sd    )8E )J&,"552:>DNuyyYmOnptDu+?!@{}%))(39r:@@BiO		*D1		+T2%5k""1#A'K^`e#f -k77+,?@oDhinDo"1:599EV;WX""$+KK$?$f?CVCVWeCf%,[[%A%i_EXEXYhEi 'J 7 Z?;N;Nz;Z $3 -k88"4&GQdfk&l"#/k**/[\f/g(OPWY^(_%~9l56BO>?CQ?@?k( a4	+5i6I6I4+PI''VX	>>..	g.4"5;;=E?F).o&!2E+^^QQ!*E+8}9U9nYbYfYfgmYno+,<()		,d3^^   C  C%.^^E/"!*E+&))--*@*FB&G&M&M&OE"#(v)>?D*9==+ABE29==3NOJ0z1JKH)-o&		/40 */&'		*D1%/9+,		/6#-5)*		-t4^^99!;E+Y]]739r:@@B 5immN6S T!7	o8V!W"7	FV8W"X#9)--HY:Z#[!)--"="CDJJL  ZPjkuwz  |E  |I  |I  JQ  |R  |X  VX  xY  QZ(,Y]];Q-R(S#E, '*)--*@*FB&G&M&M&OE"#%:9==;X%YE/"&<Y]]?=[&\E"#^^00!2E+!6y}}V7L!M!-,>(),>,@,E,E()^^66!8E+Y]]<8CGDJJLJ,A*,M),UV]_i,j)<Dainirir  tJ  jK0:,-	g.9':@@BE(-1S(SuY` $== T,Y]]=-IJRVVT,Y]]<-HIQUUT -Y]]:-FGtS	   . e>w
SSe++e #45  dCY9Z  d^c^g^gh|^}  d  BG  BK  BK  Lc  Bd  e	 % ,+;'(. 	3)J	
 6immJ6OPE(+0i(		)T2	3 )--(9:DA5>?P5Q12^^116STWXaXeXefkXlXrprTs6tKCPYP]P]^cPdPjhjLklM !I'!R GQ_ `)6o&!:E+^^116QRUV_VcVcdiVjVpnpRq6r % 		#t$% ">E+^^11$Wj9=WX[\e\i\ijo\p\vtvXw=x9==/526H6w?pC]^fhoCpL$G$U.:*+5hIL/1||J/U#l+[_K*73{{{F[\a\e\efy\zF{D,W5p9OPUPYPYZnPo9pE6w?J-1)*		-t4 .3*+		.5%3=a=3J3J3L/01;A1H1H1J-.,&3?3E3EeQ3O0 .89IJ6~F
+
0F7CE345?E126w?		3T:		148!5E+^^116bcm6nCGLE,ST[]b,c)M>=pE9:FSEBCGUECDBG>?!CE+^^//II&-II'.!1E+^^11II&-II*D1!3E+Ca4F <"2&k4(KOOF39r:@@BI%.k"# /+t,/526<<>	$2KKPZ[ikoPp">#5#56H#I#ORPVVX!."4"45F"G"M2NTTVO5E12		5t<4C01		4d;//J~t4TCMnN`N`apNqswCxN..?  AMN *8 /%
I%))*5eS)ekkm',{{}E)$IIi./1/< $ =+t,KOOF4K4Qr0R0X0X0Z^n0n$2.$/;EnFXFXYbFcei;j.,,Y7pr@(,,X6 / 3 3N C+//
;!0!4!4_!E	
 *<E&'!=$ Lr  c                h    t        j                  d|       }|sy t        |j                  d            S )N\b(20\d{2})\br   )rF  r3  r  r  r  r  s     rJ  _extract_explicit_yearr  &  s,    II&0Eu{{1~r  c                h   t        |       }||S t        |       t               j                  }t	        |       }t               j
                  }| t        fddD              r||k  r|S |dz
  S | t        fddD              r||kD  r|S |dz   S dv sdv r|dz
  S dv sd	v r|S d
v r|dz   S y )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z*_extract_reference_year.<locals>.<genexpr>
'  s      sHZ!7 sru  )r   r   r   r   r   c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z*_extract_reference_year.<locals>.<genexpr>'  s      aHZ!7 aru  )prossimoprossimaanno scorsoanno passator  r  zanno prossimo)r  r  r  r&  r  r'  r)  )r  rb  current_yearr'  current_monthr  s        @rJ  r  r  '  s    %g.H )J%',,L$W-E&(..MS sHr ss$}4|J,:JJS aH` aa$}4|J,:JJ
"n
&Baz!]j%@*$ar  c                   t        j                  d|       }g }|D ]#  }t        |      }||vs|j                  |       % t	        |      dk\  r|d d S t        |       }t               j                  }d|v sd|v r/||vr|j                  |       |dz
  }||vr|j                  |       d|v sd|v r||vr|j                  |       |d d S )Nr  r   r   r!  r   r  r  )rF  findallr  r  r  r  r  r&  )r  explicit_matchesrX  raw_yearr  r  r"  previous_years           rJ  rB  rB  '  s    zz"2G< "N$ .]
^+!!*-. >abq!! )J%',,L
"n
&B~-!!,/$q(.!!-0z!]j%@~-!!,/"1r  c                ~    t        |       }|j                         }|D ]  }t        j                  |      }||c S  y rD  )r  r  _ITALIAN_MONTHSrn  )r  r  r  r  r'  s        rJ  r  r  /'  sI     )JF ##E*L r  c                   t        |       t               j                  }t               j                  }g }t	        fddD              r|j                  ||f       t	        fddD              r#t        ||d      \  }}|j                  ||f       t	        fddD              r#t        ||d      \  }}|j                  ||f       t        j                        D ]  }|j                  d      }|j                  d	      }t        j                  |      }|=d }|r"t        j                  d
|      rt        |      }n(|dv r||k  r|n|dz
  }n|dv r||kD  r|n|dz   }n|dv r|}|j                  ||f        |sg S t        |       }	t!        |	      dk(  r|	d   n
t#        |       }
|
|}
g }t%               }|D ]4  \  }}|xs |
|f}||v r|j'                  |       |j                  |       6 |S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z-_extract_reference_periods.<locals>.<genexpr>?'  s     
ch8z!
cru  )questo mesezmese correntezmese attualec              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z-_extract_reference_periods.<locals>.<genexpr>A'  s     
qh8z!
qru  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z-_extract_reference_periods.<locals>.<genexpr>D'  s     
Uh8z!
Uru  )r~  r  r   r   r   >   r   r   r   r   >   r  r  >   r.  correnter   )r  r  r&  r'  r)  r  rj  _MONTH_REFERENCE_PATTERNr  r  r*  rn  rF  r'  r  rB  r  r  rK  r  )r  r"  r#  periodsr&  r'  r  r
  r'  rX  rn  r  rS  rF  r  s                 @rJ  r  r  9'  s    )J%',,L&(..M,.G

c2b
ccm45

q2p
qq'mRHee}%

U2T
UU'mQGee}%)22:> &kk!n;;q>##K0=Z:x=DCC#(=#8<lQ>ND11#(=#8<lQ>ND00De}%#&& 	-g6N),^)<)AN1%G^_fGgM$&(H!$D e%.$; Or  c                    t        |       }t        j                  d|      }|sy |j                  d      }|dk(  s|dk(  ry|dk(  s|dk(  ry|dk(  s|d	k(  ry
|dk(  s|dk(  ry|dk(  s|dk(  ry|dk(  ryy )NzF\b(prima|seconda|terza|quarta|quinta|ultima|1|2|3|4|5)\s+settiman\w*\br   r  1r  2r   r  3r   r  4r   r  5r.   r)  r  )r  rF  r3  r  )r  r  r  r  s       rJ   _extract_reference_week_of_monthr9  n'  s     )JII_aklEKKNE5C<	Uc\5C<ESLESLr  c                   t        |       }t        |       }||y t        |       xs t               j                  }t        ||      d   }t        |||      t        d      z   }|dk(  r t        |dz
  d      }t        |||      }||fS |dz
  dz  dz   }||kD  ry t        |||      }|t        |t        d      z   |      fS )Nr   rq  r  r   r   )
r9  r  r  r  r&  r   r   r   r  r  )r  
week_indexr'  r&  days_in_monthmonth_end_exclusive	start_dayr
  s           rJ  r  r  '  s    1':J$W-EU]"7+H/A/C/H/HDtU+A.MtUM:YA=NNR)1-	4	2011 1n)Q.	}$4	2Sya/@!@BUVWWr  c                T    | yt         j                         D ]  \  }}|| k(  s|c S  yra  )r*  rL  )r'  rI  r  s      rJ  r
  r
  '  s7    }'--/ uE>L r  c                    t        |t              r|nd }t        | t              r| nd }t        |      }|r	|r| d| S |rt        |      S |r|S y)Nr  questo periodo)r  r  r
  r  )r&  r'  r  r  r
  s        rJ  _format_purchase_period_labelrB  '  s[    %eS1%tK#D#.DJ'4Kza
|,,:r  c                    t        | t              r| S t        | t              r	 t        j                  |       S y # t        $ r Y y w xY wrD  )r  r   r  r  r  r  s    rJ  _coerce_iso_daterD  '  sJ    %%	%%e,,   		s   : 	AAc                   t        |       }t        |      }|7|5|t        d      z
  }d|j                  d       d|j                  d       S t        ||      }|dk(  ryt	        |t
              rd| S t	        |t
              rd	| S y)
Nr   rq  dal r   al rA  r
  per nel )rD  r   r  rB  r  r  )r)  r*  r&  r'  r
  r  r  r  s           rJ  _format_purchase_scope_labelrJ  '  s     #:.K$X.M=#<%	q(99k**:67tM<R<RS]<^;_``0u=L''%l^$$$l^$$r  c                
    t               ryt         fddD              ryt         fddD              ryd v sd v rt         d	d
dd      ryyt         d	d
dd      ryt         dddd      ry|j                         rdS dS )Nr^  c              3  &   K   | ]  }|v  
 y wrD  r  rH  rt  r  s     rJ  rK  z-_purchase_comparison_focus.<locals>.<genexpr>'  s     
Lh8))
Lru  )r  robarH  c              3  &   K   | ]  }|v  
 y wrD  r  rM  s     rJ  rK  z-_purchase_comparison_focus.<locals>.<genexpr>'  s     
vh8))
vru  )r  r  r  r  r  r  r@  
percentualr  r  r6  r   rI  r  r  r  r  r  )r|  r)  rw  r  )r  r  s   ` rJ  rV  rV  '  s    "#56

L:K
LL

v:u
vv
  L4F$F$%78ZYcd !3XxU_` !3ZZYcd:6J6r  c                *    | dj                  dd      S )N.1fr  r  r  r  s    rJ  _format_percentagerS  '  s    C[!!#s++r  c                    t        |       D cg c]$  }|r t        j                  d|      s
|t        vr|& }}dj	                  |d d       j                         S c c}w Nr   r  r   )r  rF  r'  rA  r  r  r  r  r  s      rJ  r  r  '  se     %W-Z/66	 	F  88F2AJ%%''   )Ac                R    t        |       j                         }|r|S t        |       S rD  )_extract_catalog_subject_queryr  r  )r  subject_querys     rJ  r  r  '  s)    27;AACM!'**r  c                    t        |       D cg c]$  }|r t        j                  d|      s
|t        vr|& }}dj	                  |d d       j                         S c c}w rU  )r  rF  r'  _INVENTORY_QUERY_IGNORED_TOKENSr  r  rV  s      rJ  r  r  '  se     %W-Z/88	 	F  88F2AJ%%''rW  c                8   t        j                  d| xs d      j                  dd      j                  d      }|j	                         j                  dd      }t        j                  dd|      }dj                  |j                               }d	}|D ]u  }t        j                  ||      }|s|j                  d
      }	 t        |j                  dd            }|dk  rOt        t        |      j                               }||fc S  y # t        $ r Y w xY w)Nr  r
  r  r  r  r  z[^a-z0-9,.\s]+r  )z\b(?:meno(?:\s+(?:di|del|della|dello|delle|dei|degli))?|sotto(?:\s+(?:a|le|la|i|il))?|inferior[ei]?\s+(?:a|al|alla|alle|allo|ai|agli))\s+(\d+(?:[,.]\d+)?)\bz7\b(\d+(?:[,.]\d+)?)\s+(?:o\s+)?(?:meno|inferior[ei]?)\br   r  r  r   )r  r  r  r  r  r  rF  r  r  r  r3  r  r  r  rK  r  )	r  r  r  r  r5  r  raw_threshold	thresholdthreshold_tokenss	            rJ  rN  rN  (  s   &&vw}"=DDWhW^^_fgJ!!#++E37J)3
;J***,-JH  +		':.A	m33C=>I >}=CCEF***+   		s   D	DDc                     t         fdt        D              xs dd  dv xs t         dddd      }|syt         d	d
      ryt         ddddddd      ryt         d      rt         ddddddddddd      ryy)Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z0_is_inventory_ranking_request.<locals>.<genexpr>(  s     EgGz!Eru  r  r  r^  r  rr  rh  Frh	  
classificaTmaggiormaggioremaggiorimassimamassimemassimimassimor  ro  rp  r{  r|  re  rf  r   )r)  r  rw  )r  inventory_scopes   ` rJ  _is_inventory_ranking_requestrl  (  s    E1DEE 	^1ZL**	^$Z*kS\] 
  ULA Y
JPY[dfoqz{ U38Q9 r  c                    t        |       }t        |      }t        |       D ]9  }t        j                  d|      st        |      }d|cxk  rt        k  s5|c S  ; |rdS t        S )Nz\d{1,4}r      )r  rl  r  rF  r'  r  r  )r  r  ranking_contextr  r  s        rJ  _extract_inventory_rank_limitrp  8(  sl     )J3J?O ) ||J.E
)))L *	 !26&66r  c                @   t        |      }t        |       }t        |      dk\  r
|d   |d   fS t        |      dk(  r|d   }||dz   fS t        |j	                  d            }t        |j	                  d            }||||fS t               j                  }|dz
  |fS )Nr   r   r   r=  r>  )rS  rB  r  r  rn  r  r&  )r  r  normalized_staterX  r;  r  state_inventory_yearr"  s           rJ  r  r  D(  s     4E:-g6N
>aa ."333
>a&q)ma////0@0D0DEu0vw01A1E1EFw1xy&+?+K"$888%',,L!\))r  c                    t         h dz  }t        |       D cg c]0  }|r,t        j                  d|      s||vr|j	                         s|2 }}dj                  |d d       j                         S c c}w )N>@   maokr  r  comer  medir  contor  grador  medier  r  stimar   r  finalerc  rd  ignorainiziolasciaqueller   r.  r  ri  rj  stimarestimator  tenendor   r6  ignorareinizialeinizialilasciamor  r  r  	calcolato	consumarers  rt  ru  rv  	ignoriamor   r{  r|  	tralasciar   
quotidiana
quotidiane
quotidiani
quotidianogiornalieragiornalieregiornalierigiornalierotralasciamor   r  r   )r\  r  rF  r'  r  r  r  )r  ignored_tokensr  r  s       rJ  r  r  Y(  s    4 A8 ANH %W-Z/' 	F  88F2AJ%%''s   5A2r  c               L   t        | |      \  }}t        |dd      }t        |dz   dd      }||z
  j                  }|xs t        |       j	                         }g }	t        |      d d D ]%  }
t        |
      }|	j                  d| d| d       ' dj                  |	      j                  dd      j                  d	d
      }dj                  |	      j                  dd      j                  d	d
      }|rd| d}|rd| d}t        |      }d|dd|dz   dd|j                          d|j                          d| d| d| d| d| d|j                          d|t        d      z
  j                          d| dt        |      ddt         }t        d|t        d       S )!Nr   r   (lower(product_name) LIKE '%"%' OR lower(supplier_name) LIKE '%r  r  r  r  r  r  zAND r  zWITH first_inventory_date AS (SELECT MIN(inventory_date) AS inventory_date FROM tenant_inventory_sessions WHERE inventory_date >= 'r~  z-01-01' AND inventory_date < 'a  -01-01'), purchase_totals AS (SELECT lower(items.product_name) AS product_lookup, lower(items.supplier_name) AS supplier_lookup, items.product_name AS product_name, items.supplier_name AS supplier_name, ROUND(SUM(items.quantity * COALESCE(NULLIF(items.units_per_pack, 0), 1)), 3) AS purchased_units FROM ordini_items AS items JOIN ordini_batches AS batches ON batches.id = items.batch_id WHERE date(batches.confirmed_at) >= 'z$' AND date(batches.confirmed_at) < 'z' a  GROUP BY product_lookup, supplier_lookup), inventory_totals AS (SELECT lower(items.product_name) AS product_lookup, lower(items.supplier_name) AS supplier_lookup, items.product_name AS product_name, items.supplier_name AS supplier_name, ROUND(SUM(items.total_equivalent_units), 3) AS final_stock_units FROM tenant_inventory_session_items AS items JOIN tenant_inventory_sessions AS sessions ON sessions.id = items.session_id JOIN first_inventory_date AS fid ON fid.inventory_date = sessions.inventory_date WHERE 1 = 1 zGROUP BY product_lookup, supplier_lookup), all_products AS (SELECT product_lookup, supplier_lookup FROM purchase_totals UNION SELECT product_lookup, supplier_lookup FROM inventory_totals) SELECT 1 AS consumption_estimate_result, 'z' AS query, z AS purchase_year, z AS inventory_year, 'z' AS purchase_start_date, 'rq  z' AS purchase_end_date, a   AS period_days, fid.inventory_date AS final_inventory_date, COALESCE(p.product_name, i.product_name) AS product_name, COALESCE(p.supplier_name, i.supplier_name) AS supplier_name, ROUND(COALESCE(p.purchased_units, 0), 3) AS purchased_units, ROUND(COALESCE(i.final_stock_units, 0), 3) AS final_stock_units, ROUND(COALESCE(p.purchased_units, 0) - COALESCE(i.final_stock_units, 0), 3) AS estimated_consumed_units, ROUND((COALESCE(p.purchased_units, 0) - COALESCE(i.final_stock_units, 0)) / rR  a[  , 3) AS estimated_daily_units, 'stock_iniziale_ignorato' AS estimation_method FROM all_products AS ap CROSS JOIN first_inventory_date AS fid LEFT JOIN purchase_totals AS p ON p.product_lookup = ap.product_lookup AND p.supplier_lookup = ap.supplier_lookup LEFT JOIN inventory_totals AS i ON i.product_lookup = ap.product_lookup AND i.supplier_lookup = ap.supplier_lookup WHERE COALESCE(p.purchased_units, 0) <> 0 OR COALESCE(i.final_stock_units, 0) <> 0 ORDER BY estimated_daily_units DESC, lower(COALESCE(p.supplier_name, i.supplier_name)) ASC, lower(COALESCE(p.product_name, i.product_name)) ASC LIMIT rg  r  r  r
  )r  r   rr  r  r  r  r  r  r  r  r/  r   r  r  r  )r  r  r  r;  rX  purchase_startpurchase_end_exclusiver  r  
conditionsr  escaped_tokenpurchase_whereinventory_whereescaped_queryr  s                   rJ  rH  rH  (  sN    %LGUa$b!M>-A.N!-!"3Q:)N:@@KWNwW^^`EJ '+ 
+E2**7 9..;_ =	

 \\*-55nFZ[ccds  vK  LNll:.66~G[\ddet  wL  MO/q1  13'.M	$ %33#77UVdghVhilUm n0 1?0H0H0J/K L--C-M-M-O,PPR
		 ''		 ?,/,
 $$&' (#iQ&77BBDEE]- W X]]hWijmVn o ""k5	$ p  2cTd>effr  c                R    | dj                  d      j                  d      }|xs dS )Nz.6fr  r  )r  r  s     rJ  _format_sql_numeric_literalr  (  s+    $$S)005H?sr  c           	     z     t         fddD              syt         dddddd	      syt         fd
dD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z/_is_inventory_author_request.<locals>.<genexpr>)  s     Pw*$Pru  )r   r   FrY   utenteaccountpersonar  r  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z/_is_inventory_author_request.<locals>.<genexpr>)  r  ru  )r  r  salvatosalvatacreatocreata
registrato
registrataeseguitoeseguitar   r)  rv  rx  s   `rJ  r  r  )  sJ    P4OPP$Z)YXdfmn 
  r  c           
        t        |       }h d}t        |       D cg c]F  }|rBt        |      dk(  r|j                         s$t	        j
                  d|      s|t        vr||vr|H }}dg}|d d D ]"  }t        |      }|j                  d| d       $ dj                  |      }| xr t        |d	d
ddddd      xs
 d|v xs d|v }|rt        nd}	d| d|	 }
t        d|
|	d      S c c}w )N>   rJ   rY   r  r  r  r  r  r)  r*  r   r   r  r  r  r  r  r  r  r  r  r  r   r   z'latest_inventory_session_id IS NOT NULLr   zlower(warehouse_name) LIKE '%%'r  r   r*  r  r  r  ciascunr  zper magazzinozper ogni magazzinoa5  SELECT warehouse_name, latest_inventory_date, latest_inventory_created_by_name, latest_inventory_created_by_user_id, latest_inventory_created_at, latest_inventory_updated_at, latest_inventory_total_products, latest_inventory_total_equivalent_units, latest_inventory_session_id FROM inventory_warehouses WHERE zh ORDER BY latest_inventory_created_at DESC, latest_inventory_date DESC, lower(warehouse_name) ASC LIMIT rg  r  r
  )r  r  r  r#  rF  r'  r\  r  r  r  rw  r  r  )r  r  author_tokensr  warehouse_tokensr  r  	where_sqllist_requestedresult_limitr  s              rJ  !_build_inventory_author_tool_callr  )  sL    )JM2 %W-UqU]]_Z/88& 	  <<J!"1% M+E29-KLM Z(I 	
%j(HgwX^`ikuv 2*,2#z1  (6#1L	  	     2cT`>abbOs   AC-c                    t        |       D ]_  }|j                  d      dk7  rt        |j                  d      xs d      j                         }|sGt	        |t        |            s]|c S  yNr  r  r  r
  )r  rn  r  r  r  r  r  ro  r  s      rJ  -_latest_inventory_consumption_request_messager  ])  sj     & 88Fv%dhhy)/R06688/RYBZ[N r  c                    t        |       D ]^  }|j                  d      dk7  rt        |j                  d      xs d      j                         }|sGt	        t        |            s\|c S  yr  )r  rn  r  r  r  r  r  s      rJ  2_latest_homemade_stock_consumption_request_messager  i)  sg     & 88Fv%dhhy)/R0668=og>VWN r  c                B   t        |       }dD ]  }t        j                  ||      }|st        |j	                  d            D cg c]$  }|r t        j
                  d|      s
|t        vr|& }}dj                  |d d       j                         }|s|c S  yc c}w )N)z-\b(?:su|del|della|dello|dei|delle|di)\s+(.+)$z\bha\s+(.+)$r   r   r  r   r
  )	r  rF  r3  r  r  r'  rA  r  r  )r  r  r5  r  r  r  r	  s          rJ  rY  rY  u)  s     )J  		':. )Q8
LLU3::	 
 
 HHVBQZ(..0	!" 
s   )Bc                j   t        |       }t        j                  d|      }|syh d}g }|j                  d      j	                         D ]F  }t        j
                  d|      r n.|t        v s||v r n |t        v r|r n6|j                  |       H dj                  |d d       j                         S )Nz0\b(?:da|dal|dalla|fornitore|fornitori)\b\s+(.+)$r
  >4   r>   rD   rE   rI   rM   r[   r]   r^   frard   re   rg   ri   r  r  r   rr   rs   rt   r8  ry   rz   r  r  r=  r9  r   r;  r<  r:  r%  r&  r'  r(  r   scorsescorsir   r6  r?  r   passatepassatir   r   r0  r7  r  prossimeprossimir  r>  r   r   r  r   )r  rF  r3  r  r  r'  r*  r(  r  r  r  )r  r  r  boundary_tokenssupplier_tokensr  s         rJ   _extract_purchase_supplier_queryr  )  s     )JYYRT^_N5On "$O%%a(..0 	&<<
E*O#u'?22u%	& 88OBQ'(..00r  c                   t        |       }|r|S t        |       }t        |       D cg c]$  }|r t        j                  d|      s
|t
        vr|& }}t        |      r |D cg c]  }|j                         r| }}t        |        |D cg c]  }|j                         r| }}t        |      r%|D cg c]  }|j                         r|dvs| }}dj                  |d d       j                         S c c}w c c}w c c}w c c}w )Nr   >   rH   ru  r$  r   r  r   )r  r  r  rF  r'  r(  rG  r  rD  rH  r  r  )r  r	  r  r  r  s        rJ  r  r  )  s   5g>N )J %W-Z/77	 	F  "*-%+CE5==?%CC(1=%+CE5==?%CC ,%+uE5==?uTtGt%uu88F2AJ%%'' DCus/   )C;"D 8D D#D8D
D
D
c           	     (   t        |       }t        |       }t        |      dk\  xs t        |      dk\  }|syt        fddD              ryt        fddD              syt	        dd	d
ddd      ryt        t        j                  d            S )Nr   Fc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z2_is_purchase_comparison_request.<locals>.<genexpr>)  s     
[h8z!
[ru  )confrontr  r  r  Tc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z2_is_purchase_comparison_request.<locals>.<genexpr>)  s     jw*$jru  )r   r   r   r  r  r  r  re  rd  minoreminoriz\b(?:tra|oppure|o)\b)r  rB  r  r)  rw  r  rF  r3  )r  r  r2  yearshas_multiple_periodss    `   rJ  rD  rD  )  s    (1G$W-Ew<1,?E
a

[2Z
[[j4ijj UFJ	S[]ef		1:>??r  rn  fallback_queryr5  r6  c                  t        |       }t        |       |B|r@t        j                  d      s*t	        fddD              s|D cg c]	  \  }}||f }}}t        |      dk\  rNt        |       xs |xs d}t        d||d   d   |d   d   |d   d   |d   d   |t        |      t        d	
      S t        |       }	t        |       }t        |	      dk\  r<t        |       xs |xs d}t        d||	d   ||	d   ||t        |      t        d	
      S t        |	      dk  rt        |       }
|
y |
|
dz
  g}	t        |       xs |xs d}t        d||	d   ||	d   ||t        |      t        d	
      S c c}}w )Nr  c              3  &   K   | ]  }|v  
 y wrD  r  rH  r  r  s     rJ  rK  z7_build_purchase_comparison_tool_call.<locals>.<genexpr>
*  s       PEEZ'  Pru  )r   r   r   r   r  r  r0  r.  r   r
  r  r   r   )r  r0  r1  r2  r3  r5  r6  r  r
  )r  r  rF  r3  r)  r  r  r  r  r  rB  r  r  )r  rn  r  r5  r6  r2  rB  r'  r  r  reference_yearr  s              @rJ  $_build_purchase_comparison_tool_callr  )  s    )1G )J!		.*5  P  6O  P  P:ABhaM5)BB
7|q'0J^5Ir+ '
1!(A")!*Q-#*1:a=((,-A(B)	
 	
 %W-E$W-E
5zQ'0J^5Ir+ %a!&"'(#(((,-A(B)	
 	
 5zA~09!!!34#G,F1E2E'!!H"#Ah$$$()=$>%	
 S Cs   E7c                ,     t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  )rH  phraser  s     rJ  rK  z/_is_purchase_history_request.<locals>.<genexpr>E*  s       	*ru  )zcosa ho ordinatozche cosa ho ordinatozcosa abbiamo ordinatozche cosa abbiamo ordinatozcosa ho acquistatozche cosa ho acquistatozcosa abbiamo acquistatozche cosa abbiamo acquistatozcosa ho compratozche cosa ho compratozcosa abbiamo compratozche cosa abbiamo compratorI  rx  s   `rJ  rE  rE  D*  s     
  r  c                     t         fddD              syt         fddD              sydd  dv ryt         d	d
dd      S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z4_is_purchase_product_list_request.<locals>.<genexpr>Y*  s     r(x:%rru  )r  r   elencr~   r   r   Fc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z4_is_purchase_product_list_request.<locals>.<genexpr>[*  s     ^w*$^ru  )r   r   r   r   r
  r  Tr  r  r  r  rv  rx  s   `rJ  rF  rF  X*  sO    r6qrr^4]^^1ZL""$ZZU_``r  c                ^     d}t         fd|D              syd}t         fd|D              S )N)rh	  r  rc  graduatoriaz	numero di	conteggioraggruppzgroup byc              3  &   K   | ]  }|v  
 y wrD  r  rH  markerr  s     rJ  rK  z,_is_sql_analytics_request.<locals>.<genexpr>m*  s     Dv#Dru  F)r   r   catalogr/  r  utentr  r   r   rw   modulimpostazionc              3  &   K   | ]  }|v  
 y wrD  r  )rH  	dimensionr  s     rJ  rK  z,_is_sql_analytics_request.<locals>.<genexpr>}*  s     L9yJ&Lru  rI  )r  aggregate_markersanalytic_dimensionss   `  rJ  _is_sql_analytics_requestr  b*  s;    	 D2CDD L8KLLLr  c           
         t        j                  d|      }|rKd|v rGd|v rC	 t        dt        t	        |j                  d            d            }t        dd| |d	
      gS g S # t        $ r d}Y #w xY w)Nz\bprimi?\s+(\d+)\s+fornitorr  r   r   rn  r   rg  zSELECT supplier_name, COUNT(*) AS total_products FROM products WHERE active = 1 GROUP BY supplier_name ORDER BY total_products DESC, supplier_name ASC LIMIT r  r
  )rF  r3  r  r  r  r  r  r  )r  r  top_suppliers_matchr  s       rJ  _build_sql_analytics_tool_callsr  *  s    ))$BJOyJ68z;Q	3s#6#<#<Q#?@"EFE '!
 "') #

 	
  I%  	E	s   .A& &A43A4c                   | j                         }d}t        j                  d| d|      ryt        j                  d| d|      }|r$t        t	        |j                  d            d      S t        j                  d|      }|D ]b  }||j                         |j                         dz    }t        j                  d|      r>t        t	        |j                  d            d      c S  y)	Nz9(?:ct|cassa|casse|cartone|cartoni|bt|bottiglia|bottiglie)z\b(un|uno|una)\s+r2  r   z
\b(\d+)\s*z	\b(\d+)\br   z\s*(?:cl|ml|l)\b)	r  rF  r3  r  r  r  r  r  r  )r  r  
unit_wordsnumeric_unit_matchgeneric_number_matchesr  tails          rJ  _extract_requested_quantityr  *  s    mmoGMJ	yy%j\4g>jB#?I3)//23Q77[[w?' +uyy{UYY[1_588'.3u{{1~&**	+ r  c                F    t        | dd      xr t        | dd      xs d| v S )Nr  r  r   r   penultimrw  rx  s    rJ  rG  rG  *  s1    !*hA 	
%j(HE (Z'	r  c                @    t        | dd      xs d| v xs
 d| v xs d| v S )Nr  r  r   r   r   r  rx  s    rJ  _has_purchase_order_subjectr  *  s<    !*hA 	!j 	!
"	! j 	r  c           
        t        |       t              sy t              ry dv ry t        j                  d      }|r/	 t        dt        t        |j                  d            d            S t              D ]  }t        j                  |      }||c S  dv xr t        fddD              }|rdS d S # t        $ r Y Vw xY w)Nr  uM   \b([1-9]|[12]\d|30)(?:\s*°|\s*[oa])?\s+(?:ordine|ordini|acquisto|acquisti)\br      prima voltac              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z4_extract_chronological_order_rank.<locals>.<genexpr>*         =AW^W
=R  =Aru  r   r   r   )r  r  rG  rF  r3  r  r  r  r  r  r  _ITALIAN_ORDINAL_RANKSrn  r)  )r  numeric_matchr  rankfirst_time_orderedr  s        @rJ  rD  rD  *  s     )J&z2!*-ZIIXM 	q#c-"5"5a"892>?? !, %))%0K
 '*4  A  =Ab  =A  :A"1,,  		s   -B< <	CCc                     t         dd      xr% t         dd      xs d v xs d v xs
 d v xs d v }d	 v xr t         fd
dD              }|xs |S )Nr  r  r  r  z
piu vecchizpiu vecchiou   più vecchiu   più vecchior  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z,_is_first_batches_request.<locals>.<genexpr>*  r  ru  r  rw  r)  )r  first_orderr  s   `  rJ  rC  rC  *  s    +J(K !*gw? 	(:%	(J&	( J&	( Z'  '*4  A  =Ab  =A  :A,,,r  c                l    t        |       }d|v ryt        |d      rt        |dd      ryt        |       S )Nr  r   r   r  r  r   )r  rw  rD  r  s     rJ  _extract_requested_order_rankr  *  s>     )JZ X6;TU_aiks;t,W55r  c           
        t        |       }d|v ryt        j                  d|      }|r/	 t        dt	        t        |j                  d            d            S t        j                  d|      }|r2t        |j                  d            }|t        dt	        |d            S t        |d      rt        |d      ry	y# t        $ r Y ow xY w)
Nr  r   z#\bultim\w*\s+(\d{1,3})\s+ordin\w*\br   r  zW\bultim\w*\s+(un|una|uno|due|tre|quattro|cinque|sei|sette|otto|nove|dieci)\s+ordin\w*\br   r  r.   )
r  rF  r3  r  r  r  r  r  r  rw  )r  r  r	  
word_matchrY  s        rJ  rE  rE  *  s     )JZIIDjQM	q#c-"5"5a"892>?? bJ *:+;+;A+>?q#fb/** X6;TU_ai;j  		s   -B< <	CCc                j     t         fddD              ryd v xr t         fdt        D              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z,_is_purchase_time_request.<locals>.<genexpr>+  s     
yh8z!
yru  )	da quanto	da quandoz	ma quandozin che datazultima voltaTr$  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z,_is_purchase_time_request.<locals>.<genexpr>+  s     )`G'Z*?)`ru  )r)  rC  rx  s   `rJ  rH  rH  +  s1    

y2x
yyz!`c)`O_)`&``r  c                    t        j                  d| t         j                        }|sy 	 t        |j	                  d            S # t
        $ r Y y w xY w)Nz(?:ordine\s*#\s*|#\s*)(\d+)\br   )rF  r3  r  r  r  r  r  s     rJ  r
  r
  +  sI    II6OE5;;q>"" s   A 	AAc                    t        j                  d|       }|sy 	 t        j                  |j	                  d            S # t
        $ r Y y w xY w)Nz\b(20\d{2}-\d{2}-\d{2})\br   )rF  r3  r   r  r  r  r  s     rJ  r
  r
  +  sI    II2G<E!!%++a.11 s   #? 	A
Ac                z    t        fddD              syt        |       yt        dd      rt        |       yy)Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z4_is_purchase_batch_detail_request.<locals>.<genexpr>(+  s       Mw*$  Mru  )r   r   r  r  z
per estesor  r  apriFTr  r  )r)  r
  rw  r
  r  s    `rJ  rI  rI  '+  sM      M  5L  M  M!'*6 Xx@EabiEjEvr  c                   |rmddj                  d |D              z  }t        j                  || t        j                        }|r+	 t	        |j                  d      j                  dd            S t        j                  d| t        j                        }|sy 	 t	        |j                  d      j                  dd            S # t        $ r Y y w xY w# t        $ r Y y w xY w)Nu-   (?:%s)\s*[:=]?\s*(?:€\s*)?(\d+(?:[.,]\d+)?)rB  c              3  F   K   | ]  }t        j                  |        y wrD  rE  )rH  anchors     rJ  rK  z/_extract_first_decimal_value.<locals>.<genexpr>3+  s     MvdjbiiX^N_MvrL  r   r  r  u   €\s*(\d+(?:[.,]\d+)?))r  rF  r3  r  r  r  r  r  )r  anchorsr5  r  s       rJ  _extract_first_decimal_valuer"  1+  s    BSXXMvnuMvEvv		'7BMM:U[[^33C=>> II0'2==IEU[[^++C566    s$   )C )C 	CC	CCc                   t        j                  d| t         j                        }|r|j                  d      j	                         S t        j                  d| t         j
                        }|r |j                  d      j	                  d      S y)Nz	:\s*(.+)$r   z$(?:nota(?: condivisa)?|note)\s+(.+)$r  r
  )rF  r3  r  r  r  r  )r  colon_match
note_matchs      rJ  _extract_note_textr&  C+  sn    ))L'299=K  #))++BGR]][J"((33r  c                ^    t        | j                               t        fd|D              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  )rH  wordr  s     rJ  rK  z,_contains_normalized_word.<locals>.<genexpr>O+  s     0$tv~0ru  )rK  r  r)  )r  wordsr  s     @rJ  rw  rw  M+  s'    !!#$F0%000r  c                P     t         fddD              xs t         ddddd      S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z$_is_price_request.<locals>.<genexpr>S+  s     b(x:%bru  )quanto costa
che prezzoz	prezzo har   r   rp   r   r   rv  rx  s   `rJ  rJ  rJ  R+  s7    b6abb fg r  c                ,     t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z+_is_lowest_price_request.<locals>.<genexpr>^+  r9  ru  )z
costa menozcosta di menoz	meno caroz	meno carazmeno costosozmeno costosazpiu economicozpiu economicarI  rx  s   `rJ  rK  rK  ]+  r?  r  c                d     t         fddD              xs d v xr t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z/_is_price_per_weight_request.<locals>.<genexpr>n+         	Jru  )zprezzo al chilozprezzo al kgzprezzo per chilozprezzo per kgzeuro al chiloz
euro al kgzprezzo kilor   c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z/_is_price_per_weight_request.<locals>.<genexpr>{+  s     I#Iru  )chilokilokgrI  rx  s   `rJ  rL  rL  m+  sC     
   	J 	JI1HIIr  c                P     d v sd v ryd vrd vryt         fddD              S )	Nsenza prezzoprezzo non disponibileTr   r   Fc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z4_is_missing_catalog_price_request.<locals>.<genexpr>+  s       	Jru  )znon hai il prezzoznon ha il prezzoznon hanno il prezzoznon hai prezziznon ha prezziznon hanno prezziznon hai il prezzizmanca il prezzozmancano i prezzizmancanti di prezzozmancante di prezzorI  rx  s   `rJ  rM  rM  +  sD    #'?:'Mz!hj&@ 
  r  c                ,     t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z+_is_catalog_data_request.<locals>.<genexpr>+  s       	Jru  )ztutti i datiztutti i dettaglizmostrami i datizmostra i datizdati che abbiamozche dati abbiamozfammi vedere i datizscheda prodottozscheda completazinformazioni suzinfo suzmostrami tutto suzmostra tutto surI  rx  s   `rJ  rN  rN  +  s     
  r  c                b     t         fddD              ryd v xr t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z-_is_units_per_pack_request.<locals>.<genexpr>+  r  ru  )zunit per packzunits per packzquante unita contienezquante bottiglie contienezda quante bottigliez	pack sizeTr  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z-_is_units_per_pack_request.<locals>.<genexpr>+  s     '|(;'|ru  )r   r   r  r  rr  rI  rx  s   `rJ  rO  rO  +  s;    
 


 
 Z|C'|I{'|$||r  c                L    | y t        |       dj                  dd      }d| S )Nr  r  r     € )r  r  r  s     rJ  _format_eurrC  +  s2    },s#,,S#6H(r  c                    | y t        |       }|j                         rt        t        |            S |dj	                  d      j	                  d      j                  dd      S )Nr  r  r  r  )r  r
  r  r  r  r  )r  numerics     rJ  _format_compact_numberrF  +  s[    }ElG3w<  c]""3'..s3;;CEEr  c                    | xs dj                         j                  dd      }|sy 	 t        |      }|dkD  r|S d S # t        $ r Y y w xY w)Nr
  r  r  r   )r  r  r  r  )r  r  rE  s      rJ  _parse_decimal_fragmentrH  +  s\    {!!#++C5G. k7+t+  s   = 	A	A	c                   t        dj                  d | |xs dfD                    }d}|D ]}  \  }}t        j                  ||t        j                        }|s.t        |j                  d            }t        |j                  d            }||gt        ||z  |z  d      }	|	|	fc S  d}
|
D ]  \  }}t        j                  ||t        j                        }|s.t        |j                  d            }|K|j                  r)|j                  dk\  rt        |j                  d            nd }|t        ||z  d      }||fc S t        t        ||      |z  d      }t        t        ||      |z  d      }||fc S  y	)
Nr  c              3  &   K   | ]	  }|s|  y wrD  r  r  s     rJ  rK  z)_infer_weight_range_kg.<locals>.<genexpr>+  s     )b4]a$)br  r
  ))z8\bkg\s*(\d+(?:\.\d+)?)\s*x\s*(\d+(?:\.\d+)?)(?:\s*pz)?\br  )z.\b(\d+(?:\.\d+)?)\s*x\s*(\d+(?:\.\d+)?)\s*kg\br  )z7\bg\s*(\d+(?:\.\d+)?)\s*x\s*(\d+(?:\.\d+)?)(?:\s*pz)?\b     @@)z-\b(\d+(?:\.\d+)?)\s*x\s*(\d+(?:\.\d+)?)\s*g\brK  r   r   r   ))z,(\d+(?:\.\d+)?)\s*/\s*(\d+(?:\.\d+)?)\s*kg\br  )z+(\d+(?:\.\d+)?)\s*/\s*(\d+(?:\.\d+)?)\s*g\brK  )z\bkg[\.\s-]*(\d+(?:\.\d+)?)\br  )z(\d+(?:\.\d+)?)\s*kg\br  )z(\d+(?:\.\d+)?)\s*g\brK  r  )r  r  rF  r3  r  rH  r  r  	lastindexr  r  )r  r  r  pack_patternsr5  divisorr  unit_weightr  total_weightr  firstri	  weightlowhighs                   rJ  _infer_weight_range_kgrU  +  s    )bL(.VX;Y)b!bcJM * 	*		':r}}=-ekk!n=,U[[^<
*"4kJ6'A1E\))	*H % 		':r}}='A7=<AOOPUP_P_cdPd(Q8jn>57?A.F6>!Cv&0!4S''115Dy r  c                   t        | j                  d            }|t        |d      }||fS t        | j                  d            }|yt        | j                  d            }|t        ||z  d      }||fS t        t	        | j                  d      xs d      t	        | j                  d      xs d            \  }}||yt        ||z  d      }t        ||z  d      }||fS )	Nr  r   r  r  r  r  r
  r  )rZ  rn  r  rU  r  )	ro  explicit_price_per_kgpriceexplicit_weightexplicit_price
low_weighthigh_weight	low_price
high_prices	            rJ  _catalog_item_price_per_kgr_   ,  s    2488<O3PQ( %&;Q ?$&;;;"488,=#>?E},TXXk-BCO"u6:~--4DHH^$*+DHHZ &B'J [0ek)1-Iuz)1-Jj  r  c                t    t        |       yt        fddD              ryt        dddddd	d
ddd      ryy)NTc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z2_is_historical_purchase_request.<locals>.<genexpr>,  s     
vh8z!
vru  )r,  r-  zultimo ordinezultimi ordinir  r$  r  r  r   r   r   r   r  r  F)r  r)  rw  r  s    `rJ  r  r  ,  sT    w'3

v2u
vv  r  c                8    d| v xr t        | dddddddd	d
d      S )Nr   r  prenotar  r  modificaspostacambiaannullacancellaeliminar  rx  s    rJ  r4  r4  0,  s=    z! &?' r  c                .    d| v xs d| v xs
 d| v xs d| v S )Nobiettiv	obbiettivr	  r  r  rx  s    rJ  rV  rV  @,  s-    #r{j'@rFjDXr\dhr\rrr  c                N    t        |       xr t        | ddddddddd	d
dddd      S )Nr  impostar  aggiornard  rf  fissafissare	definiscidefiniresettasettareri  rh  )rV  rw  rx  s    rJ  rP  rP  D,  sI    !*- 2K3 r  c                F     t               xr t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z._is_sales_goal_read_request.<locals>.<genexpr>Y,  s      6 	:6ru  )r   r   r  r  r  leggir~   r   zcome siamo messir  r  r  r  r  r	  	progressomancamancano
completare
completato
completatiannualeannualigraficochart)rV  r)  rx  s   `rJ  rQ  rQ  X,  s+    !*- # 6
6 3 r  c                ,     t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z/_is_sales_goal_graph_request.<locals>.<genexpr>z,        	 	J	ru  )r  graficar  barrezgrafico a barrerI  rx  s   `rJ  rR  rR  y,       	
	 	 	r  c                J     t         dd      xr t         fddD              S )Nr  r	  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z)_is_note_write_request.<locals>.<genexpr>,  s      I"):Iru  r  scrivir  r  ro  rd  ri  rh  r  rx  s   `rJ  rS  rS  ,  s3    $Z@ S I .DI F r  c                l    t        t        j                  |             xr t        fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z4_is_suspended_order_write_request.<locals>.<genexpr>,  s      B"):Bru  )r  r  r  r  r  rn  )r  _SUSPENDED_ORDER_PATTERNr3  r)  r  s    `rJ  rT  rT  ,  s7    (//89 c B-pB ? r  c           
         t        t        |      t        | |      t        |      t	        |      t        | |      t        |      f      S rD  )r)  r4  rU  rP  rS  rT  r^  r  s     rJ  _is_write_intentr  ,  sH    )*5%gz:(4":.-gzB'
3	
	 	r  c           
         t        t        |      t        | |      t        |      t	        |      t        | |      f      S rD  )r)  r4  rU  rP  rS  rT  r  s     rJ  _is_state_change_write_intentr  ,  s@    )*5%gz:(4":.-gzB	
 r  c                     t         fddD              xr/ t         fddD              xr t         fdt        D               S )Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z/_is_tenant_user_list_request.<locals>.<genexpr>,  s     gGz!ru  )r  accountsr  utentir  r  	dipendentc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z/_is_tenant_user_list_request.<locals>.<genexpr>,  s       _':%  _ru  )r~   r  r   r   r   r  rx  generar  ci sonorJ   c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z/_is_tenant_user_list_request.<locals>.<genexpr>,  s     MgGz)Mru  )r)  r  rx  s   `rJ  r  r  ,  sP    1~ 	N  _  6^  _  _	NM9LMMMr  c                |    d| v ryd| v ryd| v sd| v sd| v sd| v sd| v ryt        | d	d
d      ry	t        | dd      ryy )Nri  r   r  r/  r0  r1  r  r  r  modellorD   r  r  r  rx  s    rJ  _extract_module_settings_targetr  ,  so    Z::Z!7;Kz;Y]dhr]rv}  BL  wL UItD Xx@r  c                H     t               }|yt         fddD              S )NFc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z3_is_module_settings_read_request.<locals>.<genexpr>,  s     vw*$vru  )impostaz
configurazr  attiverr  r  )r  r)  )r  r  s   ` rJ  r  r  ,  s'    ,Z8F~v4uvvvr  c                   t        |       ryt        |       ryt              ryt              ryt	              ryt        |       ryt        |       ryt        fdt        D              ryt        fdt        D              ryt              ryt        fddD              ryt        dd      st              ryt              st              ryy)	NTc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z,_is_grounded_data_request.<locals>.<genexpr>,       
FW7j 
Fru  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z,_is_grounded_data_request.<locals>.<genexpr>,  rB  ru  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z,_is_grounded_data_request.<locals>.<genexpr>,  s     
~h8z!
~ru  )r   r-  r.  r  tra i miei prodottir  r	  F)r  r  r  r  r  r  r   r)  r6  rC  rO  rw  rV  r  r  r  s    `rJ  _is_grounded_data_requestr  ,  s    ,4-j93J?Z(,Wj1

F0E
FF

A0@
AA!*-

~2}
~~ VV<@VWa@b#J/3ST^3_r  c           	        |j                         syt              ryt              ryt              ryt	              ryt        dddddd      ryt        fd	d
D              ryt        fddD              rt        |        S y)NFTr  r  r  r  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z&_is_catalog_request.<locals>.<genexpr>,       
th8z!
tru  )r  zcosa abbiamozche abbiamor  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z&_is_catalog_request.<locals>.<genexpr>,  s     
bW7j 
bru  )r   r   r   usiamo)r  rV  rN  rO  rJ  rw  r)  r  r  s    ` rJ  rW  rW  ,  s    ;;=j)
+!*-$ ZZQ\^hjtu

t2s
tt

b0a
bb27JGGGr  c                    d v rd v ryt        t                     }|t        z  rt         ddddd      ryt	        j
                  d	       ryt	        j
                  d
       ryt	        j
                  d       rt         fddD              syt         ddd      rt         dd      ryt         fddD              S )Nr  r   Tvendevendonovenderetrattatrattanoz\b(?:ha|hanno|vende|vendono|tratta|trattano)\s+[a-z0-9][a-z0-9 '&.-]{1,60}\s+(?:nel|nello|nella|sul|sulla|in)\s+(?:suo|sua|proprio|propria)?\s*catalog[oi]\bz\b[a-z0-9][a-z0-9 '&.-]{1,60}\s+(?:ha|hanno|vende|vendono|tratta|trattano)\s+.{1,80}\b(?:in|nel|nello|nella|sul|sulla)\s+catalog[oi]\bzL\bcatalog[oi]\s+(?:di\s+|del\s+|della\s+|fornitore\s+|venditore\s+)?[a-z0-9]c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z/_is_supplier_catalog_request.<locals>.<genexpr>-  s     nh8z)nru  )zcatalogo prodotti del localecatalogo localer  r  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z/_is_supplier_catalog_request.<locals>.<genexpr>-  r  ru  )	chi vendezchi ha in venditazquale fornitore hazquali fornitori hannozfornitore hazfornitori hanno)rK  r  $_KNOWN_SUPPLIER_CATALOG_QUERY_TOKENSrw  rF  r3  r)  )r  normalized_tokenss   ` rJ  rT  rT  -  s    J:#;OJ78??D]GY	8ZE 	yy	[
 	yy	E
 	yy`blmn:mnn WiKPiKQ  


 
 
r  c                <   t        |       }d}|D ]  }t        j                  ||      }|st        |j	                  d            D cg c]  }|r
|t
        vr| }}|D cg c]  }|t        v s| }}|shdj                  |d d       j                         c S  d}|D ]v  }t        j                  ||      }|st        |j	                  d            D cg c]  }|r|t
        vr|dvr| }	}|	sTdj                  |	d d       j                         c S  t        j                  d|      }
|
sy	t        |
j	                  d            D cg c]  }|r|t
        vr|d
vr| }	}dj                  |	d d       j                         S c c}w c c}w c c}w c c}w )N)zN\b([a-z0-9][a-z0-9 '&.-]{1,40})\s+(?:vende|vendono|tratta|trattano)\s+[a-z0-9]z\b(?:che|quale|quali|cosa)?\s*[a-z0-9][a-z0-9 '&.-]{1,80}\s+(?:vende|vendono|tratta|trattano)\s+([a-z0-9][a-z0-9 '&.-]{1,40})\br   r  r   )z\b(?:ha|hanno|vende|vendono|tratta|trattano)\s+([a-z0-9][a-z0-9 '&.-]{1,60})\s+(?:nel|nello|nella|sul|sulla|in)\s+(?:suo|sua|proprio|propria)?\s*catalog[oi]\bz\b([a-z0-9][a-z0-9 '&.-]{1,60})\s+(?:ha|hanno|vende|vendono|tratta|trattano)\s+.{1,80}\b(?:in|nel|nello|nella|sul|sulla)\s+catalog[oi]\b>   suasuor  propriaproprior  r  r  r  r  r  	venditore	venditorir   zr\bcatalog[oi]\s+(?:prodotti\s+)?(?:di\s+|del\s+|della\s+|fornitore\s+|venditore\s+)?([a-z0-9][a-z0-9 '&.-]{1,80})$r
  >	   r  r  r  r  r  r  r  r  r  )	r  rF  r3  r  r  rA  r  r  r  )r  r  known_supplier_patternssupplier_patternr  r  r  known_tokenssupplier_patternsr  r  s              rJ  r  r  )-  s    )J
 4 6#3Z@ ))=)=a)@A
&CC 
 

 ,<m%uHl?lmm88L!,-33556 . 4#3Z@ -^-A-A!-DE!>>	 F , xxr
+1133548 II}E  %U[[^466  I  I	 	F  88F2AJ%%''q

 n>s   F
!F/FFFc                   t        |       }|r@t        j                  |      j                  dd      }t        j                  d| dd|      }t        |      D cg c]  }|r|t        vr|dvr| }}|r(t        t        |            }|D cg c]	  }||vs| }}dj                  |d d       j                         S c c}w c c}w )Nz\ r  z\b(?:nel|nello|nella|sul|sulla|del|della|di)?\s*catalog[oi]\s+(?:prodotti\s+)?(?:di\s+|del\s+|della\s+|fornitore\s+|venditore\s+)?r2  r  >   r  r  rp   ivatiivator}   r~   r  r  r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r   )
r  rF  rG  r  r  r  rA  rK  r  r  )r  r	  r  r  r  r  r  s          rJ  r  r  o-  s     )J99^4<<UFKVV R  Sc  Rd  df  g

 %Z0&66
 
	 	&F &N on=>%+LEuO/K%LL88F2AJ%%''U&R Ms   C 	CCc                ,     t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z6_is_catalog_search_followup_request.<locals>.<genexpr>-  r  ru  )zcerca nei prodottizcerca nel catalogozcerca tra i prodottizguarda nei prodottizguarda nel catalogorI  rx  s   `rJ  r  r  -  r  r  c                D   t        |       }|r8|j                  d      r't        t        |j                  d      xs d            S dD ]V  }t	        j
                  || t        j                        }|s+t        |j                  d            }|sHt        |      rT|c S  y)Nr  r
  )z9catalogo prodotti del locale\s+(.+?)\s+risulta venduto daz9cataloghi fornitori caricati\s+(.+?)\s+risulta venduto daz.articoli che corrispondono a\s+(.+?)(?:\s*:|$)z6articoli riconducibili alla famiglia\s+(.+?)(?:\s*:|$)z(varianti rilevanti per\s+(.+?)(?:\s*:|$)z#dati che trovo su\s+(.+?)(?:\s*:|$)z+Ho aggiunto il prodotto\s+(.+?)(?:\s+\(|\.)z-Ho aggiornato il prodotto\s+(.+?)(?:\s+\(|\.)r   )	1_extract_pack_size_context_from_assistant_messagern  r  r  rF  r3  r  r  r  )r  pack_contextr5  r  r  s        rJ  /_extract_catalog_subject_from_assistant_messager  -  s    DWML((8%c,*:*:>*J*Pb&QRR	  		'7BMM:*5;;q>:E?F r  c                   t        | dd        D ]  }t        |j                  d      xs d      }t        |j                  d      xs d      }|sB|dk(  rt        |      }t	        |      s9t        |      s.t        |      s#t        ||      st        ||t        |            st        |      }t        ||      xs t        |      }|st        |      r|c S |dk(  st        |      }|st        |      r|c S  y)Nr  r
  r  r  	assistant)r  r  rn  r  rT  rN  rO  rU  rW  r  r  r  rY  r  r  )r  ro  r  r  r  r	  r  s          rJ  _latest_catalog_subject_queryr  -  s    bc*+ 488F#)r*dhhy)/R06>(1J,Z8+J7-j9,WjA&w
<RSZ<[\!I'!R?X  D\z  |C  ]D!CE!J L[ CGLE?F+, r  c                    t        |       }dD ]J  }t        j                  ||t        j                        }|s+t	        |j                  d            }|sH|c S  y)N)z6prodotti acquistati da\s+([a-z0-9\s&'\.-]+?)(?:\s*:|$)zGprodotti acquistati che corrispondono a\s+([a-z0-9\s&'\.-]+?)(?:\s*:|$)r   r
  )r  rF  r3  r  r  r  )r  r  r5  r  r  s        rJ  9_extract_purchase_overview_subject_from_assistant_messager  -  sZ     )J 	 		':r}}='A7L	 r  c                   t        | dd        D ]m  }t        |j                  d      xs d      dk7  r%t        |j                  d      xs d      }|sFt        |      }t	        |      s]t        |      }|sk|c S  t        | dd        D ]^  }t        |j                  d      xs d      }t        |j                  d      xs d      }|sB|dk(  rH|dk(  sNt        |      }|s\|c S  y)Nr  r  r
  r  r  r  )r  r  rn  r  rF  r  r  )r  ro  r  r  r  r  s         rJ  r  r  -  s    bc*+ 
txx%2&&0dhhy)/R0$W-
,Z8+G4E
 bc*+ 
488F#)r*dhhy)/R06>[ MgVE
 r  c                   t        | dd        D ]  }t        |j                  d      xs d      dk7  r%t        |j                  d      xs d      }|sFt        |      t	        fdt
        D              s8t              s-t              s"t              st              st              st        |      }|st        |      r|c S  y)Nr  r  r
  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z1_latest_purchase_subject_query.<locals>.<genexpr>.  r  ru  )r  r  rn  r  r)  rC  r|  ry  rE  rH  rF  r  rP  )r  ro  r  r  r  s       @rJ  r  r  .  s    bc*+ txx%2&&0dhhy)/R0$W-
F5EFF*:6!*-+J7(40<'0<UCL%& r  c                   |j                         s| dfS t        t        |            dk  r| dfS t        |      }|s| dfS g }| D ]  }dj	                  t        d t        |j                  d      xs d      t        |j                  d      xs d      t        |j                  d      xs d      t        |j                  d      xs d      t        |j                  d	      xs d      g            }t        ||      s|j                  |        |r,|j                  d
        |t        |      t        |       k7  fS | dfS )NFr   r  r  r
  r  r  r  r  c                   t        | j                  d      xs d      j                         t        | j                  d      xs d      j                         t        | j                  d      xs d      j                         fS )Nr  r
  r  r  )r  rn  r  rj  s    rJ  rk  z&_focus_catalog_items.<locals>.<lambda>B.  sf    DHH^,2399;DHH_-34::<DHHZ(.B/557 r  rl  )r  r  rB  rN  r  rm  r  rn  r:  r  rn  )rL  r  rU  exact_matchesro  r  s         rJ  _focus_catalog_itemsr  $.  sE   ;;=e|
 '(1,e|4U;Le|-/M 'XX06B717R8,2306B7,23	

 0
LI  &'   	 	
 c-0CJ>>>%<r  c                    t        j                  d| t         j                        }|sy |j                  d      j	                         S )Nz2\b(?:lotto|lot|formato)\s+([A-Za-z0-9%./xX+\-]+)\br   rF  r3  r  r  r  r  s     rJ  #_extract_product_lot_code_for_writer  M.  s9    IIKWVXVcVcdE;;q>!!r  c                    t        j                  d| t         j                        }|sy t        j                  dd|j	                  d            j                  d      S )Nuk   \bfornitore\s+([A-Za-zÀ-ÿ0-9' .&-]{2,80}?)(?=\s+(?:prezzo|iva|categoria|note|lotto|lot|formato)\b|[,.]|$)r  r  r   r  rF  r3  r  r  r  r  r  s     rJ  #_extract_product_supplier_for_writer  T.  s_    II  E  GN  PR  P]  P]  ^E66&#u{{1~.44V<<r  c                    t        j                  d| t         j                        }|sy |j                  d      j	                         S )Nz,\b(?:codice|sku)\s+([A-Za-z0-9./_-]{2,60})\br   r  r  s     rJ  _extract_product_code_for_writer  [.  s9    IIEwPRP]P]^E;;q>!!r  c                    t        j                  d| t         j                        }|sy t        j                  dd|j	                  d            j                  d      S )Num   \bcategoria\s+([A-Za-zÀ-ÿ0-9' .&/_-]{2,80}?)(?=\s+(?:prezzo|iva|note|lotto|lot|formato|fornitore)\b|[,.]|$)r  r  r   r  r  r  s     rJ  #_extract_product_category_for_writer  b.  s_    II  G  IP  RT  R_  R_  `E66&#u{{1~.44V<<r  c                ~   d}|D ]V  }t        j                  || t         j                        }|s+	 t        |j	                  d      j                  dd            c S  | j                         }t        j                  d|      r	 t        |j                  dd            S y # t        $ r Y w xY w# t        $ r Y y w xY w)N)ul   \b(?:units?\s*per\s*pack|unit(?:a|à|a')\s+per\s+(?:cartone|cassa|confezione))\s*[:=]?\s*(\d+(?:[.,]\d+)?)\bz9\b(?:cartone|cassa|confezione)\s+da\s+(\d+(?:[.,]\d+)?)\bu`   \b(\d+(?:[.,]\d+)?)\s+(?:bottiglie|pezzi|unit(?:a|à|a'))\s+per\s+(?:cartone|cassa|confezione)\bup   \bci\s+sono\s+(\d+(?:[.,]\d+)?)\s+(?:bottiglie|pezzi|unit(?:a|à|a'))\s+in\s+un\s+(?:cartone|cassa|confezione)\buk   \bsono\s+(\d+(?:[.,]\d+)?)\s+(?:bottiglie|pezzi|unit(?:a|à|a'))\s+in\s+un\s+(?:cartone|cassa|confezione)\br   r  r  z\d{1,3}(?:[.,]\d+)?)	rF  r3  r  r  r  r  r  r  r'  )r  r  r5  r  strippeds        rJ  )_extract_product_units_per_pack_for_writer  i.  s    H  		'7BMM:	Q//S9:: }}H	||*H5	))#s344   		  		s#   )B!B0 !	B-,B-0	B<;B<c                    d}|D ]V  }t        j                  || t         j                        }|s+	 t        |j	                  d      j                  dd            c S  y # t        $ r Y ew xY w)N)zI(\d+(?:[.,]\d+)?)\s+(?:come\s+)?prezzo\s+(?:al|per)\s+(?:kg|chilo|kilo)\bzG\bprezzo\s+(?:al|per)\s+(?:kg|chilo|kilo)\s*[:=]?\s*(\d+(?:[.,]\d+)?)\buW   (\d+(?:[.,]\d+)?)\s*(?:€|euro)?\s*(?:\/\s*(?:kg|chilo|kilo)|al\s+(?:kg|chilo|kilo))\br   r  r  )rF  r3  r  r  r  r  r  )r  r  r5  r  s       rJ  ,_extract_product_unit_price_per_kg_for_writer  .  st    H
  		'7BMM:	Q//S9::   		s   )A	A+*A+c                    t        | d      S )Niva)r"  r  s    rJ  #_extract_product_vat_rate_for_writer  .  s    '77r  c                    t        j                  d| t         j                        }|sy t        j                  dd|j	                  d            j                  d      }|xs d S )Nz\bnote?\s+(.+)$r  r  r   r  r  )r  r  r	  s      rJ   _extract_product_notes_for_writer  .  sO    II('2==AEvsEKKN399&AIr  c                    t        j                  d| t         j                        }|r;t        j                  dd|j	                  d            j                  d      }|xs d S y )Nuw   \bprodotto\s+([A-Za-zÀ-ÿ0-9°%/' .,&()\-]+?)(?=\s+(?:lotto|lot|formato|fornitore|prezzo|iva|categoria|note)\b|[,.]|$)r  r  r   r  r  )r  rb  r	  s      rJ  (_extract_explicit_product_name_for_writer  .  sY    yy 	C
H
 FF63q(9:@@H	 D r  c                    d}|D ]e  }t        j                  || t         j                        }|s+t        j                  dd|j	                  d            j                  d      }|sc|c S  y )N)ul   \bprezzo\s+(?:al|per)\s+(?:kg|chilo|kilo)\s+(?:per|di)\s+(?:il|lo|la|l')\s*([A-Za-zÀ-ÿ0-9°%/' .,&()\-]+)$uv   \b(?:\/\s*(?:kg|chilo|kilo)|al\s+(?:kg|chilo|kilo))\s+(?:per|di)\s+(?:il|lo|la|l')\s*([A-Za-zÀ-ÿ0-9°%/' .,&()\-]+)$r  r  r   r  r  )r  r  r5  r  r	  s        rJ  4_extract_product_subject_for_unit_price_per_kg_writer  .  si    H  		'7BMM:FF63A7==fE	 r  c                   t        |       }|r|S | }t        j                  dd|t        j                        }t        j                  dd|t        j                        }t        j                  dd|t        j                        }t        j                  dd|t        j                        }t        j                  dd|t        j                        }t        j                  dd|t        j                        }t        j                  d	d|t        j                        }t        j                  d
d|t        j                        }t        j                  dd|t        j                        }t        j                  dd|t        j                        }t        j                  dd|      }t        j                  dd|t        j                        }t        j                  dd|      }t        j                  dd|      j	                  d      }|sy t        j
                  d|      sy t        |      }|sy |j                         D cg c]  }|t        vs| }}|rt        |      j                  t              ry |S c c}w )Nz\b(?:aggiungi|aggiungere|crea|creare|inserisci|inserire|registra|registrare|appunta|appuntare|aggiorna|aggiornare|modifica|modificare|imposta|impostare|metti|mettere|cancella|cancellare|elimina|eliminare|rimuovi|rimuovere)\br  r  z=\b(?:no|un|una|uno|nuovo|nuova|questo|questa|questi|queste)\bz\bprodott[oi]\bzW\b(?:come\s+)?prezzo\s+(?:al|per)\s+(?:kg|chilo|kilo)\s+(?:per|di)\s+(?:il|lo|la|l')\s*z0\b(?:lotto|lot|formato)\s+[A-Za-z0-9%./xX+\-]+\buh   \bfornitore\s+[A-Za-zÀ-ÿ0-9' .&-]{2,80}(?=\s+(?:prezzo|iva|categoria|note|lotto|lot|formato)\b|[,.]|$)z*\b(?:codice|sku)\s+[A-Za-z0-9./_-]{2,60}\bu/   \bprezzo\s*[:=]?\s*(?:€\s*)?\d+(?:[.,]\d+)?\bzI\b\d+(?:[.,]\d+)?\s+(?:come\s+)?prezzo\s+(?:al|per)\s+(?:kg|chilo|kilo)\bz#\biva\s*[:=]?\s*\d+(?:[.,]\d+)?%?\bu   €\s*\d+(?:[.,]\d+)?z!\b(?:per|di)\s+(?:il|lo|la|l')\s+z[?]r  r  u   [A-Za-zÀ-ÿ])r  rF  r  r  r  r3  r  r  r  rK  issubset_PRODUCT_WRITE_NAME_NOISE)r  explicit_namer  normalized_cleanedr  r  s         rJ  _extract_product_name_for_writer  .  s3   <WEMGff 	lmm	G ffUWZ\ckmkxkxyGff'gR]]KGffbmm	G ffH#w^`^k^klGff  A  CF  HO  WY  Wd  Wd  eGffBCXZXeXefGffGg]_]j]jkGffacfhowy  xE  xE  FGff;S'QSQ^Q^_Gff-sG<Gff93r}}]GffVS'*GffVS'*008G99%w/(1,>,D,D,Fb5%WaJabb$5 6 ? ?@Y ZN cs   JJc                    t              ryt        |       ryt        fddD              }|sydv ryt        |       ryt	        |       }t        fddD              }t        |xr |      S )NFc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z,_is_product_write_request.<locals>.<genexpr>.  s       	:ru  )aggiungr  inseriscregistraggiornmodificimpostmettcancelleliminrimuovr   Tc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z,_is_product_write_request.<locals>.<genexpr>.  s       	:ru  )r   r  rt	  r  r  	categoriar	  rg  ri  r7  r5  r6  r  )r^  _is_product_capability_questionr)  r  r  r  )r  r  action_requestedr  field_requesteds    `   rJ  rU  rU  .  s    ":.&w
;  I  :/827;L  N O 011r  c                .    t        dt        |             S )Nr1   r
  )r  _parse_product_write_fragmentr  s    rJ  _build_product_write_tool_callr  .  s     0<YZa<bccr  c                F    t        |       t        fddD              ryy)Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z3_extract_product_write_operation.<locals>.<genexpr>/  s     
{W7j 
{ru  )rh  
cancellareri  	eliminarerimuovi	rimuoverer	  r  r
  r  s    @rJ   _extract_product_write_operationr  /  s"     )J

{0z
{{r  c           
     Z   dt        |       i}t        |       }t        |       }t        |       }t	        |       }t        |       }t        |       }t        | d      }t        |       }	t        |       }
t        |       }t        |       }|s|t        |       }|d   dk(  r|sd }n@|s%t        |||||d u|d u|	d u|
f      st        |       }n|st        | |      rt        |       }|r||d<   |r||d<   |r||d<   |r||d<   |r||d<   |||d	<   n|||d
<   |	|	|d<   |||d<   |
r|
|d<   |S )Nr  r   r	  r  r  r  r  r  r  r  r  r  r  )r  r  r  r  r  r  r  r"  r  r  r  r  r  r)  r  rU  )r  r  r  r  r  r  r  r  rX  r  r  r  r  s                rJ  r  r  	/  s   $/1QRY1Z#[I27;H7@M27;L27;H>wGNDWM((;E27;H,W5E )J;GDL-9KGT),#T)D 		
# 7w?7L6w?$0	.! (	*%2	/"$0	.! (	*$):	%&		',	#$ (	*!&4	"#"	'r  c                B    t        |       t        fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z9_message_allows_missing_units_per_pack.<locals>.<genexpr>D/  s       	Jru  )
zsalva comunquezsalvalo comunquezsalvala comunquezcompleto dopozaggiungo dopozlo aggiungo dopozla aggiungo dopoz	non lo soz	non la soznon lo conoscor
  r  s    @rJ  &_message_allows_missing_units_per_packr  B/  s)     )J 
  r  c                T   t        j                  d| t         j                        }|rt        j                  d|j	                  d            }t        |      dk(  rt        j                  dd|d   d         j                  d      }t        j                  dd|d   d         j                  d      }t        j                  dd|d   d         j                  d      }|r|||d	d
S t        j                  d| t         j                        }|rt        j                  dd|j	                  d            j                  d      }t        j                  dd|j	                  d      xs d      j                  d      }t        j                  dd|j	                  d      xs d      j                  d      }|r|||d	d
S t        j                  d| t         j                        }|rt        j                  dd|j	                  d            j                  d      }t        j                  dd|j	                  d      xs d      j                  d      }t        j                  dd|j	                  d      xs |j	                  d      xs d      j                  d      }|r|||dd
S y )NzMcartone\/cassa\s+di\s+questi\s+prodotti\s*:\s*(.+?)\.\s*(?:Aggiorna|Dimmi|Se)z%([^,()]+?)\s*\(([^,()]+),\s*([^)]+)\)r   r  r  r   r  r   rr  r  r  r  r  z[Per\s+(.+?)(?:\s+\(([^,()]+),\s*([^)]+)\))?\s+il dato unita per pack non e ancora salvato\.r
  r   zrPer\s+(.+?)(?:\s+\(([^,()]+),\s*([^)]+)\))?\s+non serve un valore unita per pack: il lotto e\s+([A-Za-z0-9._/\-]+)r   
not_needed)rF  r3  r  r%  r  r  r  r  )r  liters_goal_matchr
  r  r  r  missing_matchno_need_matchs           rJ  r  r  U/  si   		X

 **EGXG^G^_`Gabw<166&#wqz!}=CCFKLvvfc71:a=9??GHFF63
1>DDVLM$0%2 (%	  IIf
M
 vvfc=+>+>q+ABHHPvs]-@-@-C-IrKQQRXY66&#(;(;A(>(D"FLLVT ,!.$!	  II}
M
 vvfc=+>+>q+ABHHPvs]-@-@-C-IrKQQRXY66&#(;(;A(>(^-BUBUVWBX(^\^`ffgmn ,!.$$	  r  c                    t        | dd        D ]D  }|j                  d      dk7  rt        t        |j                  d      xs d            }|B|c S  y )Nr  r  r  r
  )r  rn  r  r  r  ro  r  s      rJ  r  r  /  s`    bc*+ 88F{*CCQZH[Ha_aDbcN r  c                V   t        |       }t        |j                  d      xs d      j                         }t	        |j                  d      t
              r|j                  d      ni }|dk7  s|sy t        |j                  d      xs d      j                         }t        |j                  d      xs d      j                         }t        |j                  d      xs d      j                         }|r|sy t        |      sy t        |j                  d            }|y |||d	d
S )NrJ  r
  rM  rK  r  r  r  r  rr  r  )rS  r  rn  r  r  r  rl  rZ  )r  r  rJ  rM  r  r  r  r  s           rJ  r  r  /  s   (6E#34:;AACN6@K\A]_c6deii 12jlO(**>:@bAGGIL?&&z28b9??AH++O<BCIIKMx'1+O,?,?@P,QRN!$&	 r  c                ,     t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z._is_pack_size_update_intent.<locals>.<genexpr>/         	:ru  )
r  r  r  r   rn  r  zvoglio inserirzvoglio salvarr  rn   rI  rx  s   `rJ  _is_pack_size_update_intentr(  /  s       M  r  c                   t        j                  d| t         j                        }|r9t        j                  dd|j	                  d            j                  d      }|r|S t        j                  d| t         j                        }|sy t        j                  dd|j	                  d            j                  d      }|xs d S )Nz2\b(?:nuovo\s+)?obb?iettivo\s*:\s*([^\n,.;]{2,120})r  r  r   r  u   \b(?:nome(?:\s+dell'?obb?iettivo)?|obb?iettivo\s+nome|goal\s+nome)\s*:?\s*([A-Za-zÀ-ÿ0-9'\" .,&()/_-]{2,120}?)(?=\s+(?:fornitore|prodotto|target|obb?iettiv|anno|tipo|litri?|quantita|pezzi)\b|[,.]|$)r  )r  
block_namer	  rb  s       rJ  "_extract_sales_goal_name_for_writer+  /  s    =
J
 FF63
(8(8(;<BB6J	yy 	T
H
 vsHNN1$56<<VDIr  c                   t        t        j                  d| t        j                              }|r<t        j                  dd|d   j                  d            j                  d      }|r|S t        j                  d| t        j                        }|r9t        j                  dd|j                  d            j                  d      }|r|S y )Nu   \bfornitore\s+([A-Za-zÀ-ÿ0-9' .&/_-]{2,80}?)(?=\s*(?:,|;|\.|\)|$)|\s+(?:il|la|i|gli|le|obiettiv|target|prodott|anno|tipo|solo|litri?|quantita|pezzi|unita|qualsiasi|tutti)\b)r  r  r  r   r  u=   ([A-Za-zÀ-ÿ0-9' .&/_-]{2,80}?)\s*\(\s*come\s+fornitore\s*\))r  rF  r  r  r  r  r  r3  )r  r&  r	  alias_matchs       rJ  &_extract_sales_goal_supplier_for_writer.  /  s    
 MM	
 FF63(8(<(B(B1(EFLLVT	))H
K
 FF63(9(9!(<=CCFK	r  c                   t        |       dv rt        fddD              ry t        j                  d| t        j                        xs% t        j                  d| t        j                        }|rt        j
                  d|j                  d            }g }|D ]O  }t        j                  dd	|      j                  d
      }|s,|j                         dv r?|j                  |       Q g }t               }|D ]9  }|j                         }||v r|j                  |       |j                  |       ; |r$t        |      dk(  r|d   S dj                  |      S d}	|	D ]e  }
t        j                  |
| t        j                        }|s+t        j                  dd	|j                  d            j                  d
      }|sc|c S  t        j                  d| t        j                        }|r9t        j                  dd	|j                  d            j                  d
      }|r|S t        j                  d| t        j                        }|r;t        j                  dd	|j                  d            j                  d
      }|xs d S y )Nr  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z8_extract_sales_goal_product_for_write.<locals>.<genexpr>/  s       )PHZ)?  )Pru  )ztutti quellizqualsiasi suo prodottoztutti i prodottiz?\b(?:somma|insieme|totale)\s+di\s+questi\s+prodotti\s*:\s*(.+)$z\bprodotti\s*:\s*(.+)$z\s*,\s*|\s*;\s*r   r  r  r  >   r>   rA   edoppurer   r
  )u   \b(?:il\s+)?prodotto\s+si\s+chiama\s*:?\s*([A-Za-zÀ-ÿ0-9'\" .,&()/_-]{2,120}?)(?=\s+(?:fornitore|target|obb?iettiv|anno|tipo|litri?|quantita|pezzi)\b|[,;]|$)u   \bprodotto\s*:?\s*([A-Za-zÀ-ÿ0-9'\" .,&()/_-]{2,120}?)(?=\s+(?:fornitore|target|obb?iettiv|anno|tipo|litri?|quantita|pezzi)\b|[,;]|$)u   \bsi\s+chiama\s*:?\s*([A-Za-zÀ-ÿ0-9'\" .,&()/_-]{2,120}?)(?=\s+(?:fornitore|target|obb?iettiv|anno|tipo|litri?|quantita|pezzi)\b|[,;]|$)u   \b(?:obb?iettiv\w*|goal)\s*:?\s*([A-Za-zÀ-ÿ0-9'\" .,&()/_-]{2,80}?)(?=\s*,?\s*\d+(?:[.,]\d+)?\s+(?:bottiglie|bottiglia|pezzi|pezzo|articoli|articolo|unita|litri?|litro)\b)u   ^\s*([A-Za-zÀ-ÿ0-9'\" .,&()/_-]{2,80}?)(?=\s*,\s*\d+(?:[.,]\d+)?\s+(?:bottiglie|bottiglia|pezzi|pezzo|articoli|articolo|unita)\b))r  r)  rF  r3  r  r  r  r  r  r  r  rK  r  r  r  r  )r  grouped_productsraw_candidatescleaned_candidatesraw_candidater	  unique_candidatesseen_candidatesr  explicit_patternsr5  rb  	goal_lead
loose_leadr  s                 @rJ  %_extract_sales_goal_product_for_writer<  /  s    )Jj S  )P  QO  )P  &PyyJ
  
!

	  "46F6L6LQ6OP(*+ 	1MvsM:@@HI!!#'AA%%i0	1 (*$'E+ 	0I'')F('$$Y/	0 +./@+AQ+F$Q'iEJJWhLii
 % 99Wgr}}=FF63q(9:@@H	 		 	y
I
 FF63	(:;AA&I	 	O
J
 FF63
(8(8(;<BB6J	 D r  c                    t        |       }d|v rd|v ryt        t        j                  d| t        j                              ryt        t        j                  d| t        j                              S )Nr  z	si chiamaTu!   \bprodotto\s*:\s*[A-Za-zÀ-ÿ0-9]u'   ^\s*si\s+chiama\s*:?\s*[A-Za-zÀ-ÿ0-9])r  r  rF  r3  r  r  s     rJ  -_is_sales_goal_product_identification_messager>  *0  sX     )JZK:$=BII:GR]]ST		Dgr}}]^^r  c                   t        |       ry t        j                  d| t        j                        }|r+	 t	        |j                  d      j                  dd            S t        j                  d| t        j                        }|D ]  }|j                  d      }t        |j                  d      xs d      j                         }|dk(  r t        j                  d	t        |             se	 t	        |j                  dd            c S  t        j                  d
|       D ]  }|j                  d      }t        j                  d|      r+| |j                         d  }t        j                  d|t        j                        rd	 t	        |j                  dd            c S  y # t        $ r Y y w xY w# t        $ r Y 9w xY w# t        $ r Y w xY w)NzK\b(?:obb?iettiv\w*|target|goal)\b(?:\s+(?:di|da|a|su))?\s*(\d+(?:[.,]\d+)?)r   r  r  z](\d+(?:[.,]\d+)?)\s*(bottiglie|bottiglia|pezzi|pezzo|articoli|articolo|unita|litri|litro|l)\br   r
  r@   z4\b(?:target|obb?iettiv\w*|goal|fornitore|prodotto)\bz\d+(?:[.,]\d+)?r   r   z\s*(?:l|lt|cl|ml|kg|g)\b)r>  rF  r3  r  r  r  r  r  r  r  r  r  r'  r  r  )r  anchoredunit_matchesr  r  r  trailings          rJ  $_extract_sales_goal_target_for_writerC  30  s   4W=yygiprtrr  AH	*223<== ;;h
L
  KKN	5;;q>'R(..03;ryy)`bqrybz{	**3455 /9 
KKN	<<
I.599;=)88/2==I	**3455
 ;  		  		  		s5   )F$ ,F3G$	F0/F03	G ?G 	GGc                    t        |       dv sdv ryt        dd      ryt        fddD              ryt        |       ry t        fd	d
D              st	        j
                  d      ryy )Nzliters dualz
litri dualr	  r  r	  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z5_extract_sales_goal_type_for_write.<locals>.<genexpr>a0  s       G55J  Gru  )r  r  r  r  r  r^  rq  rr  rH  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z5_extract_sales_goal_type_for_write.<locals>.<genexpr>e0  s     
?55J
?ru  )r  r  z\b\d+(?:[.,]\d+)?\s*l\br  )r  rw  r)  r>  rF  r3  r  s    @rJ  "_extract_sales_goal_type_for_writerG  [0  s{     )J
"lj&@ VV<
  G  -F  G  G4W=

?,>
??299MgisCtr  c                p    t        |       t        fddD              ryt        fddD              ryy )Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z0_extract_sales_goal_operation.<locals>.<genexpr>l0  s     
O55J
Oru  )ri  rh  r  r	  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z0_extract_sales_goal_operation.<locals>.<genexpr>n0  s       p55J  pru  )r  r  rn  rd  ro  rf  rp  rq  rr  rs  rt  ru  r  r
  r  s    @rJ  _extract_sales_goal_operationrK  j0  s@     )J

O,N
OO
  p  -o  p  pr  c                >   t        j                  d| t         j                        ry t        j                  d| t         j                        }|r;t        j                  dd|j	                  d            j                  d      }|xs d S t        j                  d| t         j                  t         j                  z        }|r;t        j                  dd|j	                  d            j                  d      }|xs d S t        |       t        fdd	D              ry t        fd
dD              sy t        j                  dd| t         j                        }t        j                  dd|t         j                        }t        j                  dd|t         j                        }t        j                  dd|t         j                        }t        j                  dd|      j                  d      }|sy t        j                  d|t         j                        ry |S )NzI^\s*(?:nome(?:\s+dell'?obb?iettivo)?|obb?iettivo\s+nome|goal\s+nome)\s*:?z:\b(?:descrizione|nota(?:\s+dell'?obiettivo)?)\s*:?\s*(.+)$r  r  r   r  z\b(?:devo\s+)?(?:creare|aggiungere|impostare|fissare|definire|aggiornare|modificare)\s+(?:un\s+|una\s+)?(?:nuov[oa]\s+)?obb?iettivo\s*:\s*[^\n]+[\r\n]+(.+)$c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z<_extract_sales_goal_description_for_write.<locals>.<genexpr>0  r  ru  )zsolo una notaze solo una notaz
e una notau   è una notac              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z<_extract_sales_goal_description_for_write.<locals>.<genexpr>0  s     `w*$`ru  )rl  rk  r	  r  z_^\s*(?:devo\s+)?(?:aggiungere|aggiungi|crea|imposta|fissa|setta|definisci|aggiorna|modifica)\s+r
  r  z6^\s*(?:come\s+)?(?:un\s+|una\s+)?obb?iettiv\w*\s*:?\s*z^\s*(?:come\s+)?goal\s*:?\s*z^\s*(?:che\s+)?z(?:solo\s+)?(?:una\s+)?nota)
rF  r3  r  r  r  r  r  r  r)  r'  )r  rb  r	  block_descriptionr  s       @rJ  )_extract_sales_goal_description_for_writerP  s0  s   	yy]_fhjhuhuvyyVX_acananoHFF63q(9:@@H	 D 		 	h
		!
 FF63(9(?(?(BCII&Q	 D  )J

t2s
tt`4_``j
mm	I PRTV_gigtgtuI6IR]][I)2yNIvsI.44V<I	||2Ir}}Mr  c                6   t        |       }|sg S t        j                  d|      }g }t               }|D ]b  }t        j                  dd|      j                  d      }|s,|j                         }||v rA|j                  |       |j                  |       d |S )Nz\s*\|\s*|\s*,\s*|\s*;\s*r  r  r  )	r  rF  r  rK  r  r  r  r  r  )r  r  r  termsrS  r  r	  r  s           rJ  r	  r	  0  s    "5)G	HH0':EEUD  FF63-33F;	##%T>Y  Lr  c                `   t        t        | j                  d      t              r| j                  d      nd       }t        t        | j                  d      t              r| j                  d      nd       }t        t        | j                  d      t              r| j                  d      nd       }| j                  d      }t        |t              st               j                  }|xs |}|s9|sy |d d j                         }t        |      dkD  r|j                         dz   }|}d| d| S )	Nr  r  r  r&  @   ...zTarget r  )
r  r  rn  r  r  r  r&  r  r  r  )r  r  r  r  r	  rI  	shorteneds          rJ  r	  r	  0  s   )ZXaXeXefvXwy|M})--8H*I  DH  IN(:V_VcVcdsVtvyKz)G  AE  FM&zR[R_R_`mRnpsGty}}]'Cz~K--'Kk3'(*//+mE$**,	{b !((*U2IUG1[M**r  c                   i t        |       }||d<   t        |       }t        |       }t        |       }t	        |       }t        |       }t        |       }t        |       }|r|d<   |r|d<   |r|d<   |r|d<   |/|d<   |dk(  rdd	<   n|d
k(  rt        |       }	d|	v rdd	<   ndd	<   ||d<   ||d<   j                  d      dk7  r*dvr&t        fddD              rt              }
|
r|
d<   S )Nr  r  r  r  r  r  r  r  r  rH  bottiglirr  r  r  r&  r	  c              3  &   K   | ]  }|v  
 y wrD  r  )rH  rF  r  s     rJ  rK  z3_parse_sales_goal_write_fragment.<locals>.<genexpr>0  s     iSy iru  )r  r  r  r  )rK  r+  r.  r<  rG  rC  rP  r  r  rn  r)  r	  )r  r  	goal_namer  r  r  r  r  r&  r  default_namer  s              @rJ   _parse_sales_goal_write_fragmentr\  0  sT   #%I-g6I!*	+27;I;GDN9'BM27;I1':F;GDK"7+D%	&&4	"#%2	/"#.	- !*	+ &)Il#*$(1JZ'*5	,'*4	,'$	( 	& 	k"h.)#i,hii5i@ ,Ifr  c                    dvryt        fddD              sy| j                         d| v ryt        fddD              S )	Nr   Fc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z2_is_product_capability_question.<locals>.<genexpr>0  s     _w*$_ru  )r  r  r  r   r@  Tc              3  &   K   | ]  }|v  
 y wrD  r  )rH  rt  r  s     rJ  rK  z2_is_product_capability_question.<locals>.<genexpr>0  s       	Gru  )	zposso zpuoi r  u   si puòz
si possonozpotete z	possiamo zcome faccio ad aggiungerezcome aggiungo)r)  r  )r  r  r  s    `@rJ  r
  r
  0  sT    z!_4^__ G
g~ 

  r  c                6     d v ryt         fddD              S )Nrk  Fc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z5_is_sales_data_request_unavailable.<locals>.<genexpr>1  r'  ru  )vendutovenditeincassoincassi	fatturatoscontrincorrispettivri  rI  rx  s   `rJ  "_is_sales_data_request_unavailableri  
1  s(    Z u  r  c                0     t         fddD              ryy)Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z)_extract_document_kind.<locals>.<genexpr>1  s     
`h8z!
`ru  )r  r  r  r  r  r  r  rI  rx  s   `rJ  rK  rK  1  s    

`2_
``r  stop_on_title_tokensc                   t        j                  dd|       j                         }|sy |rd}nd}t        j                  ||dt         j                        }|d   j                  d      }|xs d S )	Nr  r  zM\s+(?:nominat[oa]|chiamat[oa]|titolo|dove|che|con|in\s+cui|usando|partendo)\bz.\s+(?:dove|che|con|in\s+cui|usando|partendo)\br   )maxsplitr  r   r  )rF  r  r  r  r  )r  rm  r  r5  r  r  s         rJ  _truncate_document_segmentrp  1  sd    ffVS),224GbCHHWgGE!HNN6"E=Dr  c                  t        j                  d| t         j                        }|r1t        |j	                  d            }|r|j                  d      xs d S t        j                  d| t         j                        }|rJt        j                  dd|j	                  d            j                  d      }|j                  d      xs d S t        |       }d|v rd	|v ry
d|v rd|v ryy )NzU\b(?:nominat[oa]|chiamat[oa]|chiamalo|chiamala|titolo|con\s+nome|nome\s+file)\s+(.+)$r   z '"u4   \btitolo\s+([A-Za-zÀ-ÿ0-9'\" .,:;!?()/_-]{3,200})$r  r  r  r  2025zAnalisi ordini 2025r   r   zSituazione prenotazioni stasera)rF  r3  r  rp  r  r  r  r  )r  rz  namedr  rb  r  s         rJ  r{  r{  &1  s    IInpwy{  zG  zG  HE,U[[^<==(0D0yyPRY[][h[hiH&&hnnQ&78>>vF}}V$,, )J:&J"6$:)z"90r  c                    t        j                  d| t         j                        }|sy t        |j	                  d      d      S )Nz7\b(?:nella\s+|nel\s+)?(?:cartella|folder|drive)\s+(.+)$r   Trl  )rF  r3  r  rp  r  r  s     rJ  _extract_document_destinationru  :1  s8    IIPRY[][h[hiE%ekk!n4PPr  c                   t        j                  d| t         j                        }|rIt        j                  dd|j	                  d            j                  d      }|xs | j                         S t        j                  dd| t         j                        }t        j                  dd|t         j                        }t        j                  d	d|t         j                        }t        j                  d
d|t         j                        }t        j                  dd|t         j                        }t        j                  dd|      j                  d      }|xs | j                         S )Nz!^\s*(?:dove|che|in\s+cui)\s+(.+)$r  r  r   r  zr\b(?:crea|creare|creami|genera|prepara|preparare|preparami|prepari|salva|salvare|fammi|fai|apri|scrivi|scrivere)\br  zX\b(?:un|una|uno|il|lo|la|google|doc|docs|documento|documenti|sheet|sheets|foglio|file)\bz5\b(?:nella\s+|nel\s+)?(?:cartella|folder|drive)\s+.+$u   \b(?:nominat[oa]|chiamat[oa]|chiamalo|chiamala|titolo|con\s+nome|nome\s+file)\s+[A-Za-zÀ-ÿ0-9'\" .,:;!?()/_-]{1,200}?(?=\s+(?:dove|che|con|in\s+cui|usando|partendo)\b|$)z(^\s*(?:voglio|vorrei)\s+(?:che\s+mi\s+)?r
  r  )r  explicit_briefr  s      rJ  rL  rL  A1  s   YYCWbmm\N&&n&:&:1&=>DDVL)'--/)ff}mm	G ffcmm	G ffMsT[cecpcpqGff 	wmm	G ff@"gUWUbUbcGffVS'*008G%gmmo%r  c                `     t         fddD              }t         fddD              }|xr |S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z._is_document_create_request.<locals>.<genexpr>`1  s     ~X(j0~ru  )r  r  r  r  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z._is_document_create_request.<locals>.<genexpr>a1  s       Eh*4  Eru  )r  r  r  r  r  r  rI  )r  has_file_targethas_creation_intents   `  rJ  r^  r^  _1  s?    ~A}~~O  E  FD  E  E222r  c                    t        |      syt        |      ry|}dD ]  }|j                  |d      } dj                  |j	                               }|rt        | |      S dS )NFT)r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r^  r  r  r  r  r  )r  r  reducedr  s       rJ  rQ  rQ  e1  sh    &z2#J/G f .//%-.hhw}}'G:A$Wg6LuLr  c                    t        |       }t        |      }|t        |       d}t        | |      }t	        |       }|r||d<   |r||d<   t        d|      S )N)rz  r  r
  r~  r  r<   r
  )r  rK  rL  r{  ru  r  )r  r  rz  r  r~  r  s         rJ  rJ  rJ  q1  sj     )J!*-D*73$I $G$7E9'B"	'-B	)* BiXXr  c                |    t              syt        |       ryt        fddD              ryt        dddd      S )	NFc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z._is_orders_document_request.<locals>.<genexpr>1  s     
}h8z!
}ru  )z ordine  ordini r   r  storico acquistiTr  r  r6  r   )r^  $_is_catalog_product_document_requestr)  rw  r  s    `rJ  r
  r
  1  s?    &z2+G4

}2|
}}$Z8ZQ[\\r  c                j   t        |       }t        |      syt        fddD              xs t        dddd      }|syt	        t        |            }t        fdd	D              }t        |      d uxs t        |      d uxs t        |      d u}t        fd
dD              }|s|ry|xs |S )NFc              3  &   K   | ]  }|v  
 y wrD  r  rH  rt  normalized_prompts     rJ  rK  z7_is_catalog_product_document_request.<locals>.<genexpr>1  s     chH))cru  )r  r   r  r  r  r  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z7_is_catalog_product_document_request.<locals>.<genexpr>1  s     kh"33kru  )r   r   r   r  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z7_is_catalog_product_document_request.<locals>.<genexpr>1  s       	%%ru  )r  r  z	ordini diz
ordini delz	ordini dazrighe ordinezbatch ordini)	rL  r  r)  rw  r  r  r  r  r  )r  r  has_product_shapehas_supplierasks_pricesr  historical_shaper  s          @rJ  r  r  1  s    %g.F'/ 	c:bcc 	h$%6
JPZ\fg  8@ALkDjkkK't3 	=#F+47	=(0< 
  
  *&;&r  c                   t         h dz  dfd}t        |       }t        |      }|r|S t        j                  d|t        j
                        }|r ||j                  d            }|r|S  ||      xs t        |      S )N>!   r  r  r  compror   r   r   r0  r1  r2  r3  r   r6  r  r  r  r  r=  r  r  relativarelativerelativirelativo	crescenterE  rF  rG  rU  rW  rX  rY  rZ  c                    t        |       D cg c]   }|r|vrt        j                  d|      s|" }}dj                  |d d       j	                         S c c}w rU  )r  rF  r'  r  r  )r	  r  r  r  s      rJ  clean_candidatezA_extract_grounded_document_product_query.<locals>.clean_candidate1  se     )3
^+LLU3	 
 
 xxr
#))++
s   %AzR\b(.+?)\s+che\s+(?:ho\s+tra\s+i\s+prodotti|compriamo|acquistiamo|teniamo|usiamo)\br   )r	  r  r  r  )rA  rL  r  rF  r3  r  r  r  )r  r  r  r	  explicit_matchr	  r  s         @rJ  (_extract_grounded_document_product_queryr  1  s    2 #6 #NJ, &g.F5f=NYY]
N
 #N$8$8$;<	6"D&<V&DDr  c                    t        |       }t        |      }h d}|j                         }|syt        |      j	                  |      ry|S )N>	   r  r  r  r  r  r  r  r   r6  r
  )rL  r  r  rK  r  )r  r  r  r  rU  s        rJ  &_extract_grounded_document_order_queryr  1  sK    %g.F#F+E
N ;;=L
<!!.1Lr  c                h   t        |       t              rt        di       t        |       gS t	        |       rt        |       t        |       gS t              rt        di       t        |       gS t              rt        |       t        |       gS t              rt        |       t        |       gS t              r"t        |       rt        |       t        |       gS t        |       rt        |       t        |       gS t!        |       rt#        |       t        |       gS t%        |       rt'        |       t        |       gS t)        |       rGt+              s<t-        |       }t        d||j/                         nd t0        d      t        |       gS t3        |       rVt5        |       }t7        |       }t9        |       }t;        fddD              rdnd	}t        ||||d
d      t        |       gS t=        |       }|st        |       gS t        d|d
d      t        |       gS )Nr  r
  rc  r  )r   r  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z6_build_grounded_document_tool_calls.<locals>.<genexpr>52  s       2DG'Z2G  2Dru  )r  r  r  r
  r  r  r-   rA  r  r  r  )r  r  r  rJ  r  rM  r  r  "_build_timeclock_summary_tool_callr  rG  r  r  rH  r  &_build_inventory_consumption_tool_callr   rO  r  _build_homemade_tool_callr  r4  r  r/  r  r
  r  r  r  r)  r  )r  r>  r  r&  r'  rn  r  s         @rJ  rR  rR  2  si    )J#J/%8BGIijqIrss,%g.0PQX0YZZ#J/%<KMmnuMvwwZ(27JGIijqIrss-j9;GDFfgnFopp3J?Dlmt  wA  EBA'JLlmtLuvv(*=6w?AabiAjkkWj1*735UV]5^__GZ0)'24TU\4]^^4=Z[e=f,W5(7B7NK113TX- -W5	
 		
 #7J76w?&w/(1.1  2D  XC  2D  /D*  J`	" "!	 -W5
 	
 5W=E09::"	
 	)1	 	r  c                j    t        |      r	 yt        |      rt        |      r	 yt        | |      r	 yy )Na   Posso gestire analisi e confronti del venduto solo quando colleghiamo una fonte reale dalla cassa. Oggi dalla Home leggo in modo affidabile catalogo prodotti, cataloghi fornitori, ordini storici, prenotazioni, note, obiettivi e documenti, ma non ho ancora dati reali di venduto o incasso.u  Sì, posso stimare i consumi giornalieri per prodotto usando ordini storici e inventari, ma devo indicarti il livello di affidabilità. La formula corretta è: giacenza iniziale + acquisti del periodo - giacenza finale, diviso i giorni del periodo. Se manca una giacenza iniziale reale, posso fare solo una stima parziale usando gli acquisti 2025 e il primo inventario 2026 come rimanenza finale: è utile per orientarsi, ma non è un consumo preciso perché non sappiamo quanto stock era già presente a inizio 2025. Per una stima commerciale solida conviene salvare inventari periodici: da lì posso calcolare consumi medi giornalieri, prodotti più lenti, prodotti più veloci e fabbisogno di riordino.u`  Sì. Posso anche aggiungere o aggiornare prodotti dal gestionale centrale, Per registrarlo bene scrivimi almeno il nome prodotto. Se li hai, aggiungi anche lotto, fornitore, codice, prezzo, iva, categoria e note. Se il lotto e un cartone o una cassa, dimmi anche quante unita contiene. Se qualche dato ti manca, lo salvo comunque e lo completiamo dopo.)ri  r  r  r
  r  s     rJ  _build_capability_replyr  R2  sO    )*5@	

 4J?D[\fDgJ	
 'w
;Q	
 r  c                    t        |       D ]6  }|j                  d      dk(  st        |j                  d      xs d      c S  yr  r  rn  r  r  r  s     rJ  r  r  k2  sE    L) 5;;v&(w{{9-3445 r  c                   t        | dd        D ]  }|j                  d      dk7  rt        |j                  d      xs d      }t        |      t	              r|c S t        |      }t        fdt        D              xsj t        fdt        D              xsP t        |      xsB t        fdt        D              xs( t        |      xs t        |xr t        ||            }|r yt        |      s y)	Nr  r  r  r  r
  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z4_latest_timeclock_request_message.<locals>.<genexpr>|2  r  ru  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z4_latest_timeclock_request_message.<locals>.<genexpr>}2  s     LW7j(Lru  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z4_latest_timeclock_request_message.<locals>.<genexpr>2  s     VW7j(Vru  )r  rn  r  r  r  r  r)  rC  r  r  _RESERVATION_SUBJECT_KEYWORDSr  r  rW  r_  )r  r  r  rY  has_other_domainr  s        @rJ  r  r  r2  s   L./ ;;v&(gkk),23$W-
 ,N.w7F5EFF _L8KLL_4_ V8UVV_ $GZ8	_
 M]&9':}&]^ 	 #G,'( r  c                    t        |       D ]6  }|j                  d      dk(  st        |j                  d      xs d      c S  yNr  r  r  r
  r  r  s     rJ  _latest_assistant_messager  2  sE    L) 5;;v+-w{{9-3445 r  c                    t        |       }|sy|j                         }|r|d   dk(  r|dd  }dt        |      cxk  xr dk  S c S )NFr   r>   r   r   )r  r  r  )r  r  r  s      rJ  r_  r_  2  sS     )JF&)s"s6{ar  c                X     t         fddD              xr t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rH  r  r  s     rJ  rK  z0_is_purchase_followup_request.<locals>.<genexpr>2  s     bgG))bru  )r  r  r   r   c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z0_is_purchase_followup_request.<locals>.<genexpr>2  s       D'--  Dru  )singolsongoldettaglmostrr  r  r  rI  r  s   `rJ  r`  r`  2  s8    b9abb 	D  D  >C  D  Dr  c                V     t         fddD              syt         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z7_is_purchase_expand_followup_request.<locals>.<genexpr>2  s       Gw,,  Gru  )r  r  r  tuttr  r  intercompletFc              3  &   K   | ]  }|v  
 y wrD  r  )rH  r  r  s     rJ  rK  z7_is_purchase_expand_followup_request.<locals>.<genexpr>2  s       Auu**  Aru  )r  r  r  completacompletointerainterorI  r  s   `rJ  ra  ra  2  s?      G  =F  G  G  A8  A  A  Ar  c                    t        | dd        D ]H  }|j                  d      dk7  rt        t        |j                  d      xs d            }d|v sd|v sH y y	)
Nr  r  r  r  r
  z'prezzi mancanti non inclusi nella stimaz non ho abbastanza prezzi salvatiTFr  rn  r  r  )r  r  r  s      rJ  *_assistant_mentions_missing_price_variantsr  2  sg    L-. ;;v+-$SY)?)E2%FG
4
BFhlvFv r  c                V     t         fddD              syd vrd vryt        |      S )Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z>_is_missing_price_variants_followup_request.<locals>.<genexpr>2       ow,,oru  r  r  r  r~   z
quali sonoFvariantquell)r)  r  )r  r  s   ` rJ  r  r  2  s4    o<noo**w>P/P5lCCr  c                V     t         fddD              syt         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z?_is_missing_price_variants_reference_message.<locals>.<genexpr>2  r  ru  r  Fc              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z?_is_missing_price_variants_reference_message.<locals>.<genexpr>2  s     lw,,lru  )r  r  mancantr9  rI  r  s   `rJ  ,_is_missing_price_variants_reference_messager  2  s'    o<nool<klllr  c                    | j                         syh d}h d}| j                         D ch c]  }|r|j                         s||vr| }}t        |      xr |j	                  |      S c c}w )NT>.   r	  r  r  r  r  r  senzar  r  r  r  r   r   quellar  quelliquellor%  r&  r'  r(  r.  r/  rm  rn  songolisongolor  r0  r  mancantemancantir  r?  r@  rA  rB  variantevariantir  rD  r  r  rM  r[  r  >   rV   r  r  r  rh   r  r
  r	  r  r  r  r  )r  r  r  r  r  )r  r  numeric_tokensr  rU  s        rJ  rP  rP  2  sv    ;;=3NhN  [[]U.-H 	L 
 G,"7"7"GGs   A+c                    | j                         syh d}t        |       D ch c]  }|s|	 }}t        |      xr |j                  |      S c c}w )NT>   rp   r   r   r   r   r   r   r  r  r%  r(  r   r  r  r  r  r  r  )r  rB  r  r  )r  r  r  rU  s       rJ  r  r  3  sR    ;;=N( (=U'CMeuEMLMG,"7"7"GG Ns
   AAc           
     ,   t        |      }i }t        |j                  d      t              r|j	                  |d          |dd  D ]M  }|j                  d      dk7  r|j	                  t        t        |j                  d      xs d                   O |j	                  t        |              t        |j                  d      xs d      j                         }|sFt        |j                  d      xs d      j                         }|r||d<   nt        |      }|r||d<   |j                  d      s_t        |       }	|	rRt        j                  d	d
|	t        j                        }	t        j                  dd
|	      j                  d      }	|	|d<   |S )NrM  r"  r  r  r  r
  r  rY  z6\b\d+(?:[.,]\d+)?\s+unita?\s+per\s+(?:cartone|cassa)\br  r  r  r  )rS  r  rn  r  r  r  r  r  r  r  rF  r  r  )
r  r  r  r  mergedro  fallback_product_namer  previous_catalog_queryfallback_names
             rJ  r  r  (3  so   
 )6E "F%))-.5e-./RS! U88Fv%3C8K8Qr4RSTU MM/89

> : @bAGGI !%))O"<"BCIIK%8F>"%B<%P"%)?~&::n%7@FFImm	M FF63>DDVLM%2F>"Mr  c                R   t        |       }t        |      st        |      ryt        | |      ryt	        |      }t        |j                  d      xs d      j                         dk(  ryt        |j                  d      xs d      j                         dk(  ryt        |      }|rt        |t        |            ryt        |dd        D ]X  }|j                  d      d	k7  rt        t        |j                  d
      xs d            t        fdt        D              sX y y)NFTrJ  r
  rL  rK  r"  r  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  rH  r  r  s     rJ  rK  z?_conversation_suggests_pending_product_write.<locals>.<genexpr>f3  s     J4twJru  )r  rQ  rP  rU  rS  r  rn  r  r  r  r)  _PRODUCT_WRITE_ASSISTANT_HINTSr  r  r  r  r  	last_userro  r  s          @rJ  ,_conversation_suggests_pending_product_writer  M3  s   
 !)J":.2Nz2Z *5(6E
599%&,"-3359KK
599%&,"-335H$\2I.y/):TUbc*+ 88F{*!#dhhy&9&?R"@AJ+IJJ r  c                   t        | ||      sy t        | ||      }t        |j                  d      xs d      j	                         }t        |       }t        |      }t        |j                  d      t              r|j                  d      ni }|dk(  rOt        |      r1t        |j                  d      xs d      j	                         dk7  r	 y|j                  d	      ry y
|j                  d	      rt        t        |j                  d      t              r|j                  d      nd       }|j                  d      }	t        |      r2t        |	      't        |       ry d|r|j                          dS d dS y 	 y)Nr  r  rO  r	  re  r
  r	  zNon risulta nessun nuovo prodotto appena creato da eliminare. Se vuoi rimuovere un prodotto esistente, dimmi il nome del prodotto e, se serve, anche lotto o fornitore.r  z$Dimmi quale prodotto vuoi eliminare.r  r  zPer il lotto r  z mi serve sapere quante unita contiene un cartone. Questo dato serve per conteggi, litri e obiettivi. Se non lo sai adesso, scrivimi 'salva comunque' e lo completiamo dopo.a"  Certo. Per registrare il prodotto scrivimi almeno il nome prodotto. Se li hai, aggiungi anche lotto, fornitore, codice, prezzo, iva, categoria e note. Se il lotto e un cartone o una cassa, dimmi anche quante unita contiene. Se qualche dato ti manca, lo salvo comunque e lo completiamo dopo.)r  r  r  rn  r  r  rS  r  r  r  r  rl  rZ  r  r  )
r  r  r  r  r  r  r  rO  r  r  s
             rJ  "_build_product_write_clarificationr  k3  s   
 8|\+G\<PFFJJ{+7x8>>@I )J(6E<FuyyQeGfhl<m#78suH2:>3GYG]G]^fGgGmkmCnCtCtCv  {D  DD| ::n%5zz.!'*VZZXbMcehBi

:(>ost$45'16L^6\6d5g>'/8>>#: ;YY59: ;YY 	Mr  c           	     F   t        |      xs t        |      }|y t        |       }t        |      sy |j	                  d      xs d}|j	                  d      xs d}|j	                  d      xs d}t        |      rd| d| d	|xs d
 d| d	S d| d|xs d d| d| d	S )Nr  questo prodottor  zfornitore non indicator  r
  Per zF dimmi quante unita contiene il cartone. Per esempio puoi scrivermi: 'z lotto r   fornitore z, 6 unita per cartone'.z il lotto attuale e r  zi, quindi non serve un valore unita per pack. Se vuoi registrare anche il cartone, scrivimi per esempio: 'z lotto ct fornitore )r  r  r  r(  rn  rl  )r  r  r  r  r  r  r  r  s           rJ  '_build_pack_size_followup_clarificationr  3  s    
 (5k9]^j9kG )J&z2;;~.C2CLKK0L4LM{{:&,"H#H-<. !~WX%5$6k-Pgi	
 |n01AT0B C>-m_<S	Ur  c                ,     t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z:_is_relative_new_product_delete_request.<locals>.<genexpr>3  r  ru  )zquesto nuovo prodottozquesta nuova scheda prodottozquel nuovo prodottozcancella il nuovo prodottozelimina il nuovo prodottorI  rx  s   `rJ  r  r  3  r  r  c                ^   t        | ||      sg S t        |       }t        | ||      }t        |      }t	        |j                  d      t              r|j                  d      ni }t        |j                  d      xs d      j                         dk(  rxt        |      rmt        |j                  d      xs d      j                         dk(  r<dD ]6  }t        |j                  |      xs d      j                         }|s2|||<   8 ng S |r|j                  d	      sg S t        d
|      gS )NrO  r  r  r	  re  r
  r	  r	  r  r1   r
  )r  r  r  rS  r  rn  r  r  r  r  r  )	r  r  r  r  r  r  rO  rF  r  s	            rJ  *_build_contextual_product_write_tool_callsr  3  s   
 8|\	 )J+G\<PF(6E<FuyyQeGfhl<m#78su 	FJJ{#/x0668HD3J?!%%h/526<<>)KD (.2237=2>DDF"'F3K(
 IN3	!1VDEEr  c                   t        |      xs t        |      }|g S t        |       }t        |j	                  d            }|g S t        t        |j	                  d      t              r|j	                  d      nd       xs |j	                  d      }t        |      sg S t        t        |j	                  d      t              r|j	                  d      nd       xs |j	                  d      }t        t        |j	                  d      t              r|j	                  d      nd       xs |j	                  d      }|sg S ||||d}	t        d|	      gS )Nr  r  r  r  )r  r  r  r  r1   r
  )
r  r  r  rZ  rn  r  r  r  rl  r  )
r  r  r  r  rY  r  r  r  r  r  s
             rJ  &_build_contextual_pack_size_tool_callsr  3  s}   
 (5k9]^j9kG	*73F+FJJ7G,HIN	#jT^I_ad>eFJJz$:kop  Lt{tt  AK  uLH'1	(
SYS]S]^mSnpsHtO)Dz~  `  DK  DO  DO  P_  D`M'jQWQ[Q[\jQkmpFq

>(Bw{|  \  AH  AL  AL  M[  A\L	 %&(	$I !1YGHHr  c                   t        |       }t        |      ryt        |      ryt        |      }t	        |j                  d      xs d      j                         dk(  ryt        |      }|rt        t        |            ryt        |dd        D ]X  }|j                  d      dk7  rt        t	        |j                  d	      xs d            t        fd
t        D              sX y y)NFTrJ  r
  rL  r"  r  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  zB_conversation_suggests_pending_sales_goal_write.<locals>.<genexpr>4  s     G4twGru  )r  rQ  rP  rS  r  rn  r  r  r  r)  _SALES_GOAL_ASSISTANT_HINTSr  s          @rJ  /_conversation_suggests_pending_sales_goal_writer  4  s    
 !)J":.#J/(6E
599%&,"-3359KK$\2I1/)2LMbc*+ 88F{*!#dhhy&9&?R"@AG+FGG r  c           
        t        |      }t        |       }t        |      }i }|s3t        |j	                  d      t
              r|j                  |d          |rg n|dd  }|D ]M  }|j	                  d      dk7  r|j                  t        t        |j	                  d      xs d                   O t        |       t        |      r|j                  t        |              |S )NrN  r"  r  r  r  r
  )rS  r  rP  r  rn  r  r  r\  r  r  rV  )	r  r  r  r  r  starts_new_goal_requestr  relevant_conversationro  s	            rJ  r  r  4  s    
 )6E(1:;MN "F"z%))<P2QSW'Xe012"9B|BC?P% X88Fv%6s488I;N;TRT7UVWX
 	2':F&'9:6w?@Mr  c                    t        | ||      sg S t        | ||      h d}t        fd|D              sg S t        d      gS )N	   r  r  r  r  r  r  r  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  )rH  rF  r  s     rJ  rK  z@_build_contextual_sales_goal_write_tool_calls.<locals>.<genexpr>K4  s     :sf}:ru  r3   r
  )r  r  r)  r  )r  r  r  meaningful_fieldsr  s       @rJ  -_build_contextual_sales_goal_write_tool_callsr  64  sT    
 ;7LR^_	.wlSF
 :(9::	!3vFGGr  c                    t        | dd        D ]N  }|j                  d      dk7  rt        |j                  d      xs d      }t        |t	        |            sL|c S  yNr  r  r  r  r
  )r  rn  r  r  r  r  s      rJ  _latest_tips_request_messager  P4  sb    bc*+ 88Fv%dhhy)/R0G_W%=>N r  c                    t        | dd        D ]T  }|j                  d      dk7  rt        t        |j                  d      xs d            t	        fddD              sT y y	)
Nr"  r  r  r  r
  c              3  &   K   | ]  }|v  
 y wrD  r  )rH  r  r  s     rJ  rK  z3_assistant_mentions_tips_context.<locals>.<genexpr>_4  s      	
 J	
ru  )zgiornate mance salvatezstorico mance trovatozgiornata manceztotale visibile nei calcolizdi mance giornata suTF)r  rn  r  r  r)  r  ro  r  s     @rJ   _assistant_mentions_tips_contextr
  Z4  sp    bc*+ 88F{*$S))<)B%CD
 	
	
 	
  r  c                F    t        |       ryt        fddD              S )NFc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z,_is_tips_followup_request.<locals>.<genexpr>p4  r3  ru  )r  r  in tuttor  r  zquanto fannoz	quanto fa)r  r)  r  s    `rJ  _is_tips_followup_requestr  m4  s,    , 
  r  c                    t        |       }t        | |      sg S t        |      sg S t        |      }|sg S t        |      }d|v rdnt	        |d      rdnd }t        |      }t        |      }|}t        ||||      gS )Nr   r  fallback_arearn  fallback_month)r  r  r
  r  rw  r  r  rM  )	r  r  r  previous_tips_messageinherited_normalizedinherited_areainherited_yearinherited_monthquery_sources	            rJ  !_build_contextual_tips_tool_callsr  ~4  s     !)J$Wj9	+L9	8F 	*+@A%)==VLefz  }B  MC5  IMN,-BCN./DEO(L((*		
 r  c                    t        | dd        D ]M  }|j                  d      dk7  rt        |j                  d      xs d      }t        t	        |            sK|c S  yr  )r  rn  r  rQ  r  r  s      rJ  "_latest_sales_goal_request_messager  4  s`    bc*+ 88Fv%dhhy)/R0&w'?@N r  c                    t        | dd        D ]I  }|j                  d      dk7  rt        t        |j                  d      xs d            }d|v sDd|v sI y y	)
Nr"  r  r  r  r
  	obiettivizconfigurati nel localeTFr  r	  s      rJ  _assistant_mentions_sales_goalsr  4  sf    bc*+ 88F{*$S))<)B%CD
*$)AZ)O r  c                    t        |       }t        |      sg S t        |      sg S t        |      }t	        |      }|rt        |      nd }|t        |j                  d            }t        dd|i      gS )Nr  r2   r&  r
  )	r  rR  r  r  rS  r  r  rn  r  )r  r  r  r  previous_goal_messager  r  s          rJ  ,_build_contextual_sales_goal_read_tool_callsr!  4  s~    
 !)J'
3	*<8	>|L(6EF[+,ABaeN.uyy9K/LM!2v~>VWXXr  c                    t        j                  d| t         j                        }|sy |j                  d      j	                         }|xs d S )NzRicetta homemade:\s*(.+)r   r  )r  r  r  s      rJ  0_extract_homemade_context_from_assistant_messager#  4  s?    II17BMMJEKKN  "E=Dr  c                    t        |       D ]D  }|j                  d      dk7  rt        t        |j                  d      xs d            }|sB|c S  y r  )r  rn  r#  r  r#  s      rJ  _latest_homemade_contextr%  4  sV    & 88F{*B3txxPYGZG`^`CabN r  c                8   t        |      }|sg S t        |       t        |       ;t        j                  d| t        j
                        st        fddD              sg S t        |       j                         }t        |      r|n|}|sg S t        | |      gS )Nz^\s*e\s+per\bc              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z8_build_contextual_homemade_tool_calls.<locals>.<genexpr>4  s     f(x:%fru  )r#  r  r   r   r  )r%  r  r_  rF  r  r  r)  r+  r  r  r  )r  r  last_recipe_nameextracted_queryr  r  s        @rJ  %_build_contextual_homemade_tool_callsr*  4  s    /=	 )J!'*688$gr}}=f6eff	-g6<<>O)F)Wo]mO	%goNOOr  c                t   t        | j                  d      xs d      j                         }t        t	        | j                  d      t               r| j                  d      nd       }t        t	        | j                  d      t               r| j                  d      nd       }t        t	        | j                  d      t               r| j                  d      nd       }t        t	        | j                  d      t               r| j                  d      nd       }| j                  d      }| j                  d      }t        t	        | j                  d	      t               r| j                  d	      nd       }|d
vry |dk(  r|sy |dk7  rt	        |t
        t        f      sy |dv r|s|sy t	        |t
              rt        t        |            nt        t               j                        }	g }
t        |      }|rFt        |      dkD  r$|
j                  ddj                  |              n|
j                  d|        |r|
j                  |rd| nd|        dj                  |
      j                         }d }t	        |t
        t        f      r[t        |      j                         rt        t        |            n-t        t        t        |      d            j                  dd      }|xs	 |dk(  rdnd}|dk(  rHd|	 g}|r|j                  d| d       |j                  d|        ddj                  |      z   dz   S d|	 g}|r|j                  d| d       |r|j                  |       |*|dk7  r%|j                  d | d| j                                ddj                  |      z   dz   S )!Nr  r
  r  r  r  r  r&  r  r  >   r	  r  rH  r	  r	  >   r  rH  r	  r   zsui prodotti r<  sul prodotto zdel fornitore sul fornitore r  r   r  r  r  r  r  zla nota obiettivo r  zcon testo: z#Per essere preciso: vuoi impostare zA. Se e corretto, scrivi CONFERMO. Altrimenti dimmi cosa cambiare.zl'obiettivo zcon target )r  rn  r  r  r  r  r  r  r&  r	  r  r  r  r
  r  r  )r  r  r  r  r  r  r&  r  r  
year_label
scope_bitsr	  scope_labeltarget_labelr  
label_bitss                   rJ  #_build_sales_goal_confirmation_textr3  4  s   IMM+.4"5;;=IIMMRXDY[^9_	f 5eijD)ZXaXeXefvXwy|M})--8H*I  DH  IN(:V_VcVcdsVtvyKz)G  AE  FM&zR[R_R_`mRnpsGty}}]'Cz~K== D]]8$F%ZPYP]P]^jPkmpEqimmL&Aw{|JEEF;F:fsEl#C99=Tb#-dC#8SYcBTBVB[B[>\JJ+M:M}!dii.F-GHIm_=>}N>*:;TbcqbrRst((:&,,.KL&3,'+0=+C+C+Es3v;'3uUZ[aUbdeOfKgKoKopsuxKyGh!6#JDF*:,78
$qk*K}564sxx
7KK  OR  R  	R -.JAdV1+&+&I$7K~Qtf=CCEF0388J3GG  KN  N  Nr  c                   t        |      }t        j                  |j                               ry t	        |      ry t        |      st        |||      sy t        |||      }t        |j                  d      xs d      j                         }t        |j                  d      t        t        f      }t        t        t        |j                  d      t              r|j                  d      nd             xsD t        t        t        |j                  d      t              r|j                  d      nd             }|j                  d      dk(  ry |dvry	|d
k(  r<t        t        |j                  d      t              r|j                  d      nd       sy|d
k7  r|sy|dv r|sy|dv rt        |       5 }	t!        |	t        t        |j                  d      t              r|j                  d      nd       t        t        |j                  d      t              r|j                  d      nd       t        t        |j                  d      t              r|j                  d      nd             }
d d d        
rdj#                  d |
D              }d| dS t%        |      }|rt        |||      r|S y # 1 sw Y   FxY w)Nr  r
  r  r  r  r  r	  >   r	  r  rH  r	  zaPer impostare bene l'obiettivo dimmi se va misurato in quantita, litri oppure se e solo una nota.r	  r  zQPer salvare una nota obiettivo dimmi anche il testo completo che vuoi registrare.zAPer impostare bene l'obiettivo mi serve anche il target numerico.>   r  rH  r	  z]Per impostare bene l'obiettivo indicami almeno il prodotto oppure il fornitore da monitorare.>   r  r	  r  r	  r<  c              3  D   K   | ]  }|d     d|d    d|d    d  ywr	  r  r	  s     rJ  rK  z8_build_sales_goal_write_clarification.<locals>.<genexpr>D5  s;       \`4'(4
+;*<BtO?T>UUVW r	  r	  r	  )r  _CONFIRMATION_PATTERNr  r  rQ  rP  r  r  r  rn  r  r  r  r  r  r#  r	  r  r3  )r  r  r  r  r  r  r  
has_target	has_scoper"  r 
  r  confirmation_texts                rJ  %_build_sales_goal_write_clarificationr:  5  s    !)J""7==?3":.(48ghoq}  @L  9M.wlSFFJJ{+1r288:IFJJx03,?J)TZT^T^_nToqtIu&**_*E{  A  B   FJZ

ScHdfi=jVZZ(89ptuFI zz+(*EErF#7U_`f`j`jkx`y{~U

=8Q  FJ  $KbF:R99)n--%g. 	*!E3T^_e_i_ijz_{  ~A  UBFJJ?O4P  HL   M2R\]c]g]ghw]xz}R~6::o3N  EI  J(<fpqwq{q{  }V  rW  Y\  g]VZZHa=b  cg  )h	"	 ii  dv  G5) ee <FCLWVbdpq  +	 	s   6B;J66J?c           	     R   t        |      }t        |      }t        |j                  d      t              r|j                  d      ni }|s|sg S t        |       }t        |      }t        |       }t        |       }	t        |      dk  rt        |	      dk  rg S t        | |      r:t        | t        |t        |             d|v xs d|v       fD 
cg c]  }
|
|
 c}
S t        j                  d|      sg S t        ||      xs t        d |dd  D              }|rd	}|sg S t        |      }|r|d
   d
   |d
   d
   n
t!        |      }|6t#        |j                  d            xs t#        |j                  d            }t        |      xs t%        |j                  d      xs d      }t%        |j                  d      xs d      j'                         xs t        ||      }t)        |j                  d            xs
 d|v xs d|v }t        | ||||      }|g S |gS c c}
w )Nr:  r   r@  rP  )r5  r6  z\b(?:tra|oppure|o|vs|versus)\bc           	   3     K   | ]A  }|j                  d       dk(  r+dt        t        |j                  d      xs d            v  C yw)r  r  zconfronto storicor  r
  N)rn  r  r  r	  s     rJ  rK  zC_build_contextual_purchase_comparison_tool_calls.<locals>.<genexpr>t5  sH      l88F{* 	s488I3F3L"/MNNls   AA	Tr   r0  r2  r  r
  r5  r6  r  )r  rS  r  rn  r  r  r  rB  r  rD  r  rV  r  rF  r3  r)  r  r  r  r  r  )r  r  r  r  r  r  r  r  r2  r  rm  previous_is_comparisonprevious_periodsrn  previous_queryr5  r6  comparison_tool_calls                     rJ  0_build_contextual_purchase_comparison_tool_callsrB  T5  s   
 -\:(6E2<UYY|=TVZ2[uyy.ac%5	(1)*;<(1G$W-E
7|aCJN	&w0BC 59:LNefmNno*-1C*C*i|WiGi

 $ 

 
	
 9968JK	<=NPcd hk l %l i
 !%!	12CD.>CSTUCVWXCYCe$Q'*  lC  DU  lVM-.>.B.B>.RS  UWlm}  nB  nB  CS  nT  XU,->?k3GWG[G[\cGdGjhjCkN%)),7=2>DDF  JJdex  {I  KJJ 0 4 45K LM  SQTXkQk  So{  @S  pS?#%1 #	 !!S

s   H$c                   t        | |      ryt        |       }t        |       }t        t	        |      t        |      xs t        |      t        | |      t        | |      t        | |      t        |      t        |      t        |      t        |      xs t        |      t        |      t!        |      t#        |xr t%        | ||            t%        | ||      f      S r	  )r  r  r  r)  r  r5  r4  r  r   r  r  r  r  rQ  rP  r^  rT  r  rW  r  s       rJ  %_has_explicit_non_fiscal_spend_domainrD  5  s    4*73M*73M!*-+J7d;XYc;dWj1!':6 *5(4(4,Z8'
3_7ST^7_'
3(4Z#6w
M#Z[]C	
 r  c                D   t        |       }t        | |      rg S t        | |      rg S t        |       s|j	                  d      sg S t        |      }t        |      }t        |      xs! t        |j                  d      xs d      dk(  }|sg S t        |       }|rt        |      rg S t        |       }d }	d }
|&|d   j                         }	|d   j                         }
t        |       }t        |       }t!        |       }|s|xs' t#        |j                  d            xs t        |      }|xs' t%        |j                  d            xs t!        |      }|	6|
4t'        |j                  d	            }	t'        |j                  d
            }
t)        | ||||	|
      gS )N)r^  zda rF  zdalla r0  r
  r3  r   r   r<  r@  rC  rD  r  year_overridemonth_overridestart_date_overrideend_date_override)r  r  rD  r_  r  rS  r  r  r  rn  r  rP  r  r/  r\  r  r  r  r"  r$  rS  )r  r  r  r  r  previous_fiscal_messageprevious_was_fiscal_spendcurrent_queryr
  r)  r*  r  r&  r'  s                 rJ  )_build_contextual_fiscal_spend_tool_callsrN  5  s   
 )1);<	,W6HI	$W-1C1N1NOn1o	(6EB<P $%< = zUYY{E[Ea_aAbfzAz$	/8M?N	.w7J!JH],,.
a=**,;GDO"7+D$W-E  A,UYY7J-KL  APgh  QA  F/		:N0OP  FTl  nE  UF("22599=V3WXJ0;R1STH 	&(  *&	
	 	r  c           
     *  () t        |       (t        (      rt        ddt        |       i      gS t	        | |      }|r|S t        | ||      }|r|S t        | ||      }|r|S t        | |      }|r|S t        | ||      }|r|S t        | ||      }|r|S t        | ||      }	|	r|	S t        | ||      }
|
r|
S t        | ||      }|r|S t        |      }|j                  d      rEt        (      r:t!        |j                  d      xs d      j#                         }t%        | |      gS t'        |      }|rRt)        |       st+        (      st-        (fdd	D              r(t/        |      }t/        |       }t%        | |xs |      gS t1        | |      }|r|S t3        |      }|sg S t        |      )t5        |      xs t!        |j                  d
      xs d      }t5        |       j#                         }t7        |       j#                         }t!        |j                  d
      xs d      j#                         }t9        |j                  d            }t;        |j                  d            }t=        |j                  d            }t=        |j                  d            }t!        |j                  d      xs d      j#                         }t?        |      rd}|xs tA        |      }tC        |      }tE        |j                  d            xs tG        )      }|xr7 t)        |       xs* tI        (dddd      xs d(v xs d(v xs dd( v xs d(v }|r |r|rtK        | tM        |       xs ||      gS |rt)        |       r|rtO        ||      gS tQ        |)      rt)        |       r|rtS        |       gS tU        (      r|}|rt        d|tV        d      gS |rAtY        (      s!t[        (      st]        (      st_        (      rt        d|tV        d      gS ta        (      r?|xs |xs |}|r3t        d|tc        |       xs |te        |       xs |||tV        d      gS tg        (|      rpt!        |j                  d
      xs d      j#                         }ti        |      rdn|xs tk        |      xs tm        |      } | rt        d| ||||tV        d      gS to        (      rBt!        |j                  d
      xs d      xs tm        |      } | rt        d| tV        d      gS tq        (      rt-        )fdtr        D              rtc        |       xs' t9        |j                  d            xs tc        |      }!te        |       xs' t;        |j                  d            xs te        |      }"ti        |      rdn|}#ti        |      rdn|}$|$s|#n|$}t=        |j                  d            }%t=        |j                  d            }&t        d ||!|"|%|&tV        d      gS t)        |       sg S |sg S d!)v sd")v rt        d|!tV        d#      gS tI        )d$      rt        d%|!"tV        d&      gS tu        |)|xs |      rZ|}'|rA||k7  r<t_        (      stw        |jy                               d'k  r| d| j#                         }'t        d|'tV        d      gS tI        )d(d)      rt        d|!tV        d#      gS g S )*Nr2   r&  r
  r.  r/  r
  r  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z/_build_contextual_tool_calls.<locals>.<genexpr>6  s     v(x--vru  )r   r  rc  rN  r  rk   r
  r;  r?  rA  rB  rY  r   r   r   r   r  r  r  r  r  r  r  r  r  r
  r  c              3  &   K   | ]  }|v  
 y wrD  r  )rH  r  r  s     rJ  rK  z/_build_contextual_tool_calls.<locals>.<genexpr>6  s        AAdkL_A_  AAru  r  r,  r-  r  r&  r  r$  r  rA  r   rw   r   )=r  rQ  r  r  /_build_contextual_reservation_create_tool_callsrN  rB  r  r  r  r  r!  r  rS  rn  r  r  r  rG  r  r_  r  r)  )_extract_homemade_stock_consumption_queryr*  r  r  r  r  r"  r$  r  r  r  r  r  rw  rH  r  r  r   rO  r  r  rK  rL  rM  rJ  rH  r  r  r  rP  r  r  ra  r`  rC  rW  r  r  )*r  r  r  reservation_tool_callsfiscal_spend_tool_callspurchase_comparison_tool_callstips_tool_callstimeclock_tool_callspack_size_tool_callsproduct_tool_callssales_goal_read_tool_callssales_goal_tool_callsr  r  +previous_homemade_stock_consumption_messagerM  homemade_tool_callsr  r@  current_inventory_queryr  r  r  state_purchase_start_datestate_purchase_end_dater  r  &previous_inventory_consumption_messageprevious_estimation_contextestimation_followuprY  state_querypurchase_overview_queryr&  r'  previous_specific_querycurrent_specific_queryr)  r*  search_queryr  r  s*                                           @@rJ  ru  ru  5  sD   
 )1"#56%66KabiKjBklmmLWVbc%%GQ]_kl&&%UV]_kmy%z"%--7NOA'<Yef##A'<Yef##CG\[gh!!!MgWceq!r!))I'S_amn$$(6Eyy89>YZl>meii(PQWUWX^^`;GTcdee2deq2r/2 )12DEv>uvvCDopA'J7,?
 	
 @V"",\:	)*;<,->?i3uyyQaGbGhfhCiN+G4::<M6w?EEGuyy)9:@bAGGI/		/0JK1%))<L2MN 9%))DY:Z [7		BU8VWeii8>B?EEG)*=> 0_4QR^4_-Z[g-h*"&uyy1X'Y"Z  #`  _K  L_  _`5  ) 	5$%78XW_`	5))	5 **	5 Q1233		5
 "44  #'> >NwWr[r"
 	
 .2J72SXo266
 	
 .0CDIabiIj  pG*7344*+=>.*(5@PQ   !34'(:;,-?@/0 &$:EUV
 	
 !!34'Q+?Q>1!0 7 @ WDW!9'!B!ZFZ&?$;!1
  33E|T%))$45;<BBD 3;? #k ,L9	#k >]]i=j	 	 
 #0!8 3!5&?$;!1
  ,,>?"%eii0@&A&GR"H"yLklxLy"0!8!1  %%78S  AAo  AA  >A&w/  S3HSbIc3d  Sh  AR  iS(1  X5KEIIVfLg5h  X  mE  FW  mX(KN(["ao'J='Y_l9O1Uk.uyy9N/OP
,UYY7J-KL+, "", (-

 	
 $G,		,,CV0V-$14JZ[
 	
 !!4h?+$14%Zjk
 	
 ,.A>CbUbc$n=01S9L9L9N5OST5T,-Q}o>DDFL&$0;KL
 	
 !!4gxH,$14JZ[
 	
 Ir  c                R   h d|rt        fd|D              ryt        |      s!t        |      st        |      st	        |      rt        |      S t        d |D              ryt        d |D              ryt        d |D              ryt        d |D              ryt        d |D              ryt        d	 |D              r8t        |      s,t        |      s!t        |      st        |      st        |      ryt        | |      ryt        | |      ryt        d
 |D              S )N>   r  r  r  r  r  c              3  :   K   | ]  }|j                   v   y wrD  r"  )rH  rm  purchase_read_toolss     rJ  rK  z2_home_requires_direct_guardrail.<locals>.<genexpr>6  s      j93F!F j   Tc              3  8   K   | ]  }|j                   d v   yw)>   r  rh  Nr"  r#  s     rJ  rK  z2_home_requires_direct_guardrail.<locals>.<genexpr>6  s     
mi9>>II
mr  c              3  8   K   | ]  }|j                   d v   yw)r  Nr"  r#  s     rJ  rK  z2_home_requires_direct_guardrail.<locals>.<genexpr>6  s     
sT]9>>OO
sr  c              3  :   K   | ]  }|j                   d k(    ywr!  r"  r#  s     rJ  rK  z2_home_requires_direct_guardrail.<locals>.<genexpr>6  s     
X9>>44
Xr$  c              3  :   K   | ]  }|j                   d k(    yw)re  Nr"  r#  s     rJ  rK  z2_home_requires_direct_guardrail.<locals>.<genexpr>6  s     
\Y9>>88
\r$  c              3  :   K   | ]  }|j                   d k(    yw)rg  Nr"  r#  s     rJ  rK  z2_home_requires_direct_guardrail.<locals>.<genexpr>6  s     
SI9>>//
Sr$  c              3  :   K   | ]  }|j                   d k(    ywr  Nr"  r#  s     rJ  rK  z2_home_requires_direct_guardrail.<locals>.<genexpr>6       
R99>>..
Rr$  c              3  8   K   | ]  }|j                   d v   yw)>   r1   r3   r4   r5   r6   r8   r:   Nr"  r#  s     rJ  rK  z2_home_requires_direct_guardrail.<locals>.<genexpr>
7  s(        	
		
r  )r	  rF  ra  r`  rH  r  r)  r  rJ  rK  rL  rM  r  rI  )r  r  rw  rm  s      @rJ  _home_requires_direct_guardrailrx  6  s   
 S jXi jj)*5/
;(4$Z0%&&

m[l
mm

sar
ss

XFW
XX

\J[
\\

SAR
SS

R@Q
RR+J7Z(#J/'
3,Z8$Wj9(*=  +  r  c                    h dt        |      r t        | |      rt        fd|D              S t        d |D              ryt        d |D              ryt        | |      ryt        fd|D              ryy)N>   r1   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   c              3  B   K   | ]  }|j                   d hz
  v   ywr(  r"  rH  rm  write_toolss     rJ  rK  z7_home_requires_hard_direct_execution.<locals>.<genexpr>,7  s$     }^g9>>k5W4X&XY}r	  c              3     K   | ]F  }|j                   d k(  xr1 t        t        |j                  j	                  d      xs d             H ywrg  r  r
  Nr&  r#  s     rJ  rK  z7_home_requires_hard_direct_execution.<locals>.<genexpr>-7  sN       	,,w1LSQZQdQdQhQhinQoQusuMv1ww   AATc              3  :   K   | ]  }|j                   d k(    yw)r2   Nr"  r#  s     rJ  rK  z7_home_requires_hard_direct_execution.<locals>.<genexpr>27  rv  r$  c              3  :   K   | ]  }|j                   v   y wrD  r"  r{  s     rJ  rK  z7_home_requires_hard_direct_execution.<locals>.<genexpr>67  s     
LY9>>[(
Lrn  F)r^  rQ  r)  r  )r  r  rw  r|  s      @rJ  $_home_requires_hard_direct_executionr  7  s    
K #:.3XY`bl3m}k|}}}
 *  

R@Q
RR$Wj9

L:K
LLr  c               :   t              ryt        | |      ry|rt        d |D              ryt        |       ryt	        fdt
        D              ryt        |      r7t	        fdt
        D              rt        j                               dk  }|ryy)NTFc              3  :   K   | ]  }|j                   d k(    yw)r  Nr"  r#  s     rJ  rK  z2_should_prefer_planner_for_home.<locals>.<genexpr>G7  s     $yV_Y^^7Q%Q$yr$  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z2_should_prefer_planner_for_home.<locals>.<genexpr>L7  rB  ru  c              3  8   K   | ]  }|t              v   y wrD  rk  )rH  r  r  s     rJ  rK  z2_should_prefer_planner_for_home.<locals>.<genexpr>P7  s     _7OI$>>_s   r   )	r  r  r	  r  r)  rC  r  r  r  )r  r  r  rx  rw  short_followupr  s    `    @rJ  _should_prefer_planner_for_homer  ;7  s     !,+GZARS$ycx$y!y *5

A0@
AA$\2IS_N^__Z--/0A5r  c           
     2    d| v xr t        | ddddddd      S )	Nr   r  rc  r  r  segnar  appuntar  rx  s    rJ  _is_reservation_create_requestr  W7  s4    z! 	&?	' 	r  c                f   t        |       }t        |       }t        |       }t        |       }t	        |       }t        |       }|||||j                         nd t        |      dk(  rt        |d         nd |d}|j                         D 	ci c]  \  }}	|		||	 }
}}	t        d|
      S c c}	}w )Nr   r   )rZ  r[  r\  r]  r^  r`  r5   r
  )r  r  r  r  r  r  r/  r  r  rL  r  )r  rZ  r[  r\  r]  time_candidatesr`  r  rF  r  filtered_argumentss              rJ  #_build_reservation_create_tool_callr  d7  s    6w?M,W5N,W5N-g6-g6O*73F&((<L<X,668^b;>;OST;TmOA$67Z^$I 8A7H^eEL]#u*^^ 4@RSS _s   
B-B-c                l   t        |       }t        |      sy t        |       }t        |      dk  ry g }|D ])  }|j	                  d      }||vs|j                  |       + t        |      dk  ry t        |      dk(  rdj                  |d d       ndj                  |d d       d|d    z   }d| dS )	Nr   r  r   r  r<  r  z Vedo piu orari nella richiesta: z-. Dimmi quale devo usare per la prenotazione.)r  r  r  r  r  r  r  )r  r  r  rendered_timesr	  r  joined_timess          rJ  '_build_reservation_create_clarificationr  w7  s     )J)*5-g6O
?q  "N$ ,	%%g.>)!!(+, >a585HA5M5::nRa01SWS\S\]klomo]pSqvy  {I  JL  {M  zN  uO  TOL-l^;hiir  c                    t        |       }t        |       t        |       t        |       t	        |       t        |       |d}t        |      dk(  r|d   |d<   |S )N)rZ  r[  r\  r]  r`  r  r   r   r^  )r  r  r  r  r  r  r  )r  r  r  s      rJ  "_parse_reservation_create_fragmentr  7  sa    -g6O;GD1':1':27;/8*"G ?q  / 2Nr  c                J   t        |       }t        |      ryt        |      }|rt        t        |            ryt        |dd        D ]X  }|j	                  d      dk7  rt        t        |j	                  d      xs d            t        fdt        D              sX y y)	NTr"  r  r  r  r
  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  zD_conversation_suggests_pending_reservation_create.<locals>.<genexpr>7  s     O4twOru  F)r  r  r  r  rn  r  r)  #_RESERVATION_CREATE_ASSISTANT_HINTS)r  r  r  r  ro  r  s        @rJ  1_conversation_suggests_pending_reservation_creater  7  s     )J%j1$\2I3OI4NObc*+ 88F{*!#dhhy&9&?R"@AO+NOO r  c           
        t        | |      sg S g }|dd  D ]M  }|j                  d      dk7  r|j                  t        t	        |j                  d      xs d                   O t        |       }|j                  |       t        |j                  d      xs g       dkD  rg S i }d }|D ]G  }dD ]  }|j                  |      }	|	|	||<    t        |j                  d	      t              sC|d	   }I |||d	<   i }
|j                         D ]M  \  }}	t        |	t              r|	j                         |
|<   *t        |	t              rt        |	      |
|<   I|	|
|<   O |
sg S t        d
|
      gS )Nr"  r  r  r  r
  r  r   )rZ  r[  r\  r]  r`  r^  r5   r
  )r  rn  r  r  r  r  r  r
   rL  r   r/  r  r  )r  r  	fragmentsro  current_fragmentr  latest_single_timert  rF  r  r  s              rJ  rS  rS  7  s   <WlS	)+IRS! ]88Fv%;C@S@YWY<Z[\] :'B%&
 128b9A=	 "F&* 8f 	$CLL%E #s	$ hll<0$7!),!78 %1|,.lln ,
UeT"&+oo&7s#t$&3E&:s#&+s#, 	!5ASTUUr  c           	     6    t        dt        | |d| i            S )Nrd  r  r
  )r  rF  r  s     rJ  r  r  7  s$    $5gzLZaKbc r  r  c               ^   t        |       t        |       }t        |       xs |}t        |       xs |}d }dv rd}nt	        d      rd}n|dv r|}g }|r|j                  dt        |       d       |$|j                  d|j                          d       n7|||j                  d|dd	|d
d       n||j                  d|dd       t        |       }	t              xs t              }
t        |	      D cg c]  }|r
|t        vr| }}|rb|d d D ]%  }t        |      }|j                  d| d| d       ' |rdj                  |      nd}d| dt         }t        d|t        d      S t!        fddD              xs dv xr t	        ddd      }|rdj                  |      nd}t#              r d| dt         }t        d|t        d      S |s|
r d| dt         }t        d|t        d      S d| d t         }t        d|t        d      S c c}w )!Nr   r  >   r  r   zruns.area = 'r  zruns.tip_date = 'zsubstr(runs.tip_date, 1, 7) = 'r~  rw  r  zsubstr(runs.tip_date, 1, 4) = 'r   z"(lower(entries.staff_name) LIKE '%z)%' OR lower(entries.staff_lookup) LIKE '%r  r  1 = 1a  SELECT entries.staff_name AS staff_name, runs.area AS area, COUNT(DISTINCT runs.id) AS tip_days, ROUND(SUM(COALESCE(entries.amount_today, 0)), 2) AS total_assigned_amount, ROUND(SUM(COALESCE(entries.historical_amount, 0)), 2) AS total_loaded_history_amount, ROUND(SUM(COALESCE(entries.total_amount, 0)), 2) AS total_visible_amount FROM tips_run_entries AS entries JOIN tips_runs AS runs ON runs.id = entries.run_id WHERE z GROUP BY lower(entries.staff_lookup), entries.staff_name, runs.area ORDER BY total_visible_amount DESC, lower(entries.staff_name) ASC LIMIT rg  r  r
  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z(_build_tips_tool_call.<locals>.<genexpr>8  s     mVFj0mru  )rc  r  rh	  r  r  rY   r  u   piùa  SELECT runs.area AS area, COUNT(DISTINCT runs.id) AS tip_days, ROUND(SUM(COALESCE(runs.total_tip_amount, 0)), 2) AS total_tip_amount_sum, ROUND(SUM(COALESCE(runs.tip_pos_amount, 0)), 2) AS total_pos_amount_sum, ROUND(SUM(COALESCE(runs.tip_pos_effective_amount, 0)), 2) AS total_pos_effective_amount_sum, ROUND(SUM(COALESCE(runs.historical_total_amount, 0)), 2) AS total_loaded_history_amount_sum, ROUND(SUM(COALESCE(runs.payable_total_amount, 0)), 2) AS total_payable_amount_sum FROM tips_runs AS runs WHERE zW GROUP BY runs.area ORDER BY total_payable_amount_sum DESC, lower(runs.area) ASC LIMIT a  SELECT runs.tip_date AS tip_date, runs.area AS area, ROUND(runs.total_tip_amount, 2) AS total_tip_amount, ROUND(runs.tip_pos_amount, 2) AS tip_pos_amount, ROUND(runs.tip_pos_effective_amount, 2) AS tip_pos_effective_amount, ROUND(runs.historical_total_amount, 2) AS total_loaded_history_amount, ROUND(runs.payable_total_amount, 2) AS total_payable_amount, runs.present_staff_count AS present_staff_count FROM tips_runs AS runs WHERE z9 ORDER BY runs.tip_date DESC, runs.updated_at DESC LIMIT )r  r  r  r  rw  r  r  r/  r  r  r  r  r  r  r  r  r)  r  )r  r  rn  r  rZ  tip_year	tip_monthrL  r  person_querystaff_breakdown_requestedr  person_tokensr  r  r  ranking_requestedr  s                    @rJ  rM  rM  7  s    !)J!'*H&w/@=H(1C^ID	":u	5	/	)JM*=d*C)DAFG-h.@.@.B-C1EF		)"7;HS>9UX/YZ[\		;HS>KL&w/L @ L sPghrPs %\2U"CC 	M 
 "2A& 	E/6M44A? C99F H	 1;GLL,		 K   &&( 	 $6#XhBijjm?lmm *\!::ueU[!\  -7Z(GIj)	 K   &&( 	 $6#XhBijj5	 K   &&( 	 $6#XhBijj
	  !"	$   2cTd>effos   H*)r  r)  r*  c                   |xs t        |       j                         }|#|!t        |       }||}t        |       }||\  }}t	        d|||j                         nd ||j                         nd t        d      S )Nre  )r  r)  r*  r  r
  )r  r  r  r  r  r/  r  )r  r  r)  r*  r  r  r
  s          rJ  r  r  V8  s     @7@GGIEh..w7$$H27;
!#- J(4>4J*..0PT080D**,$%	
 r  c           
        t        |       }t        |      rt        |       S t        |      r t	        |       }d| }t        d||d      S t        |       }t        |       }|s|dt         }t        d|t        d      S t        |      D cg c]  }|r
|t        vr| }}d }||\  }}	|D cg c]	  }||	vs| }}|s	||r|gng }g }
g }|d d D ]C  }t        |      }|
j                  d| d| d	| d
       |j                  d| d| d| d
       E |
rdj                  |
      nd}|rdj                  |      nd}d}d}d}|t        |      }| d}d| d}d}|
r(|&d| d| d| dt         }t        d|t        d      S d| d| d| | dt         	}t        d|t        d      S c c}w c c}w )Na  SELECT 1 AS inventory_rank_result, product_name, supplier_name, ROUND(SUM(total_equivalent_units), 3) AS total_equivalent_units, GROUP_CONCAT(warehouse_name || ': ' || RTRIM(RTRIM(printf('%.3f', total_equivalent_units), '0'), '.'), ' | ') AS warehouse_breakdown, GROUP_CONCAT(DISTINCT inventory_date) AS inventory_dates, GROUP_CONCAT(DISTINCT inventory_source) AS inventory_source FROM inventory_latest_items GROUP BY product_name, supplier_name ORDER BY total_equivalent_units DESC, lower(supplier_name) ASC, lower(product_name) ASC LIMIT rg  r  r
  aA  SELECT warehouse_name, latest_inventory_date, latest_inventory_created_by_name, latest_inventory_created_at, latest_inventory_total_products, latest_inventory_total_equivalent_units, product_count, current_total_equivalent_units, inventory_session_count FROM inventory_warehouses ORDER BY lower(warehouse_name) ASC LIMIT r   r  r  z#%' OR lower(warehouse_name) LIKE '%r  z,(lower(COALESCE(p.product_name, '')) LIKE '%z2%' OR lower(COALESCE(p.supplier_name, '')) LIKE '%z-%' OR lower(COALESCE(p.lot_code, '')) LIKE '%r  r  r
  zXORDER BY total_equivalent_units DESC, lower(supplier_name) ASC, lower(product_name) ASC z AS threshold_units, z%HAVING SUM(total_equivalent_units) < r  zWORDER BY total_equivalent_units ASC, lower(supplier_name) ASC, lower(product_name) ASC zWITH catalog_matches AS (SELECT p.id AS product_id, p.product_name AS product_name, p.supplier_name AS supplier_name, GROUP_CONCAT(DISTINCT p.lot_code) AS catalog_lot_codes FROM ordini_products AS p WHERE a   GROUP BY p.id, p.product_name, p.supplier_name), stock_totals AS (SELECT product_id, product_name, supplier_name, ROUND(SUM(total_equivalent_units), 3) AS total_equivalent_units, GROUP_CONCAT(warehouse_name || ': ' || RTRIM(RTRIM(printf('%.3f', total_equivalent_units), '0'), '.'), ' | ') AS warehouse_breakdown, GROUP_CONCAT(DISTINCT inventory_date) AS inventory_dates, GROUP_CONCAT(DISTINCT inventory_source) AS inventory_source, 0 AS catalog_only, '' AS catalog_lot_codes FROM inventory_latest_items WHERE (a1  ) OR product_id IN (SELECT product_id FROM catalog_matches WHERE product_id IS NOT NULL) GROUP BY product_id, product_name, supplier_name), combined AS (SELECT product_id, product_name, supplier_name, total_equivalent_units, warehouse_breakdown, inventory_dates, inventory_source, catalog_only, catalog_lot_codes FROM stock_totals UNION ALL SELECT c.product_id, c.product_name, c.supplier_name, 0 AS total_equivalent_units, '' AS warehouse_breakdown, '' AS inventory_dates, 'catalog_only' AS inventory_source, 1 AS catalog_only, COALESCE(c.catalog_lot_codes, '') AS catalog_lot_codes FROM catalog_matches AS c WHERE NOT EXISTS (SELECT 1 FROM stock_totals AS s WHERE (s.product_id IS NOT NULL AND c.product_id IS NOT NULL AND s.product_id = c.product_id) OR (lower(s.product_name) = lower(c.product_name) AND lower(s.supplier_name) = lower(c.supplier_name)))) SELECT product_name, supplier_name, ROUND(SUM(total_equivalent_units), 3) AS total_equivalent_units, MAX(catalog_only) AS catalog_only, GROUP_CONCAT(DISTINCT NULLIF(catalog_lot_codes, '')) AS catalog_lot_codes, GROUP_CONCAT(NULLIF(warehouse_breakdown, ''), ' | ') AS warehouse_breakdown, GROUP_CONCAT(DISTINCT NULLIF(inventory_dates, '')) AS inventory_dates, GROUP_CONCAT(DISTINCT inventory_source) AS inventory_source FROM combined GROUP BY product_name, supplier_name zLIMIT zeSELECT product_name, supplier_name, ROUND(SUM(total_equivalent_units), 3) AS total_equivalent_units, a  GROUP_CONCAT(warehouse_name || ': ' || RTRIM(RTRIM(printf('%.3f', total_equivalent_units), '0'), '.'), ' | ') AS warehouse_breakdown, GROUP_CONCAT(DISTINCT inventory_date) AS inventory_dates, GROUP_CONCAT(DISTINCT inventory_source) AS inventory_source FROM inventory_latest_items WHERE z& GROUP BY product_name, supplier_name )r  r  r  rl  rp  r  r  rN  r  r  r\  r  r  r  r  )r  r  r  r  inventory_querythreshold_matchr  r  threshold_valuer`  r  product_conditionsr  r  product_where_sqlthreshold_select_sql
having_sql	order_sqlthreshold_sqls                      rJ  rO  rO  p8  s   (1#$67099$%784W= "N$ 	 $6#XdBeff.w7O8AO6 &&( 	 $6#XhBijj %_5U"AA 	F 
 %)O",;))%+MEu<L/L%MM&5&=//"WYJ$& 
+E2**7 9..;_ =//<o >	
 	!!::G I>>K_ M99F H	

  -7Z(GI<N%78T[JjI"3OD"/0EF<]O1M
m	o- '' (  [ #!4H k%&w;( 	| $6#XhBijj	L  
 	  0,+
!"	$    2cTd>effq Ns   F93	F>=F>rF  c                  t        |       }||n
t        |       }||n
t        |       }t        |       }	|xs t	        |       j                         }
t        |
      D cg c]  }|r|t        vr|dvr| c}d d }d}g }|	R|j                  | d|	d   j                          d       |j                  | d|	d   j                          d       n |\|Zt        ||      \  }}|j                  | d|j                          d       |j                  | d|j                          d       n|1|j                  | d|d	d
       |j                  | d|d	d       no|mt               }t        |j                  |      \  }}|j                  | d|j                          d       |j                  | d|j                          d       ddg}|j                  |       |9|7| dt        |       d| dt        |       dg}ddg}|j                  |       dj                  |      }|rog }g }|D ]C  }t        |      }|j                  t!        ||             |j                  t#        ||             E dj                  |      }dj                  |      }nd}d}t        |
      }t%        |xs d      j                         }|	*|	d   j                          d|	d   j                          }n6|4|2t        ||      \  }}|j                          d|j                          }d| d| d| d| dt        |       d}t'        d|dd      S c c}w )N>	   r  r  r  r  r  fiscalefiscalir  r  r   zHdate(COALESCE(NULLIF(d.document_date, ''), substr(d.created_at, 1, 10)))z >= 'r   r  z <= 'r   r~  z-01-01'z-12-31'zd.status = 'ready'zd.total_amount IS NOT NULLr  r  r
  r  zKWITH base_documents AS (SELECT d.* FROM tenant_fiscal_documents AS d WHERE z@), document_matches AS (SELECT * FROM base_documents AS d WHERE a  ), line_matches AS (SELECT d.id AS document_id, d.display_name, d.document_type, d.document_date, d.supplier_name, i.description, i.line_total, i.vat_code, CASE WHEN i.line_total IS NULL THEN NULL ELSE i.line_total * (1 + COALESCE(NULLIF(CAST(i.vat_code AS REAL), 0), 22) / 100.0) END AS line_total_including_vat FROM base_documents AS d JOIN tenant_fiscal_document_items AS i ON i.document_id = d.id WHERE z
) SELECT 'z' AS query, 'a  ' AS period, CASE WHEN (SELECT COUNT(*) FROM document_matches) > 0 THEN 'document_total_vat_included' ELSE 'line_total_vat_included_from_rows' END AS calculation_basis, CASE WHEN (SELECT COUNT(*) FROM document_matches) > 0 THEN (SELECT COUNT(*) FROM document_matches) ELSE (SELECT COUNT(DISTINCT document_id) FROM line_matches) END AS document_count, CASE WHEN (SELECT COUNT(*) FROM document_matches) > 0 THEN ROUND((SELECT SUM(total_amount) FROM document_matches), 2) ELSE ROUND((SELECT SUM(line_total_including_vat) FROM line_matches), 2) END AS total_amount_including_vat, CASE WHEN (SELECT COUNT(*) FROM document_matches) > 0 THEN GROUP_CONCAT(display_name, ' | ') ELSE (SELECT GROUP_CONCAT(DISTINCT display_name) FROM line_matches) END AS documents, CASE WHEN (SELECT COUNT(*) FROM document_matches) > 0 THEN GROUP_CONCAT(DISTINCT supplier_name) ELSE (SELECT GROUP_CONCAT(DISTINCT supplier_name) FROM line_matches) END AS suppliers FROM document_matches LIMIT 1rg  r  r
  )r  r  r  r  r  r  r  r(  r  r/  rf  r  r&  r  r  r  r  r  r  r  )r  r  rG  rH  rI  rJ  r  r&  r'  r
  r  r  rU  	date_exprperiod_conditionsr)  r*  r  document_conditionsdocument_wheredocument_token_conditionsline_token_conditionsescapeddocument_match_whereline_match_wherequery_labelr  r  s                               rJ  rS  rS  9  s'    !)J)5=;RSZ;[D,8N>VW^>_E.w7JC:7CJJLE %U+77xx	 	 	q
L [I#%  I;eJqM4K4K4M3Na!PQ  I;eJqM4K4K4M3Na!PQ		e/0u=
H  I;eJ4H4H4J3K1!MN  I;eH4F4F4H3I!KL		  I;eD:W!EF  I;eD:W!EF		"$0UC
H  I;eJ4H4H4J3K1!MN  I;eH4F4F4H3I!KL 	$ 01&+<+Hk23FGHJk23DEFaH

 !(
 	""#45\\"56N$&! "! 	WE)%0G%,,-MeU\-]^!(()EeW)UV	W  '||,EF"<<(=>&"%e,Ktzr?((*L$Q-1134C
18O8O8Q7RS		e/0u=
H$..01X5G5G5I4JK	 	 &&	" ""	= -. /9#	 L  2cTU>VWWMs   Mr  c                   |xs t        |       j                         }t        |      r|nd}t        |       }i }|r||d<   |||d<   t	        d|      S )Nr
  r  r  rf  r
  )r+  r  r  r_  r  )r  r  	raw_queryr  r  r  s         rJ  r  r  9  sc    C#:7#CJJLI6yAIrE-g6M#%I"	' %2	/" 5KKr  c           
     	   t        |       t               }t        j                  d      }|rrt	        dt        t        |j                  d            d            }|t        |dz
        z
  }|j                         |t        d      z   j                         d| dfS t        |       }|t        d      r|t        d      z
  }|<|j                         |t        d      z   j                         |j                         fS t        |       }|U|\  }}|j                         |j                         d|j                          d	|t        d      z
  j                          fS d
v rt        fddD              rIt        |t        d      z
        \  }}|j                         |t        d      z   j                         dfS t        fddD              rIt        |t        d      z         \  }}|j                         |t        d      z   j                         dfS t        |d      \  }}|j                         |t        d      z   j                         dfS dv r=t        fddD              rat        |j                   |j"                  d      \  }	}
t%        |	|
      \  }}|j                         |t        d      z   j                         dfS t        fddD              rat        |j                   |j"                  d      \  }	}
t%        |	|
      \  }}|j                         |t        d      z   j                         dfS t%        |j                   |j"                  d      \  }}|j                         |t        d      z   j                         dfS t'        |       }
t)        |       }	|
{|	xs |j                   }t%        ||
||j                   k(  xr |
|j"                  k(        \  }}|j                         |t        d      z   j                         t+        |
       d| fS |	K|	|j                   k(  r|nt-        |	d d!      }|	d"d#|t        d      z   j                         t/        |	      fS y$)%Nz\bultim\w*\s+(\d{1,3})\s+giornr   m  rq  zultimi  giornir  rF  rG  rs  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z5_homemade_stock_consumption_period.<locals>.<genexpr>9  s       J(x:%  Jru  ry  r   rz  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z5_homemade_stock_consumption_period.<locals>.<genexpr>9  ru  ru  rv  rw  Trk  questa settimanar  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z5_homemade_stock_consumption_period.<locals>.<genexpr>9  s     u(x:%uru  r  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z5_homemade_stock_consumption_period.<locals>.<genexpr>9  r|  ru  r}  r~  rc  r-  r  r5  r  r~  r  )NNztutto lo storico disponibile)r  r  rF  r3  r  r  r  r  r   r/  r  rw  r  r)  ro  rj  r&  r'  rf  r  r  r
  r   r  )r  r  last_days_matchrr  r)  r  r
  r  r*  r&  r'  resolved_yearr  s               @rJ  "_homemade_stock_consumption_periodr  9  s    )J Eii A:NO1c#o33A67=>YD1H55
##%	q0A(A'L'L'NRYZ^Y__fPggg*73M!::v!N	q 11 &&(=9!;L+L*W*W*Y[h[r[r[ttt.w7J$.!
M##%}'>'>'@DI]I]I_H``dfsv  FG  wH  gH  fS  fS  fU  eV  CW  W  	WZ  J  7I  J  J#3EI1<M4M#N J'')Hya7H,H+S+S+UWiiiw6vww#3EI1<M4M#N J'')Hya7H,H+S+S+UWkkk/4P
H##%9!3D(D'O'O'QSeeeu6tuu+EJJRHKD%#4T5#A J'')Hya7H,H+S+S+UWdddh6ghh+EJJQGKD%#4T5#A J'')Hya7H,H+S+S+UWfff0U[[VZ[
H##%9!3D(D'O'O'QS```$W-E"7+D*

0S`didndnSn  THsx  }B  }H  }H  tH   I
H##%9!3D(D'O'O'QVklqVrUsst  vC  uD  TE  E  	E EJJ.5Dr24Fs6"X	q0A%A$L$L$NPSTXPYYY5r  c                T    t        |       }t        |ddd      ryt        |dd      ryy)	N
ristoranteterrazzer   )r~  r  r  club)r  zbar/clubra  r  rw  r  s     rJ  "_homemade_stock_usage_scope_filterr  9  s/     )J \:vN) UF; r  c                @   t        j                  dd| t         j                        }t        j                  dd|t         j                        }t        j                  dd|t         j                        }h d}|j                  t        j                                d}t        |      D cg c]D  r@j                         s0|vr,t        fd|D              st        j                  d	      sF }}dj                  |d d
       j                         S c c}w )Nz!\bultim\w*\s+\d{1,3}\s+giorn\w*\br  r  r  r  >F   var  r`   r  r  rw  r  r  r  r  r   r  r  r  r  r   r  r  r  r  r  r  vannoandareandatiandatocnsumir  r  rc  rd  indicar   r   r   r   r   r%  r&  r'  r(  r   r   ri  rj  scaricor  r;  r   indicamir   r   scarichir  r  r  rs  rt  ru  rv  r  rN  
consumiamor  r  r  r  r  r   r   )r  r  r  indicr  r  r  trovc              3  @   K   | ]  }j                  |        y wrD  r  )rH  r
  r  s     rJ  rK  z<_extract_homemade_stock_consumption_query.<locals>.<genexpr>8:  s     LE$$V,Lr  z\d{1,3}r   )rF  r  r  r  r*  rM  r  r  r)  r'  r  r  )r  r  r  ignored_prefixesr  r  s       ` rJ  rT  rT  9  s    ff93r}}]Gff^S'GGffJCQX`b`m`mnGGNP /..01	 %W-'L;KLLZ/ 	F  88F2AJ%%''s   .A	Dc               P   ||n
t        |       j                         }t        |       \  }}}t        |       \  }}t	               t        d      z
  j                         }|rdt        |       dnd}	|rdt        |       dndt        |       d}
|rdt        |       dnd}dg}|r|j                  d	t        |       d       |r|j                  d
t        |       d       |r t        |      }|j                  d| d       t        |      d d D ]%  }t        |      }|j                  d| d| d       ' dj                  |      }|r| d| n|}t        |      }t        |      }d| d| d|	 d|
 d|	 d|
 d| d| dt         }t        d|t        d      S )Nr   rq  r  zm.first_observed_datezdate('z', '-1 day')z1COALESCE(NULLIF(recipes.usage_scope, ''), 'both')z[(COALESCE(movements.consumed_quantity, 0) > 0 OR COALESCE(movements.added_quantity, 0) > 0)z)substr(movements.occurred_at, 1, 10) >= 'z(substr(movements.occurred_at, 1, 10) < 'z7COALESCE(NULLIF(recipes.usage_scope, ''), 'both') IN ('z
', 'both')r   z3(lower(COALESCE(movements.recipe_name, '')) LIKE '%z:%' OR lower(COALESCE(movements.recipe_lookup, '')) LIKE '%r  r  z, area zWITH movement_summary AS (SELECT movements.recipe_lookup, movements.recipe_name, movements.measurement_unit, COALESCE(NULLIF(recipes.usage_scope, ''), 'both') AS usage_scope, a   AS calculation_scope, COUNT(CASE WHEN COALESCE(movements.consumed_quantity, 0) > 0 THEN 1 END) AS movement_count, COUNT(DISTINCT CASE WHEN COALESCE(movements.consumed_quantity, 0) > 0 THEN substr(movements.occurred_at, 1, 10) END) AS consumption_event_days_count, MIN(substr(movements.occurred_at, 1, 10)) AS first_observed_date, MAX(substr(movements.occurred_at, 1, 10)) AS last_observed_date, MIN(CASE WHEN COALESCE(movements.consumed_quantity, 0) > 0 THEN substr(movements.occurred_at, 1, 10) END) AS first_consumed_date, MAX(CASE WHEN COALESCE(movements.consumed_quantity, 0) > 0 THEN substr(movements.occurred_at, 1, 10) END) AS last_consumed_date, ROUND(SUM(COALESCE(movements.consumed_quantity, 0)), 2) AS consumed_quantity, ROUND(SUM(COALESCE(movements.added_quantity, 0)), 2) AS added_quantity FROM tenant_homemade_stock_movements AS movements LEFT JOIN tenant_homemade_recipes AS recipes ON recipes.id = movements.recipe_id WHERE a   GROUP BY movements.recipe_lookup, movements.recipe_name, movements.measurement_unit, usage_scope, calculation_scope HAVING consumed_quantity > 0), current_stock AS (SELECT recipe_lookup, ROUND(SUM(COALESCE(quantity, 0)), 2) AS current_quantity FROM tenant_homemade_stock_items GROUP BY recipe_lookup), calendar_counts AS (SELECT m.recipe_lookup, COUNT(DISTINCT days.operational_date) AS operational_days_count FROM movement_summary AS m JOIN tenant_homemade_operational_days AS days ON ((m.calculation_scope = 'bar' AND days.usage_scope = 'bar') OR (m.calculation_scope = 'restaurant' AND days.usage_scope = 'restaurant') OR (m.calculation_scope = 'both' AND days.usage_scope IN ('bar', 'restaurant'))) AND days.operational_date >= z AND days.operational_date <= z: GROUP BY m.recipe_lookup), final_summary AS (SELECT m.*, z AS calculation_start_date, a   AS calculation_end_date, COALESCE(cc.operational_days_count, 0) AS operational_days_count, CASE WHEN COALESCE(cc.operational_days_count, 0) > 0 THEN MAX(COALESCE(cc.operational_days_count, 0), m.consumption_event_days_count) ELSE m.consumption_event_days_count END AS workdays_count, CASE WHEN COALESCE(cc.operational_days_count, 0) > 0 THEN 'operational_calendar' ELSE 'movement_days' END AS calculation_basis, COALESCE(c.current_quantity, 0) AS current_quantity FROM movement_summary AS m LEFT JOIN current_stock AS c ON c.recipe_lookup = m.recipe_lookup LEFT JOIN calendar_counts AS cc ON cc.recipe_lookup = m.recipe_lookup ) SELECT 1 AS homemade_consumption_result, 'z' AS period_label, 'a  ' AS query, m.recipe_name, m.usage_scope, m.calculation_scope, m.measurement_unit, m.consumed_quantity, m.added_quantity, m.workdays_count, m.consumption_event_days_count, m.operational_days_count, m.calculation_basis, ROUND(CASE WHEN m.workdays_count > 0 THEN m.consumed_quantity / m.workdays_count ELSE 0 END, 2) AS average_daily_consumption, m.current_quantity, ROUND(CASE WHEN m.consumed_quantity > 0 AND m.workdays_count > 0 THEN m.current_quantity / (m.consumed_quantity / m.workdays_count) ELSE NULL END, 2) AS coverage_days, m.first_observed_date, m.last_observed_date, m.first_consumed_date, m.last_consumed_date, m.calculation_start_date, m.calculation_end_date FROM final_summary AS m ORDER BY m.consumed_quantity DESC, lower(m.recipe_name) ASC LIMIT rg  r  r
  )rT  r  r  r  r  r   r/  r  r  r  r  r  r  )r  r  r  r)  r  r  r  usage_scope_labelcompleted_days_end_datecalculation_start_sqlcalculation_end_sqlcalculation_scope_sqlr  escaped_scoper  r  r  effective_period_label
period_sql	query_sqlr  s                        rJ  rG  rG  >:  sf   -9^?hip?qxxzE.PQX.Y+J|%G%P"K"13iQ6GGRRTFPa 3J ?@BVm  $]34LA$%<=>a@   ,-Q/@  ppJEFYZdFeEffghiDEXYfEgDhhijk+K8STaSbblmn '+ 
%e,AAH	 JFFMY O	

 Z(IL]~W5F4GHco$%;<J#E*I	M !
! "  ( )>'> ?((;'< = !
!!=
   < ; 
 ""w;	$ |  2cTd>effr  c           	     8    d|  d}d|  d}d| d| d| d| d		S )
Nzlower(' ' || COALESCE(z.source_name, '') || ' ')zupper(COALESCE(.category, ''))r  z = 'RUM' OR z LIKE '% rum %' OR z LIKE 'rum %' OR z LIKE '% rhum %')r  )rH  r  r  s      rJ  )_supplier_catalog_rum_candidate_conditionr  :  sT    )%0IJJ 7H* \ \ \ 		r  c           	         d|  d|  d}t         D cg c]  \  }}| dt        |       d }}}ddj                  |      z   dz   S c c}}w )	Nlower(COALESCE(%.source_name, '') || ' ' || COALESCE(r   LIKE '%r  r   OR r=  $_SUPPLIER_CATALOG_JAMAICAN_RUM_RULESr  r  )rH  r  r  _reasoncheckss        rJ  ._supplier_catalog_jamaican_rum_match_conditionr  :  sp    "5')NugUdeJ CE7 ,h259:"=F  V$$s**	s   Ac                    d|  d|  d}t         D cg c]#  \  }}d| dt        |       dt        |       d% }}}dd	j                  |      z   d
z   S c c}}w )Nr  r  r  zWHEN r  z	%' THEN 'r  zCASE r  z ELSE '' ENDr  )rH  r  r  r  casess        rJ  *_supplier_catalog_jamaican_rum_reason_caser  :  s    "5')NugUdeJ BE6 
|8$7$>#?yI\]cIdHeefgE  SXXe_$~55	s   (Ac                    t        |  d|       }t        |dddddddd	d
dd      }t        |dd      }|r|sy ddt        d      t        d      t	        d      dS )Nr  r   r   	jamaicano	jamaicana	jamaicani	jamaicanegiamaica
giamaicano
giamaicana
giamaicani
giamaicaner   rN  sci)r  	attributecandidate_conditionmatch_conditionreason_case)r  rw  r  r  r  )r  r  r  wants_jamaican	wants_rums        rJ  )_extract_supplier_catalog_semantic_filterr  :  s     G9AeW!56J.N **eVDI HOI%PA%H r  c           	        t        |       }t        | |      }|s&t        |       xs t        |       j	                         }t        | |      }||d    d|d    j	                         }t        |      xs t        |      }|sy d"d}|rt        |      ng D cg c]  } |dd|       }}||d   g}n|D cg c]  } |dd	|       }}|D cg c]  } |d
d|       }	}t        |      }
dj                  |      }|r| ddj                  |      z   }dj                  |	      }t        |      }d}d}|/dt        |d          dt        |d          d|d    d|d    d	}d}d|
 d| d| d| d	}|s||d| dz   t        t              z   }n|d|
 d| dt         z   }t        d|t        d !      S c c}w c c}w c c}w )#Nr  r  r	  c                     g }t        |      D ](  }t        |      |j                   fd|D               * ddj                  |      z   dz   S )Nc              3  6   K   | ]  }d  d| d d  yw)r  r  z, '')) LIKE '%r  Nr  )rH  r   rH  r  s     rJ  rK  zU_build_supplier_catalog_lookup_tool_call.<locals>._token_condition.<locals>.<genexpr>:  s.      ! "%&yK!r9  r  r  r=  )r
  r  r  r  )rH  r^  r  column_checksr  r  s   `    @rJ  _token_conditionzB_build_supplier_catalog_lookup_tool_call.<locals>._token_condition:  s\    ,U3 	G)'2G   !%! 	 V[[//#55r  sc)r  catalog_namesource_file_namer
  r  )r  r  r  r  op)r  r  r  r  r  r
  r  z ' AS catalog_semantic_subject, 'z+' AS catalog_semantic_attribute, CASE WHEN r  z& THEN 1 ELSE 0 END AS semantic_match, r  z AS classification_reason, zsemantic_match DESC, z@SELECT 0 AS sort_scope, 'cataloghi_fornitori' AS source_scope, 'z' AS lookup_query, 'z' AS lookup_supplier, a  sci.source_name AS display_name, sci.source_lot_code AS display_lot_code, COALESCE(NULLIF(sci.source_supplier_name, ''), sc.supplier_name) AS display_supplier_name, sci.final_price_vat AS display_price_vat, sci.product_code AS display_product_code, sci.category AS display_category FROM supplier_catalog_items AS sci LEFT JOIN supplier_catalogs AS sc ON sc.id = sci.catalog_id WHERE z	ORDER BY zdisplay_name ASC LIMIT zFUNION ALL SELECT 1 AS sort_scope, 'catalogo_locale' AS source_scope, 'a5  ' AS lookup_query, '' AS lookup_supplier, op.product_name AS display_name, op.lot_code AS display_lot_code, op.supplier_name AS display_supplier_name, op.final_price_vat AS display_price_vat, op.product_code AS display_product_code, NULL AS display_category FROM ordini_products AS op WHERE op.active = 1 AND z1 ORDER BY sort_scope ASC, display_name ASC LIMIT rg  r  r
  )rH  r  r^  ztuple[str, ...]r  r  r  r  )r  r  r  r  r  r  rN  rB  r  r  r  r  r  )r  r	  r  semantic_filterrU  r  r  supplier_token_conditionssupplier_conditionslocal_conditionslookup_querysupplier_wherelocal_wheresupplier_query_sqlsemantic_select_columnssemantic_order_prefixsupplier_selectr  s                     rJ  rU  rU  :  s   =gFN3G^LE'0S4J74SZZ\?OO""9-.a0L/MNTTV4U;[?TUZ?[L6 @N+N;SU! 	TV[\! ! "./DEF &
 U$bdij
 
 " 	\^cd  'u-L\\"56N *+51GLLAZ4[[,,/0K,^< "#OI$>?@ A#OK$@AB C():;<<b}-..IK 	  !8	>-.@-AAW"
#	   		#  4),A+BBY ZZ]`aq]rr ~ '
 (3m 4%&	(
( 	  2cTd>effw!
s   F<9GGc                   t        |       t        |       }t        |       }t        |       }t	        |       }t              rt        |       gS t        |       r&t        |       }t              r|t        |       gS |gS t              rt        |       gS t              rt        |       rt        |       gS t!        |       rt#        |       gS t%        |       rt'        |       gS t)        |       rt+        |       gS t-        |       rt/        |       gS t1        |       rt3        dd      rNt3        dd      rAt5        |       }t7        |      dk\  r(t9        dd|d   d	d
      t9        dd|d	   d	d
      gS t;        fddD              }t=        | |      }||gS t?              r1t              rt9        di       t        |       gS t9        di       gS t              r#tA        |       rtC        |       S t        |       gS tE              rtG        |       S tI              s|ZtK        |       }	tM        |       }
t9        d||	|
||d   jO                         nd ||d	   jO                         nd d|xs d	d      gS tQ              r4tK        |       }	tM        |       }
tS        |       }t9        d||	|
|d      gS tU              rtW        |       gS tY              rg S t[        |       rt]        |       gS t_              r3ta        |       h d}t;        fd|D              rt9        d      gS g S tb        je                  |       rt;        fddD              rdnd}tg        |       }ti        jd                  d| th        jj                        }|r |jm                  d	      jo                  d      n
t        |       }|rt9        d|||dgd      gS t3        dd       rZt;        fd!d"D              rt9        d#d$tp        i      gS t;        fd%d&D              rts        |       }|rt9        d'd(|d)      gS tu              }|rtw              rt9        d*d+|i      gS ty              rt{        |       }	t9        d,d-|	i      gS t}              rt        |       }||gS t;        fd.t        D              r~d}d/v rd	}nd0v rd1}t               t        |2      z   jO                         }t        |       }d3v sd4v rd5nd6v rd7nd8}t9        d9||r|d   j                  d:      nd |tp        d;      gS t              r-tK        |       }	tM        |       }
t9        d<||	|
tp        d      gS t              r&t        |       xs |}|rt9        d=|tp        d>      gS t        | |      rt9        d=|tp        d>      gS t;        fd?t        D              rtK        |       xs ||d   j                  nd }	tM        |       xs ||d   j                  nd }
||d   jO                         nd }||d	   jO                         nd }t        |       rst        |       }t        |       }t9        dd||d n!t        |t              r|jO                         nd ||d n|	||d n|
||d n|||d n|||tp        nd	d@      gS dAv sdBv rt9        dC||	|
||tp        dD      gS t              rt9        dC||	|
||tp        dD      gS t;        fdEdFD              r1t3        dd      r$t              st9        d||	|
||tp        dD      gS t              rt9        dG||	|
||tp        dD      gS t              rt9        d<||	|
||tp        dD      gS t;        fdHdID              rdGnd<}t9        |||	|
||tp        dD      gS g S )JNr   r   r  r  r   r  r
  r   r   rR  r
  c              3  &   K   | ]  }|v  
 y wrD  r  rs  s     rJ  rK  z+_build_direct_tool_calls.<locals>.<genexpr>W;  s     "wh8z#9"wru  )r  r>  r?  )r6  r  r5	  )r  r&  r'  r)  r*  r@  r  rA  r   c              3  &   K   | ]  }|v  
 y wrD  r  )rH  rF  goal_argumentss     rJ  rK  z+_build_direct_tool_calls.<locals>.<genexpr>;  s     Bsn$Bru  r3   c              3  &   K   | ]  }|v  
 y wrD  r  )rH  r)  r  s     rJ  rK  z+_build_direct_tool_calls.<locals>.<genexpr>;  s       8It
8J  8Iru  )r  r  r  r  r  rK  z(?:\bdi\b|\bcon\b)\s+(.+)$r  r:   r	  )r  rL  r  r	  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z+_build_direct_tool_calls.<locals>.<genexpr>;  s     zw*$zru  )r   r   r  r  r  rx  r~   r  r  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z+_build_direct_tool_calls.<locals>.<genexpr>;  s       Lw*$  Lru  r  r4   r  )r  r  rh  r  r2   r&  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z+_build_direct_tool_calls.<locals>.<genexpr>;  r  ru  r   r  r  rq  r   r   r
  r   r
  rU  r  r  )r>  rT  rV  r  r  r  r  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z+_build_direct_tool_calls.<locals>.<genexpr><  rB  ru  )r  r=  r>  r&  r'  r)  r*  r  r,  r-  r  r
  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z+_build_direct_tool_calls.<locals>.<genexpr>7<  s     }':%}ru  r*  r  c              3  &   K   | ]  }|v  
 y wrD  r  r  s     rJ  rK  z+_build_direct_tool_calls.<locals>.<genexpr>d<  s       2BG'Z2G  2Bru  )r  r   r   r$  )Sr  r  r  r  rD  r  r  r  rM  r^  rJ  r  rG  r  r  rH  r  r  r   rO  r  rS  r  r  rD  rw  rB  r  r  r)  r  r  rQ  rR  r  r  rC  r  r  r/  rG  rE  r  r  r4  rU  r  rP  r\  r  r3  r  rF  r  r  r  r  r&  r  r  rQ  r  rT  rU  r6  r  r   r  r  rF  rN  rY  rW  rC  r&  r'  rI  r
  r
  r  r   rH  rE  )r  r  r
  r
  r8  tips_tool_callr  r6  rA  r&  r'  r  r  r  rH  r  rF  	note_textmodule_settings_targetrj  offset_daysr>  explicit_timesrV  detail_queryr)  r*  r=  rn  r'  r  s                                @@rJ  rt  rt  3;  sX	    )J"7+E,W5N.w7J@IZ(27JGHH,.w7&z2"$DW$MNN-j9;GDEE3J?Dlmt  wA  EBA'JKK(*=6w?@@Wj1*73444-g677GZ0)'233&w
;%j(HE)*hI,W5E5zQ#)?UWafghaituKvw#)?UWafghaituKvw   #"wJv"wwCGbvw+())#J/&z2#)<KMmnuMvww%8BGHH":.0*E6w??09:: ,.w
CC ,0H0T&w/(1++ "?I?U*Q-"9"9";[_=G=S
1 7 7 9Y]",5:
 	
 "*-&w/(17@++ ""	

 
	
 &j13G<==$Z0	 *5.w788#J/9'B

 B0ABB#);~VWW	&&w/47  8I  XH  8I  5I5  OT	.w7		"?"--XCP++A.44Y?VlmtVu0%.4Ax"X!Y  !VV<z4yzz#)<RbHcdee  L  5K  L  L*73I'-@ZbluLvwxx<ZH"B:"N%:xQgFhijj":.%g.%664.QRR#J/%Mg%V"%1.//

F0E
FFz!Kz!K)+i[.IITTV09#,
#:f
>RickoycyX_  @I0#.JX>!#4#=#=g#F^b#.-	

 
	
 )4&w/(1,+ "-	

 
	
  
+5g>G%*!-!1  7J6&"-
 	
 
A0@
AA&w/k*J`JqM4F4Ffj(1nZMcjm6I6Iim2<2HZ],,.d
0:0F:a=**,D,WjA1':H6w?K/!#$,/7/Cteop{  ~B  fC+J_J_Ja  IM(0(<@W]a)1)=AX^c.6.BkF]dcm,4,@KD[Dai5@5LQYQa!1gh	  Z'?j+H1!/ $!&&0$,!1
  %Z01!/ $!&&0$,!1
  }5|}})*hI5jA  /!/ $!&&0$,!1
  (
3/!/ $!&&0$,!1
  -Z80!/ $!&&0$,!1
  /2  2B  XA  2B  /B*  H_	+ "", (-

 	
 Ir  c                 K   t        |      }dt        |       dddj                  dt        |       dd|ddt	        |      dd	|j                          g
      dg}t        |d
t               j                  t                      d {   \  }}	 t        t        |            }t        j                  |      S 7 1# t        t        f$ r dddddj                  dt        |       dd|ddt	        |      dd	|j                          dd|j                         xs dg      dg}	t        |	d
t               j                  t                      d {  7  \  }
}t        t        |
            }t        j                  |      cY S w xY ww)Nsystemr  r  r  r
  Contesto runtime:r
  Stato strutturato del thread:Conversazione recente:Messaggio utente attuale: r  temperature
max_tokensr   at  Ripari l'output di un planner. Devi restituire SOLO JSON valido nel formato {"mode":"reply","reply":"...","tool_calls":[]} oppure {"mode":"tool","reply":null,"tool_calls":[{"tool":"nome_tool","arguments":{...}}]}. Non cambiare l'intento dell'utente. Se l'output originale contiene gia un tool o i suoi argomenti, wrappalo correttamente senza aggiungere testo fuori schema.z%Output planner originale da riparare:z(vuoto))rZ  r  r  r  r  r  r&   r    assistant_max_tokensr  r  r  r  r   r  r   )r  r  r  r  thread_state_summaryplanner_messagesr  rB  rY  repair_messagesrepaired_replyrepaireds               rJ  _plan_tool_usagerE  v<  s     <LI&<W&EFyy',W53(,.|<00AB	
* 1>66&(	 HE1,6();E)BC++F33 ( )6 !R
 99+097,02<@4W]]_4EF?2 
B #>#~::*,	#
 
 
 ++=n+MN++H55S)6sC   BF	B;
F(B= :F=BFE1FFFFc                Z   g }| D ]  }t        |j                  d      xs d      j                         }|rd| dnd}|j                  d|j                  d       d|j                  d       d	|j                  d
       d|j                  d       d| 
        dj	                  |      S )Nr[  r
  r;  r=  r
  rZ  z il r]   alle r^  r
  r`   personer
  )r  rn  r  r  r  )r	  r
  r	  r6
  suffixs        rJ  #_render_reservation_candidate_linesrJ  <  s    E 
	IMM"239r:@@B"'2eWAR/0Y]]CU5V4WW]^g^k^klx^y]zz  AJ  AN  AN  OW  AX  @Y  Ya  bh  ai  j	

 99Ur  c                   t        | j                  d      xs d      j                  dd      }t        | j                  d      xs d      }t        | j                  d      xs d      }t	        | j                  d            }t        | j                  d	      xs d      }t        | j                  d
      xs d      }t        | j                  d      t              r| j                  d      ng }|rdj                  d |D              nd}d| j                  d       d| d| j                  d       dd| d| d| dg}	|B|dk(  r|	j                  dt        |       d       n|	j                  dt        |       d       |r|	j                  d| d       t        | j                  d      t              r| j                  d      ng }
|
r|	j                  d       |
D ]  }t        |t              st	        |j                  d             }|d!t        |       nd}|	j                  d"|j                  d#       d$|j                  d%       d&|j                  d'       d(|j                  d)       | 	        |	S )*Nr	  r
  r  r  r8	  r   r  r4	  r  r=	  r9	  r<  c              3  2   K   | ]  }t        |        y wrD  r@	  r	  s     rJ  rK  z)_render_purchase_batch.<locals>.<genexpr><  s      AtT ArG  r
  zOrdine #r=  r
  r
  r  r  zRighe: . Quantita totale: z. Fornitori coinvolti: r  zTotale ordine: z (prezzo snapshot salvato).zTotale ordine stimato: z(Prezzi mancanti non inclusi nel totale: z righe.rL  zContenuto ordine:r  u    · r
  rH  r
  r  r;  r  z) da r  )r  rn  r  r  rZ  r  r  r  r  rC  r  )r%  r	  r8	  r  r4	  r  r=	  	supplierssupplier_summaryr
  rL  ro  r  rI  s                 rJ  _render_purchase_batchrP  <  s   uyy06B7??SILeii.3!4K#349:N3EII>V4WX		/28b9Meii(=>C!D/9%))DT:UW[/\		*+bdIENtyy Ay AATY
599Z()|nN599U\K]J^^_`
+1.1AAXYiXjjklE ),,LL?;7M+N*OOjklLL2;?U3V2WWXYZ?@S?TT[\]",UYYw-?"FEIIgBE() 	D$%3DHH=S4TU
=G=S4J 789Y[*-.c$((>2J1K2dhhWaNbMcchimiqiq  sB  jC  iD  EK  DL  M		 Lr  c                   |j                         sy t        |       }t        |ddddd      sd|v sy t        |j	                  d      t
              r|j	                  d      ng }|sy t        |j	                  d      xs d	      j                  d
d      }t        |j	                  d      xs d      }|dk  rt        d |D              }t        |      rdnd}t        |      dk(  rt        |d   t              r|d   }t        |j	                  d      xs d	      j                         }	|	rd|	 nd	}
| dt        |j	                  d      xs d       |
 d|j	                  d       d|j	                  d       d|j	                  d       d| dS | d| d| d|j	                  d       d| d 
g}|D ]  }t        |t              st        |j	                  d      xs d	      j                         }	|	rd|	 nd	}
|j                  d!t        |j	                  d      xs d       |
 d|j	                  d       d|j	                  d               d"j                  |      S )#Nr   r   r   r   r  z	di quantir:	  r	  r
  r  r  r;	  r   c              3  z   K   | ]3  }t        |t              st        |j                  d       xs d       5 yw)rH  r   Nr  r  r  rn  r	  s     rJ  rK  z:_render_purchase_batch_matched_quantity.<locals>.<genexpr>=  s/     $xaklprvawS*)=)B%C$x   ;#;z"La prima volta che lo hai ordinatozNell'ordine richiestor   r  z, hai comprato rH   di r  r
  r  z nell'ordine #r=  r
  r  z, le righe compatibili con z sono z unita nell'ordine #r  r
  r
  )r  r  rw  r  rn  r  r  r  r  r  rC  r  r  r  r  )r  r%  r  r  r:	  r	  r;	  r
  ro  r  
lot_suffixr
  s               rJ  '_render_purchase_batch_matched_quantityrW  <  s   ;;= )J!*h(HV`a*$2<UYY=WY]2^EIIo.dfMuyy06B7??SIL +C!D!IJ"!$$xP]$x!x5Nz5Z1`wF
=Q:mA.>#EQtxx
+1r288:'/q
^R
hoc$((:*>*C!&D%Ej\QUVZV^V^_mVnUo p((?+,N599Z;P:QQVWcVddeg	
 (-eWF;Q:RRfglgpgpq{g|f}  ~C  DP  CQ  QR  	SE  IdD!488J/526<<>H+31XJJLL2c$((:"6";!<=j\dhhWeNfMggklpltlt  vE  mF  lG  H  I	I
 99Ur  c                0     d}t         fd|D              S )N)r   r   r   r   ztutto il localer  r  c              3  &   K   | ]  }|v  
 y wrD  r  rH  r  r  s     rJ  rK  z(_is_capacity_question.<locals>.<genexpr>=  s     Nw,,Nru  rI  )r  capacity_keywordss   ` rJ  _is_capacity_questionr\  =  s    hN<MNNNr  c                4     t         fdt        D              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rZ  s     rJ  rK  z2_is_reservation_subject_request.<locals>.<genexpr>!=  s     Zw,,Zru  )r)  r  )r  s   `rJ  r5  r5   =  s    Z<YZZZr  c                T    t        |       }d|v xs t        j                  d|      d uS )Nr  z\bfrom\s+reservations\b)r  rF  r3  r  normalized_sqls     rJ  _sql_targets_reservationsrb  $=  s/    $S)N N2wbii@Z\j6ksw6wwr  c                ,    t        |       }d|v xs d|v S )Nr  r  rk  r`  s     rJ  _sql_targets_timeclockrd  )=  s"    $S)N.(X,F.,XXr  c                B    t        |       t        fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rH  rt  ra  s     rJ  rK  z)_sql_targets_inventory.<locals>.<genexpr>0=         	N"ru  )zinventory latest itemszinventory latest lotszinventory warehousesztenant inventoryr
  r`  s    @rJ  rP  rP  .=  )    $S)N 
  r  c                B    t        |       t        fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rg  s     rJ  rK  z._sql_targets_homemade_stock.<locals>.<genexpr>==  rh  ru  )ztenant homemade stockzhomemade stockz
prep stockzhomemade consumption resultr
  r`  s    @rJ  rl  rl  ;=  ri  r  c                B    t        |       t        fddD              S )Nc              3  &   K   | ]  }|v  
 y wrD  r  rg  s     rJ  rK  z$_sql_targets_tips.<locals>.<genexpr>J=  s      
 	N"
ru  )z	tips runsztips run entriesztips rosterztenant tipsz
mance runszmance entriesr
  r`  s    @rJ  _sql_targets_tipsrn  H=  s)    $S)N 


 
 
r  c                ,    t        |       }d|v xs d|v S )Nztenant fiscal documentsztenant fiscal document itemsrk  r`  s     rJ  _sql_targets_fiscal_documentsrp  W=  s#    $S)N$6j:X\j:jjr  c                :    t        |       }t        |       xr d|v S )Nztotal amount including vat)r  rp  r`  s     rJ  r  r  \=  s#    $S)N(-`2NR`2``r  c                    t        j                  dt        j                  |       d| t         j                        }|r|j	                  d      j                         S dS )Nz'([^']*)'\s+AS\s+r2  r  r   r
  )rF  r3  rG  r  r  r  )r  rH  r  s      rJ  r  r  a=  sJ    II*299U+;*<B?BMMZE%*5;;q>!22r  c                d    | j                         }t        |       }d|v xs d|v xs
 d|v xs d|v S )Nr  r  zsupplier catalog itemszfornitori cataloghi items)r  r  )r  r  ra  s      rJ  r  r  f=  sM    iikG$S)N G+ 	9&'1	9#~5	9 '.8	r  c                    t        j                  d| t         j                        }|syt        |j	                  d            S )Nz'([^']+)'\s+AS\s+lookup_queryr  r
  r   )rF  r3  r  r  r  )r  r  s     rJ  r  r  q=  s2    II62==QE!%++a.11r  c                v    t        t        | j                  d      xs | j                  d      xs d            S )Nr  r  r
  )r  r  rn  r{	  s    rJ  _row_source_scoperv  x=  s.    3sww~6P#''':JPbQRRr  c                v    |D ]4  }t        | j                  |      xs d      j                         }|s2|c S  yra  r	  )rJ  rM  rF  r  s       rJ  _row_display_valuerx  |=  s>     CGGCL&B'--/L r  c                H   t        | dddd      }|sd}t        | ddd      }t        | d	d
d      }||fD cg c]  }|s|	 }}|rddj                  |       dnd}| j                  d      }|| j                  d      }t        |      }|rd| dnd}	d| | |	 S c c}w )Nrt  r  r  r  Articolodisplay_supplier_namer  r  display_lot_coder  r  r;  r<  r=  r
  display_price_vatr  r
   ivator
  )rx  r  rn  rC  )
rJ  r  r  r  r  suffix_partsrI  rX  price_labelprice_suffixs
             rJ  _render_catalog_lookup_liner  =  s    c>=.RXYD&s,CE[]lmM!#'9;LjYH&3X%>GT$DGLG0<r$))L)*!,"FGG'(E})*e$K/:R}F+LvfXl^,, Hs
   BBc                n    t        |       }d|v xs% d|v xs t        |ddd      xr t        |dddd	      S )
Nr  zchi mi vender  r  r  r  r  r  r  r  r  s     rJ  "_is_supplier_seller_lookup_messager  =  sS     )Jz! 	
Z'	
 &j'9iP j)*k;P[]hir  c                    i }| D ]h  }t        |ddd      }|st        |dddd      }t        |dd	d
      }|xs d}|r| d| d}|j                  |g       }||vsX|j                  |       j |S )Nr{  r  r  rt  r  r  r  r|  r  r  r  r;  r=  )rx  r  r  )rQ  r  rJ  r  r  r  r  supplier_matchess           rJ  _supplier_seller_matchesr  =  s    $&G ,*30GI_apq)#~}n^de%c+=?PR\]+xr(1-F"--mR@))##F+, Nr  c                   t        |      }t        |      }|s|sy g }|rS|j                  d|  d       t        |      D ]0  }dj                  ||   d d       }|j                  d| d|        2 |rY|rdnd|  d}|j                  |       t        |      D ]0  }dj                  ||   d d       }|j                  d| d|        2 |r|s|j                  d	       d
j                  |      S )Nz!Nei cataloghi fornitori caricati z risulta venduto da:r  r.   r
  r
  z:Nel catalogo prodotti del locale risulta anche venduto da:z!Nel catalogo prodotti del locale zrNota: nei cataloghi fornitori caricati non trovo questo articolo; il dato arriva dal catalogo prodotti del locale.r
  )r  r  r5  r  )	r  supplier_rows
local_rowsr  local_matchesr
  r  detailsr
  s	            rJ  %_render_supplier_seller_lookup_resultr  =  s*    0>,Z8MME8?STU#$45 	:Mii 0 ? CDGLL2m_Bwi89	:    I4UG;OP 	
 	V#M2 	:Miim <Ra @AGLL2m_Bwi89	: -  J  	K99Ur  c                    | j                  d      }t        |t              r|S t        |t        t        f      rt	        |      dkD  S t        |xs d      j                         j                         dv S )Nsemantic_matchr   r
  >      sìr4  rT   yestrue)rn  r  r  r  r  r  r  r  )rJ  r  s     rJ  _row_is_semantic_matchr  =  sd    GG$%E%%#u&U|au{!!#))+/PPPr  c           	     Z   |D cg c]@  }t        |t              r.t        |j                  d      xs d      j	                         r|B }}|sy t        |       }|d   }t        |d      xs |}t        |d      xs d}t        |d      xs d}|D cg c]  }t        |      s| }	}|D cg c]  }t        |      r| }
}|rd| nd	}|	rt        |	      d
k(  r|n|}d| dt        |	       d| d| d	g}|	D ]4  }t        |d      }t        |      }|r| d| d}|j                  |       6 |
r$|j                  dt        |
       d| d| d       dj                  |      S |rd| d| d| dg}|j                  dt        |       d| d       |d d }|rj|j                  d       |j                  d |D               t        |      t        |      kD  r*|j                  d t        |      t        |      z
   d!       dj                  |      S y c c}w c c}w c c}w )"Ncatalog_semantic_attributer
  r   lookup_suppliercatalog_semantic_subjectr  	richiestir  z
 fornitorir   zNel catalogo trovo r  z identificabili come r  classification_reasonr;  r=  zHo controllato anche altri z articoli della categoria zO, ma non hanno indicatori sufficienti nel nome/catalogo per classificarli come r  r
  z non trovo z dai dati salvati.zHo trovato z$ articoli candidati nella categoria zG, ma nessuno contiene brand o indicatori affidabili per quella origine.rn  zCandidati non classificati:c              3  2   K   | ]  }t        |        y wrD  r  rH  rJ  s     rJ  rK  zA_render_supplier_catalog_semantic_query_result.<locals>.<genexpr>>  s     Rc4S9RrG  - ... e altri z	 articoli)r  r  r  rn  r  r  rx  r  r  r  r  r  r  )r  rQ  rJ  semantic_rowsr	  	first_rowr  r  r	  r	  unmatched_rowssupplier_label
item_labelr
  r  linepreview_rowss                    rJ  ._render_supplier_catalog_semantic_query_resultr  =  s    c4 S1M)N)TRT%U%[%[%] 	M 
 =gFNa I(4EFX.O ,FGU:G"9.JKZ{I#0PC4J34OCPLP%2Vc:PQT:UcVNV8G{?"34\N #L 1Q 6WG
>*'#l2C1DAj\Qfgpfqqrs
   	C'-DEF.s3Dr&+LL	 LL-c..A-BB\]d\e f``i_jjkm yy>*+gY>ST]S^^pq
 	#m,--QRYQZ  [b  c	
 %Sb)LL67LLR\RR=!C$55~c-.@3|CT.T-UU^_`yye QVs   AHH#$H#.H(?H(c                   t        | |      }|r|S t        |       }t        | |      }|xs t        |       xs t	        |       xs d}|D cg c]0  t              dv st              st        fddD              r2 }}|D cg c]  }t        |      dv r| }}|st        |       rt        |||      }|r|S |s|r	d| d| dS d	| d
S g }	|ryt        |      dk(  rdnd}
|r(|	j                  d| dt        |       d|
 d| d	       n$|	j                  dt        |       d|
 d| d       |	j                  d |D               n0|r|	j                  d| d| d       n|	j                  d	| d       |r+|s)|	j                  d       |	j                  d |D               dj                  |	      S c c}w c c}w )Nquesta richiesta>   supplier catalogsupplier catalogscataloghi fornitoric              3  &   K   | ]  }|v  
 y wrD  r  rI  s     rJ  rK  z8_render_supplier_catalog_query_result.<locals>.<genexpr>>  s     -zScSj-zru  )r  r  r  >   local catalogr  catalogo prodottizNel catalogo fornitore z1 caricato non trovo articoli che corrispondano a r  zHNei cataloghi fornitori caricati non trovo articoli che corrispondano a z?. Non trovo risultati nemmeno nel catalogo prodotti del locale.r   r  r  r  r   che corrispondono a r  z'Nei cataloghi fornitori caricati trovo c              3  2   K   | ]  }t        |        y wrD  r  r  s     rJ  rK  z8_render_supplier_catalog_query_result.<locals>.<genexpr>7>  s     O#05OrG  z( non trovo articoli che corrispondano a z.Nel catalogo prodotti del locale invece trovo:c              3  2   K   | ]  }t        |        y wrD  r  r  s     rJ  rK  z8_render_supplier_catalog_query_result.<locals>.<genexpr>@>  s     L#05LrG  r
  )r  r  r  r  r  rv  r)  r  r  r  r  r  r  )r  rQ  semantic_replyr	  r  rJ  r  r  seller_replyr
  r  s        `     rJ  %_render_supplier_catalog_query_resultr  >  sM   CGTRN=gFN3G^LEm+G4m8Nw8Wm[mE S!%ee %#-zDy-z*z 	M  S!%^^ 	J  @I<UMS]^,^,<<mnsmttuvvVW\V] ^L L	

 E#&}#5#:Z

LL2>2B'#mJ\I]]^_i^jj  AF  @G  GH  I  JLLB3}CUBVVWXbWccxy~x  @A  B  COOOLL2>2BBjkpjqqrstLLcdicjjklm.EFLLL99UWs   5F=	Gc                    | j                         }|sy	 t        j                  |      }|t	               z
  j
                  }|dk(  ry|dk(  ry|dk(  ryd| S # t        $ r d| cY S w xY w)	Nnel perimetro richiestozper il r   per oggir   
per domanir  per ieri)r  r   r  r  r  rr  )r>  raw_target_dater
  
delta_dayss       rJ  _reservation_target_labelr  E>  s    !'')O(+''8
 13399JQQR_%&&  +)**+s   A A)(A)rU  rT  rV  c                   t        |       }|r|dk(  rd| dS d| d| dS |dk(  r|dk(  ry|d	k(  ry
|dk(  ry|dk(  ryd| dS |dk(  r|dk(  ry|d	k(  ry|dk(  ry|dk(  ryd| dS |dk(  ryd| dS )Nr  zNon vedo prenotazioni alle r  zNon vedo prenotazioni rG  r
  r  z"Non vedo prenotazioni per stasera.r  z&Non vedo prenotazioni per domani sera.r  z$Non vedo prenotazioni per ieri sera.z'Non vedo prenotazioni in fascia serale.z in fascia serale.r
  z(Non vedo prenotazioni per oggi a pranzo.z*Non vedo prenotazioni per domani a pranzo.z(Non vedo prenotazioni per ieri a pranzo.z'Non vedo prenotazioni in fascia pranzo.z
 a pranzo.z.Non vedo prenotazioni nel perimetro richiesto.)r  )r>  rT  rV  r1  s       rJ  "_render_empty_reservations_messager  W>  s     -[9L440Q??'~VK=JJi:%7<';:%944<'~5GHHg:%=<'?:%=44<'~Z@@00?#L>33r  c                   	 t        |       }|j	                         rt        t        |            S |dj                  d      j                  d      j                  dd      S # t        t        f$ r t        |       cY S w xY w)Nz.3fr  r  r  )r  rX  r  r  r
  r  r  r  )r  numeric_values     rJ  _format_inventory_unitsr  {>  s|    e !3}%&&C ((-44S9AA#sKK	 z" 5zs   A# #B ?B c                @    dD ]  }| j                  |      }||c S  y )N)r  total_unitssum_total_equivalent_units	sum_unitsavailable_unitsr  r	  )rJ  rF  r  s      rJ  _inventory_row_total_unitsr  >  s2     
 L
 r  c                @   	 t        | j                  d      xs d      dk(  }t	        t        | j                  d      xs d            }	 t        t        |       xs d      }|xr |dk  xr |dv S # t        t        f$ r d}Y bw xY w# t        t        f$ r d}Y 9w xY w)	Ncatalog_onlyr   r   Fr  r
  r  >   catalog onlycatalog only nessuna giacenzar  )r  rn  rX  r  r  r  r  r  )rJ  r  rg  r  s       rJ  _inventory_row_is_catalog_onlyr  >  s    377>27a8A= S);!<!BCDF6s;@qA   BK1,  B  <B  2B  B z" 
 z" s#   !A2 B	 2BB	BBc                .    d| dj                  dd      S )NrB  r  r  r  r  r  s    rJ  _format_currencyr  >  s    %%%c3//r  c                    t        |       }||j                         S t        |       }t        |       }|1|/ddddddddd	d
ddd}|j	                  |t        |             d| S |t        |      S y)Nr6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  )r   r   r   r   r.   r   r   r   r   r   r4  r5  r  r
  )r  r/  r  r  rn  r  )r  r  r&  r'  month_labelss        rJ  _tips_period_label_from_messager  >  s    *73M &&(("7+D$W-EE-
 ""5#e*56av>>4yr  c                4    t        |       j                         S rD  )r  r  r  s    rJ  r  r  >  s    5!''))r  c                b    t        t        | xs d            }|sy d|v ryd|v ryt        |       S )Nr
  zcurrent stockcontenuto corrente registratozlatest inventoryzultimo inventario salvato)r  r  )r  normalized_values     rJ  _inventory_source_labelr  >  s>    &s5;B'78**.--*u:r  c           
     8   t        | j                  d      xs d      j                         }t        | j                  d      xs d      j                         }t        | j                  d      xs d      j                         }t        | j                  d      t              r| j                  d      ng }t        | j                  d      xs d      j                         }|dk(  s|r|syd	| d
| }|s|r	d| d| dS d| dS t        | j                  d            }t        |      dk(  rt        |d   t              r|d   ni }t        |j                  d      xs d      }	t        |j                  d      xs d      j                         }
d| d
| d| d|	 }|
r| d|
 }| d}|g}|j                  dt        |j                  d             dt        |j                  d             d       dj                  |      S d| d
| d| d}|r| d| }| d g}|D ]  }t        |t              st        |j                  d      xs d      j                         }
d!t        |j                  d"             d#t        |j                  d             dt        |j                  d             g}|
r|j                  d$|
        |j                  d%|j                  d       d&d'j                  |               dj                  |      S )(Nr  r
  r  r  rL  r  r  zcPer stimare i consumi da inventario mi servono almeno due inventari totali salvati in date diverse.ztra il z e il zNon vedo cali di giacenza per r  r  zNon vedo cali di giacenza r  r   r   r  r
  r  zTra il  risultano z unita equivalenti in meno di r
  z
Giacenza: r   -> r  r
  z unita equivalenti in menor
  r  zcalo r  z	giacenza 
fornitore r
  r
  r<  )
r  rn  r  r  r  r  r  r  r  r  )r	  r  r  r  rL  r  r  r  ro  r  r  intror
  r
  detail_bitss                  rJ  )_render_inventory_consumption_tool_resultr  >  s}   H%+,224Fvzz*@AGRHNNPVZZ(<=CDJJL#-fjj.A4#HFJJwbE

7#)r*002E''/CK]t12&9K8LML3E7!L>KK+L>;;26::>T3UV
5zQ%eAh5uQx2488N3AzBDHH_5;<BBD./v6H5IUiTj  kI  JV  IW  XgT-1E'0/1JKLDQhimiqiq  sB  jC  RD  QE  EF  G	
 yy,-V4F3G{SgRh  iC  DGIU5'*y]OE 
P$%DHH_5;<BBD+DHH5E,FGHI/0IJK4Pghlhphp  rA  iB  QC  PD  E
 M?;<r$((>232dii6L5MNO
P 99Ur  c                    d}| D ]$  }	 |t        |j                  |      xs d      z  }& t	        |d      S # t        t        f$ r Y Dw xY w)Nr  r   r   )r  rn  rX  r  r  )rQ  rF  r  rJ  s       rJ  _sum_numeric_rowsr  ?  s^    E 	U3773<,1--E
 ? :& 		s   !8A
	A
c                   | syt        | d   t              r| d   ni }t        |j                  d      xs d      j	                         }t        |j                  d      xs d      j	                         }t        |j                  d      xs d      j	                         }t        |j                  d      xs d      j	                         }t        |j                  d      xs d      j	                         }	 t        |j                  d	      xs d
      }|s6t        |j                  d      xs d      j	                         }d|xs d dS | D 	cg c]  }	t        |	t              s|	 }
}	t        |
d      }t        |
d      }t        ||z
  d      }|dkD  rt        ||z  d      nd}|rd| nd}|rd| nd}d| | dt        |       dd|xs | d|xs | d| ddt        |       dt        |       dt        |       d| d 	g}|dk  r|j                  d!       t        |
      d"kD  r|j                  d#       |
d d$ D ]  }	t        |	j                  d%      xs d&      }t        |	j                  d'      xs d      j	                         }|rd(| nd}|j                  d)| | dt        |	j                  d*             d+t        |	j                  d             d,t        |	j                  d             d-
        t        |
      d$kD  r!|j                  d.t        |
      d$z
   d/       d0j                  |      S # t        t        f$ r d
}Y Gw xY wc c}	w )1NzENon trovo acquisti o giacenze compatibili per stimare questo consumo.r   final_inventory_dater
  r;  rA  rB  r  r  r  rX  zNon trovo un inventario nel periodo richiestoz  da usare come rimanenza finale.purchased_unitsfinal_stock_unitsr   r  r
  r
  z"Stima parziale consumo giornalieror
  z unita equivalenti al giorno.zMetodo: acquisti r  z$ meno giacenza del primo inventario z, stock iniziale ignorato.zTotale stimato: acquisti z, rimanenza finale z, consumo stimato  su  giorni.zAttenzione: il consumo stimato risulta negativo. Significa che la rimanenza finale supera gli acquisti del periodo; senza stock iniziale il dato non e affidabile.r   zDettaglio prodotti:r  r  r
  r  r
  r
  estimated_daily_unitsz/giorno (acquisti z, rimanenza r=  z	...altri z prodotti non mostrati.r
  )r  r  r  rn  r  r  rX  r  r  r  r  r  r  r  )rQ  r  r  r;  rA  rB  r  r  rX  rJ  r  total_purchasedtotal_finaltotal_consumedtotal_dailyr  r  r
  r  r  supplier_fragments                        rJ  3_render_inventory_consumption_estimate_query_resultr  ?  s   V%d1gt4Q"Iy}}-CDJKQQS	o6<"=CCEMimm,ABHbIOOQIMM*=>D"EKKM	g&,"-335E)--6=#>  Y]]+;<BCIIK-n.S@S-TTtuu&*Dsjd.CsDOD'9JKO#O5HIK?[8!<N<G!O%4a8QTK!&eWoBG'4eM?#"E -WIeWB?VWb?c>d  eB  	C 3 D}ESIZIk^kHl m22F1GGac ((?(P'Q R  7 DE F6~FGtK=X`bE  q	
 ?a*+"3B' 		Csww~6D*EL 8 >B?EEGM:G$}o 6RLL\N#4"5R*3773J+KLM N4SWW=N5OPQ R4SWW=P5QRSSTV			 "$LL9S%9B%>$??VWX99U_ z"  Es   ;M M$+M$M! M!c                   | sy| rt        | d   t              r| d   ni }d|v r*t        | D cg c]  }t        |t              s| c}      S d|v rt        |       dk(  rt	        |j                  d      xs d      j                         }t	        |j                  d      xs d      j                         xs d	}t	        |j                  d
      xs d      j                         }t	        |j                  d      xs d      j                  dd      d d }|rd| nd}|rd| nd}d| d| d| | dS dg}	| D ]  }t        |t              st	        |j                  d      xs d      j                         }t	        |j                  d      xs d      j                         xs d	}t	        |j                  d
      xs d      j                         }t	        |j                  d      xs d      j                  dd      d d }|rd| nd}|	j                  d| d|xs d d| |         dj                  |	      S d|v rt        |       dk(  rt	        |j                  d      xs d      }
t	        |j                  d      xs d      j                         }t        |      rI|
 }|r| d| }t	        |j                  d      xs d      j                         }|rd | dnd}| d!| S t        t        |            }d"| d#|
 }|r| d| }| d}|g}	t	        |j                  d$      xs d      j                         }|r|	j                  d%| d       t        |j                  d&            }t	        |j                  d'      xs d      j                         }|r|d(k7  r|	j                  d)| d       |r|	j                  d*| d       dj                  |	      S d+|v rd,nd-}|g}	| D ]  }t        |t              st	        |j                  d      xs d      }
t	        |j                  d      xs d      j                         }t        t        |            }t	        |j                  d$      xs d      j                         }t	        |j                  d      xs d      j                         }t        |j                  d&            }t        |      rGd.d/g}t	        |j                  d      xs d      j                         }|r|j                  d0|        n| d1g}|r|j                  d2|        |r|j                  d3|        n|r|j                  d4|        |rt        |      s|j                  d5|        |	j                  d|
 dd6j                  |               dj                  |	      S d7g}	| D ]  }t        |t              st	        |j                  d      xs d8      }t	        |j                  d
      xs d      j                         }|rS|	j                  d| d9| d6t        |j                  d:      xs d       d;t        |j                  d<             d1	       |	j                  d| d=t        |j                  d>      xs d       d?t        |j                  d@             d1        dj                  |	      S c c}w )ANzLNon vedo giacenze compatibili con questa richiesta nei magazzini registrati.r   consumption_estimate_resultr  r   r  rz  r
  zutente non registrator  r  r  r     r
  z, salvato il zL'ultimo inventarior
  z risulta fatto da r  zUltimi inventari salvati:r
  r
  zdata non registrataz, fatto da r
  r  r
  r  r
  catalog_lot_codesz Lotti catalogo: zr esiste nel catalogo prodotti, ma non risulta nessuna giacenza registrata negli inventari o nei magazzini attuali.zIn magazzino risultano  unita equivalenti di warehouse_breakdownzMagazzini: r  inventory_datesr  zData ultimo inventario: zFonte: inventory_rank_resultz.Prodotti con maggiore giacenza totale in casa:zGiacenze trovate nei magazzini:zpresente in catalogoznessuna giacenza registratazlotti catalogo z unita equivalentir  z
magazzini z
magazzino zfonte r<  zMagazzini registrati:	Magazzinoz: ultimo inventario r  z prodotti, r  z$: nessun inventario datato salvato, r  z" prodotti nel contenuto corrente, r  )r  r  r  r  r  rn  r  r  r  r  r  r  r  r  r  )rQ  r  rJ  r  r  r  r  date_fragmentsaved_fragmentr
  r  r  r  	lot_codeslot_fragmentr  r  source_labelr  r
  detail_partss                        rJ  _render_inventory_query_resultr  I?  s>   ]JtAw$=Q2I$	1BSWCqC[efiko[pCCqrr)Y6t9> /?!@!OKPVVXN!)--0R"S"YWYZ``b}f}O$'	6M(N(TRT$U$[$[$]!Y]]+HIORPXXY\^abcfdfgJ?Te$9#:;Z\M=G}ZL9RN(u^<LL^_n^op~o  @A  B  B,- 	NCc4( )9!:!IkJPPRN!#''*L"M"SQSTZZ\w`wO$'0G(H(NB$O$U$U$W!SWW%BCIrJRRSVX[\]`^`aJ=G}ZL9RNLL2n-R0E0^I^/__jkzj{  }K  |L  M  N	N yy"t9>y}}^<J
KL	o > D"EKKMM-i8'. $gT-9E	.A B HbIOOQ	CL!29+Q?RTg ??KnN 22LY2WXK-k]:PQ]P^_E 'm_5gQKEGE"%imm4I&J&Pb"Q"W"W"Y"{+>*?qAB29==AS3TUL!)--0A"B"HbIOOQO<3R#R77HJKw|nA6799U##F]ajFjB  qR	 	ICc4(sww~6D*EL 8 >B?EEGM12LS2QRK"%cgg.C&D&J"K"Q"Q"S )9!:!@bAGGIN2377;M3NOL-c2 68UV(; < BCIIK	 ''/)(EF#.-/A BC##j$@A"##j1D0E$FG##j0@$AB$B3$G##f\N$;<LL2l^2dii.E-FGH1	I2 yy$%E #t$SWW%56E+F #CGG,C$D$J K Q Q S LL^$$89N8Orsww@AFQGH*3773\+]^__qs LL^$$Hsww/41566X*3773S+TUVVhj" 99UK Drs   [8[8c           
        |syt        |       }|rt        |d   t              r|d   ni }d|v rat        |      dk(  r|}t	        |j                  d      xs d      j                         }|rd| nd}t        |j                  d      xs d      }t        t        |j                  d	      xs d            }t        t        |j                  d
      xs d            }	t        t        |j                  d      xs d            }
t        t        |j                  d      xs d            }t        t        |j                  d      xs d            }|rd| nd}d| | d| d| dg}|j                  d| d|	 d|
 d       t        |j                  d      xs d      r|j                  d| d       dj                  |      S d|rd| nd dg}|D ]  }t        |t              st	        |j                  d      xs d      j                         }t        |j                  d      xs d      }t        t        |j                  d      xs d            }|j                  d| d| d| d        dj                  |      S d|v rtt        |      dk(  r\|}t	        |j                  d      xs d      }t	        |j                  d      xs d      j                         }|rd | d!nd}t        |j                  d      xs d      }t        t        |j                  d"      xs d            }t        t        |j                  d#      xs d            }t        t        |j                  d$      xs d            }|rd| nd}d%| | | d&| d'| d	g}t        |j                  d#      xs d      r|j                  d(| d       |j                  d)| d       dj                  |      S d*|rd| nd dg}|D ]  }t        |t              st	        |j                  d      xs d      }t	        |j                  d      xs d      j                         }t        |j                  d      xs d      }t        t        |j                  d$      xs d            }| d+| dg}|r|j                  |       |j                  d| dd,j                  |               dj                  |      S d-|v rt        |      dk(  r|}t	        |j                  d-      xs d      }t	        |j                  d      xs d      j                         }|rd| nd}t        t        |j                  d.      xs d            }t        t        |j                  d/      xs d            }t        t        |j                  d0      xs d            }t        t        |j                  d#      xs d            }t        t        |j                  d1      xs d            }t        |j                  d2      xs d      }d3| d4| d| d5g}|j                  d| d| d| d       t        |j                  d#      xs d      r|j                  d6| d       |r|j                  d7| d       dj                  |      S d8|rd| nd dg}|D ]  }t        |t              st	        |j                  d-      xs d      }t	        |j                  d      xs d      j                         }t        t        |j                  d1      xs d            }|g}|r|j                  |       |j                  t        |j                  d2      xs d       d9       |j                  d| dd,j                  |               dj                  |      S d:t        |       d;g}|D ]]  }t        |t              s|j                         D cg c]  \  }}| d<|  }}}|j                  dd=j                  |      z          _ dj                  |      S c c}}w )>Nz1Non trovo mance che corrispondono alla richiesta.r   total_payable_amount_sumr   rL  r
  r  tip_daystotal_tip_amount_sumtotal_pos_amount_sumtotal_pos_effective_amount_sumtotal_loaded_history_amount_sumr
  zTotale mancer
  z da pagare su z giornate salvate.zLordo raccolto: z; POS lordo: z; POS effettivo: r  zStorico caricato complessivo: r
  zTotali mancer
  r  r
  r  z	 giornater  
Dipendenter;  r=  total_assigned_amounttotal_loaded_history_amounttotal_visible_amountr  z vedo z di mance giornata su z(Storico caricato in calcoli successivi: z%Totale visibile nei calcoli salvati: zStorico mance trovatoz nei calcolir<  rZ  r[  r\  r]  total_payable_amountrb  zGiornata mancer
  z da pagare.zStorico caricato: zPersone in divisione: zGiornate mance salvaterH  z$Query mance eseguita correttamente: z righe restituite.=r
  )r  r  r  r  r  rn  r  r  r  r  r  r  rL  )r  rQ  r  r  rJ  rL  
area_labelr  r[  total_pos_amounttotal_pos_effective_amountr  r
  period_fragmentr
  r  
days_countassigned_totalloaded_totalvisible_totalr  rZ  r\  r]  rb  rF  r  r
  s                               rJ  _render_tips_query_resultr  ?  s   B27;LJtAw$=Q2I!Y.t9>Cswwv,"-335D'+1TFJ377:.3!4H/cgg>T6U6ZYZ0[\/cgg>T6U6ZYZ0[\)9%Hh@i@nmn:o)p&*:5IjAkApop;q*r'#3E#''B\:]:bab4c#d 8Dl^4"O#J</@CWBXXfgofp  qC  D  EELL+,<+=]K[J\\m  oI  nJ  JK  L  MSWW>?D1E=>Y=ZZ[\]99U##,%~ 6BOqQR 	UCc4(swwv0&1779D377:.3!4H#3E#''B\:]:bab4c#d LL2dV2&:%;4zST	U yyy t9>CSWW\2BlCJswwv,"-335D)-2dV12JSWWZ05A6J-eCGG<S4T4YXY.Z[N+E#'':W2X2]\],^_L,U377;Q3R3WVW-XYM8Dl^4"OJ<
|O3DF>JZZpq{p|  }O  P  QESWW:;@qAG~UVWXLL@qQR99U##(<5)?UW(XXYZ[ 
	FCc4(SWW\2BlCJswwv,"-335DSWWZ05A6J,U377;Q3R3WVW-XYM+_L9j\;STK""4(LL2j\DIIk,B+CDE
	F yyYt9>C377:.4"5Hswwv,"-335D'+1TFJ/cgg>P6Q6VUV0WX-eCGG<L4M4RQR.STN'7cggF`>a>fef8g'h$*:5IfAgAlkl;m*n'#3E#''BX:Y:^]^4_#` "%cgg.C&D&I"J%j\xjCWBXXcdeELL+,<+=]>JZZk  mE  lF  FG  H  ISWW:;@qA12M1NaPQ"56I5J!LM99U##)LE,*@VX)YYZ[\ 
	DCc4(377:.4"5Hswwv,"-335D#3E#''BX:Y:^]^4_#` /0K""4(#cgg.C&D&I"J!K8TULL2hZr$))K*@)ABC
	D yy3CI;>PQRE 8#t$=@YY[IzsESE5'*IITEJJ~667	8
 99U Js   $a.c                    t        |      }|dv rdn|dv rdnd}|dk(  r$| dk\  rt        | dz         dS t        |        dS |dk(  rt        |        d	S | dk\  rt        | dz         d
S t        |        dS )N>   g lg litrog per lg per literg per litrogg_per_literr  >   gocce/lgocce litrogocce/litrodrop per literdrops per litergocce per litrodrops_per_literdropsr  r,  z kgz gz goccer  z ml)r  rF  )r  r/  normalized_unitr  s       rJ  _format_homemade_quantityr&  #@  s    %&67O mm 	   S  S  	 s{D=,UT\:;3??(/033w(/077}(67r::$U+,C00r  >   cser  r%  r  r  r  r  r  r  r  r  r   r  r#  r$  r  archiviocontengar  r   presentepresenti	contenerer  ingredienteingredientir   r   c                   |j                         }|sd g fS t        |      }| D cg c]/  }t        t        |j                  d      xs d            |k(  s.|1 }}|r|d   |fS | D cg c].  }|t        t        |j                  d      xs d            v s-|0 }}t	        |      dk(  r|d   |fS d |fS c c}w c c}w )Nr  r
  r   r   )r  r  r  rn  r  )r
  r  cleaned_queryr  reciper  partial_matchess          rJ  _match_homemade_recipe_queryr4  X@  s    KKMMRx(7*1z5Fs6::V\K]KcacGd5eiy5yVzMzQ..,3|&7GK\]`agakaklrasaywy]zK{7{v|O|
?q q!?22   { }s   /B7B7).B<B<c                    t        |       D cg c]"  }|t        vrt        j                  d|      r|$ }}|xs t        |       S c c}w )Nz[a-z0-9])r  $_HOMEMADE_INGREDIENT_QUERY_STOPWORDSrF  r3  )r  r  r  s      rJ  "_homemade_ingredient_search_tokensr7  f@  sT     %U+<<;X]A^ 	F 
 +_U++s   'Ac                n    t        | |      ryt        |       dk\  rt        |      dk\  r| d d |d d k(  ryy)NTr   r  F)r  r  )rS  ingredient_tokens     rJ  _homemade_tokens_matchr:  o@  sH    ["23
;1%5!6!!;CR@PTdehfhTi@ir  c                f    t        |       r|syt        |       t        fd|D              S )NFc              3  T   K   | ]  v xs t        fd D                 yw)c              3  6   K   | ]  }t        |        y wrD  )r:  )rH  r9  r  s     rJ  rK  zD_homemade_ingredient_name_matches_query.<locals>.<genexpr>.<genexpr>~@  s     iCS%e-=>ir9  NrI  )rH  r  ingredient_tokensnormalized_names    @rJ  rK  z:_homemade_ingredient_name_matches_query.<locals>.<genexpr>|@  s;        	  	jiWhii	js   $()r  r  r	  )ingredient_namerU  r>  r?  s     @@rJ  '_homemade_ingredient_name_matches_queryrA  w@  s<    '8O,'8  "  r  c                T    t        |      }|dv rt        |        dS t        | |      S )N>   r  parter'  r   parti)r  rF  r&  )r  r/  r%  s      rJ  _format_homemade_match_quantityrE  @  s7    %&67O==(/077$U,<==r  c                   t        |      }g }| D ]  }t        |j                  d      xs d      }t        |j                  d      xs d      }g }t               }t	        |j                  d      t
              r|j                  d      ng }	|	D ]  }
t	        |
t              st        |
j                  d      xs d      j                         }t        ||      sMt        |
j                  d      xs d      }t        |
j                  d      xs d	      }|j                  t        |             |j                  |||t        ||      d
d        t        || d      }t	        |j                  d      t
              r|j                  d      ng }|D ]  }
t	        |
t              st        |
j                  d      xs d      j                         }t        |      }||v rPt        ||      s]t        |
j                  d      xs d      }t        |
j                  d      xs d	      }|j                  |       |j                  |||t        ||      dt	        |
j                  d      t
              r|
j                  d      ng d        |s|j                  |||d        t!        |d       S )Nr  r
  r  ingredientsr@  r/  r  part_amountr  direct)r@  rH  r/  quantity_label
match_typer  r  expanded_ingredientsrH  expandedsources)r@  rH  r/  rJ  rK  rO  )r  r  matched_ingredientsc                P    t        t        | j                  d      xs d            S )Nr  r
  r  r  rn  rj  s    rJ  rk  z7_match_homemade_recipes_by_ingredient.<locals>.<lambda>@  s     ,=c$((6BRBXVX>Y,Z r  rl  )r7  r  rn  rK  r  r  r  r  rA  r  r  r  r  rE  "_calculate_homemade_recipe_payloadr&  r5  )r
  r  rU  r  r2  r>  r@  rP  matched_keysrG  
ingredientr@  r/  rH  expanded_payloadrM  ingredient_keys                    rJ  %_match_homemade_recipes_by_ingredientrX  @  s   5e<L')G =

4(.B/	&**V,2379!$3=fjj>WY]3^fjj/df% 	Jj$/!*..1B"C"IrJPPRO:?LY":>>2D#E#MNZ^^M:AcBH.?@&&'6 ((8&EhP`&a"*	& >fg]`a *../EFM   !78 	
 / 	Jj$/!*..1B"C"IrJPPRO.?N-:?LY":>>2D#E#MNZ^^J7>3?H^,&&'6 ((8&?JZ&[",<Fz~~V_G`bf<gz~~i8mo		. NN#'+>o=| 'Z[[r  c               p  	
 |D ci c]M  }t        |j                  d      xs d      j                         rt        |j                  d      xs d      |O c}|D ci c]V  }t        |j                  d      xs d      j                         r(t        t        |j                  d      xs d            |X c}i i g dfd	dfdd	
fd
 
| |g        g }t	        | j                  d	      t
              r| j                  d	      ng D ]?  }t	        |t              st        |j                  d
            }t        |j                  d      xs d      j                         }|j                  t        |j                  d      xs d      t        |j                  d      xs d      t        |j                  d      xs d      |xs d|z  t        |j                  d      xs d      |xs d t        |      xs) t        t        |j                  d      xs d            v t        |j                  d      xs d      d       B dt        | j                  d      xs d      t        | j                  d      xs d      | j                  d      t        | j                  d      xs d      t        | j                  d      xs t        |            d||t        j                         d       t        j                         d       dS c c}w c c}w )Nr  r
  r  c                2    | vrj                  |        y y rD  r[  )r  warningss    rJ  append_warningz:_calculate_homemade_recipe_payload.<locals>.append_warning@  s    xOOD!  r  r@  r/  c                >   t        |      dv rdn|}t        |        d| }j                  |      }|| |||gd|<   y t        |j                  d      xs d      |z   |d<   |j                  d      }t	        |t
              r||vr|j                  |       y y y )N>   r  rC  r'  r  r  z::)r@  rH  r/  rO  rH  r  rO  )r  r  rn  r  r  r  r  )	r@  rH  source_recipe_namer/  normalized_measurement_unitrF  r  rO  rM  s	           rJ  append_expanded_ingredientzF_calculate_homemade_recipe_payload.<locals>.append_expanded_ingredient@  s    .=>N.OSv.vd  }M#"?34B7R6ST&**3/?#2$$?./	) % #GKK
$;$BsChN
++i(gt$);7)JNN-. *K$r  c                b   |dk  ry t        | j                  d      xs d      }t        | j                  d      xs d      }||v r d| d       y g ||}t        | j                  d      t              r| j                  d      ng }|D ]  }t        |t              st        |j                  d	      xs d      j                         }|sDt        |j                  d
      xs d      }	t        |j                  d            }
|
|
|z  }t        |j                  d      xs d      j                         }|rj                  |      nd }|j                  t        |            }|t        |j                  d      xs d      |k7  r|	dv rt        |j                  d      xs d      }j                  |      }|'|t        |j                  d      xs |      |dd|<   n$t        |j                  d      xs d      |z   |d<    ||dz  |        ||||	        y )Nr   r  r
  r  PrepzTrovato un ciclo nella prep z. L'espansione si ferma qui.rG  r@  r/  r  per_liter_quantitylinked_recipe_id>   r  r  )r>  r@  rH  r/  rH  r  rK  )	r  rn  r  r  r  r  rZ  r  r  )current_recipecurrent_literstrailr>  r@  
next_trailrG  rU  r@  ingredient_unitrc  scaled_quantityrd  nested_recipe	nested_idcurrent_nestedr`  r\  expandnested_recipesrecipes_by_idrecipes_by_lookups                   rJ  rn  z2_calculate_homemade_recipe_payload.<locals>.expand@  sP   Q**406B7	.,,V4>?9+Fbcd(u(i(
;EnFXFXYfFgim;nn((7tv% 	gJj$/!*..1B"C"IrJPPRO"!*..1C"D"LMO!7
G[8\!]!)0>AO":>>2D#E#KLRRTCSM--.>?Y]M$ 1 5 56G6X Y(S1B1B41H1NB-OS\-\ap  uC  bC 1 1$ 7 =2>	!/!3!3I!>!)%.'*=+<+<V+D+W'X$3,0	1N9- 27~7I7I*7U7\Y\1]`o1oN:.}o&>
K&Vef;	gr  rG  rc  rd  rH  r  
percentager  calculation_modeproportional)r@  rH  rr  rH  r/  rd  is_nested_recipers  r2  r  r0  r1  )r  r  r  r0  r1  c                P    t        t        | j                  d      xs d            S )Nr@  r
  rR  rj  s    rJ  rk  z4_calculate_homemade_recipe_payload.<locals>.<lambda>BA  s!    .s488<M3N3TRT/UV r  rl  c                P    t        t        | j                  d      xs d            S )Nr@  r
  rR  rj  s    rJ  rk  z4_calculate_homemade_recipe_payload.<locals>.<lambda>FA  s    .s488M3J3Pb/QR r  )r  r2  r  raw_ingredientsrM  ro  r[  )r  r  r  r]  )
r@  r  rH  r  r^  r  r/  r  r  r]  )re  r  rf  r  rg  r  r  r]  )r  rn  r  r  r  r  r  rZ  r  r  r  r  r  r5  rK  )r2  r
  r  ro  rx  rU  rc  rd  r`  r\  rn  rM  ro  rp  rq  r[  s           @@@@@@@@rJ  rS  rS  @  s    txx~#$**, 	DHHTN b!4'M txx%2&,,. 	#dhhv.4"56<
 :<35NH"/"'g 'gR 6="%/1O3=fjj>WY]3^fjj/df 

*d+3JNNCW4XYz~~.@AGRHNNP#&z~~6G'H'NB#O$Z^^M%B%IcJ#JNN<$@$GCH/63-G$'
7I(J(Rd$S$4$<$()9$:  %S>OPST^TbTbctTuT{y{P|>}  BS  ?S$'
7I(J(\n$]		

& fjj&,"-

6*0b1ZZ( M!:!AcB #FJJ/A$B$Zc/FZ [
 '* & '')V!
 !!!#R
 ' C
s   AL.&AL3c                   t               j                  |       }t        |j                  d      t              r|j                  d      ng }|D cg c]  }t        |t
              s| }}t        |j                  xs d      j                         }|sd|D cg c]y  }t        |j                  d      xs d      t        |j                  d      xs d      t        |j                  d      xs d      t        |j                  d      xs d	      d
{ c}t        |      dS t        ||      \  }}|t        ||      }	|	r0d|dj                  t        |            xs ||	d d t        |	      dS |rdnd||d d D cg c]?  }t        |j                  d      xs d      t        |j                  d      xs d      dA c}dS t!        |||j"                  xs d      S c c}w c c}w c c}w )Nr
  r
  r  r  r  r1  r   r0  r  )r  r  r1  r0  )r  r
  total_countingredient_searchr  r
  )r  r  ingredient_queryr  rz  rg	  re	  rn  )r  r  )r  r  r  r  rL  )r*   list_homemade_recipesr  rn  r  r  r  r  r  r  r  r  r4  rX  r  r7  rS  r  )
r  r$  r  r
  r2  normalized_recipesr  matched_reciper  ingredient_matchess
             rJ  r  r  LA  s    66w?G(27;;y3I4(Pgkk)$VXG/6SV*VT:R&SS

 b!'')E 1  fjj.4"5

6 2 8b9(+FJJ7I,J,Oa(P#(M)B)Ic#J	 12
 	
 ;;MuUNGBCUW\]+$'HH-OPU-V$W$`[`-cr2"#56  $+K &crl
  fjj.4"5

6 2 8b9

 
	
 .((/C Q T
4s   G(&G(A>G-AG2c                   t        | j                  d      xs d      }|dk(  rt        | j                  d      t              r| j                  d      ng }|sydg}|D ]q  }t        |t              s|j                  d|j                  d       dt        |j                  d	      xs d
       dt        |j                  d             d       s dj                  |      S |dk(  rt        | j                  d      xs | j                  d      xs d      }t        | j                  d      t              r| j                  d      ng }|sd| dS d| dg}|D ]`  }t        |t              st        |j                  d      xs d      }t        |j                  d      t              r|j                  d      ng }	g }
|	D ]  }t        |t              st        |j                  d      xs d      j                         }t        |j                  d      xs d      j                         }t        |j                  d      xs d      }|dk(  rd nd!}|r|r|
j                  | d"| d#| d$       |s|
j                  | d#| d$        |j                  d| d|
rd%j                  |
      nd&        c dj                  |      S |d'k(  r$t        | j                  d      xs d(      }d)| dS |d*k(  rt        | j                  d      t              r| j                  d      ng }|sy+d,g}|D ]6  }t        |t              s|j                  d|j                  d              8 dj                  |      S t        | j                  d-      t              r| j                  d-      ni }t        |j                  d      xs d      }t        | j                  d.      xs d/      }t        | j                  d0      t              r| j                  d0      ng }t        | j                  d1      t              r| j                  d1      ng }t        | j                  d2      t              r| j                  d2      ng }d3| d4t        |       d5g}|rg }|D ]^  }t        |t              s|j                  |j                  d6       d"t        t        |j                  d7      xs d8      d9              ` |r$|j                  d:d%j                  |       d       |r|j                  d;       |D ]{  }t        |t              s|j                  d|j                  d       dt        t        |j                  d7      xs d8      t        |j                  d<      xs d9                    } |r,|j                  d=       |D ]  }|j                  d|         dj                  |      S )>Nr  r  r
  z.Non trovo ricette homemade salvate nel locale.zRicette homemade del locale:r
  r  r
  r1  r   z ingredienti, r0  rD  r
  r{  r|  r  zingrediente richiestor  z*Non trovo ricette homemade che contengano r  z Ricette homemade che contengono r  RicettarP  r@  r
  rJ  rK  rI  rN  zespanso da prep interneznella ricetta baser  r;  r=  r<  zingrediente trovatore	  zquesta ricettaz1Non trovo una ricetta homemade che corrisponda a rg	  z7Non riesco a individuare la ricetta homemade richiesta.zDHo trovato piu ricette homemade compatibili. Dimmi quale vuoi usare:r2  r  r  rM  ro  r[  zRicetta homemade: zProduzione richiesta: z L.r@  rH  r  r  zPrep interne espanse: zIngredienti finali:r/  zNote:)r  rn  r  r  r  r  r  rF  r  r  r  r&  )r	  r  r
  r
  r2  r  r  r  r@  ingredient_rowsr  rU  r@  rJ  rK  rI  r  rM  ro  r[  nested_labelsro  r  s                          rJ  _render_homemade_tool_resultr  ~A  s   vzz&!+V,Dv~+5fjj6KT+R&**Y'XZC/0 	Ffd+LLVZZ'(3vzz:L/M/RQR+S*TTbdz  |B  |F  |F  GT  |U  eV  cX  X^  _	 yy""FJJ12dfjj6IdMde+5fjj6KT+R&**Y'XZ?waHH3E7!<= 	iEeT*eii/<9=KBLUYYWlMmosBteii(=>z|O!#G- 
D
!*d3"%jnn5F&G&M2"N"T"T"V!$Z^^4D%E%K!L!R!R!T !=!IJ
6@J6N2Th"~NNo%6a7Gr&QR#ST$NNo%6b#BC
D LL2k]"7TYYw-?Pe,fgh#	i$ yy{FJJw';+;<B5'KK{+5fjj6KT+R&**Y'XZLWX 	7E%&r%))F"3!456	7 yy%/

80Dd%KVZZ!QSFfjj(5I6K&**_5<=MAKFJJWmLnptAu6::&<={}5?

K[@\^b5cVZZ 01ikN)3FJJz4JD)Qvzz*%WYH [M*
 !7!F GsKE " 	DdD)  88M*+1-FuTXXV`MaMhehGiko-p,qr	 LL1$))M2J1K1MN*+. 	Jj$/LLZ^^$567r:STYZdZhZhisZtZ{x{T|  B  CM  CQ  CQ  Rd  Ce  Cm  im  n  ;o  :p  q	 W 	)GLL2gY(	)99Ur  c                   |sy |d   }t        |t              rd|vry 	 |j                  d      t        |j                  d            nd }t        |j                  d      xs t        |       xs d      j                         }t        |j                  d      xs d      j                         }|xs |}t        |j                  d      xs d      j                         }t        |j                  d      xs d      }||dk  r6|rd| nd}	t        j                  d	|      rd
| n	|rd| dnd}
d|	 |
 dS t        j                  d	|      rd
| }n-d|v r|j                  dd      \  }}d| d| }n|rd| d}nd}|rd| nd}t        |j                  d      xs d      }|dk(  rd}nd}dt        |       | | d| dS # t        t
        f$ r d }Y w xY w)Nr   total_amount_including_vatr  r
  rN  r  document_countr
  r   r
  r;  r=  z2Non trovo documenti fiscali con totale IVA inclusor  r  r    dal rG  z con calculation_basisdocument_total_vat_includedz$totale documenti fiscali IVA inclusaz'righe documento con IVA inclusa stimatazAbbiamo speso ).)r  r  rn  r  rX  r  r  r  r  r  rF  r'  r  rC  )r  rQ  rJ  r^  r  rN  r  r  r  r  period_suffixr  r  r  subject_labelbasisrg  s                    rJ  !_render_fiscal_spend_query_resultr  A  s   
q'Cc4 $@$KADIeAfArsww;<=x|  N$?$HNBOUUWECGGK(.B/557I 5G"(b)//1F!127a8N~1,&-5	"2,.LLV,L%x(djTVW]V^^_R`prCF8M?Z[\\	||J'vh'	&\\%+
sugT#/	F81~)0eG9%bM+,23E--7:K/0~RPVxWYZZ; z" s   -G G#"G#c                (   |sy|d   }d|vrd|vry t        |j                  d      xs d      j                         xs d}t        |j                  d      xs d      j                         }|rd	| nd}d
| d| dg}|d d D ]J  }t        |j                  d      xs |j                  d      xs d      j                         }t        |j                  d      xs d      j                         xs d}	t        t	        |j                  d            xs d      }
t	        |j                  d            xs d}t        |      }t        |j                  d      xs d      j                         }|dk(  r
|dk(  rdnd}n	|dk(  rdnd}t        t	        |j                  d            xs d      }t        t	        |j                  d            xs d      }t        t	        |j                  d                  }d}t        |j                  d      xs |j                  d      xs d      j                         }t        |j                  d       xs |j                  d!      xs d      j                         }|r|r||k7  r	d"| d#| }n|rd$| }|d%| d&nd}|j                  d'| d(|
 d)|	 d*| d)| | d+| d)|	 d,| d)|	 |        M t        |      dkD  r!|j                  d-t        |      dz
   d.       d/j                  |      S )0NzDNon trovo consumi delle preparazioni homemade nel periodo richiesto.r   homemade_consumption_resultrG  r  r
  r  r  r
  zConsumi preparazioni homemader;  z):r  r@  r  Preparazioner/  r  workdays_countr  operational_calendarr   zgiorno operativo calendariozgiorni operativi calendariozgiorno con consumozgiorni con consumoaverage_daily_consumptioncurrent_quantitycoverage_dayscalculation_start_datefirst_consumed_datecalculation_end_datelast_consumed_datez, dal rG  z, il z, copertura r  r
  z: consumati r  r  z; media z/giorno; stock attuale z... e altre z preparazioni.r
  )r  rn  r  rF  rZ  r  r  r  )r  rQ  r  r  r  subject_suffixr
  rJ  r@  r  consumedraw_daysrr  r  	day_labelaverager  coverage
date_range
first_date	last_datecoverage_parts                         rJ  /_render_homemade_stock_consumption_query_resultr  B  s#   UQI$I5:MU^:^~.4"5;;=TATF	g&,"-335E(-uUG_2N,^,<BvhbIJECRy 
#''-0UCGGFOU~V\\^377-.6$7==?G4)*@I\A]*^*cbcd)#''2B*CDI%h/(; < BCIIK 669AQ5LiI08A,CWI()?Hc@d)e)jijk()?HZ@[)\)a`ab)*@AY*Z[
!9:bcggF[>\b`bciik
 67^377CW;X^\^_eeg	)
i(?!*T)=J -J<D<P,xj8VX\(1TF$tfAi[Q[P\ ]IQtf$;G9AdVM?\	
-
4 4y2~|CIN#3>BC99Ur  c                   t        |j                  d      xs d      }|j                  d      }t        |t              sy |dk(  rVt        |j                  d      t              r|j                  d      ng }|sydg}|D ]  }t        |t              st        |j                  d      t              r|j                  d      ng }|D cg c]^  }t        |t              st        |j                  d	      xs d      j                         sAt        |j                  d	      xs d      ` }	}t        |j                  d
      xs d      }
dj                  |	      }|j                  d|j                  d       d|
 d|        
 dj                  |      S |dk(  r4t        |j                  d      t              r|j                  d      ng }t        |j                  d      t              r|j                  d      ng }t        |j                  d            }t        |j                  d      xs d      }t        |      ry t        |      r+t        | |D cg c]  }t        |t              s| c}      S t        |      r+t        | |D cg c]  }t        |t              s| c}      S t        |      r*t!        |D cg c]  }t        |t              s| c}      S t#        |      r+t%        | |D cg c]  }t        |t              s| c}      S t'        |      r/t)        | |D cg c]  }t        |t              s| c}      }||S |sy|st+        |       t-        |      st/              rt1        |       }||j3                         nd}|spdv r&t5               t7        d      z   j3                         }nFdv r&t5               t7        d      z
  j3                         }ndv rt5               j3                         }t9        |       }|rt;        |d         nd }dv sdv rdndv rd nd!}t=        |||"      S y#d$t?        |       d%|rd&nd'z   g}|D ]Y  }t        |t              s|D cg c]  }| d(|j                  |        }}|j                  dd)j                  |      z          [ dj                  |      S |d*k(  rtA        |      S |d+k(  r t+        |       t        |j                  d,      xs d-      }t        |j                  d.      t              r|j                  d.      nd }t        |j                  d/      t              r|j                  d/      ng }t        |j                  d0      t              r|j                  d0      ng }t        |j                  d1      t              r|j                  d1      ng }t        |j                  d2            }|d3k(  r|sy4d5g}|D ]  }t        |t              s|j                  d6      xs( |j                  d7      xs |j                  d8      xs d9}|j                  d| d:t        |j                  d;      xs d      jC                  d<d=      d d>          dj                  |      S tE        |j                  d?            }tE        |j                  d@            } tE        |j                  dA            }!|r| r|| k(  rdB| }"n%|r| r	dC| dD|  }"n|!rdB|! }"n|d-k(  rdn|dEk(  rdFndG}"tG        fdHdID              }#|tI        |j                  dJ            }$|j                  d6      xs( |j                  d7      xs |j                  d8      xs dK}%|#r#|"d d jK                         |"dd  z   }&|& dL|$ d'g}n%|"d d jK                         |"dd  z   }&|& d=|% dM|$ d'g}|r|r|j                  dN       |D ]  }t        |t              st        |j                  d;      xs d      jC                  d<d=      d d> }|j                  dO      r1t        |j                  dO      xs d      jC                  d<d=      d d> ndP} tI        |j                  dQ            }'|j                  d| dR|  dS|' dT        dj                  |      S |rtM        dU |D              }(tM        dV |D              })dW|" dXg}|j                  dYtI        |(       dZ|) d[       |D ]  }t        |t              s|j                  d6      xs( |j                  d7      xs |j                  d8      xs d9}tI        |j                  dJ            }$|j                  d| d|$ dZt        |j                  d1      xs d       d\        dj                  |      S |d-k(  rd]|" d'S |dEk(  rd]|" d'S d]|" d'S |d^k(  rtO        |      S |d_k(  rt        |j                  d`      xs d      }*t        |j                  dA      xs d      }t        |j                  da      xs d      j                         }t        |j                  db      xs d!      }t        |j                  dc      t              r|j                  dc      ng }+t        |j                  dd      t              r|j                  dd      ng },|rde| nd}-t+        |       tM        df |,D              }.tM        dg |,D              }/tQ              r|,r|rdh| di|. dj|/ dkg}ndl|. dmg}|,D ]  }0t        |0t              s|r[|j                  d|0j                  dn       d|0j                  do       dp|0j                  dq       dr|0j                  ds       dt	       q|j                  d|0j                  dn       d|0j                  do       du        |*dk(  r|j                  t=        |||"             dj                  |      S |*dk(  rt=        |||"      S |dk(  rdn|d k(  rdndv}1|r0dw|1 dx| de| dy|* dzt        |j                  d{      xs d       d|g}n,dw|1 dx| dy|* d}t        |j                  d~      xs d       d	g}|,r|j                  d       |,D ]   }0t        |0t              s|r|j                  d|0j                  dn       d|0j                  ds       d|0j                  do       d|0j                  dq       d|0j                  d       d|0j                  d       d       |j                  d|0j                  dn       d|0j                  d       d|0j                  ds       d|0j                  do       d|0j                  dq       
        |+D ]  }2t        |2t              st        |2j                  d      xs d      j                         }3|3rd|3 nd}4t        |2j                  dn      xs d      j                         }5|5rd|5 nd}6|j                  d|2j                  d       d|2j                  d       d|2j                  d       d|6 |4 	        dj                  |      S |dv rt        |j                  d      xs d      }7|7dk(  rt        |j                  d      xs d      j                         }8t        |j                  d      t              r|j                  d      ng }9|9r/|8 dtS        |9D :cg c]  }:t        |:t              s|: c}:       S |8xs dS |7dv rt        |j                  d      xs d      S t        |j                  d      t              r|j                  d      ni };|7dk(  rKd|;j                  d       d|;j                  d       de|;j                  d       d|;j                  d       d	S |7dk(  rKd|;j                  d       d|;j                  d       de|;j                  d       d|;j                  d       d	S |7dk(  r9d|;j                  d       dx|;j                  d       de|;j                  d       d'S y |dk(  rt        |j                  d      xs d      }7|7dk(  rt        |j                  d      xs d      j                         }8t        |j                  d      t              r|j                  d      ng }9|9ra|8g}|9D ]H  }:t        |:t              s|j                  d|:j                  d       d|:j                  d              J dj                  |      S |8xs dS |7dv rt        |j                  d      xs d      S t        |j                  d      t              r|j                  d      ni }<|7dk(  rd|<j                  d       S |7dk(  r&d|<j                  d       d|<j                  d       S |7dk(  rd|<j                  d       d'S y |dk(  rct        |j                  d      xs d      }7|7dk(  rt        |j                  d      xs d      j                         }8t        |j                  d      t              r|j                  d      ng }9|9rt|8g}|9D ][  }:t        |:t              s|j                  d|:j                  d       d|:j                  d	       dS|:j                  d       dT       ] dj                  |      S |8xs dS |7dv rt        |j                  d      xs d      S t        |j                  d      t              r|j                  d      ni }=|=j                  d      }>d }!t        |>t        tT        f      r[tU        |>      jW                         rt        t        |>            n-t        tY        tU        |>      d            jC                  d'd      }!t        |=j                  d      xs |=j                  d      dk(  rdnd      j                         }?d }"|=j                  d      rd|=j                  d       }"n%|=j                  d      rd|=j                  d       }"g }@|!Et        |=j                  d      xs d      dk7  r$@j                  |! d=|? j                                |"r@j                  |"       @rdd=j                  @       nd}A|7dk(  r*d|=j                  d       d|=j                  d	       dA d'S |7dk(  r*d|=j                  d       d|=j                  d	       dA d'S |7dk(  r'd|=j                  d       d|=j                  d	       dƝS y |dk(  rgt        |j                  d      xs d      }7|7dk(  rt        |j                  dȫ      t              r|j                  dȫ      ng }Bt        |j                  dɫ      t              r|j                  dɫ      ng }Cdg}|CD ]6  }2t        |2t              s|j                  d|2j                  d̫              8 BD ]6  }2t        |2t              s|j                  d|2j                  d̫              8 dj                  |      S |7dk(  rPt        |j                  dΫ      t              r|j                  dΫ      ng }+dj                  dτ |+D              }Dd|D d'S y |dk(  rt        |j                  dc      t              r|j                  dc      ng }+|+sydg}|+D ]Z  }2t        |2t              s|j                  d|2j                  d       d=|2j                  dԫ       d|2j                  d              \ dj                  |      S |dk(  rkt        |j                  d֫      t              r|j                  d֫      ng }E|j                  d      }F|EsdF d؝S t+        |       dىv sdډv rED =cg c]*  }=t        |=t              s|=j                  d۫      dk7  s)|=, }G}=ED =cg c]*  }=t        |=t              s|=j                  d۫      dk(  s)|=, }H}=dF dݝg}d}IGD ]  }=|=j                  d۫      dk(  rtU        |=j                  d߫      xs d      }JtU        |=j                  d      xs d      }KtU        |=j                  d      xs d      }LtU        |=j                  d      xs d      }Mt[        KJz
  d      }Nt[        |MLz
  d      }O|Ndk  rOdk  rIdz  }I|j                  d|=j                  d	       dt]        N       dt]        J       dt]        K       dt]        O       dt]        L       dt]        M       d       -tU        |=j                  d      xs d      }PtU        |=j                  d      xs d      }>t[        |>Pz
  d      }Q|Qdk  rIdz  }It        |=j                  d      xs d      j                         }R|j                  d|=j                  d	       dt]        Q       d=|R dt]        P       dt]        |>       d=|R d         Idk(  r|j                  d       HrM|j                  d       HD ]7  }=|j                  d|=j                  d	       d|=j                  d              9 dj                  |      S t_              rED =cg c]*  }=t        |=t              s|=j                  d۫      dk7  s)|=, }G}=ED =cg c]*  }=t        |=t              s|=j                  d۫      dk(  s)|=, }H}=dF dXg}GD ]  }=tU        |=j                  d      xs d      }PtU        |=j                  d      xs d      }>t        |=j                  d      xs d      j                         }R|>dk  rdnt[        dta        P|>z  dz  d            }St        tY        |Sdz  dz              }Td|Tz  dd|Tz
  z  z   }U|j                  d|=j                  d	       d|U d|SddP d|> d=R dT        HrL|j                  d       HD ]6  }=t        |=t              s|j                  d|=j                  d	              8 dj                  |      S dF dg}ED ]8  }=t        |=t              s|=j                  d۫      dk(  r6|j                  d|=j                  d	       d|=j                  d              _|=j                  d۫      dk(  rm|j                  d|=j                  d	       d|=j                  d߫       d|=j                  d       d|=j                  d       d|=j                  d       d       |j                  d|=j                  d	       d|=j                  d       d|=j                  d       d=|=j                  d              ; dj                  |      S |dk(  r|j                  dg       D Vcg c]  }Vt        |Vt              sV }W}V|Wsyt+        |       d7v xr tG        fd dD              xs dv }X|Xr.dg}|jc                  d WD               dj                  |      S dt?        W       d'g}|WD ]1  }Vt        |Vj                  d	      xs* Vj                  d7      xs Vj                  d      xs d      j                         }t        Vj                  d7      xs d      j                         }Yt        Vj                  d      xs d      j                         }Zt        Vj                  d      xs d      j                         }[Yrd	Y ndZrd
Z nd[rd[ ndfD \cg c]  }\|\s\	 }]}\|j                  d| ddj                  |]              4 dj                  |      S |dk(  r1t        |j                  dc      t              r|j                  dc      ng }+t        |j                  d      xs t?        |+            }^t        |j                  d      xs d      j                         }_t        |j                  d      t              r|j                  d      ng }`dj                  d |`D              j                         }a|axs _xs d}b|+sardb d'S db d'S t+        |       te        |       xs _}c|+D 2cg c]  }2t        |2t              s|2 }d}2tg        |dc      \  }e}fti              rexs d}dt?        |d      dk(  sYt?        d      dkD  rutU        dd   j                  d      xs d      tU        dd   j                  d      xs d      dz   k\  r+dd   }2t        |2j                  d      xs d      j                         }gt        |2j                  d      xs d      j                         }hg|hfD \cg c]  }\|\s\	 }i}\|irdSdj                  i       dTnd}jtk        |2j                  d            }k|k$|2j                  d       j dt]        k       dS tm        h      rd|2j                  d       j dS hrd|2j                  d       j dh d'S d|2j                  d       j dS d g}dD ]  }2t        |2j                  d      xs d      j                         }gt        |2j                  d      xs d      j                         }hg|hfD \cg c]  }\|\s\	 }i}\|irdSdj                  i       dTnd}jtk        |2j                  d            }k|kt]        k       d!}lntm        h      rd"}lnd#hxs d$ }l|j                  d|2j                  d       j dl         dj                  |      S to              rexs d}m|msdb d'S cxs# t        md   j                  d      xs d%      }nt?        mD 2ch c]/  }2t        |2j                  d      xs d      j                         1 c}2      dk(  r"t        md   j                  d      xs n      }nd&n dXg}mD ]  }2t        |2j                  d      xs d      j                         }ot        |2j                  d      xs d      j                         }gt        |2j                  d      xs d      j                         xs d$}hd#|h g}]gr]j                  d'g        t        |2j                  d(      xs d      j                         }p|pr]j                  d)p        t        |2j                  d*      xs d      j                         }q|qr]j                  d+q        tq        |2j                  d,            }r|rr]j                  d-r        tk        |2j                  d            }k|k]j                  d.t]        k              ntm        h      r]j                  d/       tk        |2j                  d0            }s|s]j                  d1t]        s              t        |2j                  d2      xs d      }t|tdkD  r]j                  d3t        t        |2j                  d4      xs d      j                         jC                  d<d=      }u|ur]j                  d5u        tdk  rus]j                  d6       |j                  do ddj                  ]               dj                  |      S ts              rog }vexs dD ]:  }2t        |2t              stu        |2      \  }w}x|wx'vj                  |2wxf       < vs	 y7vjw                  d8 9       d:g}|vD ]  \  }2}w}xt        |2j                  d      xs d      j                         }gt        |2j                  d      xs d      j                         }hg|hfD \cg c]  }\|\s\	 }i}\|irdSdj                  i       dTnd}jty        wxz
        d;k  rtq        w       d<}rnd=tq        w       d>tq        x       d<}r|j                  d|2j                  d       j dr         dj                  |      S t{              r@exs dD 2cg c]&  }2t        |2t              r|2j                  d,      |2( }y}2|ysard?b d@S dAb d@S ardBb dX}znfrdCcxs b dX}zndDb dX}zz d=t?        y       dEg}|yD ]  }2t        |2j                  d      xs d      j                         }gt        |2j                  d      xs d      j                         }hg|hfD \cg c]  }\|\s\	 }i}\|irdSdj                  i       dTnd}j|j                  d|2j                  d       |j         dj                  |      S t}              rexs dD 2cg c]&  }2t        |2t              r|2j                  d,      |2( }{}2|{syFt              rta        {dG 9      }|t        ||j                  d      xs d      j                         }gt        |j                  d      xs d      j                         }hg|hfD \cg c]  }\|\s\	 }i}\|irdSdj                  i       dTnd}jtq        |j                  d,            }rdH||j                  d       |j d|r dIS t?        {      dk(  r{d   }2t        |2j                  d      xs d      j                         }gt        |2j                  d      xs d      j                         }hg|hfD \cg c]  }\|\s\	 }i}\|irdSdj                  i       dTnd}jtq        |2j                  d,            }r|2j                  d       |j d|r dIS {d   }}tU        |}j                  d      xs d      }~tU        {d   j                  d      xs d      }~|dz   k\  r}}2t        |2j                  d      xs d      j                         }gt        |2j                  d      xs d      j                         }hg|hfD \cg c]  }\|\s\	 }i}\|irdSdj                  i       dTnd}jtq        |2j                  d,            }r|2j                  d       |j d|r dIS dJg}{D ]  }2t        |2j                  d      xs d      j                         }gt        |2j                  d      xs d      j                         }hg|hfD \cg c]  }\|\s\	 }i}\|irdSdj                  i       dTnd}jtq        |2j                  d,            xs dK}r|j                  d|2j                  d       j d|r dL        dj                  |      S tG        fdMdND              r~g }exs dD ]Y  }2t        |2t              st        |2j                  dO      xs d      j                         }|sDvsIj                         [ rdPdj                        z   d'z   S exs d}ar(^dk(  rdQnd}^dk(  rdRndS}dT^ d= d=| dUb dX	g}nTfr*t?              }|dk(  rdVndW}dX d=| dYcxs b dXg}n(^dk(  rdQnd}^dk(  rdZnd[}dT^ d= d\| d]b dX	g}D ]  }2t        |2t              st        |2j                  d      xs d      j                         }ht        |2j                  d      xs d      j                         }g|ghfD \cg c]  }\|\s\	 }i}\|irdSdj                  i       dTnd}j|j                  d|2j                  d       |j         dj                  |      S |d^k(  rjt        |j                  d      xs d      }7|7dk(  rt        |j                  d      xs d_      S |7d`k(  rt        |j                  d      xs da      S t        |j                  db      t              r|j                  db      ni }|j                  dc      xs g D cg c]4  }t        |      j                         rt              j                         6 }}g }it        j                  d      xs d      j                         }gt        j                  d      xs d      j                         }hgrgt        k7  rij                  g       hrht        k7  rij                  h       irdSdj                  i       dTnd}jtq        j                  d,            }r|rrddr d'nd}tq        j                  de            }|rdf dgnd}d}rdhdj                         di}|7dk(  rdjj                  d       j d'   S |7dk(  rdkj                  d       j d'   S |7dk(  rdlj                  d       j d'S y |dmk(  rMt        |j                  dn      t              r|j                  dn      ni }t        |j                  do      t              r|j                  do      ni }|j                  dp      }|j                  dq      }|j                  dr      }|j                  ds      }t        |j                  d      xs d      j                         }_t+        |       t        |j                  dt      xs d      j                         }|duv rnt        _      }t              }t              }_rdv_ dXndwg}t        j                  dx      xs d      }t        j                  dx      xs d      }t        j                  dy      xs d      }t        j                  dy      xs d      }t        j                  dz      xs d      }t        j                  dz      xs d      }tk        j                  d{            }tk        j                  d{            }t        |j                  d|      xs d      }t        j                  d|      xs d      }d}k(  rhk(  r |j                  d~ d d d'       nkD  r|j                  d d d d'       n|j                  d d d d'       n}dk(  rhk(  r |j                  d~ d d d'       nRkD  r|j                  d d d d'       n.|j                  d d d d'       ndk(  r	 yxs d}xs d}|k(  r(|j                  d~ d dtq               d'       nkD  r0|j                  d dtq               dtq               d'       n|j                  d dtq               dtq               d'       ndk(  r|j                  d~ d d d'       n@kD  r|j                  d d d d'       n|j                  d d d d'       t        |j                  d            xs d| v xs dv }|rd}k(  r}}d}n+dk(  r}}d}ndk(  rxs d}xs d}d}n}}d}dkD  rUk7  rPz
  |z  dz  }|dkD  rdnd}|j                  d dt        ty                     d| d d d'       n%dk(  r dkD  r|j                  d d d       d d d d }d d d d }dtq               z  }dtq               z  }|j                         |j                         t        |j                  d      xs d      }t        |j                  d      xs d      }t        |j                  d      xs d      }dkD  rdn
dk  rdnd}dkD  rdn
dk  rdnd}dkD  rdn
dk  rdnd}d d dty               d dty               d dty               d| d'}dk(  rHxs d}xs d}|z
  }|dkD  rdn
dk  rdnd}dtq        ty                    xs d d= d'z  }|j                         dk(  rt        j                  d      xs d      dk(  r6t        j                  d      xs d      dk(  r|j                  d       n|j                  d       sr!|j                  d d= d d= d	       t        j                  d      t              rj                  d      ng }|r|j                  d dX       D ]r  }t        |t              s|j                  dj                  d       d|j                  d       d|j                  d       d|j                  dz              t dj                  |      S |dk(  rt        |j                  d      xs d      }7|7dk(  rt        |j                  d      xs d      S |7dk(  rt        |j                  d      xs d      S t        |j                  d      t              r|j                  d      ni }|j                  d      dk(  rdnd}t        j                  d      xs d      j                         }Dt        j                  d«      xs d      j                         }|rd nd}d dj                  dū       d| d'g}Dr|j                  D       t        j                  dƫ      xs d      j                         }|r|j                  d        dj                  |      S |dk(  rt        |j                  dc      t              r|j                  dc      ng }+|+syt        |j                  dʫ      xs t?        |+            }t        |j                  d?      |j                  d@      |j                  d      |j                  d˫      ̫      }"d}z|"rz d=|" }zz d dΝg}|+D ]  }2t        |2t              st        |2j                  dϫ      xs d      }	 t        j                  jC                  dАdѫ            j                  dҫ      }|j                  d d|2j                  dӫ       d|2j                  d       d|2j                  d               dj                  |      S |dk(  rt        |j                  d֫      t              r|j                  d֫      ng }|syt+        |       t        |j                  d?      |j                  d@      |j                  d      |j                  d˫      ̫      }"t        |       }|zt?              k\  rlt        dz
     t              rdz
     nd }|yt        | t        |j                  d      xs d            }|S dj                  t                    S t?              dk(  st              rtt        |       dk(  rft        d   t              rd   nd }|yt        | t        |j                  d      xs d            }|S dj                  t                    S d}z|"rz d=|" }zz dXg}D ]  }t        |t              st        j                  dϫ      xs d      jC                  d<d=      }tk        j                  d٫            }|Ádtq        ë       nd}|j                  dj                  dܫ       dx d|j                  dݫ       d|j                  dz       |ě 	        dj                  |      S |dk(  rt        |j                  dy      xs d      }t        |j                  d      t              r|j                  d      ng }t        |j                  d      xs d      j                         }_t        |j                  d      xs d      j                         jC                  d<d=      }t        |j                  d4      xs d      j                         jC                  d<d=      }ut        |j                  d?      |j                  d@      |j                  d      |j                  d˫      ̫      }"dk(  r3|"r%|"d d jK                         |"dd  z    d_xs d d'S d_xs d d'S t        t+        |             r_xs d}u}|ur:	 t        j                  ujC                  dАdѫ            }|j                  dҫ      }g }dt+        |       v sdt+        |       v rur	 t        j                  ujC                  dАdѫ            }t[        t5               |j                         z
  j                  d      }|j                  dǛ d|j                  dҫ       d|ʛ d       n3|j                  dǛ d'       nr|j                  dǛ dț d'       rUuk7  rP	 t        j                  jC                  dАdѫ            }|j                  dҫ      }|j                  d̛ d'       |j                  dś dt        |j                  dz      xs d       d'       dj                  |      S t        t+        |             r}|j                  d      }|̀y_xs d}g }|"rA|j                  |"d d jK                         |"dd  z    dt        ͫ       dǛ dZś d       n'|j                  dt        ͫ       dǛ dZś d       D cg c](  }t        |t              sj                  d      '* }}|r|j                  d       D ]k  }|j                  d|j                  d       d|j                  d       dt        |j                  d             dZ|j                  d       d	       m tM        d D              }|r|j                  dϛ d       dj                  |      S g }_xs d}_sK|"r1|j                  |"d d jK                         |"dd  z    dś d       nh|j                  dś d       nP|"r4|j                  |"d d jK                         |"dd  z    dǛ dZś d       n|j                  dǛ dZś d       |j                  dt        |j                  dz      xs d       d'       _sdj                  |      S t?              dk(  rwd   }t        |t              r|j                  dj                  d       d|j                  d       d|j                  d       d|j                  dz       d'	       n|j                  d       D ]r  }t        |t              s|j                  dj                  d       d|j                  d       d|j                  d       d|j                  dz              t dj                  |      S |d k(  rbt        |j                  dc      t              r|j                  dc      ng }+t+        |       t        |j                  d      xs d      j                         }_t        |j                  d?      |j                  d@      |j                  d      |j                  d˫      ̫      }"|+s<t              rtk        |j                  d{            }|Ё[d}_r|"rћ d=tq        Ы       d_ d=|" d'S _rћ d=tq        Ы       d_ d'S |"rћ d=tq        Ы       d=|" d'S ћ d=tq        Ы       d'S _r|"rd_ d=|" dtq        d       d'S _rd_ dtq        d       d'S |"r(|"d d jK                          |"dd   dtq        d       d'S dtq        d       d'S _s6tG        fddD              r |"r|"d d jK                          |"dd   dS yt              r	_rd_ d'S y	|j                  d      }F|j                  d˫      }t        t        |t              rnd       }g }|rFrj                  d
ӛ d=F        n/rj                  d
ӛ        nFrj                  dF        t        |j                  d      t              r|j                  d      ng }tG        fddND              rsrqg }D ]P  }t        |t              s|j                  d      s'j                  t        |j                  d                   R rddj                        z   d'z   S t        |j                  d      t              r|j                  d      ng }t        |j                  d      xs t?        |+            }t        |j                  d|      xs d      }dj                  d D              xs dj                  d D              }ؐrt              r|+D 2cg c]&  }2t        |2t              r|2j                  d{      |2( }y}2|yrPd}z_rz d_ }zrz d=d=j                  ԫ       }zz dt?        y       dg}|yD ]  }2t        |2j                  d      xs d      j                         }ht        |2j                  d      xs d      j                         }gg }@|gr@j                  d'g        hr@j                  d#h        |2j                  dz      %@j                  d|2j                  dz              @rddj                  @       nd}A|j                  d|2j                  d       |A         dj                  |      S t              st              rd}z_rCt?        ֫      dk(  r-t        d   t        t        f      rd   rz dd   d    }znz d_ }zrz d=d=j                  ԫ       }zz dכ dg}|+D ]  }2t        |2t              st        |2j                  d      xs d      j                         }hd|2j                  dz       g}]|hr]j                  d#h        t?        ֫      dk(  rt        d   t        t        f      rd   s%]j                  d'|2j                  d              |j                  d|2j                  d       ddj                  ]               t?        |+      kD  r#|j                  dt?        |+      z
   d       dj                  |      S d}zrz d=d=j                  ԫ       }zz dXg}r|j                  dٛ d'       t              rtk        |j                  d{            }t        |j                  d      xs d      }Ѐy_xs d}g }ڐdk(  rdnd}_r\r6|j                  ћ d=tq        Ы       dǛ d=d=j                  ԫ       d'       ny|j                  ћ d=tq        Ы       dǛ d'       nUr3|j                  ћ d=tq        Ы       d=d=j                  ԫ       d'       n |j                  ћ d=tq        Ы       d'       t              r|d   S ڐdk(  r|j                  d       n|j                  d        r|j                  dٛ d'       |+D 2cg c](  }2t        |2t              s|2j                  d{      '|2* }{}2|{D ]V  }2|j                  d|2j                  d       d|2j                  d       dtq        |2j                  d{                    X r|j                  d؛ d       dj                  |      S t              ra|+D 2cg c](  }2t        |2t              s|2j                  d      '|2* }}2tM        d! |D              }|dk  ry"_xs d}g }r6|j                  d#t        ͫ       dǛ d=d=j                  ԫ       d'       n#|j                  d#t        ͫ       dǛ d'       r|j                  dٛ d'       D ]V  }2|j                  d|2j                  d       d|2j                  d       dt        |2j                  d                    X tM        d$ |+D              }C|Cr|j                  dC d%       dj                  |      S _rt?        |+      dkD  rt              r|+D 2cg c]  }2t        |2t              s|2 }m}2|mD 2cg c]  }2t        |2       }}2g }mrt        d& D              rutM        d' D              }|j                  r:d=j                  ԫ      d d jK                         d=j                  |ԫ      dd  z   d=z   nd d(t]        ݫ       d)_ d'       n$|j                  d*t?        m       d+_ d,       |j                  d       mD ]  }2t        |2j                  d      xs d      j                         }h|hrd=h nd}|j                  d|2j                  d       d|2j                  d       d|2j                  dz       |ޛ         dj                  |      S _r4t?        |+      dk(  r%t              s|+d   }2t        |2t              rt        |2j                  d      xs _      j                         }ot        |2j                  d      xs d      j                         }gt        |2j                  d      xs d      j                         }ht        |2j                  dz      xs d      }hrߛ d=h n
t        ߫      }d=j                  ԫ      }|r|d d jK                          |dd   d=nd}&grdg nd}|& d- do | d'S |+D ]_  }2t        |2t              s|j                  d|2j                  d       d|2j                  d       d.|2j                  dz              a dj                  |      S |d/k(  rt        |j                  dc      t              r|j                  dc      ng }+|+sy0d1g}|+D ]K  }2t        |2t              s|j                  d|2j                  dӫ       d|2j                  d              M dj                  |      S y c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}:w c c}=w c c}=w c c}=w c c}=w c c}Vw c c}\w c c}2w c c}\w c c}\w c c}2w c c}\w c c}2w c c}\w c c}2w c c}\w c c}\w c c}\w c c}\w c c}\w c c}w # t        $ r jC                  d<d=      }Y w xY w# t        $ r u}Y w xY w# t        $ r |j                  dǛ du d'       Y -w xY w# t        $ r }Y w xY wc c}w c c}2w c c}2w c c}2w c c}2w c c}2w (2  Nr  r
  r	  r
  r  z9Non trovo tabelle disponibili nel query layer del tenant.z&Schema dati disponibile per il tenant:r^  r  r  r   r<  r
  r  r
  z righe, colonne r
  rg  rQ  r-  r  zELa query e stata eseguita correttamente ma non ha restituito colonne.r   r   rq  r  r   r   r   r
  r   r
  rU  r  z1Non trovo righe che corrispondono alla richiesta.z"Query SQL eseguita correttamente: z righe restituitez (troncate).r  r  r
  rf  rd  r  r  r  r  r  r
  r  r	  z(Non vedo turni attivi in questo momento.zTurni attivi adesso:r  r  r  r  z: turno aperto dalle 
started_atr  r  r  r)  r*  r>  zil rF  rG  r  r  znel periodo richiestoc              3  .   K   | ]  }|d  d v   ywrZ  r  rM  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>B  s'       DX8+=*>a'@@  Dr  r  total_hourszquesto accountz hai lavorato z ha lavorato zTimbrature rilevate:r  zturno apertor  r  r;  r=  c              3  z   K   | ]3  }t        |t              st        |j                  d       xs d       5 yw)r  r  N)r  r  r  rn  r  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>B  s/     "|Cfpqtvzf{5)?)F3#G"|rT  c              3  z   K   | ]3  }t        |t              st        |j                  d       xs d       5 yw)r
  r   NrS  r  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>B  s/     $vc`jknpt`uS);)@q%A$vrT  zRiepilogo turni r  zTotale staff: z in z turni.z turnizNon vedo timbrature re  r  r~
  rT  rV  rL  r
  rG  c              3  x   K   | ]2  }t        |t              r t        |j                  d       xs d       4 yw)rx
  r   NrS  rH  r
  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>B  s5      !
$% (-A.!
   8:c              3  x   K   | ]2  }t        |t              r t        |j                  d       xs d       4 yw)rz
  r   NrS  r  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>B  s6      $
$% *+0q1$
r  zAlle z+ la capienza tavoli totale del locale e di z coperti, con z posti liberi.z*La capienza tavoli totale del locale e di z	 coperti.re
  rx
  z coperti totali, rz
  z	 liberi, ry
  z
 assegnatiz copertir  zPer la r
  r  z+ prenotazioni nel perimetro richiesto, con r
  z# coperti assegnati su quell'orario.z prenotazioni per r
  z coperti totali.zSituazione sale:z coperti assegnati su z
 massimi, z posti liberi, r{
  r
  rw
  z tavoli occupatir}
  z prenotazioni, z# coperti previsti, capienza tavoli z, posti residui teorici r7
  z	, tavolo z, sala r^  rZ  r
  r`  rH  >   r5   r6   r8   re  r	  r  r	  z?Mi servono piu dettagli per individuare la prenotazione giusta.>   re	  rV
  z/Operazione non completabile in modo affidabile.rX
  r	  zHo creato la prenotazione di z per il r]  z	 persone.r	  z!Ho aggiornato la prenotazione di r	  z Ho eliminato la prenotazione di r4   z- #r  r  z9Mi serve piu contesto per capire quale nota vuoi toccare.z'Operazione sulle note non completabile.r	  z%Ho salvato una nuova nota condivisa: zHo aggiornato la nota #zHo eliminato la nota #r3   r&  z0Mi servono piu dettagli per gestire l'obiettivo.z,Operazione sugli obiettivi non completabile.r	  r  r   r  r  r  r  r  r  r  r-  r  r,  zHo creato l'obiettivo z 'r  zHo aggiornato l'obiettivo zHo eliminato l'obiettivo z'.r:   r	  r	  zANon riesco ancora a chiudere l'ordine sospeso in modo affidabile.z- Prodotto non trovato: rF  z- Prodotto ambiguo: r	  c              3     K   | ]9  }t        |t              r'|j                  d        d|j                  d        ; yw)rH  r
  r  Nr  r  rn  r	  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>vC  sA       dD) 88J'(DHH^,D+EF s   ?Az$Ho aggiornato l'ordine sospeso con: r  z0Non risultano note condivise salvate nel locale.z0Queste sono le ultime note condivise del locale:r  r2   r	  zPer il z- non risultano obiettivi vendita configurati.r  r  r  zPer completare gli obiettivi z manca:r	  r	  r	  r	  r	  z: Grey z L mancanti (z L); Patron z L).r	  r  z mancanti (r  z8- Tutti gli obiettivi quantitativi risultano completati.z"Accordi qualitativi da verificare:r  zGrafico testuale obiettivi r  r  r   u   █   ·z: [z] rR  z% (zNote obiettivo:z
Obiettivi z configurati nel locale:z L, Patron r  r  r  z0Non risultano account salvati per questo locale.c              3  &   K   | ]  }|v  
 y wrD  r  rZ  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>C  s     _'--_ru  r
  r
  r  c              3  z   K   | ]3  }d t        |j                  d      xs d      j                           5 ywr  r	  r
  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>C  s4     ZD2c$((:"6"<"=CCEFGZr  zAccount del locale: r  r  r  r  r  r  r  r  ry  r  rz  c              3  T   K   | ]   }t        |t              st        |       " y wrD  )r  r  r	  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>C  s      _tTXZ]I^T _s   ((r  zPNel catalogo prodotti del locale non trovo articoli riconducibili alla famiglia zHNel catalogo prodotti del locale non trovo articoli che corrispondano a rx  g333333?r  r  r  r  z unita per pack.r  z- il dato unita per pack non e ancora salvato.z0 non serve un valore unita per pack: il lotto e z, non trovo un valore unita per pack salvato.z0Nel catalogo prodotti trovo questi formati pack:z unita per packzdato unita per pack mancantezlotto znon specificator  z Questi sono i dati che trovo su r  r  zcodice r  z
categoria r  zprezzo ivato zunita per pack z!unita per pack non ancora salvatar   zlitri per unita rw  zquantita totale ordinata r  zultimo ordine z nessun ordine storico registratozTrovo gli articoli richiesti nel catalogo, ma non riesco a calcolare il prezzo al chilo perche il peso unitario non e leggibile in modo affidabile.c                `    | d   | d   z   dz  t        | d   j                  d      xs d      fS )Nr   r   r  r   r  r
  rh
  r  s    rJ  rk  z,_render_single_tool_result.<locals>.<lambda>cD  s<    E!HuQx4G33NPSTYZ[T\T`T`aoTpTvtvPw2x r  rl  z.Prezzo al chilo stimato nel catalogo prodotti:r\  z/kgztra z/kg e z3Nel catalogo prodotti tutte le voci della famiglia z hanno gia un prezzo salvato.z=Nel catalogo prodotti tutti gli articoli che corrispondono a zXNel catalogo prodotti non hanno ancora un prezzo salvato questi articoli della famiglia zWNel catalogo prodotti non hanno ancora un prezzo salvato queste varianti rilevanti per z]Nel catalogo prodotti non hanno ancora un prezzo salvato questi articoli che corrispondono a z
 articoli.zQTrovo gli articoli richiesti nel catalogo, ma non hanno ancora un prezzo salvato.c                    t        | j                  d            xs t        d      t        | j                  d      xs d      fS )Nr  infr  r
  )rZ  rn  r  r  rj  s    rJ  rk  z,_render_single_tool_result.<locals>.<lambda>D  s;    .txx8I/JK[uUZ|DHH^4:;& r  z"Il meno caro in valore assoluto e z ivato.z0Nel catalogo prodotti trovo questi prezzi ivati:r:  r~  c              3  &   K   | ]  }|v  
 y wrD  r  rZ  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>D       Pw,,Pru  )rw   r   rv  z:Nel catalogo prodotti del locale risultano queste marche: r  riconducibilericonducibiliz+Nel catalogo prodotti del locale risultano z alla famiglia r  r  z'Nel catalogo prodotti del locale trovo z rilevanti per corrispondecorrispondonoz che z a r1   z,Mi servono piu dati per salvare il prodotto.re	  z%Non trovo un prodotto corrispondente.r  r	  z Prezzo ivato: r  z Prezzo al kg: z/kg.z Restano da completare: z<. Se vuoi, puoi scrivermeli qui e aggiorno subito la scheda.zHo aggiunto il prodotto zHo aggiornato il prodotto zHo eliminato il prodotto r  r 	  r!	  r0  r1  r2  r3  r5  >   r^  rI  r  rH  zConfronto storico ordini per zConfronto storico acquisti:r	  r	  r  r  r  r  zTra r  z5 hai ordinato lo stesso numero di prodotti distinti: z&Hai ordinato piu prodotti distinti in z contro rI  z( il numero di ordini distinti e uguale: z!Hai fatto piu ordini distinti in r^  zuTrovo gli ordini richiesti, ma non ho abbastanza prezzi salvati nel catalogo per stimare la spesa in modo affidabile.z* il valore stimato degli ordini e uguale: z"Hai una spesa stimata maggiore in z' la quantita totale ordinata e uguale: z-Hai ordinato una quantita totale maggiore in r6  r@  rP  zprodotti distintizordini distintizvalore stimato degli ordinizpezzi totali acquistatid   zin piuzin menozIn z hai ordinato il z% z rispetto a z, parlando di z il valore di riferimento sui z? e zero, quindi la percentuale non e calcolabile in modo utile.z prodotti distinti, z" ordini distinti, quantita totale z, valore stimato r"	  r#	  rE  ugualiugualezDifferenza z vs z
 prodotti r  z pezzi z Valore stimato u   € 0,00r  r  zBNota: il valore usa il prezzo snapshot salvato nelle righe ordine.zzNota: il valore e stimato dove manca il prezzo snapshot storico e viene usato il prezzo ivato attuale del catalogo ordini.z)Prezzi mancanti non inclusi nella stima: z varianti, z
 varianti.r  zVarianti piu presenti in r
  r  z ordini, quantita r<   z0Mi serve un brief piu chiaro per creare il file.r  z)Google Workspace non e' ancora collegato.r  rz  r  zGoogle Sheetz
Google Docr
  r  z usando l'account zHo creato il r~  r  zLink: r  zENon trovo righe di storico acquisti che corrispondano alla richiesta.rX	  r'  )r)  r*  r&  r'  zStorico acquisti rilevatoz righe trovate.r	  Zz+00:00z%d/%m/%Y %H:%MrH  r
  r  rK	  z2Non trovo ordini che corrispondano alla richiesta.zQuesti sono gli ordini rilevatir4	  z	, totale r
  r=  r8	  r
  r  r'	  z& non trovo ordini che corrispondano a z%Non trovo ordini che corrispondano a zquesta selezioner  r  zNon ordini r  z
, cioe da r  z L'ultimo ordine compatibile per z e del z)Non trovo una data ordine affidabile per z7Il primo ordine rilevato nel perimetro richiesto e del zOrdini distinti rilevati: rM  r  zjTrovo gli ordini richiesti, ma non ho abbastanza dati di formato per calcolare i litri in modo affidabile.z hai ordinato rU  z ordini distinti.zHai ordinato zDettaglio per variante:z ordinic              3  f   K   | ])  }t        |t              s|j                  d       &d + ywr  Nr   r  )rH  r  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>8F  s6       #C
7TX@Y^e^i^ijx^y  _B1  #C   111zNota: zf varianti abbinate alla richiesta non hanno un formato litro affidabile e non sono incluse nel totale.z hai fatto z
Hai fatto zQuantita totale rilevata: zVariante rilevata: z ordini, quantita totale r  zHo stimato una spesa totale diz; non risultano ordini registrati, quindi la spesa totale e zENon risultano ordini registrati nel locale, quindi la spesa totale e c              3  &   K   | ]  }|v  
 y wrD  r  rZ  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>{F  s      {7,>!> {ru  )r  r  r6  r   z! non risultano ordini registrati.z+Non risultano ordini registrati nel locale.z2Non trovo prodotti acquistati che corrispondano a z4Non trovo acquisti che corrispondano alla richiesta.rH  rI  r  c              3  &   K   | ]  }|v  
 y wrD  r  rZ  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>F  r  ru  r  z:Dai prodotti acquistati risultano queste marche rilevate: r  r  c              3  `   K   | ]&  }t        |t              s|st        |d           ( ywr   N)r  r  r  rH  r  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>F  s&     "mU:V[]aKbgl3uQx="m   ...c              3  `   K   | ]&  }t        |t              s|st        |d           ( ywr  )r  rN  r  r  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>F  s+      {
#Jue4LQVCaM{
r  z0Queste sono le varianti senza prezzo disponibilezquantita totale z!Questi sono i prodotti acquistatir  z prodotti distinti.r  z	 prodottiz%Ho trovato questi dati acquisti realizFornitori piu presenti: z
gli ordiniz Ho calcolato un totale ordine dizFNota: questo valore usa il prezzo snapshot salvato nelle righe ordine.zNota: il valore e stimato sui prezzi ivati attualmente salvati nel catalogo ordini, perche una parte dello storico non conserva il prezzo snapshot per riga.c              3  X   K   | ]"  }t        |j                  d       xs d       $ yw)r  r  Nr	  r	  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>F  s#     c$uTXXn%=%DEcr	  zTrovo acquisti che corrispondono alla richiesta, ma non ho abbastanza dati di formato per calcolare i litri in modo affidabile.zHo calcolato c              3  f   K   | ])  }t        |t              s|j                  d       &d + ywr  r  r	  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>
G  s+     sdz$7MRVRZRZ[iRjRrsr  zf articoli abbinati alla richiesta non hanno un formato litro affidabile e non sono inclusi nel totale.c              3  $   K   | ]  }|d u 
 y wrD  r  r	  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>G  s     #T%E$5#Tr	  c              3  :   K   | ]  }t        |xs d         ywr  rI	  r	  s     rJ  rK  z-_render_single_tool_result.<locals>.<genexpr>G  s     ,]5U5:A->,]r$  zabbiamo ordinato r  zTrovo z varianti per zd, ma non posso sommarle in modo affidabile perche manca il dato unita per pack su almeno un cartone.zabbiamo comprato z: quantita totale r  z,Al momento non c'e un ordine sospeso aperto.zOrdine sospeso attuale:)^r  rn  r  r  r  r  r  r  r  r  rd  rn  r  rl  r  rP  r  r  r  r  r  r  rb  r5  r  r/  r  r   r  r  r  r  r  r  r  r)  r  r  r  r  r\  rJ  r  r
  r  r  rF  rR  r  r  rY  r  rO  rZ  rl  rN  rC  rL  r_  rn  absrM  rJ  rK  rv	  ru	  rV  rB  rS  rJ  r	   r  r  r  r  rW  rP  rG  rE  rH  r   rr  ry  r  r|  rF  r
  r  ra  rN  r  r~  rp  r	  )r  r
  rn  r	  r  r
  r  r^  r   rR  r  column_labelrQ  r-  r  rJ  fiscal_replyr  r>  r3  rT  rV  r
  r  r  r  r  r
  r  r  r  start_label	end_labelr1  r0  first_personr  subject_namer
  duration_labeltotal_team_hourstotal_team_entriesr  rL  r
  
slot_labeltotal_max_capacitytotal_available_seatsr
  rI  ro  r7
  assignment_suffixre
  room_suffixre  r  r	  r	  rX
  r	  r	  r  r  r  detail_suffixr	  r	  r
  r	  r&  numeric_goals
note_goalsincomplete_countr	  r	  r	  r	  missing_greymissing_patronr	  rr  r  rr  filledr  r  r  r  r  r  r  r  r  rz  r  rz  family_labelrequest_labelrY  matching_itemsfocused_itemsnarrowed_focusr  r  r  rI  r  value_labeldetail_itemsr  r  r  r  r  r   rw  r  weighted_itemsr]  r^  missing_price_itemsr
  priced_itemscheapest_itemtop_itemrN
  rO
  brandsr  display_itemsr  relation_label
item_count
verb_labelr  r  r	  r  price_per_kg_labelprice_per_kg_suffixpending_suffixr 	  r!	  r0  r1  r2  r3  result_focus_hintfocusprimary_labelsecondary_labelprimary_productssecondary_productsprimary_orderssecondary_ordersprimary_quantitysecondary_quantityprimary_amountsecondary_amountprimary_missing_pricessecondary_missing_pricesprimary_amount_valuesecondary_amount_valuewants_percentageprimary_metricsecondary_metricmetric_labeldelta_percentage	directionprimary_summarysecondary_summaryr"	  r#	  rE  product_directionorder_directionquantity_direction
delta_linedelta_amountamount_directionr  r  r  rz  r  account_suffixr  rX	  raw_confirmed_atr	  rK	  requested_rankr%  focused_quantity_replyr4	  amount_suffixr	  r'	  r  formatted_last_ordered_atlast_dt
days_deltafirst_dtfirst_labelr  measurable_variantsmissing_variantsr  r  r'  r
  scope_partsr  rN  r  r  r9	  r  measurable_itemsr  r  rV  rH  rJ  supplier_suffixr  s                                                                                                                                                                                                                                     @rJ  _render_single_tool_resultr*  ,B  s]   KOOF+1r2I__X&Ffd#,,)3FJJx4H$)OH%UWN9: 	_EeT*.899Mt.Teii	*Z\GHO  WfS]^dfjSkpstzt~t~  @F  uG  uM  KM  qN  qT  qT  qVC

6 2 8b9  WL  WEIIk27a8I99\2LLL2eii01I;>N|n]^	_ yy&&+5fjj6KT+R&**Y'XZ%/

60BD%Ivzz&!rK01	&**U#)r*!#&S!,Wd6dsjY\^bNcs6dee&s+B7\`LzUXdnortxdySLz{{!#&1$2`3*UXZ^J_32`aa(-8RVBp3ZdehjnZo3Bpqq%c*<WVZFts^hilnr^ssFtuL'##Z!0!9(-1PQc1d 6w ?;H;Tm557Z\"#55'9';iQ>O'O&Z&Z&\#55'9';iQ>O'O&Z&Z&\#55&8&:&D&D&F!8!ABPmN1,=>VZ+48J+JfXjNji  |D  HZ  |Zpw  `i9+S^lwxxF5c$i[@QRhqVdwz{| 	<Cc4(JQR#''&/):;RNRLL

> ::;		<
 yy))+F33++,W5FJJw'273=G

SeHfhl=m6::&89sw;EfjjQbFcei;j&**%67pr9CFJJO_D`bf9g$45mo+5fjj6KT+R&**Y'XZvzz*;<=H!A+,E' z!%.yy-q:1Fq%))T`Jaqeqr$'<S<AXA^\^=_=g=ghkmp=qrusu=v<wxy	z
 99U##0L1IJ.vzz*/EF	1&**]2KL9	)A}-KY T)=K~.K$)W$4&PUY_P_:Le|K  D  RC  D  D'01A1E1Em1TUK $$[1 $#''
3$#''5$ $	  $Ra..0;qr?B"8>+a@A$Ra..0;qr?B"81\N-}ANO734$ WE%eT2 "%eii&=&C"D"L"LSRU"VWZXZ"[K[`[d[deo[pEIIj$9$?R @ H Hc RSVTV W  wEI%;EIIFV<W%XNLL2k]$ykNCSST!UVW 99U##""|Sb"||!$$v_$v!v'}A67ELL>*@AQ*R)SSWXjWkkrst& a!#t,ww{+kswwz/BkcgglF[k_k4SWW]5KLr$r+d3swwy?Q?VUV;W:XX^_`a 99U##G)+a88F?)+a88%k]!44//8@@//FJJ349:&**]39r:&**]39r:@@B&**]3@yA'1&**W2Et'L

7#RT9CFJJO_D`bf9g$45mo/:vk]+
,W5  !
&!
 

 !$ $
&$
 !
 !!34K=(STfSggu  wL  vM  M[  \ FFXEYYbcd& 
!$-LLTXXk232dhh~6N5OO`aeaiaij{a|`}  ~G  HL  HP  HP  Qb  Hc  Gd  dn  o LLTXXk232dhh~6N5OxX
 z?Ydr}~99U##A:5k{hstt%2KSZDZ`j%k]&[QVPW  XC  DG  HN  HR  HR  Se  Hf  Hk  jk  Dl  Cm  mP  QE ugU;-{5'I[\_`f`j`jky`z`~  ]A  \B  BR  S  TELL+,& 
!$-LLTXXk232dhh?P6Q5RRhimiqiq  sA  jB  iC  CM  NR  NV  NV  Wh  Ni  Mj  jy  z~  zB  zB  CT  zU  yV  VW  X\  X`  X`  an  Xo  Wp  p@  A LLTXXk232dhh?R6S5TTcdhdldlm~d  dA  Ad  ei  em  em  n|  e}  d~  ~V  W[  W_  W_  `q  Wr  Vs  t
  		DdD)TXXl39r:@@BJ<F)J< 8BDHH[17R8>>@I3<GI;/"KLLTXXl+,Btxx/H.ItxxX`OaNbbjkvjw  yJ  xK  L		 yyVVVZZ)/R0--H-34::<F5?

<@XZ^5_L1egJ $Gdn  IOW`r|  ~G  IM  sN  IO  %P  $Q  R  R^^^66vzz(+`/`aa3=fjj>WY]3^fjj/dfY/0P/QQYZeZiZij|Z}Y~ #56eKOOH<U;VV_a Y3KOOO4T3UUW??#567vkool>[=\\abmbqbqrzb{a|  }FG Y2;???3S2TTY??#567vkool>[=\\]_ ''VZZ)/R0--H-34::<F5?

<@XZ^5_L1egJ!+ [I!)T2s9==+>*?r)--PVBWAX%YZ[ yy''XXX66vzz(+X/XYY%/

60BD%Ivzz&!rY:488F;K:LMMY,TXXd^,<Btxx?O>PQQY+DHHTN+;1==&&VZZ)/R0--H-34::<F5?

<@XZ^5_L1egJ!+ uI!)T2s9==+>*?r)--PVBWAXXZ[d[h[hio[pZqqr%stu yy''OOO66vzz(+]/]^^%/

60BD%Ivzz&!r(#fsEl+/4V}/G/G/I3s6{+sSXY^_eYfhiSjOkOsOstwy|O}L,/m488K;PT\;\Cblnttv
88$%*4884D+E*FGKXXo&)$((?*C)DEK#DHH[,A,GR(HF(R,q=CCEF{+8C"SXXk234Y+DHHV,<+=R@P?QQRS`RaabccY/0@/ADHHVDTCUUVWdVeefggY.txx/?.@488FCSBTTVWW++VZZ)/R0--?I&**UfJgim?nfjj):;tvO;EfjjQ`Facg;hFJJ7npMXYE% YdD)LL#;DHH_<U;V!WXY ( UdD)LL#78Q7R!STU 99U##Y8B6::NbCcei8jFJJ34prEii  !  G
 :'!DD'''1&**W2Et'L

7#RTECD 	^D$%s488D>"2!DHHX4F3Gr$((SYJZI[\]	^ yy%%'1&**W2Et'L

7#RTzz&!TF"OPP,W5''98J+J.3mdz$7MRVRZRZ[aRbflRlTmMm+0j4JtT4JtxxX^O_ciOi$jJj4TF'BCE % 88F#}4$)$((?*C*Hq$IM"'(?(D1"EK&+DHH5F,G,L1&MO$)$((?*C*Hq$IM#&{]'BA#FL%()H!%LN#q(^q-@ $)$LLTXXf-.g6L\6Z5[ \2=AB!DZ[fDgCh i""8"H!I J2?CDAF\]jFkEllpr  *!5!:;txx16Q7fx/3a< A% 488F+1r288:&)*"-CG-L,MQtf U.x89;QRX;Y:ZZ[\`[aace3:  1$WXAB& UDLL2dhhv&6%7r$((=:Q9R!STU99U##'(:;.3mdz$7MRVRZRZ[aRbflRlTmMm+0j4JtT4JtxxX^O_ciOi$jJj24&:;E% 	 *!5!:;txx16Q7488F+1r288:$*aKSSc8fCTX]B]_d>e5f
UJ$6"#<=>fntrF{';;&)*#cU"Z4DCzQRSYRZZ[\`[aabc	 ./& >D!$-r$((6*:);%<=> 99U##dV#;<= 
	vDdD)xx6)r$((6"2!32dhh}6M5NOP&!]2&)*'$((?2K1LAdhhWdNeMffqrvrzrz  |M  sN  rO  OP  QU  QY  QY  Zi  Qj  Pk  km  n r$((6"2!32dhhz6J5K1TXXV^M_L``abfbjbjkqbrastu
	v yy''"(**Wb"9T$Zd=STTE,W5"&88 
_=^__ <%);; 	 9:ELLZTYZZ99U##'E
|156 	<Dtxx'a488J+?a488GCTaXabhhjD488J/526<<>H)/R0668Etxx'-2.446DCK9XJ)?QSinW]^c]dUetv  LP  {A  BF  AG  yH  VX  )Y  b  ]at  bG  bLL2dV2dii&8%9:;	< yy%%'1&**W2Et'L

7#RT&**W-;U<FJJw'-2.4469CFJJO_D`bf9g$45moyy _~ __eeg$CC1Cijwixxyzz]^k]llmnn,W56w?H5+0K4JtT4J$KK(<^]([%~%&89*<nN>"a'N#a'.+//>E#F%P^_`PaPePefsPtP{x{J|  @C  KC  C%a( #DHH_$=$C D J J Ltxx
39r:@@B2?1JSdSS<H2dii56a8b!7AQ8R!S!-"hh~67xrCYZhCiAkk{||/9!$((>":!;F8Cpqq!$((>":!;F8Cst|s}}~dhh~67x?kllGHE& U #DHH_$=$C D J J Ltxx
39r:@@B2?1JSdSS<H2dii56a8b!7AQ8R!S!-%;N%K$LO"\K1(;"@K$*8+H7H*I"JKr$((>":!;F82k]STU 99U###$67(:NLaboappqrr)jSa1D1D^1T1iXi-jMLYDC06B7==?YZ^__ #LO$7$7$G$X= Y7aHIE$  H"488N#;#ArBHHJ #DHH_$=$C D J J Ltxx
39r:@@BWFW#H:./ NNZ#?@"488N#;#ArBHHJNNW\N#;<txx
39r:@@BNNZz#:;)$((3D*EFNN];-#@A!7AQ8R!S!-NN_5KN5[4\#]^1(;NN#FG"8BS9T"U".NN%56L_6]5^#_`),TXX6N-O-TST)U&)A-NN%>?U>V#WX"%dhh/@&A&GR"H"N"N"P"X"XY\^a"b"NN^O3D#EF)Q.NN#EFr,r$))G2D1EFGA HB 99U##'(:;KMN%7 E!$-(B4(H%	:$
(:%%tY
&CDE "R
 $xyEFE/= 	U+i #DHH_$=$C D J J Ltxx
39r:@@B2?1JSdSS<H2dii56a8by:-.5%0%;$<C"@K$(Y)?(@{S]G^F__b"cKr$((>":!;F82k]ST	U 99U##,-?@ +<n#dD)dhh7H.I.Q # #
 'PQ^P__|}}VWdVe  fC  D  Dt  vC  uD  DE  Fs  uB  uS  FS  tT  TU  Vy  {H  zI  IJ  Ky#&9":!;:FGE+ F #DHH_$=$C D J J Ltxx
39r:@@B2?1JSdSS<H2dii56a8br$((>":!;F8DEF 99U##/0 +<ndD)dhh7H.I.U L 
  j'(:; # ! !$M$5$5o$F$L" M S S U}00<BCIIK2?1JSdSS<H2dii56a8b)-*;*;<M*NO;M<M<Mn<];^_e^ffhithuu|}}< A%#A #DHH_$=$C D J J Ltxx
39r:@@B2?1JSdSS<H2dii56a8b)$((3D*EF((>23F82k]'RR#AHhll=9@SAI a!4!4]!C!JsKLL3.. #DHH_$=$C D J J Ltxx
39r:@@B2?1JSdSS<H2dii56a8b)$((3D*EF((>23F82k]'RRGHE$ [ #DHH_$=$C D J J Ltxx
39r:@@B2?1JSdSS<H2dii56a8b)$((3D*EFbJbr$((>":!;F82k]RXYZ[ 99U##P<OPPF%7 )!$-DHH^4:;AACU&0MM%() SVZV_V_`fVggjmmm%7'2a'7ZJ0;q0@_oNB;-qQ[P\\]^l]mm|  ~K  }L  LM  N  OE]+J'1QJJ>zl!J<Wfgt  hF  yF  gG  GH  I  JE'2a'7ZJ*5*:JB;-qQ[P\\ablammpq~p  @A  B  CE! 	BDdD)488J/526<<>H 9 ?R@FFHM.;X-FOT$DOLO8Dr$))L12!4"FLL2dhh~67x@A	B yy$$VZZ)/R0--vzz(+]/]^^[ vzz(+V/VWW+5fjj6KT+R&**Y'XZ !**%56<"
5z! J
 

 GKK8>B?EEGw{{:.4"5;;=].LL.$==)4@2dii-.a0b!'++.?"@A;FQ7B(5H)IJL^0B/C4Hdf*499^+D*E FM M  Y-gkk..I-J6(RST`Sabuav  xF  wG  H  HY/N0K/LVHTUVbUcdwcx  zH  yI  J  JY.w{{>/J.KF8STUU..+5fjj6KT+R&**Y'XZ/9&**[:QSW/XFJJ{+^`	zz.1

?3$45 **%67FJJw'-2.446,W5

< 8 >B?EEG%6:f%f!  mG  HZ  \a  mb5lMR7X=B0q9Hefw{{+>?D1E /B!C!HqIW[[):;@qAy}}->?D1Ew{{+;<AB /?!@!EAF/<T0UV1)--@X2YZ!$W[[1N%O%TST!U#&y}}5R'S'XWX#Y J#55=/_,==r  tD  sE  EF  G "$66<]O2N^M__ghzg{{|} <_<MRPbOcckl|k}}~ h!11tM?#o5FFno}n~~  A  B"22@rR`Qaaijzi{{|}~@@QQSTdSeemn|m}}~  Ah%*:*B L $2#8S %5%<"#'===/_,==ghs  uI  iJ  hK  KL  M &(>>8r+VjJkIllt  vA  BX  vY  uZ  Z[  \ 88IKXnLoKppx  zE  FZ  z[  y\  \]  ^  #55tM?#o5FFmn~m  @A  B  C!$66L]O[]^n]oow  yK  xL  LM  N  OL_L]]_`r_ss{  }M  |N  NO  P  Q

+A BC{sg~{Yei{Y{
"!1#5 2("!/#3 0("!/!63#3#:s <!1#5 8!#:J(J%36F%FJZ$Z^a#a (81(<H)	-(9:LSQaMb:c9ddfgpfqq}  N  ~O  O]  ^j  ]k  kl  m "Q&>A+=/**H  WV  W }oR0@/AAUVdUe  fH  IY  HZ  [  14F3GG[\l[m  nP  Qc  Pd  e%!2;~3N2OPPO'#4[AQ5R4S!TT_%&'VZZ(89>Q?6::n5:;VZZ(89>Q?(6(:H^^_M_	em&2Q&6(XYIYI_g)7!);Xn_`N`fn-_,=R>"#:.?-@3|CTBUU]^m]nnpqt  vD  rE  qF  FM  N`  Ma  abc 	 H#1#8S %5%<"/2HHL+7!+;xl]^N^dl,k#l:K.L.ZPZ,\\]^n]oopqqJZ H7;;/526:JJsS\S`S`apSqSwuwOx  }M  PMab Q &)A?aPfOggr  tC  sD  DE  F^  E_  _i  j /9Z9PRV.W7;;z*]_LL4]O1EF# gt,LLW[[89gkk/>Z=[[]^e^i^ijw^x]y  zL  MT  MX  MX  Yi  Mj  Lk  l
 yy66VZZ)/R0--vzz(+a/abb[ vzz(+Z/Z[[-7

:8NPT-U6::j)[]!)f!5!@~lhll9-34::<HLL9?R@FFHAN-m_=TV bg)>(?q@PPQRSLL!hll9-34::<LL6'+,yy**'1&**W2Et'L

7#RTZFJJ7E3u:F2zz,/ZZ
+F#**W%	
 . 	;-0G9B}o_=> 		D$%#&txx'?'E2#F F#+#9#9:J:R:RSVX`:a#b#k#kl|#}L b*)=(>c$((>BZA[[_`d`h`hix`y_z{		 yy**+5fjj6KT+R&**Y'XZG,W52zz,/ZZ
+F#**W%	
 7w?%#g,.*H3=gnWXFX>Y[_3`GNQ./fjE}K%LWV[]`agakaklsatazxz]{%|"%1--993E:;;w<1!;<N!OT{  }D  UE  IJ  UJ",WQZ">GAJDE}K%LWV[]`agakaklsatazxz]{%|"%1--993E:;;3 	;-0G9A 	E%&"599^#<#BCKKCQTU)?		Jb@c)d&UkUw)K8N,O+P Q} :!6 7u\N"UYYWdMeLff~  @E  @I  @I  JZ  @[  \  ]j  \k  l	 yy,,fjj):;@qA-7

:8NPT-U6::j)[]FJJw'-2.446vzz*<=CDJJLTTUXZ]^fjj):;ArBHHJRRSVX[\2zz,/ZZ
+F#**W%	
 a%bq///1KOCDDjkp  lG  uG  kH  HI  J  J:5;VDV:WWXYY$_W%=>11G(7%@&44_5L5LSRZ5[\G070@0@AQ0R- Eog66+Y`Ia:a"l"*"8"89P9PQTV^9_"`%(*<*>*O)U)UWX%Y
{7)5AQAQRbAc@ddnoynz  {C  &D  E LL#LWIUV!WX*?yPiOjjklm$4$G3'556F6N6NsT\6]^H"*"3"34D"EK VWbVccdefLL5o5FFYZ]^d^h^hiy^z^~  [A  ZB  BC  D  E99U##og67!::n5L# D11GEBQ 5 5 7+ab/ IJ.YghtYuXvvz  |C  {D  DH  IX  HY  Yj  k  l}^L-I,J$wiW[\k[ll}~:B  #MwjQXZ^F_dkdodop~d  eL7  #M  #M"672 GLLW[[89gkk/>Z=[[])'++n*EFGtGKKXeLfKggnp
  #  #CH  #C   C-.  /U  V 99U##--BQ 5 5 7+ab/ IJ+VeUffwxyz/)::KLMLLKO113k!"oEFnU\T]]abqar  sD  E  FLL=	o5FFWXY1#fjjAQ6R6WVW2X1YYZ[\99U##x=AqkG'4()'++n*E)Fd7;;WfKgJhhj{{=122KGKKXhLiKjjkm
 LL23# gt,LLW[[89gkk/>Z=[[]";;}566OPWP[P[\lPmOnp yy++'1&**W2Et'L

7#RT,W5FJJw'-2.4462zz,/ZZ
+F#**W%	
 *+=>)?

Kc@d)e&)5<E"'+6L*M)NeTYSZZ[\g[hhijj"'+6L*M)NeTYSZZ[\\""'+6L*M)NaP[}\]^^#WAk2H&I%J!LL[!%+6qr}~  sA  rB  BC  D  D!%(cdopqdrcsstuu)"1o3356{126G  HC  DO  PQ  DR  CS  ST  U  U^_jkl_m^nnoppS {Nz {{)"1o3356{126GGhiiD01CDKE7RSTTIzz&!

7#+Zs5KEQUV!#4k]!D6:;k]34dV}-7A&**_B]_c7d

?3jlP<OPPUbF& ;eT*uyy/AMM#eii&8"9:; SVZV_V_`fVggjmmm3=fjj>Y[_3`FJJ/fh	FJJ7E3u:F&)&**5R*S*XWX&Y#"mi"mm 
quqzqz {
'0{
 r
 '+WXj+k "#dD)dhh7O.P.X # #
 #L!(	ug6G!(	388K+@*ABG#9Bs+>'?&@
KL/ QD"488J#7#=2>DDFH$'(A(GR$H$N$N$PM-/K$#**Z+GH#**VH:+>?xx 01=#**-=dhhGW>X=Y+Z[EPb;)?(@$AVXMLL2dhh~&>%?!OPQ yy'',-?@Dhi{D|9Gy>Q&:ilT5M+RW`abWc!(	il1o->?G!(	)>ugFG$IQsxx'<&=>y=/1DEFE XdD)"488J#7#=2>DDFH!1$((;K2L1MNOGz':;	Na/Jy|dTY]4[`ijk`lDHH_4M3N'OPLL2dhh~&>%?r$))GBTAU!VWX s5z)~mc%j.H-IST99U##9 	388K#8"9:G9ALL3N3C1EF&'9:%;FJJG_<`%a"

? ; ArBM%- O+|GE:GK[:[6  bBELLE7!K8N,O+PPUV]U^^_`c`h`hit`u_vvw!xyLLE7!K8N,O+PPUV]U^^_!`awa4J(K'LAchhWbNcMddefgwa4J(K'LANO%&89Qx 00ef s 77GqIJ!&*T4*@TXXNfEgEsL  % .12$txx7P6QQST_`d`h`h  jB  aC  UD  TE  F +?@[?\\fg 99U##0116z*T4:PUYU]U]^lUmUyzzcRbccLq  Y11GE}^L-I,J$wiWXY\YaYabmYnXoopqr}^L-I,J$wiWXYZ77GqIJ( .12$txx7P6QQSTbcgckcklzc{T|S}~  sessM]O  ,R  S 99U##SZ!^(EFX(Y-2MTjt6LDMLMR^_$ ? E__E#TCS#T T),,]L\,])]&^isxx,Ra0668388K;PQRQS;TTWZZoqr'(>?U(V'WWmnsmttuw
 S./~eW  Ei  j LL23$ txx
39r:@@B/7q
^R
.12$txx7P6QQSTXT\T\]mTnSopzo{| 99U##SZ1_-NOa-b8D$%"488N#;#DuEKKM #DHH_$=$C D J J Ltxx
39r:@@Btxx(89>Q?=EH:Qxj!93x=-?DE"1IOO-.uQRyk;"<ID"8r !2>2B$|nUdTeefgg 	D$%.12$txx7P6QQcdhdldlm}d~c  A	
 yy))'1&**W2Et'L

7#RTA*+ 	WD$%r$((:"6!7s488N;S:TUV	W yyQ( W 7eLz2`BpFt4 SP IOx njP njB U( b$ L  T  T$ Zx  T#(  T$  T  T  T  TF P
l " F#3#;#;C#ELFT " @0?-@ & l'GyPWXgWhhi%jkl " 3"2K3$ #MV#b  {0 N_sy  E[*#,E[* E[*!E[/
7E[/
E[4
-E[4
E[9"E[9E[>
E[>
8E\
E\
E\6E\E\`!E\`7E\aE\aE\a,E\bE\lE\l/E\mE\mE\!m$E\!m9E\!yE\&yE\&E\+E\+D=E\0EE\0IE\5IE\5M5E\:M=E\:Q*4E\?b	E]bE]e +E]	hE]h E]j+E]l8E]m E]p
E]pE]tE]"t E]"wE]'w&E]'1E],9E],D9E]1v<7E]6J9E^ K*BE^* N+9E_ S$E_&S:E_&TE_&o)+E_+CE_0CE_0C1E_0FE_5F"E_5F5E_5LE_:L!E_:L+E_?]6E^^E^^E^'^&E^'^*#E__E__E_#_"E_#c                ^   t        |      dk(  rt        | |d         S |r|d   nd }t        |t              sy t	        |j                  d      xs d      }|dk(  rt        | |      S |dk(  rt        |j                  d      t              r|j                  d      ni }t        |j                  d	      t              r|j                  d	      ni }t	        |j                  d
      xs |j                  d
      xs d      }t        |      st        |      st        |      rt        | |      S y )Nr   r   r  r  r
  r<   rg  r	  r  r  )	r  r*  r  r  r  rn  r  r  rl  )r  r  last_tool_resultlast_tool_namer	  r  r  s          rJ  _render_known_tool_resultsr.  FG  s   
<A)'<?CC+7|B'T&-)--f5;<N;;)'3CDD++3=>N>R>RS[>\^b3c!%%h/ik9CDTDXDXYdDegk9l$((5rt	&**U#Ay}}U';ArB(-1KC1PTopsTt-g7GHHr  c                (    dj                  g d      S )Nr
  )z.Sei l'assistente operativo globale del locale.zRispondi sempre in italiano.zRispondi come una persona competente che sta lavorando sul gestionale: frasi dirette, niente tono robotico, niente formule inutili.z;Usa solo i dati reali forniti nei risultati tool qui sotto.z<Non inventare mai numeri, clienti, prodotti, stati o azioni.zNon confondere mai marca del prodotto con fornitore. Se il dato marca deriva dal nome articolo, dichiaralo chiaramente come marca rilevata dai prodotti acquistati.zeSe i tool non bastano o segnalano ambiguita, dillo chiaramente e chiedi il minimo dettaglio mancante.zMSe una richiesta e' stata eseguita, conferma in modo concreto cosa hai fatto.zhSe l'utente chiede dati sensibili del SUO locale autenticato, puoi rispondere usando i dati disponibili.zzPuoi creare liste, conteggi, percentuali e calcoli semplici solo usando i numeri forniti dall'utente o dai risultati tool.ztSe l'utente chiede solo un totale, restituisci solo il totale con una riga di contesto minimo. Non aggiungere liste.zSe l'utente chiede una lista o una classifica, ordina e raggruppa in modo coerente con la domanda, spiegando brevemente il criterio usato.zwSe il risultato tool contiene SQL/righe, sintetizza dai valori restituiti senza mostrare SQL salvo richiesta esplicita.zSe il risultato usa calculation_basis=document_total_vat_included, comunica che il totale viene dai documenti fiscali ed e' IVA inclusa.znNon confondere il destinatario/fatturazione dentro un OCR con il fornitore normalizzato del documento fiscale.zSe i risultati arrivano da inventory_latest_items, inventory_latest_lots o inventory_warehouses, trattali come giacenze reali del magazzino: usa l'ultimo inventario salvato se esiste, altrimenti il contenuto corrente registrato del magazzino.zPer richieste inventario 'in casa' o senza magazzino esplicito, le soglie e i totali si intendono aggregati su tutti i magazzini. Non presentare come sotto soglia un prodotto che e' sotto soglia solo in un singolo magazzino.zPer stime di consumo giornaliero o medio, spiega sempre se il calcolo e preciso o parziale. La formula affidabile richiede giacenza iniziale, acquisti del periodo, giacenza finale e numero di giorni.zSe inventory_source vale current_stock, dillo chiaramente come contenuto corrente registrato e non come inventario datato. Non dedurre mai una data inventario dal nome del magazzino.zjNon convertire mai le unita equivalenti inventario in ml o litri se il tool non fornisce un formato certo.z_La data/ora corrente e il locale attivo sono forniti nel Contesto runtime del messaggio utente.r  r  s    rJ  _final_system_promptr0  [G  s    99	
 r  c                    t               }t        |       }dj                  d|j                          dt	               j
                   ddt        j                  |d       g      S )Nr
  r  r;  r=  r  Fr-  )r  r  r  r/  r    r  r   r0  r  s      rJ  _final_runtime_contextr2  wG  sc    

C!'*G99#CMMO#4B|~7X7X6YYZ[djjuEFG	
 r  depthc          
        | t        | t        t        t        f      r| S t        | t              rC| j                         }t        |      t        k  r|S |d t          dt        |      t        z
   dS t        | t              r^|dk  rt        nd}| d | D cg c]  }t        ||dz          }}t        |       |kD  r!|j                  d|t        |       |z
  d       |S t        | t              r;| j                         D ci c]  \  }}t	        |      t        ||dz         ! c}}S t	        |       S c c}w c c}}w )Nz... [testo troncato: z caratteri]r   r  r3  T)
_truncatedshown_itemsomitted_items)r  r  r  r  r  r  r  _SYNTHESIS_MAX_STRING_CHARSr  _SYNTHESIS_MAX_LIST_ITEMS_compact_for_synthesisr  r  rL  )r  r4  compact	max_itemsro  compact_itemsrF  s          rJ  r;  r;  G  sE   }
54e*<=%++-w<66N66788McRYl]xNxMy  zE  F  	F%16!-	SXYcZcSde4/EAIFeeu:	!  "&#,%(Z)%; %Y^YdYdYfgICQUC0UQYGGggu: f hs   D7$D<r<  c               X    |rt        |       n| }t        j                  |dt              S )NFr
  )r;  r   r0  r  )r  r<  r  s      rJ  _build_tool_results_payloadrA  G  s$    >E,\:<G::gE3??r  c                   | sy| D ]  }t        |j                  d      xs d      dk7  r%t        |j                  d      t              r|j                  d      ni }t        |j                  d      t              r|j                  d      ni }t        |j                  d      xs |j                  d      xs d      }t	        |      st        |      st        |      s y t        d	 | D              S )
NFr  r
  rg  r	  r  r  Tc              3  d   K   | ](  }t        |j                  d       xs d      t        v  * yw)r  r
  N)r  rn  _DETERMINISTIC_SYNTHESIS_TOOLSrH  r
  s     rJ  rK  z6_should_use_deterministic_synthesis.<locals>.<genexpr>G  s*     tXcs;??6*0b15SSts   .0)r  rn  r  r  r  rl  r  r)  )r  r
  r	  r  r  s        rJ  #_should_use_deterministic_synthesisrF  G  s    # {v&,"-1CC.89RTX.Y*_a4>{{?[]a4bKOOK0hj	&**U#Ay}}U';ArB%c*.I#.NRopsRt tgstttr  c          
        | t        | t        t        t        f      r| S t        | t              r7dj                  | j                               }t        |      dk  r|S |d d  dS t        | t              r?|dk\  rdt        |       iS t        |       | d d D cg c]  }t        ||dz          c}d	S t        | t              rj|dk\  rd
t        | j                               d d iS t        | j                               d d D ci c]  \  }}t	        |      t        ||dz         ! c}}S t	        |       S c c}w c c}}w )Nr        rU  r   ry  r   r3  )ry  samplerM  r   )r  r  r  r  r  r  r  r  r  r  r  rM  rL  )r  r4  r<  ro  rF  s        rJ  r  r  G  s@   }
54e*<=%((5;;=)g,#-wHgdsm_C3HH%A:SZ((ZPUVXWXPYZ,TCZ
 	
 %A:D.r233 "%++-0!4
T H+D	BB
 	
 u: [

s   D;$E c                H    | D cg c]  }|j                          c}S c c}w rD  )
model_dumpr  rm  s     rJ  r  r  G  s    4>?yI  "???s   c           
         g }| D ]g  }t        |t              s|j                  |j                  d      t	        |j                  d            t	        |j                  d            d       i |S )Nr  r  r	  r  )r  r  r  rn  r  )r  tracedr
  s      rJ  r  r  G  si    &(F# 	
+t,#/2;??;3OP/0IJ	
	
 Mr  c                    | d t          S rD  )_AGENT_MAX_TOOL_CALLSr  s    rJ  _agent_tool_call_slicerS  G  s    ,,--r  >   r2   r  rg  r  r  r  rf  rh  r  r  r  rd  rc  r
  r  r  re  r  c                @    t        |       xr t        d | D              S )Nc              3  @   K   | ]  }|j                   t        v   y wrD  )r  _READ_ONLY_AGENT_TOOLSr#  s     rJ  rK  z+_is_agent_read_only_plan.<locals>.<genexpr>G  s     #iQZINN6L$L#is   )r  r	  rR  s    rJ  _is_agent_read_only_planrW  G  s    
i#i^h#i iir  c           	        t        | j                  d      xs d      }| j                  d      }|dk(  ryt        |t              sy|dk(  rt	        |      S |dk(  r!t        |j                  d      xs d	      d	k(  S |d
v r4t        |j                  d      xs |j                  d      xs d	      d	k(  S |dk(  r4t        |j                  d      xs |j                  d      xs d	      d	k(  S |dk(  r8t        |j                  d      t              r|j                  d      }| S g }| S |dk(  r2t        |j                  d      t              r|j                  d      ni }t        |j                  d      t              r|j                  d      ni }t        t        |j                  d      xs d	      t        |j                  d      xs d	      t        |j                  d      xs d	            }t        t        |j                  d      xs d	      t        |j                  d      xs d	      t        |j                  d      xs d	            }|d	k(  xr |d	k(  S |dv r!t        |j                  d      xs d	      d	k(  S |dk(  r8t        |j                  d      t              r|j                  d      }| S g }| S |dk(  r t        |j                  d      xs d      dv S |dk(  r8t        |j                  d      t              r|j                  d      }	|	 S g }	|	 S |dk(  r&|j                  d      }
t        |
t              xr |
 S y) Nr  r
  r	  r
  Frg  r  ry  r   r
  r  r  rX	  r  rK	  r  r 	  r!	  r	  r	  r	  >   r  r  rc  re  rL  rf  r  >   rg	  re	  r2   r	  rh  r  )r  rn  r  r  $_run_tenant_query_result_looks_emptyr  r  r  )r
  rn  r	  rK	  r 	  r!	  primary_matchessecondary_matchesrL  r	  r  s              rJ  _tool_result_empty_for_retryr\  G  s0   KOOF+1r2I__X&F,,fd#&&3F;;%%6::g&+!,11GG6::o.J&**W2EJKqPP**6::o.J&**W2EJKqPP**+5fjj6KT+R&**Y'{ Y[{..+5fjj6KT+R&**Y'XZ/9&**[:QSW/XFJJ{+^`	N+0q1-.3!4/05A6

  	n-23	/05A6	127a8

 !#>(9Q(>>WW6::g&+!,11//'1&**W2Et'L

7#y SUy))6::f%+,0JJJ%%'1&**W2Et'L

7#y SUy))::j)(D):(l:r  c                    | yt        | t        t        f      rt        |       dk(  S t        | t              r2| j	                         }|sy	 t        |j                  dd            dk(  S y# t        $ r Y yw xY w)NTr  r  r  F)r  r  r  r  r  r  r  )r  r  s     rJ  _is_empty_aggregate_cellr^  'H  s}    }%#u&U|s""%;;=	))#s34;;   		s   A+ +	A76A7c                |   t        | j                  d      xs d      dk(  ryt        | j                  d      t              r| j                  d      ng }t	        |      dk7  st        |d   t
              sy|d   D ch c]  t        fddD              r }}|syt        fd	|D              S c c}w )
Nr  r   TrQ  r   Fc              3  T   K   | ]  }|t              j                         v  ! y wrD  )r  r  )rH  rt  rF  s     rJ  rK  z7_run_tenant_query_result_looks_empty.<locals>.<genexpr>AH  s'       Fx3s8>>++  Fs   %()r  r  ry  rH  r^  r  r  r  c              3  R   K   | ]  }t        j                  |               y wrD  )r^  rn  rI  s     rJ  rK  z7_run_tenant_query_result_looks_empty.<locals>.<genexpr>EH  s     P#'5PrK  )r  rn  r  r  r  r  r)  r	  )r	  rQ  rF  aggregate_keysrJ  s     ` @rJ  rY  rY  7H  s    
6::k"'a(A-!+FJJv,>!E6::f2D
4yA~ZQ6
q'C   F  =E  F  F 	N 
 PPPPs   B9c                    t        |       sy|D cg c]%  }t        |j                  d      xs d      dk7  r|' }}|st        d |D              ryt	        |      xr t        d |D              S c c}w )NFr  r
  r
  c              3  ^   K   | ]%  }t        |j                  d       xs d      dk(   ' yw)r  r
  r
  Nrh
  rE  s     rJ  rK  z1_tool_results_need_agent_retry.<locals>.<genexpr>PH  s0       &Fitc+//&*A*GR&HLd&d  &Fs   +-Tc              3  2   K   | ]  }t        |        y wrD  )r\  rE  s     rJ  rK  z1_tool_results_need_agent_retry.<locals>.<genexpr>RH  s     +|Ze,H,U+|rG  )rW  r  rn  r)  r  )r  r  r
  actionable_resultss       rJ  _tool_results_need_agent_retryrg  HH  s    #J/ ({v&,"-1II 	 
 #  &F  yE  &F  #F"#|+|i{+|(||s   *A1c                |    t        j                  | D cg c]  }|j                          c}dt              S c c}w )NT)	sort_keysr  )r   r0  rL  r  rM  s     rJ  _tool_calls_signaturerj  UH  s.    ::zJ)y++-JVZdghhJs   9c                  K   dt        |       dddj                  dt        |       ddt        |      ddt	        |      dd	|j                          dd
t        j                  |D cg c]  }|j                          c}dt              ddt        |d      ddg      dg}t        |dt               j                  t                      d {   \  }}		 t        t!        |            }
t"        j%                  |
      }|j*                  dk(  r"t-        |j.                        t-        |      k(  ry |S c c}w 7 i# t&        t(        f$ r Y y w xY ww)Nr6  r7  r  r
  r8  r
  r9  r:  r;  zPrimo piano eseguito:Fr
  z Risultati reali del primo piano:Tr?  a3  Se i risultati sono vuoti, incompleti o sembrano aver interrogato la fonte sbagliata, costruisci un nuovo piano usando tool diversi o una query SQL migliore. Non ripetere lo stesso piano identico. Se invece i risultati sono corretti e indicano davvero assenza di dati, usa mode=reply e spiegalo chiaramente.r  r<  r  )r  r  r  rZ  r  r  r   r0  rL  r  rA  r&   r    r?  r  r  r  r  r   r  r   r  rj  r  )r  r  r  r  previous_tool_callsprevious_tool_resultsrm  retry_messagesr  rB  rY  
retry_plans               rJ  _replan_after_tool_resultsrp  YH  s]     &<W&EFyy',W534\B,.|<00AB+JJH[\9	 4 4 6\kpz}~6/0EtTl%	
N: 1>66&(	 HE1();E)BC"11&9
 & %::;P;P%QUjk~U%1  ] ( sC   A%E'D5(>AED:E)D< 9E<EEEEc                  K   dt        |       dddj                  dt        |       ddt        |      ddt	        |      dd	|j                          dd
d|j                         xs d ddg      dg}t        |dt               j                  t                      d {   \  }}	 t        t        |            }t        j                  |      }	|	j                   dk(  r|	j"                  r|	S d S 7 P# t        t        f$ r Y y w xY ww)Nr6  r7  r  r
  r8  r
  r9  r:  r;  zdIl planner aveva risposto senza tool, ma questa e' una richiesta grounded sui dati reali del locale.zRisposta rifiutata: z(vuota)zuDevi ora restituire mode=tool con i tool necessari. Non usare placeholder, non inventare dati e non usare mode=reply.r  r<  r  )r  r  r  rZ  r  r  r&   r    r?  r  r  r  r  r   r  r   r  r  )
r  r  r  r  rejected_replyforce_messagesr  rB  rY  forced_plans
             rJ  %_force_tool_plan_for_grounded_requestru  H  s*     &<W&EFyy',W534\B,.|<00ABz*>+?+?+A+NY*OP L	
N2 1>66&(	 HE1();E)BC#226: &**f49O9O;YUYY ( s6   BD	!C2"D	*)C4  D	4DD	DD	c                   |syt        t        |            }t        d |D              }|r|ryt        d |D              }t        | |      r|r|D ]  }t	        |t
              r|j                  d      dk7  r(t	        |j                  d      t
              r|j                  d      ni }t	        |j                  d      t
              r|j                  d      ni }	t        |j                  d	      xs |	j                  d	      xs d
      }
t        |
      st        |      s y t        d |D              }t        d |D              s|syt        |       }|rt        | ||      st        |      sy|D ]g  }t	        |t
              s|j                  d      dk7  r)t	        |j                  d      t
              r|j                  d      ni }t        |      sg y y)NFc              3  R   K   | ]  }t        |t              rt        |       ! y wrD  )r  r  r\  rE  s     rJ  rK  zC_should_fallback_to_direct_after_planner_results.<locals>.<genexpr>H  s'      %k4( 	%[1%s   %'Tc              3     K   | ]F  }|j                   d k(  xr1 t        t        |j                  j	                  d      xs d             H ywr~  )r  rP  r  r  rn  r#  s     rJ  rK  zC_should_fallback_to_direct_after_planner_results.<locals>.<genexpr>H  sS      %  	,, 	N"3y':':'>'>u'E'K#LM	N%r  r  rg  r	  r  r  r
  c              3     K   | ]F  }|j                   d k(  xr1 t        t        |j                  j	                  d      xs d             H ywr~  )r  r  r  r  rn  r#  s     rJ  rK  zC_should_fallback_to_direct_after_planner_results.<locals>.<genexpr>H  sT      $  	,, 	U)#i.A.A.E.Ee.L.RPR*ST	U$r  c              3  :   K   | ]  }|j                   d k(    ywru  r"  r#  s     rJ  rK  zC_should_fallback_to_direct_after_planner_results.<locals>.<genexpr>H  s     Vyy~~!22Vr$  )rW  rS  r)  r   r  r  rn  r  rP  rY  r  rW  rT  )r  r  planned_tool_resultsrw  direct_read_onlyplanner_results_look_emptyhas_direct_inventory_queryr
  r	  r  r  has_direct_catalog_lookuprY  s                rJ  0_should_fallback_to_direct_after_planner_resultsr  H  s    /0FGX0YZ!$ %/% "
 6!$ % +% "
 Wj16P/ 	Kk40KOOF4KOa4a2<[__X=VX\2][__X.ceF8B;??S^C_ae8f4lnIfjj'E9==+?E2FC%c*/STZ/[	 !$ $ +$ !
 VDUVV_x*73M!4Wj-!X\x  zD  ]E+ +t,??6"&88.89RTX.Y*_a/7 r  c                t  K   t        ||      }|rt        |      r|dfS dt        |       dddj                  dt	        |       ddt        |      dd	| dd
t        |d      g
      dg}	 t        |dt                      d {   \  }}|j                         |fS 7 # t        $ r
 |r|dfcY S  w xY ww)Noperational-deterministicr6  r7  r  r
  r8  r
  r:  r;  zRisultati tool reali:Tr?  g?)r=  r   z"operational-deterministic-fallback)r.  rF  r0  r  r2  r  rA  r&   r  r  r   )r  r  r  r  deterministic_replysynthesis_messagesr  r   s           rJ  _synthesize_from_tool_resultsr  H  s      5WlKB<P"$??? &:7&CDyy'*73,.|<0	:+/dK	
*
8,.
 
u
 {{}e##
  &(LLLs<   A*B8-B" B B" B8 B" "B51B83B55B8c                >    t        dddd|dt        |       d|       S )NzNon possiedi l'autorizzazione per usare Turni. Chiedi all'amministratore del locale di abilitare questo accesso dal pannello Account.r  ztimeclock-access-deniedr  timeclock_permission_missingr  r  r  r  r  r  r  r  r  s     rJ  _timeclock_access_denied_runr  I  s7    " V'4#89P#Q	
 - r  c                >    t        dddd|dt        |       d|       S )NzNon possiedi l'autorizzazione per usare Inventario. Chiedi all'amministratore del locale di abilitare questo accesso dal pannello Account.r  zinventory-access-deniedr  inventory_permission_missingr  r  r  r  s     rJ  _inventory_access_denied_runr  .I  s7    " ['4#89P#Q	
 - r  c                >    t        dddd|dt        |       d|       S )NzNon possiedi l'autorizzazione per usare Homemade. Chiedi all'amministratore del locale di abilitare questo accesso dal pannello Account.r  zhomemade-access-deniedr  homemade_permission_missingr  r  r  r  s     rJ  _homemade_access_denied_runr  =I  s7    " Y&3#89P#Q	
 - r  c                j  K   |j                         }t        |      }t        |      }t        | ||      }t        j                  |      r1t        |       d   }d| d}	t        |	ddd|t        |      d|      S t        |||      }
|
r9t        ||g g d	|
      }t        |
dd	d||t        |      t        |      d|      S t        |||      }|rM|j                  d      r|}nt        ||g g d|
      }t        |ddd||t        |      t        |      d|      S t        | |||      }|r9t        ||g g d|
      }t        |ddd||t        |      t        |      d|      S t        |      }|rt        |ddd||t        |      d|      S t        ||      }t!        dt#        |||            }|xs t%        d|||      }t'        |      }t)        |||      }t+        |||      }|rt-        | |      ng }t/        |||||      }|}d|||t1        |      ||||rdnd|t3        |      ||t        |      d}	 |r|r|rt5        |||      S |r|rg }|D ]'  }|j7                  t9        | ||       d {          ) t        ||||d|
      }t;        | |||       d {   \  }	}t        |	|di |t=        |      t        |      d|      S t?        | |||       d {   }d }|j@                  dk(  r5|r3tC        |      s(tE        | ||||jF                         d {   }||}|}|j@                  dk(  rr|jF                  j                         s|s|r|rg }|D ]'  }|j7                  t9        | ||       d {          ) t        ||||d|
      }t;        | |||       d {   \  }	}t        |	|di |d|jI                         i|d |jI                         ini t=        |      t        |      d|      S |}tK        ||      rt        ||g g d|
      }n)tM        |      stO        |||      rt        ||g g d|
      }t        |jF                  j                         d!d"i |d|jI                         i|d |jI                         ini d#t        |      i|      S tQ        ||jR                        }tU        ||||$      }t'        |      } t-        | |       }!|!rt5        |||!      S g }| D ]'  }|j7                  t9        | ||       d {          ) tW        | |      r tY        | |||| |%       d {   }"|"|"j@                  dk(  r|"jF                  j                         rnt[        ||||      rg }#|D ]'  }|#j7                  t9        | ||#       d {          ) t        ||||#d&|
      }t;        | |||#       d {   \  }	}t        |	|d&i |d|jI                         i|d |jI                         ini t3        |      t=        |      |"jI                         t=        |#      t        |      d'|      S t        ||| |d(|
      }t        |"jF                  j                         d!d(i |d|jI                         i|d |jI                         ini t3        |      t=        |      |"jI                         t        |      d)|      S |"j@                  d*k(  r;t]        |"jR                        r%tQ        ||"jR                        }$tU        ||$||$      }$t'        |$      }%t-        | |%      }&|&rt5        |||&      S g }'|%D ]'  }|'j7                  t9        | ||'       d {          ) tW        |%|'      st        |||%|'d+|
      }t;        | |||'       d {   \  }	}t        |	|d+i |d|jI                         i|d |jI                         ini t3        |      t=        |      |"jI                         t=        |'      t        |      d,|      S t[        ||||      rg }#|D ]'  }|#j7                  t9        | ||#       d {          ) t        ||||#d-|
      }t;        | |||#       d {   \  }	}t        |	|d-i |d|jI                         i|d |jI                         ini t3        |      t=        |      t=        |#      t        |      d.|      S t        ||| |d/|
      }t;        | |||       d {   \  }	}t        |	|d/i |d|jI                         i|d |jI                         ini t3        |      t=        |      t        |      d0|      S 7 7 7 7 o7 7 7 |7 S7 7 7 &7 7 E7 7 # t^        t`        f$ ra}(|r	 |rt5        |||      cY d }(~(S g }|D ](  }|j7                  t9        | ||       d {  7         * t        ||||d1|
      }t;        | |||       d {  7  \  }	}t        |	|d1i |tc        te        |(t^              r&te        |(jf                  th              r|(jf                  n
ti        |(            t=        |      t        |      d2|      cY d }(~(S # tj        $ r Y nw xY wte        |(t^              r|(jf                  n
ti        |(      })tc        te        |)th              r|)nd       }*t        d3|* d4d5d6i |d7|*i|      cY d }(~(S d }(~(ww xY ww)8Nr  z.Ciao. Sono qui per aiutarti sulla gestione di z\: prenotazioni, prodotti, ordini sospesi, note e storico acquisti. Dimmi pure cosa ti serve.zoperational-directzdirect-greetingr  )r  r  r  r  r  )r   r  r  r  r  r  r  )r  r  r  r  thread_state_afterz/Non risulta nessun nuovo prodotto appena creator  r  z'deterministic-reservation-clarification)r  r  r  r  )rx  rw  zdirect-hard-guardrailzllm-planner-first)r  r  r  grounded_requestcontextual_directdirect_guardrailhard_direct_guardrailplanner_preferreddecision_modedirect_firstrw  missing_direct_tool_scopes heuristic_missing_message_scopesr  )r  r  r  r  zdirect-tool-execution)r  r  r  r  )executed_tool_resultsr  )r  r  r  r  )r  r  r  r  rr  zplanner-fallback-direct-toolsplannerrejected_grounded_reply_plannerzoperational-plannerzplanner-replyr  rs  )r  r  r  r  rl  rm  z)planner-retry-empty-fallback-direct-tools)normalized_planned_tool_callsr  retry_plannerfallback_tool_resultsr  zplanner-retry-reply)r  r  r  r  r  zplanner-retry-tool-execution)r  r  r  retry_tool_resultsr  z#planner-empty-fallback-direct-tools)r  planner_tool_resultsr  r  zplanner-tool-execution)r  r  r  zexception-recovery-direct-tools)r  r  r  zSNon riesco ancora a leggere o aggiornare questo dato operativo in modo affidabile. z9. Prova a riformulare la richiesta in modo piu specifico.zoperational-safe-fallbackzsafe-fallbackr  )6r  rS  r  ra  _DIRECT_GREETING_PATTERNr  r  r  r  r  r  r  r  r:  r  r  r  ru  ry  rS  rx  r  rs  r  r  r  r  r  r  r  r  rE  r  r  ru  r  rL  rU  rP  r  rq  r  rv  rg  rp  r  rW  r   r  r  r  r  r  r?  )+r  r  r  r  trimmed_messager  r  $heuristic_missing_scopes_for_messager  r   pack_size_followup_clarificationnext_thread_stateproduct_write_clarificationsales_goal_write_clarification reservation_create_clarificationr  rx  rw  direct_execution_tool_callsr  r  r  r  r  
base_tracer  rm  r   planrejected_grounded_reply_planrt  r  planned_execution_tool_callsmissing_planned_tool_scopesro  direct_tool_resultsretry_tool_callsretry_execution_tool_callsmissing_retry_tool_scopesr  r:  r  safe_details+                                              rJ  $run_operational_assistant_with_tracer  LI  sL     mmoO:<H(9 ,QQXZik}+~(%%o6(1,?
<ZL  Ie  f 	 '&#$Yn  pG  ZH  I0
 	
 (O`l  oF  (G$'52# "9%
 '2-9!*&8'<=T'U&;<M&N +
 	
 #E_Vbd{"|"&112cd 7 96'$&;)! '--7!*&8'<=T'U&;<M&N +
 	
 &K7Tceq  tK  &L"%52# ":%
 '0-:!*&8'<=T'U&;<M&N +
 	
 (O'_$'&2-;$Xj  DY  Zq  Dr  s0
 	
 1BTU:6C_`oq}  @W  DX  Y-  R1QRXZikw  zQ  2R"89J"K6HZ\mn@Rdfwx tE!I'Sn!o  KM73+ )L"0,!"78,!6. % $$$./@A&@,P45LM%J*W
!;5(?'9 
 -L8 s	##*<Widp*q$qrs 96'$?)-)! "?'))	" LE5 +- -@-N*?@Q*R
 /
 
 &#%0	
 
 >B$99$4=TUg=h E')4#zz! K &/3,"99::##%+;?OUf!!< wI ''.@)ht.u(uvw$=#:+(C!-9!-%! &C#+!-!-	&  u /9
$
!4??#4

  <G ?@\@g@g@ij!#
 2E\1R.CDU.V
 "3 " !8(:LM$=#:+(*!#?!-%! ..@AEt'F
 %>#:+(*!#B!-%! +jj&&(+%	 	t0	
 8C ;<X<c<c<ef	 )*?@Q*R	 / " )K?\`\k\k(l%(N)%0	)
% (>>['\$&NwXt&u#&5(?': 
 5 	oI&8)`l&m mn	o)*FU9')4$@&2  J %??g-*2B2B2H2H2JG'*$)	 /1+)D MI/66=OPWYb  xK  >L  8L  MM,E+B$30K)<"M)5-) .K$+$3)5)<	. (u  7"'"'"M#",# )4??+<#
 (D'O &GHdHoHoHq$r)+# BSSpAq9L\9Z1;1F1F1H9LM`9a6KL]6^# *;%  ( )B'> /,H%13%1)% 3(..44633(%t'8
 $@#K "CD`DkDkDm n%' >OOl=m5H5V-7-B-B-D2GHY2Z &7# & ??f,1I*J_J_1`'I/[e[p[p'q$'M'(%1%<	($ 2HHX1Y.0XY`b|0}-0A4K$3+D  
 *,&%? G	*118J7T]  sE  9F  3F  GG9:TVhi,E+B$30J);"@)5-) .K$+$3)5);	. (u  7"'"'"@#",# )4??+<#
 (D'O &GHdHoHoHq$r)+# BSSpAq9L\9Z1;1F1F1H6IJ\6]6KL]6^# *;%  ( <	
 #%8 A	#**1CGYk~1+  AA 96'$?0;)! "?')0	" LE5 +; t0
 8C ;<X<c<c<ef 6GGd5e,?,M-@AT-U*?@Q*R /# & 62# <%*%
 ;#%%	
 
u '*4??,
 4? 78T8_8_8ab 2CC`1a)<\)J&;<M&N +!
 	
W
 %r$
 )v ` !n$ 8L(N 3F(D ,@D
0 :& 0
%-=0G /'A 
  "!< wI ''.@)ht.u(u(uvw$=#:+(C!-;!-%! &C#+!-!-	&    u /;$(JYcdgivYw  }G  HK  HR  HR  TW  }X3::  ^a  be  ^f  )g1D\1R.CDU.V	 "3   )#}=3s88:fVYCZ`de&ghsgt  un  o-!=Z==0
 	
U0
s  H>l3f? l3'f? <f
=-f? *f+/f? l3f? -f.?f? -f.Af? f
-f? 9f":Af? l3B'f? 9l3:Af? l3#f? )f%
*+f? f(A#f? 9f+
:-f? 'f.(A:f? "l3#Bf? 5l36A1f? 'l3(#f? f1
9f? f4A:f?  l31f? 2f7
3-f?  f:!A+f? l3#f? 0f=1A!f? l3f? f? f? f? f? "f? %f? (f? +f? .f? 1f? 4f? 7f? :f? =f? ?l0l+j9!l0"l3'#j9
h.j99h<:A9j93l04l39	kl+kA l+%l0&l3+l00l3c                l   K   t        | |||       d {   }|j                  |j                  fS 7 w)N)r  r  r  r  )r  r  r   )r  r  r  r  r  s        rJ  run_operational_assistantr  uK  s=      9!!	 G =='--''s   424)r  r   )r  r	   )r  r   )r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  r  r  r  )r  r  r  r  r  r  )r  r  r  r  )r  r  r  list[tuple[str, str]])r  r  r4  tuple[str, str]r  r  )r  r  r  r  r  r  )r  r  r  r  )r  r  rU  r  r  r  )r  object | Noner  r  )r  r  r  r  )r  r  r  r  r   r  r  r  )rH  r  r  r  r  r  r  r  r   r  r  r  )r  r  r  r  )ro  r  r  r  )r  r  r  r  )r  r  r  r  r  r  )r  r  r  r  )r  list[dict[str, str]]r  r  )rH  r  r  r  r  r  )r  zfloat | int | Noner  r  )r  r  r  r  )rH  r  r  r  r  r  )r  r  r	  r  r  r  )r  r  r  r  )r  r  r  set[str])r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r'   r  r  )r  r  r  r  )r  r'   )r  r  r  r  )r  objectr  r  )rK  zlist[object]r  r  )r"  sqlite3.ConnectionrP  r  rQ  list[dict[str, object]]r  r]  )r"  r  rP  r  r^  r  r  r]  )r"  r  rP  r  r  r  )r"  r  rP  r  r  r  )r  r'   ri  r  r  r  )r  r  r  r(  )r  r  r  r  )r  r  r  r  )r  r'   r  r  )r  r'   r  r  r  r  )r  r  r  r  )r  r  r  r  r  r  r  r  )r  r  r  r  r  r  )r  r'   r  r  r  r  r  r  )rm  r  r  r  )r  r'   r  r  r  r  )r  r  r  r(  )r  r  r  r  )r  r  r  r  r  r  r  r  )rQ  r  r  r  )r  r'   r  r  )r"  r  r  r  )r  r  r  r  )r  r  )r  r'   r$  r  r  r  )r  r'   r$  r  r  r  )r"  r  rP  r  r  r  )rJ  sqlite3.Row | NonerF  r  r  r  )r  r'   r  r  )r  r'   r  list[ProductCandidate])r  r  r  r  r  r%  r  r  )r  r'   r$  r	  r  r  )r&  r  r  r  )r&  r  r'  r  r  r  )
r&  r%  r'  r%  r)  r(  r*  r(  r  z5tuple[int | None, int | None, str | None, str | None])r  ztime | str | Noner  r  )r  r  r  r%  )r  r  r  r  )r  r  r  r(  )r  r  r  z
list[time])r  r  r  r%  )r  r  r  r  )r:  zhttpx.HTTPErrorr  r  )r  r'   r$  r"  r  r  )r  r'   r$  r.  r  r  )r  r'   r$  r8  r  r  )r  r'   r$  r<  r  r  )r  r'   r$  r:  r  r  )r\	  r  r  zdict[str, int])r  r'   r$  rB  r  r  )r  r  r  r  r  z;tuple[str, ProductCandidate | None, list[ProductCandidate]])r  r  rn	  r  r  r  )r  r  rn	  r  r  r  )r  r  r  r  r  r  )
r"  r  r  r  r  r  r  r  r  r  )r	  r  r  r  )rJ  r  r  r  )r  r'   r"  r  r  r  r  r  r  r  r  ztuple[sqlite3.Row | None, bool])r  r'   r$  r  r  r  )r  r'   r$  rJ  r  r  )ro  sqlite3.Rowr	  r  r!	  r  r  r  )
r"  r  r  r  r  r  r  r  r  r  )r  r'   r$  rN  r  r  )r  r'   r$  rP  r  r  )r  r'   r  r%  r  r  r  7tuple[str, sqlite3.Row | None, list[dict[str, object]]])r  r'   r$  r  r  r  )
r  r'   r  r%  r&  r%  r  r  r  r  )r  r'   r$  r  r  r  )r
  r  rV  r  r  r  )ro  r  r  rS  )ro  r  rT  rS  r  r  )ro  r  r  r%  )r  r'   r)
  r  r*
  r  r  r  r
  r  r  z dict[str, object] | list[object])r  r'   r  r  )ro  r  r  r  )r  r'   r>  r(  r  r  )ro  r  r  r  r  r  )r  r'   rj  r%  rW  r  r[  r  r>  r(  rT  rS  rB
  r  r  z=tuple[str, dict[str, object] | None, list[dict[str, object]]])r  r'   r$  rY  r  r  )r  r'   r$  ri  r  r  )r  r'   r$  rv  r  r  )r  r'   r$  rR  r  r  )r
  r  rz  ry  r  r  )r
  r  r
  r  r  r  )r	  r  r  r  )r  r  r  r  )r$  rx  r	  r  r  r"   )r	  r  r  r  )r$  rx  r
  r  r  %GoogleWorkspaceDocumentPreview | None)r  r'   r$  rx  r  r  )r
  r  r  r  )r  r  r  r  )r  r  rz  ry  r  r  )r  AssistantSurfacern  r  r  r  )r  r  r  r  r  r  )r  r  r  r  r  r  r  )
r  r  r  r  r  list[dict[str, str]] | Noner  r  r  r  )r  r#   r  r#   )r  r'   r  r#   r  r  r  r  )r  r'   r  r#   r  r"   )r  r'   r  r#   r  r  )r  r'   r$  rx  r
  list[dict[str, object]] | Noner  r  )r  r'   r$  r  r  r  )r  r'   r$  r  r  r  )r  r'   r$  r  r  r  )r$  r  r  ztuple[date | None, date | None])r  r'   r  r  r  z+tuple[str | None, dict[str, object] | None])r  r'   r$  r  r  r  )r  r  r)  r(  r*  r(  r  ztuple[str | None, str | None])r  r'   r$  r  r  r  )r  r'   r$  r  r  r  )r  r'   r$  r  r  r  )r  r'   rm  r  r
  r  r  r  )r  r  )r  r  )r  r  r  r%  )r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  r  )r&  r  r'  r  rd  r  r  tuple[date, date])r&  r  r'  r  rh  r  r  tuple[int, int])rn  r   rl  r  r  r  )r  r  r  r  r  z5tuple[str, str | None, str | None, str | None] | None)r  r  r  r  r  z.tuple[str, str | None, str | None, str | None])r  r  r  r  r0  r  r  r  rD  )r  r  r  r  r  r  r  r  )
r  r  r  r  r  r  r  r  r  r  )r   r  r  r  r  r  r  r  r  r  r  r  r  r  )r  r  r  r%  )r  r  r  z	list[int])r  r  r  zlist[tuple[int, int]])r  r  r  ztuple[date, date] | None)r'  r%  r  r  )r&  r  r'  r  r  r  )r  r  r  r(  )
r)  r  r*  r  r&  r  r'  r  r  r  )r  r  r  r  r  z3Literal['products', 'orders', 'quantity', 'amount'])r  r  r  r  )r  r  r  ztuple[float, set[str]] | None)r  r  r  r  )r  r  r  r  r  r  )r  r  r  r  r  r  r  r  )r  r  r  r  )r  r  rn  r%  r  r  r5  r4  r6  zbool | Noner  PlannedToolCall | None)r  r  r  r  r  r  )r  r  r!  r  r  r  )r  r  r*  r  r  r  )r  r  r  r  r  !tuple[float | None, float | None])ro  r  r  r  )r  r  r  zELiteral['ordini', 'prenotazioni', 'whatsapp', 'fiscal', 'llm'] | None)r  r  r  r  r  r  r  r  )r  r  r	  r  r  r  )r  r  r  r  )rL  r  r  r  r  z$tuple[list[dict[str, object]], bool])r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  dict[str, str] | None)r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  z"Literal['upsert', 'delete'] | None)r  r  r  r  )r  r  r  r  )r  r  r  ry  )r  r  rm  r  r  r  )r  r  rz  ry  r  r  )r  r  r  r  )r  r  r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  r  r  r  )r  r  r  r  )r  r  r  r  r  r  r  r  )r  r  r  r  r  r  r  r  )r  r  r  r  r  r  r  r  )r  r  r  r  r  r  )r  r  r  r  )r  r  r  r  )
r  r'   r  r  r  r  r  r  r  r  )r  r  r  r  rw  r  r  r  )r  r  r  r  r  r  rx  r  rw  r  r  r  )r  r  r  r  r  r  )r  r  r  r  r  r  )
r  r  r  r  rn  r%  r  r%  r  r  )
r  r  r  r  r)  r(  r*  r(  r  r  )r  r  r  r  rG  r%  rH  r%  rI  r  rJ  r  r  r  )r  r  r  r  r  r  )r  r  r  z"tuple[str | None, str | None, str])r  r  r  ztuple[str | None, str])r  )rH  r  r  r  )r  r  r  r  r  r  )r  r  r  r  )
r  r'   r  r  r  r  r  r  r  r  )r	  r  r  r  )r%  r  r  r  )r  r  r%  r  r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  rH  r  r  r  )rJ  r  r  r  )rJ  r  rM  r  r  r  )rQ  r  r  zdict[str, list[str]])r  r  r  r  r  r  r  r  )rJ  r  r  r  )r  r  rQ  r  r  r  )r  r  rQ  r  r  r  )r>  r  r  r  )r>  r  rT  r  rV  r  r  r  )rJ  r  r  r  )rQ  r  rF  r  r  r  )rQ  r  r  r  )r  r  r/  r  r  r  )r
  r  r  r  r  z8tuple[dict[str, object] | None, list[dict[str, object]]])rS  r  r9  r  r  r  )r@  r  rU  r  r  r  )r
  r  r  r  r  r  )r2  r  r
  r  r  r  r  r  )r  r'   r$  r  r  r  )r  r  r
  r  r  r  )r  r  r  r  r  r  )r  r  r4  r  r  r  )r  r  r<  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  r  )r  r  r  r  )r
  r  r  r  )r  r  r  r  )r	  r  r  r  )r  r  r  r  r  r  )r  r  r  r  )r  r'   r  r  r  r  r  r  rl  r  rm  r  r  AssistantPlan | None)r  r'   r  r  r  r  r  r  rr  r  r  r  )
r  r  r  r  r{  r  rw  r  r  r  )
r  r'   r  r  r  r  r  r  r  r  )r  r  r  r  r  r  )
r  r'   r  r  r  r  r  r  r  r  )
r  r'   r  r  r  r  r  r  r  r  (  
__future__r   calendarr   collectionsr   
contextlibr   dataclassesr   r	   r   r
   r   r   difflibr   r   loggingpathlibr   rF  r  r   typingr   r  zoneinfor   fastapir   r  pydanticr   r   r   r   app.api.routes.google_workspacer   r   r   r   r   r   r   r   app.core.configr    app.models.google_workspacer!   r"   r#   %app.services.google_workspace_sessionr$   app.services.llm_clientr%   r&   app.services.tenant_storer'   r(   r)   r*   shared.assistant_profilesr,   CalendarDate	getLoggerr  r  r  rQ  r:  r9  rD  r  r  r  r  compiler  r  r6  r  r  r  r6  r  rC  r  r  r  r*  r  r  r*  r  r1  r]  r  r  r  rA  r(  r\  _TIPS_QUERY_IGNORED_TOKENSr  r  r  r  r  r  r  r  ru	  rv	  r  r  r  r  r  r  r	  r  r"  r.  r8  r:  r<  rB  rD  rJ  rN  rP  rR  rY  ri  rv  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r,  r0  r6  r=  r?  rB  r*  rN  r:  rZ  r_  rd  rg  rl  rp  ry  r|  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r'  r1  "_TENANT_QUERY_ALLOWED_ROWS_DEFAULTr	  r+  r1  r8  rW  r_  r]  re  rj  rn  r{  r  r  r  rj  rk  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r>  rX  r_  ra  rp  rs  r  r  r  r  r+  r  r  r  r  r  r  r  r  r"  r'  r;  r=  r@  r  rg  rt  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r$	  r2	  rT	  rZ	  r]	  rc	  rj	  ro	  rq	  rx	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r
  r

  r
  r
  r
  r-
  r3
  r8
  r>
  rA
  rP
  rY
  r`
  rc
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r  r  r  rq  ry  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r$  r'  r)  r+  rS  rZ  r\  rb  rf  rj  ro  r  r  r  r  rF  r  r  r  rv  r  r  r  rB  r  r  r9  r  r
  rB  rD  rJ  rV  rS  r  r  r  rN  rl  rp  r  r  rH  r  r  r  r  r  rY  r  r  rD  r  rE  rF  r  r  r  rG  r  rD  rC  r  rE  rH  r
  r
  rI  r"  r&  rw  rJ  rK  rL  rM  rN  rO  rC  rF  rH  rU  r_  r  r4  rV  rP  rQ  rR  rS  rT  r  r  r  r  r  r  rW  rT  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rU  r  r  r  r  r  r  r  r(  r+  r.  r<  r>  rC  rG  rK  rP  r	  r	  r\  r
  ri  rK  rp  r{  ru  rL  r^  rQ  rJ  r
  r  r  r  rR  r  r  r  r  r_  r`  ra  r  r  r  rP  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r!  r#  r%  r*  r3  r:  rB  rD  rN  ru  rx  r  r  r  r  r  r  r  rS  r  rM  r  rO  rS  r  r  r  rT  rG  r  r  r  r  rU  rt  rE  rJ  rP  rW  r\  r5  rb  rd  rP  rl  rn  rp  r  r  r  r  rv  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r&  r6  r4  r7  r:  rA  rE  rX  rS  r  r  r  r  r*  r.  r0  r2  r;  rA  rF  r  r  r  rS  rV  rW  r\  r^  rY  rg  rj  rp  ru  r  r  r  r  r  r  r  r  r  rJ  <module>r     s^   "   % ! > > #    	      !  G G	 	 	 ) D  D X X } } D			8	$   " "  h
T (( $	( $ &2::&cegerers "

#tvx  wD  wD  E  bjj!A299r}}C\] %2::&Er}}U  U  m  ( 
   
 )Q)Q) Q) Q	)
 q) q) q) q) Q) Q) Q) Q) a) a) a)  a!)" a#)$ a%)& a')( a))* Q+), Q-). Q/)0 Q1)2 q3)4 q5)6 q7)8 q9): a;)< a=)> a?)@ aA)B AC)D AE)F Q) V  &2::
	hh=_==>^_  w76?;9%#wVwx 4 0  	

		ud6 2 dJ" 2S! h "? UB U" l #@ -C -# \ ; &> & N %? FB F% !N  
#  JBMMZ9:' #"   , !0  D"?i "?J ./ I & 2 2 2   L L
>y > L9 LLY LLI LL) L	L) 	LY (Y (
i =Y =Li LLy L<I <mI m$$I $L) L) # # VI V>y >
L9 L
99 9"9 "Ly L< <
EY E"y "L L
   "7/%%*K
$
( 03((:: : 	:
 ": #: :&H
M@(!HD@&	6W>0&*.6>%
#     !$ %( "#-2:: LMM$  4	1.:Z"ZZ #Z 
	ZtO	#L2	 "++    ! J6.  	
 4"J(iB0%P3$J K ';T$NX
: F#(Ll:*?"$ OQ  .
bJ-` F(0f.
*K\S;l@LT 7
 7  7 	 7
  7 ; 7FE70/"5)X<&;"D(:]@BJCLjZEP*!H%(D"
:": : 	:
 : :z77"7 	7
 7 7 %7tG
TSl NS  ( +/)") ) 	)
 () )Xn\b*)))) )) 	))
 =))XK\,),) ,) 	,)
 ,) =,)^wt
92 (,*.  	
 % ( &@$( Z^ B B !S)S) S) 	S)
 S) S) S) S) CS)l+V\AH#LRj# 0 		"
2
%2 2 $	2j>.@K
%K 0K +	K\W
%W W $	Wt.
%. . $	.b;N;N
%;N +;N|3
%3 03 +	3l40"=
%= = $	=@;
@d^7H 15-1	 . +	
 ** !,	* 	
 +B* $DD*D DV :>	nn
%n 7	n
 nbV2j:3 0*+++ 1+\(Vhh h 	h
 #hD\~!`H(( :>	OOO 7	O
 Od
n
p
2.JZ
	2/	$,l^D3N		 EJ    ;
 JO    5p%<2*** (* 	*Z F8 .2GG&G +G 	G^ .2vv%v '	v
 +v v~ 04R,R R /	R
 *R R .R Rj,02j*X(
  	
  	,7$,(+(2<	7 '+**#* **K(b "&-1	SgSg Sg +	Sg
 Sgl
0@cF	&			&		,I1X(,@$ !%!%MQ(,EE E 	E
 KE &E EP(aM<4*-8	-64a$1
 $.*} F,' 'T!.2 s(B

	w<6%PC(L3(l
.46.&R"="=4"8	)X2.d6r&5p0,2BJ_%P&R&+&-`0 PU 
 
(Q&<3	MY ]#'L=E@,HV20 ADmJHZH< .2""&" +" 	"P .2& + 
	B .2++&+ ++ 	+b .2& + 	<
  .2FF&F +F 	FB .2II&I +I 	IF .2& + 
	> .2& + 	6 .2HH&H +H 	H4&"& : .2YY&Y +Y 	Y&P$2Nr .2	666 '6 +	6
 6x .2;";"&;" +;" 	;"|6 .211&1 +1 	1n .2~~&~ +~ 	~B777 -7 
	7t - 
	D '
 1 - 
8
T&j*$&VR !% $!%vgvg vg 	vg
 vg vgx "&"   	
  4cgR "& $!%&*$(tXtX tX 	tX
 tX $tX "tX tXn MQ 	L 	L66r`(F _c cg cgL
 
+ +6 68Qgh@P
 .2O6O6 O6 '	O6
 +O6 O6dB$NO
[x
Y


k
a
3
2S- 	"6D[>Q3l3l'* # 	!4!4 !4 	!4
 	!4HL
B08*.b;|k\iX1(( $B!,	>A\H{{${ 	{
 {|/dXv%[P(VWt(*8 ;<  2 [` @ @
u :;  .@. ,j.b Q"
}i33 3 '	3
 +3 /3 33 3l,Z,Z ,Z '	,Z
 +,Z ,Z ,Z^111 21 -	1
 
1h** * '	*
 ** *Z( .2f
f
 f
 '	f

 +f
 f
\ .2(( ( '	(
 +( (r  