
    y"jg                      d dl mZ d dl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Zd dlZd dlmZ d dlZd dlmZmZmZ d dlZd d	lmZ d dlZd d
lmZ d dlmZ d dlm Z  d dl!m"Z" d dl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) d dl*m+Z+m,Z,m-Z-  e
j\                  d      Z/ e
j\                  d      Z0 e
j\                  d      Z1 e
j\                  de
jd                        Z3h dZ4h dZ5 ed      Z6dZ7h dZ8h dZ9h dZ:dZ;h dZ<h dZ=ddhd d!hh d"fZ>h d#Z?h d$Z@eAj                  i d%d&d'd&d(d)d*d)d+d,d-d,d.d/d0d/d1d2d3d4d5d4d6d7d8d7d9d:d;d:d<d=d>d=i d?d@dAdBdCdBdDdEdFdEdGdHdIdHdJdKdLdKdMdNdOdNdPdQdRdQdSdTdUdTdVdWdXdWdYdYdZdZd[d\d]d^d^d_d_d`d`dadadb      ZCddcZDd	ddZEd
deZFddfZGd	dgZHdhdiddjZIddkZJddlZKddmZLddnZMddoZNddpZOddqZPddrZQd	dsZRdddtZSdduZTd	dvZUddwZVddxZWddyZXd	dzZYdd{ZZdd|Z[dd}Z\dd~Z]d	dZ^ddZ_ddZ`ddZaddZbddZcd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d&dZmd'dZnd(dZod)dZpd*dZqh dZrh 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{d0dZ|d1dZ}d2dZ~ddZ	 	 	 	 	 	 	 	 	 	 	 	 d3dZddZddZd4dZd5dZd6dZd7dZd8dZd8dZd9dZd:dZd8dZd;dZd	dZ	 	 	 	 	 	 d<dZddd=dZd>dZd?dZd@dZdAdZdAdZdBdZdAdZdCdZ	 	 	 	 	 	 	 	 	 	 	 	 dDdZdEdZ	 	 dF	 	 	 	 	 	 	 	 	 dGdZdHdZdIdZdJdZd9dZdJdZdKdÄZdKdĄZ	 	 	 	 	 	 dLdńZ	 	 	 	 	 	 	 	 	 	 dMdƄZ	 	 	 	 	 	 	 	 	 	 	 	 dNdǄZdOdȄZdPdɄZdPdʄZdPd˄ZdQd̄ZdRd̈́ZdSd΄Z	 	 	 	 	 	 	 	 dTdτZ	 	 	 	 	 	 	 	 dUdЄZddфZdd҄ZddӄZdVdԄZdWdՄZdXdքZdYdׄZ	 	 	 	 	 	 	 	 dZd؄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d1dZddZ	 	 	 	 	 	 	 	 d`dZddZÐd$dZĐdadZ	 	 	 	 	 	 	 	 	 	 dbdZƐdcdZǐdddZȐd[dZɐd&dZʐdedZːdedZ̐dfdZ͐dgdZΐdhdZϐdidZАdjdZѐdkdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 dldZӐdmdZdddndZՐdodZdd	 	 	 	 	 	 	 	 	 	 	 dpdZאdqdZؐdrdZ	 	 	 ds	 	 	 	 	 	 	 dtdZdd 	 	 	 	 	 	 	 dudZېdvdZܐdwdZݐdwdZ	 	 	 	 	 	 dxdZߐdydZ	 	 	 	 	 	 	 	 	 	 dzdZy({      )annotations)datetimetimezone)SequenceMatcherN)Path)median)ZoneInfo)HTTPException
UploadFilestatus)Image)get_settings)!process_document_with_document_ai)upload_binary_file_to_drive)&get_active_google_workspace_connection)extract_menu_asset_textnormalize_asset_namenormalize_text_blockresolve_asset_kindresolve_asset_mime_typetruncate_text)FiscalDocumentRecordSessionIdentityget_tenant_storez%\b(\d{2})[./-](\d{2})[./-](\d{2,4})\bz2(?<!\d)(\d{1,3}(?:\.\d{3})*,\d{2}|\d+,\d{2})(?!\d)z'(?<![\d/.-])(\d+(?:[.,]\d{2}))(?![\d/])zQ\b(s\.?\s*r\.?\s*l\.?|s\.?\s*n\.?\s*c\.?|s\.?\s*a\.?\s*s\.?|s\.?\s*p\.?\s*a\.?)\b>   bmbtcsctfdkgltpz>
   BMBTCSCTFDFSKGLTNRPZzEurope/Rome)descrizione prodottodescrizione mercequantita	bottiglie	categoriazcod. ean
confezionez
in cartoniin cassezgiorno chiusurazdiritto fissofirma del destinatariodichiaro di aver ricevutoai sensi dell'art.>   aldianddeidelthekg10liitlt18delladellepapersuper>   bludrygasnatpetbluegoldminiroseanejoblackgreenplatarossoverdevetrowhitebiancoblancogiallagiallosilvernaturalereposadosapphire>   invoicedelivery_noteinstant_invoiceffffff?>                     >   fornitore direttofornitore genericocashvarivariedirettadirettogenericozel originalz
25 holdingzeleven tradezroby marton>   marcello reduzzimarcello reduzzi montenegromarecello reduzzi montenegro
montenegro>   asbvdpesr    mcmprutzvorur>	   lr   cfr   r    r!   nrr"   crtu   ΑAu   Аu   ΒBu   Вu   ϹC   Сu   ΕEu   Еu   ΖZu   ΗHu   Нu   ΙIu   Іu   ΚKu   Кu   ΜMu   Мu   ΝNu   ΟOu   Оu   ΡPu   Рu   ΤT   Тu   ΥYu   Уu   ΧXu   Хu   αau   аu   βbu   вu   ϲcu   сeikmnoptx)u   εu   еu   ιu   іu   κu   мu   νu   οu   оu   ρu   рu   τu   тu   χu   хc                F    t        | xs d      j                  t              S N )r   	translate_OCR_LATIN_CONFUSABLESvalues    8apps/backend-hub/app/services/fiscal_document_service.py _normalize_ocr_latin_confusablesr      s    ,667MNN    c                f    t        | xs d      j                         t        fddD              S )Nr   c              3  &   K   | ]  }|v  
 y wN .0token
normalizeds     r   	<genexpr>z/_has_legal_reference_context.<locals>.<genexpr>   s     iuu
"i   )zd.p.rdprdecretozart.articololegger   casefoldanyr   r   s    @r   _has_legal_reference_contextr      s,    %ekr2;;=Ji0hiiir   c                    t        |       }|sy d|v r1|j                  dd      j                  dd      j                         }n|j                         }	 t        |      }|dk\  r|S d S # t        $ r Y y w xY w)N,.r   r   )r   replacestripfloat
ValueError)r   	raw_valuer   parseds       r   _parse_euro_amountr      s    $U+I
i&&sB/77SAGGI
__&
z" q[6*d*  s   A) )	A54A5c                    t        | xs d      }|sy dD ]6  }	 t        j                  ||      j                         j	                         c S  y # t
        $ r Y Ew xY w)Nr   )z%Y-%m-%dz%d/%m/%Yz%d-%m-%Yz%d/%m/%yz%d-%m-%y)r   r   strptimedate	isoformatr   )r   r   patterns      r   _parse_iso_or_italian_dater      sh    $U[b1IO 	$$Y8==?IIKK
   		s   1A	AAc                   t        |       }|sy	 t        j                  |      j                         }t        j
                  t              j                  }d|j                  cxk  xr |dz   k  S c S # t        $ r Y yw xY w)NF     )r   r   fromisoformatr   r   now_ITALIAN_TIMEZONEyear)r   r   parsed_datecurrent_years       r   "_is_plausible_fiscal_document_dater      s|    '.F,,V499; << 1277L;##7|a'77777  s   #A3 3	A?>A?r   contextc               ~    t        | xs d      }|sy t        | d|       ry t        |      }|rt        |      r|S y )Nr    )r   r   _parse_italian_date_matchr   )r   r   r   r   s       r   &_parse_plausible_italian_document_dater      sI    $U[b1I#wiq$<=&y1F4V<r   c                B   t        | xs d      }|sy t        j                  |      }|sy |j                         \  }}}	 t	        |      }|dk  r|dz  }t        |t	        |      t	        |            j                         }|j                         S # t        $ r Y y w xY w)Nr   d   r   )	r   _DATE_PATTERNsearchgroupsintr   r   r   r   )r   r   matchdaymonthr   
year_valuer   s           r   r   r      s    $U[b1I  +E||~CY
$J*c%j#c(;@@B   s    AB 	BBc                |    g }t         j                  |       D ]!  }t        |      }||j                  |       # |S r   )_AMOUNT_PATTERNfindallr   append)lineamountsr   r   s       r   _extract_amounts_from_liner      sD    G ((. ##E*NN6"# Nr   c                    | y t        | t              ry t        | t        t        f      rt        |       }nt	        t        |             }|y |dkD  r|S d S )Nr   )
isinstanceboolr   r   r   str)r   r   s     r   _coerce_positive_document_floatr     sU    }%%#u&u#CJ/>aZ6)T)r   c                    t        |       }t        |       }t        |      dk\  rt        j                  d|      r|d d S |S )Nrc   z2(?:^|[\s|])(?:0[,.]00\s+)?(?:4|04|10|22)[,.]00\s*$)r   r   lenrer   )raw_row_textr   r   s      r   "_amounts_without_trailing_vat_rater     sB    (6G%l3JGIIKZXs|Nr   c           	        t        t        | j                  d      xs d            }|syt        |      }|D cg c]
  }|dkD  s	| }}|sy|d   t	        | j                  d            t	        | j                  d            t	        | j                  d            t	        | j                  d	            t	        | j                  d
            fD cg c]  }|| c}d }d|v rˉrt        j                  d|      D cg c]  }t        |      st        |       }}d }	t        |      D ]N  \  }
}t        t        j                  dd|      j                               7t        fdD              sL|
}	 n |	1|	dz   t        |      k  r t        dj                  ||	dz   d              }||n|d d }t        fd|D        d       }|t        |      dk(  r|d   }|fS c c}w c c}w c c}w )Nr   r   NNr   r   
pack_countquantitygross_quantitytare_quantitynet_quantity|\s*\|\s*z\s*[xX]\s*$c              3  @   K   | ]  }t        |z
        d k    ywMbP?Nabs)r   r   quantity_candidates     r   r   z<_infer_document_line_pricing_from_raw_row.<locals>.<genexpr>>  s!     _83)H45>_   r    | c              3  n   K   | ]+  t        fd D              st        z
        dkD  r - yw)c              3  @   K   | ]  }t        |z
        d k    ywr  r  )r   r   amounts     r   r   zF_infer_document_line_pricing_from_raw_row.<locals>.<genexpr>.<genexpr>I  s      W8s6H,-6Wr  r  N)r   r  )r   r
  
line_totalquantity_valuess    @r   r   z<_infer_document_line_pricing_from_raw_row.<locals>.<genexpr>F  s9      	
WWWFZ'(50 	
s   15)r   r   getr   r   r   split	enumerater   subr   r   r   joinnext)itemr   r   r
  positive_amountsr   unit_price_amountscellcellsquantity_cell_index
cell_indexunit_candidates
unit_pricer  r  r  s                @@@r   )_infer_document_line_pricing_from_raw_rowr     s   'DHH^,D,J(KLL0>G-4C6
CC!"%J ,DHH\,BC+DHHZ,@A+DHH5E,FG+DHH_,EF+DHH^,DE

  	
O .2
l8:l8[z_stx_y%d+zz" )% 0 	J!3BFF>2t4T4Z4Z4\!]!)___&0#	 */BQ/FU/S!CEJJuUhklUlUnOoDp!q,>,J(P`adbdPeO	
)	
 	J c"23q8%a(

##U D

 {s   
G.G.G3G8G8c                    t        | j                  d            }t        | j                  d            }t        |       \  }}||}||}||fS )Nr  r  )r   r  r  )r  r  r  inferred_unit_priceinferred_line_totals        r   _document_line_pricingr   S  s[    0,1GHJ0,1GHJ/XY]/^,,(
(

##r   c                    t        |       }t        |      \  }}t        |j                  d            |t	        |d      |d<   t        |j                  d            |t	        |d      |d<   |S )Nr  rd   r  )dictr   r   r  round)r  enrichedr  r  s       r   _enrich_document_item_pricingr%  ^  ss    DzH3H=J
&x||L'ABJzOe!&z1!5&x||L'ABJzOe!&z1!5Or   c                    | y t        j                  dt        |             }|sy 	 t        t	        |j                  d                  S # t        $ r Y y w xY w)Nz\b(4|04|10|22)\br   )r   r   r   r   r   groupr   )r   r   s     r   _document_vat_rate_from_coder(  h  sT    }II)3u:6ESQ()) s   "A
 
	AAc                   t        | xs d      j                  d      }t        |      dk  ryd|v ryt        |      ryt	        j
                  d|t        j                        syt        t	        j                  d|            S )Nr    .:-/#rb   F@z[A-Z0-9./-]{3,}\d)	r   r   r   r   r   	fullmatch
IGNORECASEr   r   )r   	candidates     r   _looks_like_document_numberr0  t  sn    $U[b177AI
9~
i +<<*Ir}}E		%+,,r   c                   t        | xs d      j                         t        |xs d      j                         syt        j                  d      }|d uxr1 |j	                  d      t
        v xr t        j                  d      d u}|s-t        j                  d      st        j                  d      syt        fdt        D              ryt        fd	d
D              ryy)Nr   Tz^([a-z]{2,3})\br   z
\b\d{6,}\bu   [a-zà-ÿ]{3,}\bco2\bc              3  &   K   | ]  }|v  
 y wr   r   )r   r   normalized_descriptions     r   r   z*_is_noise_delivery_item.<locals>.<genexpr>  s     
Tu5**
Tr   c              3  &   K   | ]  }|v  
 y wr   r   )r   r   normalized_rows     r   r   z*_is_noise_delivery_item.<locals>.<genexpr>  s     
~u5N"
~r   )r5   r6   r4   F)	r   r   r   r   r'   _COMPACT_FISCAL_PRODUCT_PREFIXESr   r   _DELIVERY_ITEM_NOISE_TOKENS)descriptionr   compact_product_matchis_compact_product_descriptionr4  r6  s       @@r   _is_noise_delivery_itemr<    s    1+2CDMMO),*<"=FFHN!HH%79OPT) 	A!''*.NN	AIIm^4D@ # +		+-CD		*&<=

T8S
TT

~0}
~~r   c                    g }| D ]m  }t        |t              st        |j                  d      xs d      }t        |j                  d      xs d      }t	        ||      r]|j                  |       o |S )Nr9  r   r   )r   r"  r   r  r<  r   )itemscleanedr  r9  r   s        r   _clean_delivery_itemsr@    ss    ')G $%$((=17R8488N39r:";=t Nr   c                    t        | xs d      }|syt        j                  d|      s&t        j                  d|t        j                        sy|j	                         t        fddD              ryy)Nr   F   [A-Za-zÀ-ÿ]{3,}r2  c              3  &   K   | ]  }|v  
 y wr   r   r   r   lowereds     r   r   z8_looks_like_delivery_description_line.<locals>.<genexpr>  s       G5G  Gr   )imposta di bolloriepiloghi ivatotale documentototale a pagareannotazioniT)r   r   r   r.  r   r   )r   r   rE  s     @r   %_looks_like_delivery_description_linerK    so    %ekr2J99):6ryyU_acanan?o!!#G
  G  *F  G  Gr   c                    t        | xs d      j                         }|sy|dv ryt        j                  d|      syt        j                  d|      syt        j                  d|      ryt        |      dk  S )Nr   F>   C.IC.I.0r#   r$   CIr%   r&   r'   r(   SSOCTz
[$A-Z0-9]+r,  z\d{1,3}re   )r   upperr   r-  r   r   )r   r   s     r   !_looks_like_stacked_delivery_coderT    sm    %ekr288:J``<<z299UJ'	||J
+z?b  r   c                    t        | xs d      j                         }|sy dddd d d}||v r||   S |j                         t        v r|S t	        j
                  d|      }|r|j                  d      S y )Nr   r&   r%   )rR  0CT6CSu   Θu   ওz(CT|CS|FD|BT|BM|KG|LT|PZ|FS)$r   )r   rS  r   _STACKED_DELIVERY_LOT_CODESr   r   r'  )r   r   	alias_mapsuffix_matchs       r   $_normalize_stacked_delivery_lot_coder[    s    %ekr288:JI Y$$ ;;99=zJL!!!$$r   c                |    t        j                  d|       D cg c]  }t        |      rt        |       c}S c c}w Nr   )r   r  r   r   parts     r   _split_laconi_structured_partsr`    s<     HH[$/+D1 	).     9c                *    t        t        |             S r   )rT  r   r   s    r   "_looks_like_laconi_structured_coderc    s    ,-Me-TUUr   c                ^   | rt        | d         r| S t        | d         }t        j                  d|t        j                        }|s| S |j                  d      j                         }t        |j                  d            }t        |      rt        j                  d|      s| S ||g| dd  S )Nr   z^(\$?[A-Z0-9]{2,12})\s+(.+)$r   ra   rB  )rc  r   r   r   r.  r'  rS  r   )parts
first_partr   coder9  s        r   "_normalize_laconi_structured_partsrh    s    6uQx@1%(;JHH4j"--PE;;q>!D25;;q>BK-d3299EY[f;g+*ab	**r   c                    t        |       }|syt        j                  d|t        j                        }|sd |fS |j	                  d      j                         t        |j	                  d            fS )Nr   z*^(FS|CT|BM|BT|CS|FD|PZ|KG|LT|NR)\b\s*(.*)$r   ra   )r   r   r   r.  r'  rS  r   r   r   r   s      r   _split_laconi_unit_tokenrk    sd    1%8JHHBJPRP]P]^Ej!!KKN  "$8Q$HIIr   c                    t        |       }|syt        j                  d|      }|syt        |j	                  d            }|j	                  d      rt        |j	                  d            nd }||fS )Nr   z-(\d+(?:[.,]\d+)?)\s*[xX]\s*(\d+(?:[.,]\d+)?)?r   ra   )r   r   r   r   r'  )r   r   r   r   unit_multipliers        r   !_parse_laconi_quantity_expressionrn    sf    1%8JIIF
SE#EKKN3J<AKKN(Q8PTO((r   c                    t        |       }d|v rt        |j                  dd      d         S d|v rt        |j                  dd      d         S y)Nr   r   r   r   r   )r   r   rsplitr   s     r   _laconi_decimal_placesrq    sY    1%8J
j:$$S!,R011
j:$$S!,R011r   c                    t        |       }|syt        |      \  }}|yt        j                  d|      ryt	        |xs |      rt        j
                  d|      syy)NFTz-\d+(?:[.,]\d+)?\s*[xX]\s*(?:\d+(?:[.,]\d+)?)?rB  )r   rk  r   r-  _extract_decimal_tokensr   )r   r   	unit_code	unit_rests       r   _looks_like_laconi_detail_startrv    s^    1%8J3J?Iy	||DjQy6J7		J^`j@kr   c                   t        |       dk  st        | d         sy g }t        |       }t        | dd  d      D ]%  \  }}t        |      r|} n|j	                  |       ' t        dj                  |            }|rt        |      ry | |d  }d }d }	d }
d}g }|D ]  }t        |      }|st        |      \  }}||}|}|s(t        |      \  }}|	|}	|}
|d u }A|r(t        j                  d|      rt        |      }||}
d}k|j                  t        |              |D cg c]  }t        |      x}| }}t        ||      D cg c]  \  }}t!        |      dk\  r| }}}|r|d   nt        |      dk\  r|d   nd }|r|d	   nd }d }|	|
|	|
z  }n|	|	}|| d   d |d ||	|	|d |	||d t#        d
j                  |             dS c c}w c c}}w )Nra   r   r   )startr   F\d+rb   r   r  
line_indexproduct_codeiso_coder9  category_codert  r   r   r   r   r   r  r  vat_coder   )r   rc  r  rv  r   r   r  r<  rk  rn  r   r-  r   extendrs  ziprq  r   )re  r{  description_partsdetail_startindexr_  r9  detail_partsrt  r   rm  pending_multiplierdecimal_tokensraw_partcurrent_unit_coderu  current_pack_countcurrent_multiplierparsed_multiplierr   r   parsed_decimalshigh_precision_pricesr  r  r   s                             r   #_parse_laconi_structured_item_partsr    s   
5zA~?aI#%u:L qr!4 't*40 L  &	' 3388<M3NOK1+>'L I#J$(O "N  =/9'?'E$9()ID1RSW1X..)+J0O!3t!;",,vt"< 24 8 ,"3%*"5d;<3=: $(//F< 	O  !AE6!%(A- 	 
 .C&q)_bcr_swx_xYZI[  CJ(7$TJN/"=#o5		# !a" ("  ,UZZ->? '
s   'GGc                .   t        | d      }|yt        |j                  d            }t        |j                  d            }t        |j                  d            }|y||dk  ry| ||z  }|dkD  r|t        |d	z  |d
z        k  ry|dk  xr |dk\  S )Nr   Fr  r  r   Tr   r   g      ?皙?   
   )r  r   r  max)re  r   r  r  r   expected_totals         r   )_laconi_structured_row_needs_continuationr  u  s    0;F~0L1IJJ0L1IJJ4VZZ@P5QRN1!4#n4A*s:3C^VYEY/Z"Z4" 44r   c                
   t        |       j                         D cg c]#  }|j                         s|j                         % }}|sg S g }t        |      D ]5  \  }}t	        |      dv sdv sdv s dv s%|j                  |       7 |st        |       S d}g }t               }t        |      D ]i  \  }}	|dz   t        |      k  r||dz      n
t        |      }
||	dz   |
 }d}|t        |      k  sD||   }|j                         t        fd|D              rnt        t        |            }|s|dz  }Ut        |d         sUt        dt        t        |      dz
  d	            D ]0  }t        ||         st        d
 ||dz   d  D              s+||d  } n t        |d         rt!        |      r+|dz   }|t        |      k  r||   }|j                         t        fd|D              rnt        t        |            s|dz  }Ut        dj#                              }t        t%        j&                  d|            dk\  rnt        d         rnt        fdt        dt        t              d	            D              rnSt        d D              sn@D ]  }||vs|j                  |        |}t!        |      sn|dz  }|t        |      k  rt        dj#                  |            j                         }||vr"|j                  |       |j)                  |       |dz  }S|dz   t        |      k  rt        t        ||dz                  ng rt        d         rt        d dd D              rt        d |D              rt        t%        j&                  dt        dj#                  |                        dk  rbd   gdd  |}t        dj#                  |            j                         }||vr"|j                  |       |j)                  |       |dz  }St        |      dk\  rrt        d         rt              dk\  rt+        d         d   d   |d   gdd  }|dd  D ]$  }t-        |      s||vs|j                  |       & t        dj#                  |            j                         }||vr"|j                  |       |j)                  |       |dz  } |dz  }|t        |      k  r&l g }|D ]4  }t/        t        |      t        |            }|$|j                  |       6 t1        |      }|r|S t        |       S c c}w )Nc artdescrizioner/   prezzo)	totale mercerH  rI  rF  rG  riepiloghiivadata inizio trasportocausale del trasportor4   r   r   c              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   zH_extract_laconi_delivery_note_items_from_preview_text.<locals>.<genexpr>  s     @55J&@r   rc   c              3  2   K   | ]  }t        |        y wr   )rv  r   r_  s     r   r   zH_extract_laconi_delivery_note_items_from_preview_text.<locals>.<genexpr>  s     j$ ? Ej   c              3  &   K   | ]  }|v  
 y wr   r   r   r   next_normalizeds     r   r   zH_extract_laconi_delivery_note_items_from_preview_text.<locals>.<genexpr>  s     QEu7Qr   r   rB  ra   c              3  :   K   | ]  }t        |           y wr   )rc  )r   
code_index
next_partss     r   r   zH_extract_laconi_delivery_note_items_from_preview_text.<locals>.<genexpr>  s#       * ?z*?UVs   c              3  2   K   | ]  }t        |        y wr   rs  r  s     r   r   zH_extract_laconi_delivery_note_items_from_preview_text.<locals>.<genexpr>  s     "XT#:4#@"Xr  r  c              3  <   K   | ]  }t        |      d    du  yw)r   N)rk  r  s     r   r   zH_extract_laconi_delivery_note_items_from_preview_text.<locals>.<genexpr>  s      b$06q9Eb      c              3  2   K   | ]  }t        |        y wr   r  r  s     r   r   zH_extract_laconi_delivery_note_items_from_preview_text.<locals>.<genexpr>  s     H$/5Hr  )r   
splitlinesr   r  _normalize_match_textr   -_extract_simple_delivery_note_items_from_textsetr   r   r   rh  r`  rc  rangeminr  r  r   r   addrk  rs  r  r@  )textr   linesheader_indicesr  stop_tokensstructured_rowsseen_raw_rowssection_indexheader_indexnext_header_indexbodyr   re  r  lookahead_index	next_line	next_textcontinuation_partraw_rowmergedtrailing_partr>  	row_partsr   cleaned_itemsr  r  r   s                             @@@r   5_extract_laconi_delivery_note_items_from_preview_textr    s   &:4&@&K&K&M^dQUQ[Q[Q]TZZ\^E^	 "N ' )t*40
j ]j%@ZS]E]bjnxbx!!%() <TBB
K (*O!eM'0'@ c#|ANQRARUXYgUhAhN=1+<=nqrwnx\A%(9:#d)m7DJ@K@@67UVZ7[\EQ5eAh?"'3s5zA~q+A"B J:5;LMjRWXbefXfXhRijj %jk 2 2%(;<UC&'!eO)CI5$($9	*3*<*<*>Q[QQ!%GHfgpHq%r
)+q0O$$8*9M$N	rzz*>	JKqP!=jmL! .3As3z?A7N.O  """XZ"XX!1; @-0= %-> ?@ ,HO!'1,7 *CI5: /uzz%/@AJJL-/#**51!%%g.Q q53t9$ 33QRVWX[\W\R]3^_  6z!}EbR\]^_`RabbH%HH

#79MchhW\o9^_`cdd$Q-A*QR.A5A.uzz&/ABKKM-/#**62!%%g.Q E
a6z!}E
Oq(,Z];A>J$Q-qCJqrNC%*12Y 5M.}=-W]B]m45 /uzz&/ABKKM-/#**62!%%g.QFA #d)m	cJ &(E$ !	45WXa5bdghmdnoLL ! *%0M8>>M _s
   U:U:c                j    t        j                  dd|       }d| v xs | dv xs |j                  d      S )Nz\s+r   r/   >   qtqtar  )r   r  
startswith)normalized_cellcompacts     r   _is_quantity_header_cellr    sA    ffVR1Go% 	%m+	%e$r   c                   t        | xs d      }|sy t        j                  d|t        j                        }|sy t        |j	                  d            j                         j                  d      }h d}t        j                  dd|      j                         }||vry t        |j	                  d            }||d	kD  r|S d S )
Nr   z^(\d+(?:[.,]\d+)?)\s*(.*)$ra   z .>   n dr   r   r   r   r    r!   mlndr   r"   collicartonecartonilattinalattine	bottigliar0   
[^a-z0-9]+r   r   r   )	r   r   r   r.  r'  r   r   r  r   )r   r   r   trailingallowed_trailing_tokensr   s         r   _parse_delivery_quantity_liner    s    %ekr2JHH2JNE#EKKN3<<>DDTJH( vvmS(399;H..!%++a.1H+18F$Fr   c                   t        |       j                         D cg c]#  }|j                         s|j                         % }}|sg S d }t        |      D ]]  \  }}d|j	                         vrdj                  ||t        |dz   t        |                   j	                         }d|v sVd|v s[|} n |g S d}d}d }g }	g }
g dfd}||dz   d  D ]  }t        |      }|j	                         t        fd	|D              r t              S t        fd
|D              rt        |      dk  rat        |      }|;|r |||       d }n,|	r ||	j                  d      |       n|
j                  |       t        |      s|
r |||
j                  d             ||	s|}||	j                  |       d }|	j                  |        t              S c c}w )Nr  r   rc   quantit)pesor  bancalizcausale trasportor  portovettorezfirma incaricatozfirma destinatarior4   noterH  r  )r  r  c                    t        |       }|dk  st        ||      ry j                  t              d d |d d |||d |d d d | dt	        |d       d       y )Nr   r  grz  )r   r<  r   r   format)r9  r   cleaned_descriptionr>  s      r   append_itemzK_extract_description_quantity_delivery_items_from_text.<locals>.append_itemb  sz    2;?q=34GI\]!%j $ 2!%!&$"*!% ("" #6"7s6(C;P:Q R	
r   r   c              3  &   K   | ]  }|v  
 y wr   r   rD  s     r   r   zI_extract_description_quantity_delivery_items_from_text.<locals>.<genexpr>}  s     9Eu9r   c              3  &   K   | ]  }|v  
 y wr   r   rD  s     r   r   zI_extract_description_quantity_delivery_items_from_text.<locals>.<genexpr>  s     ;Eu;r   rf   r   )r9  r   r   r   returnNone)r   r  r   r  r   r  r  r   r   r  popr   rK  r@  )r  r   r  r  r  nearbyr  header_tokenspending_descriptionqueued_descriptionsqueued_quantitiesr  r   r   r>  rE  s                 @@r   6_extract_description_quantity_delivery_items_from_textr  =  s   &:4&@&K&K&M^dQUQ[Q[Q]TZZ\^E^	#L ' t/%EAIs5z(BCDMMOF"yF': L 	K /M&*%'%'%'E
0 lQ&() /)$/
%%'9[998 !''7 ;];;JSU@U0<"/:&*#$/33A6A!((24Z@
$5$9$9!$<=&/B",*&&':;"&"":.=/@ !''y _s
   G!G!c                   t        |       j                         D cg c]#  }|j                         s|j                         % }}|sg S d }g }t        |      D ]  \  }}t	        j
                  d|      D cg c]  }t        |      st        |       }}|D cg c]  }t        |       }	}t        |      dk\  set        d |	D              sxt        d |	D              s|}|} n |t        |       S |D cg c]  }t        |       }
}t        d t        |
      D        d      }t        d t        |
      D        t        |      dz
        }t        d t        |
      D        d	      }t        d
 t        |
      D        d       }d}g }||dz   d  D ]7  }t        |      j                         t        fd|D              r nd|vr9t	        j
                  d|      D cg c]  }t        |      st        |       }}t        |      dk  r|t        |      k  r
||k7  r||   nd }|t        |      k  r||   nd}d }t	        j                  d|d	   t        j                        }|ret        |      dkD  rWt        |d         }t        |j                  d            }|-t	        j                   d|      r|j                  d      }|}|}d}||t        |      k  r||   nd}||rt        |      nd }|Cg }t        |      D ]&  \  }}t        |      }||j#                  ||f       ( |s|d   \  }}n|}||d	k  r|s|dkD  rdj%                  |d|       }t'        ||      rd }| |t        |      k  r||   }t        |      |}|j#                  t        |      |d |d ||||d |d d d t        |      d       : t)        |      }|r|S t        |       S c c}w c c}w c c}w c c}w c c}w )Nr   ra   c              3  $   K   | ]  }d |v  
 ywr  Nr   r   r  s     r   r   z@_extract_simple_delivery_note_items_from_text.<locals>.<genexpr>  s     GdMT)Gs   c              3  2   K   | ]  }t        |        y wr   r  r  s     r   r   z@_extract_simple_delivery_note_items_from_text.<locals>.<genexpr>  s     Pt,T2Pr  c              3  0   K   | ]  \  }}d |v s|  ywr  r   r   r  r  s      r   r   z@_extract_simple_delivery_note_items_from_text.<locals>.<genexpr>  s     mtWdhlWlem   r   c              3  <   K   | ]  \  }}t        |      r|  y wr   r  r  s      r   r   z@_extract_simple_delivery_note_items_from_text.<locals>.<genexpr>  s$      	
t'- 	
r  c              3  :   K   | ]  \  }}d |v s|dk(  s|  yw)codicecodNr   r  s      r   r   z@_extract_simple_delivery_note_items_from_text.<locals>.<genexpr>  s&     rPX\`P`dhlqdqurs   r   c              3  0   K   | ]  \  }}|d v s|  yw)>   u mumunitaNr   r  s      r   r   z@_extract_simple_delivery_note_items_from_text.<locals>.<genexpr>  s     oPTXnPnuor  )r  zdata e firmar4   znumero di collir  rH  r  trasporto a mezzoc              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   z@_extract_simple_delivery_note_items_from_text.<locals>.<genexpr>       <uu
"<r   r   rb   r   z^([A-Z0-9]{4,})\s+(.+)$   [A-Za-zÀ-ÿ]{2,}r   r   rz  )r   r  r   r  r   r  r  r   r   r  r  r   r   r.  r   r'  r   r   r  r<  r@  ) r  r   r  r  header_cellsr  r_  r  r  normalized_cellsnormalized_headerdescription_indexquantity_indexr  
unit_indexr  r>  r|  r9  r   merged_description_matchmerged_quantitymerged_descriptionr  quantity_cellnumeric_cellsr  r   rt  candidate_unitr  r   s                                   @r   r  r    sj   &:4&@&K&K&M^dQUQ[Q[Q]TZZ\^E^	#L L ' 
t8:d8SrWklpWq%d+rrDIJD1$7JJJ!OG6FGGP?OPP L L
 EdKKAMN.t4NNmyAR7Smopq	
():;	

 	LAN r	:K0LrtuvJo	:K0LoquvJ	K &(ElQ&() G
)$/88:
<<<d?8:d8SrWklpWq%d+rru:>,6U,C
VgHguZ(mq2Cc%j2Pe-.VX!%#%88,FaRTR_R_#` #E
Q0q:O!56N6T6TUV6W!X*ryy9MOa/b7==a@0*&'#191AnWZ[`WaFan-gi<I)-8tH57M$-e$4 ? 
D+D1%!((*f)=>? !,9",=)"0x1}2Q6((5+>#?@K";5	!j3u:&=":.N!.19*	!%j , *!%&&$"*!% (""  4T :	
kG
P *%0MA$GGo _ sJ O> ss.   O.O.8O3	O3O8=O=*P;Pc                .    t        j                  d|       S )Nz.\d{1,3}(?:\.\d{3})+,\d{2,4}|\d+(?:[.,]\d{2,4}))r   r   r   s    r   rs  rs    s    ::GOOr   c                .   t        | j                  d      t              r| j                  d      ni }t        |t              r+t        t	        |j                  d      xs d            }|r|S t        t	        | j                  d      xs d            }|S )N
textAnchorcontentr   mentionText)r   r  r"  r   r   )entitytext_anchoranchoredmention_texts       r   _document_ai_entity_textr     sx    .8L9QSW.X&**\*^`K+t$'KOOI,F,L"(MNO'FJJ},E,K(LMLr   c                   t        | j                  d      t              r| j                  d      ni }t        |t              syt        t	        |j                  d      xs d            }|r|S t        |j                  d      t              r|j                  d      ni }t        |t              rt        |j                  d      xs d      }t        |j                  d      xs d      }t        |j                  d      xs d      }|r.|r,|r*	 t        |||      j                         j                         S t        |j                  d	      t              r|j                  d	      ni }t        |t              rJt        |j                  d
      xs d      }t        |j                  d      xs d      }	||	dz  z   }
|
r|
dS y# t        $ r Y w xY w)NnormalizedValuer   r  	dateValuer   r   r   r   
moneyValueunitsnanosi ʚ;z.2f)
r   r  r"  r   r   r   r   r   r   r   )r  r   normalized_text
date_valuer   r   r   money_valuer%  r&  r
  s              r   #_document_ai_entity_normalized_textr*  &  s   2<VZZHY=Z\`2a-.giJj$'*3z~~f/E/K+LMO0::>>+;VX\0],ceJ*d#:>>&).Q/JNN7+0q1*..',1-EceS1668BBDD 3=Z^^L=Y[_2`*...fhK+t$KOOG,12KOOG,12%-/0S\"  s   (G 	GGc                   t        | t              syt        | j                  d      t              r| j                  d      ng }t        |t              syg }|D ]i  }t        |t              st	        |j                  d      xs d      }t	        |j                  d      xs d      }||k  rV|j                  |||        k t        dj                  |            S )Nr   textSegments
startIndexr   endIndexr   )r   r"  r  listr   r   r   r  )anchordocument_textsegmentsre  segmentrx  ends          r   _document_ai_anchor_textr5  A  s    fd#-7

>8RTX-Yvzz.)_aHh%E /'4(GKK-23'++j).Q/%<]5-./  00r   c                   t        | j                  d      t              r| j                  d      ni }g }t        |t              rft        |j                  d      t              r|j                  d      ng }|s2t        |j                  d      t              r|j                  d      ng }|D cg c]1  }t        |t              st	        |j                  d      xs d      3 }}|D cg c]1  }t        |t              st	        |j                  d      xs d      3 }}|r|syt        |      t        |      t        |      t        |      fS c c}w c c}w )NboundingPolynormalizedVerticesverticesr           y)r:  r:  r:  r:  )r   r  r"  r/  r   r  r  )layoutpolyr9  vertexxsyss         r   _normalized_poly_boundsrA  S  s   )3FJJ~4NPT)U6::n%[]DH$5?I]@^`d5e48801km/9$((::NPT/Utxx
+[]H6>	[F*VUYBZ%

3&3
'	[B	[6>	[F*VUYBZ%

3&3
'	[B	[R#GSWc"gs2w//	 
\	[s   /E E+E Ec                F   t        | j                  d      xs d      }t        | j                  d      t              r| j                  d      ng }|rt        |t              sg S g }t	        |      D ]	  \  }}t        |t
              st        |j                  d      t              r|j                  d      ng D ]  }t        |t
              st        |j                  d      t
              r|j                  d      ni }t        |t
              sWt        t        |j                  d      t
              r|j                  d      ni |      }|st        |      \  }	}
}}|j                  |||	|
||d         |sg S |D cg c])  }t        dt        |d	         t        |d
         z
        + }}t        dt        d|rt        |      nddz              }g }t        |d       D ]  }|rLt        |d         t        |d   d         k7  s,t        t        |d
         t        |d   d
         z
        |kD  r/|j                  t        |d         t        |d
         |gd       |d   d   j                  |       t        t        |d   d
         t        |d
               |d   d
<    |D ]_  }t        |j                  dg       D cg c]  }t        |t
              s| c}d       }||d<   dj!                  d |D              |d<   a |S c c}w c c}w )Nr  r   pagesr  r<  r  )
page_indexr  x0y0x1y1r:  rH  rF  g;Onr?g~jt?gMb?      ?c                T    t        | d         t        | d         t        | d         fS )NrD  rF  rE  )r   r   r  s    r   <lambda>z*_extract_google_ocr_rows.<locals>.<lambda>  s0    c$|:L6MuUYZ^U_O`bghlmqhrbs5t r   keyrD  r   )rD  rF  r2  r2  c                    t        | d         S )NrE  )r   rK  s    r   rL  z*_extract_google_ocr_rows.<locals>.<lambda>  s    U4:. r   r  c              3  8   K   | ]  }t        |d            yw)r  N)r   )r   r3  s     r   r   z+_extract_google_ocr_rows.<locals>.<genexpr>  s      R'WV_!5 Rs   )r   r  r   r/  r  r"  r5  rA  r   r  r   r  r   sortedr   r  r  )documentr1  rC  r2  rD  pager   r<  r  rE  rF  rG  rH  r3  heightsrow_thresholdrowsrowrow_segmentss                      r   _extract_google_ocr_rowsrY  a  s   V,23M%/W0Et%LHLL!RTE
5$ 7	(*H%e, 
D$%)3DHHW4Et)LDHHW%RT 	DdD)+5dhhx6H$+OTXXh'UWFfd++
SYS]S]^jSkmqHrFJJ|,Dxz  }J  KD4V<NBBOO", 		0 	T\]s3gdm,uWT]/CCD]G]EwF7OEUY+Y Z[M$&D((tu J7<()Sb,1G-HH5'%R*??@=PKK"%gl&;"<.!(	 R##G,U48D>2E'$-4HIRJ"  S$'GGJ$;Yz'SW?XWY.
 'Jjj R\ RRFS K9 ^. Zs   .LL
'L
c                N    t        |       }|sydj                  d |D              S )Nr   
c              3     K   | ]R  }t        t        |j                  d       xs d            r)t        t        |j                  d       xs d             T yw)r  r   N)r   r   r  )r   rW  s     r   r   z1_build_google_ocr_preview_text.<locals>.<genexpr>  sI      CGGFO$9r :; 	S!6B78s   AA)rY  r  )rR  rV  s     r   _build_google_ocr_preview_textr]    s0    #H-D99   r   c           	        t        |       j                         D cg c]#  }|j                         s|j                         % }}|sy d}d}t        |d d       D ]  \  }}|j	                         t        fd|D              s+t        |t        d|dz
        |       D ]Q  }|j	                         t        fd|D              r(t        j                  |      s>t        |      sJ|d d c c S   y c c}w )	N)zp.ivatelefonopiazzazvia vialezloc.zcapitale socialezregistro delle imprese)documento di trasportozd.d.tddt    c              3  &   K   | ]  }|v  
 y wr   r   )r   markerr   s     r   r   z9_extract_delivery_header_supplier_name.<locals>.<genexpr>  s     >F6Z'>r   r      c              3  &   K   | ]  }|v  
 y wr   r   r   r   candidate_normalizeds     r   r   z9_extract_delivery_header_supplier_name.<locals>.<genexpr>  s     MU500Mr   x   )r   r  r   r  r   r   reversedr  _LEGAL_ENTITY_PATTERNr   _is_company_like_line)	r  r   r  ignored_tokensmarkersr  r/  rj  r   s	          @@r   &_extract_delivery_header_supplier_namerq    s    &:4&@&K&K&M^dQUQ[Q[Q]TZZ\^E^{N8G s, 	't]]_
>g>>!%Auqy(9E"BC 	'I#,#5#5#7 MnMM$++I6;PQZ;[ #&	'		' ! _s
   C:C:c                $   t        t        | j                  d      xs d            }|r|S t        |       }|sy d}|D ]  }t	        |j                  d      xs d      |k\  r y |j                  dg       D cg c]Z  }t        |t              rHt	        |j                  d      xs d      dk  r't        t        |j                  d      xs d            \ }}|D ],  }t        j                  |      st        |      s%|d d	 c c S   y c c}w )
Nr  r   g(\?rF  r:  r2  rE  gQ?rk  )rq  r   r  rY  r   r   r"  r   rm  r   rn  )rR  delivery_header_supplierrV  header_boundaryrW  r3  left_segmentsr/  s           r   (_extract_supplier_name_from_ocr_documentrv    s   Ec(,,W]J^JdbdFef''#H-DO 
'%#&/9  77:r2
'4(U7;;t3D3K-LPT-T !W[[%8%>B!?@
 

 ' 	'I$++I6;PQZ;[ #&	'
' 
s   8ADc                   t        |       dk  ryt        |       dkD  r| d   nd}t        j                  d|      syt        j                  d| r| d   nd      s*t        j                  dt        |       dkD  r| d	   nd      syy
)N	   Fra   r   u   [A-Za-zÀ-ÿ]r,  r   r   T)r   r   r   )valuesr9  s     r   "_looks_like_delivery_note_item_rowr{    sy    
6{Q"6{Q&)BK99%{399U&F2Jb9"))EadekalopapSYZ\S]vxByr   c                    t        | xs d      }|syt        j                  d|      }|st        |      d fS t        |j	                  d            |j	                  d      fS )Nr   r   z*(\d+(?:[.,]\d{2,4})?)\s+([A-Za-z]?\d{1,3})r   ra   )r   r   r-  r   r'  rj  s      r   _split_total_and_vat_cellr}    sZ    %ekr2JLLF
SE":.55u{{1~.A??r   c                   t        |       sy | d d }| dd  }t        |      dk  st        |      dk  ry t        |d         \  }}|(|&t        |      dk\  rt        |d         }|}|}|d d }	nJt        |      dk\  rt        |d         nd }t        |      dk\  rt        |d         nd }|r|d   nd }|d d }	d |	D        D 
cg c]  }
|
|
 }}
t        |d         }|r|d	   nd }t        |      dk\  r|d
   nd }t        |      dk\  r|d   n|r|d   nd }||n||n|}||d	   xs d |d
   xs d |d   |d   xs d |d   xs d ||||||||xs d t	        dj                  |             dS c c}
w )Nrd   rb   r   ra   ry  c              3  2   K   | ]  }t        |        y wr   r   r  s     r   r   z1_parse_delivery_note_table_row.<locals>.<genexpr>  s     ND)$/Nr  r  r   r   rc   r  rz  )r{  r   r}  r   r   r  )rz  r{  prefixtailtrailing_totaltrailing_vat_coder  r  r  measurement_cellsr   measurementsr   r   r   r   r   s                    r   _parse_delivery_note_table_rowr    s   -f5BQZF!":D
6{Q#d)a-(A$r((K%N%!&7&CD	UV'R1
#
$ "I58Y!^'R1
58Y!^'R1
#48 "I O<MN 	L 
 $F1I.J(4\!_$N'*<'8A'=LO4M&),&71&<<?Wc<PRCSimL+7|P^PjnpzH !q	)T1I%ay*dAY&$ (&$  $,UZZ-?@ s   E0>   BUCLr%   r&   LEMAMZPDPLPOSASFVS>   r%   r&   r)   r+   r,   c                    | D cg c]  }t        |      st        |       }}d }|r#t        j                  d|d         r
|d   }|d d }d |D        D cg c]  }|| }}||fS c c}w c c}w )N\d{2}r   c              3  2   K   | ]  }t        |        y wr   r  r  s     r   r   z*_cavallaro_amount_parts.<locals>.<genexpr>-       JD)$/Jr  r   r   r-  r  r  cleaned_cellsr  r   rz  s         r   _cavallaro_amount_partsr  %  s    <A`DEYZ^E_)$/`M`Hhb0AB $%cr* KMJ 	F 
 8 a
s   A(A(A-c                    t        |       \  }}|sy g }d }d }t        |      dk\  r|d d }|d   }|d   }nt        |      dk(  r|d   }|d   }n|d   }||||dS )Nrb   ry  r   ra   r   r   )r  r  r  r  )r  r   )r  rz  r  r  r  r  s         r   _parse_cavallaro_amount_liner  3  s    .u5FH "LJJ
6{acr{BZ
BZ
	V	AY
AY
AY
$  	 r   c                N   | sy | D cg c]'  }t        |      st        |      j                         ) }}|sy d }d }d }g }|d   t        v rEt        |      dk\  r7|d   t        v r,|d   }|d   }t        |       dk\  rt        | d         }| dd  }nI|d   t        v r'|d   }t        |       dk\  rt        | d         }| dd  }n|d   t        v r|d   }| dd  }ny d |D        D cg c]  }|| }}g }	d }
t        |      dk\  r|d d }	|d   }
n|r|}	||||	|
d d dS c c}w c c}w )Nr   ra   r   rb   c              3  2   K   | ]  }t        |        y wr   r  r  s     r   r   z,_parse_cavallaro_lot_line.<locals>.<genexpr>h  s     AD)$/Ar  r   )r~  rt  r   r  r  r  r  )r   rS  _CAVALLARO_CATEGORY_CODESr   _CAVALLARO_UNIT_CODESr   )r  r  tokensr~  rt  r   restr   rest_valuesr  r  s              r   _parse_cavallaro_lot_liner  K  s   =BaTFZ[_F`"4(..0aFaMIJDay--#f+2BvayTiGiq	1I	u:?+E!H5JQRy	+	+1I	u:?+E!H5JQRy	/	/q	QRy BDA 	K 
 !#LJ
;1"3B' _
	"& $  I b0s   DD%D"c                    i }| xs i |xs i fD ]J  }|j                         D ]5  \  }}|dk(  r#|r t        |t              rt        |      n|||<   .|1|||<   7 L |S )Nr  )r>  r   r/  )baseoverrider  sourcerN  r   s         r   _merge_cavallaro_lot_datar  }  sz     !#F:2x~2. $ ,,. 	$JCn$1;E41H$u+eF3K #s	$$ Mr   c           	     ^   t        |       dk  ryt        j                  dt        | d               syt        |       dk\  r2t        j                  dt        | d         j	                               rdnd}t        |       |k  ryt        t        j                  dt        | |                     S )	Nra   F\d{3,6}r   rb   [A-Z]{2}r   rB  )r   r   r-  r   rS  r   r   )r  r  s     r   "_looks_like_cavallaro_product_liner    s    
5zA~<<
$8q$BC Z1_kK_`efg`hKiKoKoKq1rxy
5z&&		.0DUK\E]0^_``r   c                h   t        |       sy t        | d         }d }d}t        |       dk\  rNt        j                  dt        | d         j                               rt        | d         j                         }d}t        | |         }| |dz   d  }t        |      }|d n
t        |      }|||d||fS )Nr   r   rb   r  ra   )r|  r}  r9  )r  r   r   r   r-  rS  r  r  )r  r|  r}  r  r9  r  lot_datatrailing_amounts           r   _parse_cavallaro_product_liner    s    -e4'a1LH
5zQ2<<5I%PQ(5S5Y5Y5[\'a1779&u->'?@K"Q&()D(.H&2d8TUY8ZO ) &	

 	 r   c                    | D cg c]  }t        |      st        |       }}|sy d }t        j                  d|d         r
|d   }|d d }d |D        D cg c]  }|| }}|s|y ||dS c c}w c c}w )Nr  r   c              3  2   K   | ]  }t        |        y wr   r  r  s     r   r   z8_parse_cavallaro_wrapped_amount_cells.<locals>.<genexpr>  r  r  )rz  r  r  r  s         r   %_parse_cavallaro_wrapped_amount_cellsr    s    <A`DEYZ^E_)$/`M`H	||HmB/0 $%cr* KMJ 	F 
 h&(33 as   A/A/A4c                >   | sy t        | d         }t        j                  d|      sy |}d }d}t        |       dk\  rNt        j                  dt        | d         j	                               rt        | d         j	                         }d}t        | |d        }|||dS )Nr   r  r   ra   r  )r|  r}  amount_data)r   r   r-  r   rS  r  )r  
first_cellr|  r}  amount_start_indexr  s         r   "_parse_cavallaro_continuation_liner    s    %eAh/J<<
J/LH
5zQ2<<5I%PQ(5S5Y5Y5[\'a17797>P>Q8RSK$" r   c                   | D cg c]  }t        |      j                          }}t        dt        |      dz
        D ]   }||   t        v s||dz      t
        v s|c S  t        |      D ]  \  }}|t
        v s|c S  y c c}w )Nr   r   )r   rS  r  r   r  r  r  )r  r  upper_cellsr  r   s        r   _find_cavallaro_lot_startr    s    BGH$'-335HKHq#k*Q./ u!::{5ST9?UYn?nL "+. u))L  Is    Bc                   t        |       }|y | d | D cg c]  }t        |      st        |       }}|sy d }d }g }t        j                  d|d         rY|d   }t	        |      dk\  r@t        j                  d|d   j                               r|d   j                         }|dd  }nV|dd  }nPt        j                  d|d   j                               r't	        |      dk\  r|d   j                         }|dd  }n|}t        dj                  |            }|sy d }	t        | |         j                         }
|dz   }|
t        v r1|t	        |       k  r#|
}	t        | |         j                         }
|dz  }|
t        vry | |d  D cg c]  }t        |      st        |       }}d }|r#t        j                  d|d         r
|d   }|d d }d	 |D        D cg c]  }|| }}|sy |d   }|dd  }d }d }d }d }d }|
d
k(  ru|r|d   }t	        |      dk\  r|d   }|d   }|d   }|d   }nt	        |      dk\  r|d   }|d   }|d   }nt	        |      dk\  r|d   }|d   }njt	        |      dk\  r\|d   }nV|r
|d   }|d   }t	        |      dk\  r|d   }|d   }|d   }n,t	        |      dk\  r|d   }|d   }nt	        |      dk\  r|d   }||n||n|}|||||	|
||||||||t        dj                  |             d}t        t        |j                  d      xs d      t        |j                  d      xs d            ry |S c c}w c c}w c c}w )Nr  r   ra   r  r   r   r  r   c              3  2   K   | ]  }t        |        y wr   r  r  s     r   r   z4_parse_cavallaro_inline_item_line.<locals>.<genexpr>  s     ID)$/Ir  r)   r  rb   rc   r  rz  r9  r   r   )r  r   r   r-  r   rS  r  r  r  r<  r   r  )r  r{  lot_start_indexr  r  r|  r}  r  r9  r~  rt  detail_start_indexdetail_cellsr  r   numbersr   detail_valuesr   r   r   r  r  r   r  s                            r   !_parse_cavallaro_inline_item_liner    s   /6O5:;KO5LkTPdeiPj"4(kFkLH#%	||Jq	*ayv;![&)//:K Lay(H &qr
 &qr
	k6!9??#4	5#f+:J!9??$"12J"&sxx0A'BCKM$U?%;<BBDI(1,--2Ds5z2Q!(/A)BCIIK	a--;@ASAT;Ut4YmnrYs(.tLtHX|B/?@##CR( JLI 	G 
 JABKMNMLJJD*1-N}")!,M(+L&q)J&q)J1$)!,M(+L&q)J1$)!,M(+L1$)!,M*1-N(+L}"(+L&q)J&q)J1$&q)J&q)J1$&q)J+7|P^PjnpzH $"& (&$  ,UZZ->?D" s488M#:#@bA3txxP^G_GeceCfgKU lD u
s   MM
MMMc                   |sy |j                  d      xs g D cg c]$  }t        |t        t        f      st        |      & }}|j                  d      }t	        t        | j                  d      xs d            j                         }|dk(  rbt        |      dk\  rT| j                  d      |d   | d<   |d   | d	<   | j                  d
      |d   | d
<   | j                  d      q|d   | d<   nht        |      dk\  r3| j                  d
      |d   | d
<   | j                  d      0|d   | d<   n't        |      dk(  r| j                  d      |d   | d<   |r| j                  d      || d<   y y y c c}w )Nrz  r  rt  r   r)   rb   r   r  r   r  ry  r  r   ra   r   r   )r  r   r   r   r   r   rS  r   )r  r  r   rz  r  rt  s         r   _apply_cavallaro_amount_datar  S  s   (3(A(GRku:V[^ach]iKjeElkFkz*H$S+)>)D"%EFLLNIDS[A-88N#+#)":D %bzD88L!)!'D88L!)!'D	V	88L!)!'D88L!)!'D	V	dhh|4<#AY\DHHZ(0#Z 1x% ls
   E6E6c                "   t        |       j                         D cg c]#  }|j                         s|j                         % }}|sg S g }d }d}d}|D ]  }|j                         t	        fd|D              r|r t#        |      S 7dv sdv rdv rd}F|sIt        j                  d|      D cg c]  }t        |      st        |       }}|st        |t        |            }	|	 t        |	|       d }|j                  |	       t        |      }
|
|r|d	   }|j                  d
      s|
j                  d
      |d
<   |j                  d      s%|
j                  d      r|
j                  d      |d<   t        |j                  d      xs d ddj                  |             |d<   t        |
j                  d      t              r|
j                  d      nd }t!        |      }||} t#        |      S c c}w c c}w )NF)r  firma del conducenter4   totale imponibilerH  c              3  &   K   | ]  }|v  
 y wr   r   r   r   normalized_lines     r   r   zI_extract_cavallaro_split_delivery_note_items_from_text.<locals>.<genexpr>}       AEu'Ar   r.   zcateg.r  Tr   r   r|  r}  r   r   r  r  )r   r  r   r   r   r   r  r  r   r  r   r  r  r  r   r"  r  r@  )r  r   r  r>  pending_amount_datain_tabler  r_  r  r  continuation	last_itemr  r  s                @r   6_extract_cavallaro_split_delivery_note_items_from_textr  l  s1   &:4&@&K&K&M^dQUQ[Q[Q]TZZ\^E^	%'E48HK  '.--/A[AAJ !''I /1h/6QV^bqVqH8:d8SrWklpWq%d+rr0E
C(/BC"&LL9%@#!"I	 }}^40<0@0@0PIn- }}Z0\5E5Ej5Q,8,<,<Z,HIj),@ }}^4:;3uzz%?P>QR-	.) FPP\P`P`anPoquEv,"2"2="A  }A;EB""-O'.R !''o _4 ss   HH6HHc                   |xs i }|xs i }|j                  d      xs g D cg c]$  }t        |t        t        f      st        |      & }}|j                  d      xs g D cg c]$  }t        |t        t        f      st        |      & }	}t	        |	      dk\  r|	}
n2t	        |      dk\  rt	        |	      dk(  r|d   |d   |	d   g}
n|	r|	}
n|}
|j                  d      }|
r|
d   nd }t	        |
      dk\  r|
d   nd }t	        |
      dk\  r|
d   n|
r|
d   nd }||n||n|}|j                  d      |j                  d      n|j                  d      }|j                  d	      |j                  d	      n|j                  d	      }|j                  d
      |j                  d
      n|j                  d
      }|| j                  d      | j                  d      | j                  d      |j                  d      |j                  d      ||||||||t        dj                  |            d}t        t        |j                  d      xs d      t        |j                  d      xs d            ry |S c c}w c c}w )Nr  rb   ra   r   r   r   r   r  r  r  r|  r}  r9  r~  rt  r  rz  r   r   )	r  r   r   r   r   r   r  r<  r   )productr  r  	raw_partsr{  
merged_lotr
  r   lot_measurementsamount_measurementsr  r   r   r   r   r   r  r  r  r  s                       r   _build_cavallaro_wrapped_itemr    s    RJBF3=>>.3Q3WUW|\fglortynz\{e||6<jj6P6VTV{E[efknqsxmy[z5<{{
1$*		!	#,?(@A(E(+-=a-@BUVWBXY	*'-J(4\!_$N'*<'8A'=LO4M&),&71&<<?Wc<PRCSimL+7|P^PjnpzH-3ZZ-E-QL)WaWeWefrWsJ-3ZZ-E-QL)WaWeWefrWsJ)/J)?)Kvzz*%Q[Q_Q_`jQkH N3KK
+{{=1#8^^K0 (&$  ,UZZ	-BCD" s488M#:#@bA3txxP^G_GeceCfgKK }{s   I> I>&JJc           
        t        |       j                         D cg c]#  }|j                         s|j                         % }}g }d }d }d}|D ]X  }|j                         t	        fddD              r|r t!        |      S 7t        j                  d|      D cg c]  }t        |      rt        |       }}|sq|D 	cg c]  }	|	j                          }
}	dv sd|
v rd|
v rd}d|
v r'd|
v r#|
j                  d      }t        ||d	z   d        }|st        |      st        |      }|G|\  }}}t        ||      }t        ||||gt        |      
      }||j                  |       |}d }d})t        |      }|t        ||      }d}Ft        |      }|U|}d}[ t!        |      S c c}w c c}w c c}	w )NFc              3  &   K   | ]  }|v  
 y wr   r   r  s     r   r   zK_extract_cavallaro_wrapped_delivery_note_items_from_text.<locals>.<genexpr>  s       QEu'  Qr   )r  r  r  rH  r   r.   r  zc.isoTr   )r  r  r  r  r{  )r   r  r   r   r   r   r  r  r  r  r  r  r  r   r   r  r@  )r  r   r  r>  pending_amountpending_lotr  r_  r  r  r  
ciso_indexproduct_partsr  product_lotr  r  r  lot_lineamount_liner  s                       @r   8_extract_cavallaro_wrapped_delivery_note_items_from_textr    s#   &:4&@&K&K&M^dQUQ[Q[Q]TZZ\^E^%'E/3N,0KH 2--/  Q  6P  Q  Q` !''_  d3
#D) !&
 

 8=>DMMO>>/1hBR6RW^brWrH''G7G,G)//8J9%
Q@P:QRN B5 I5e<$4A1G[/0kJH0!*&u:D T",NKH,U33KJKH259"(NHe2h !''s _
 ?s   F8F8 F=Gc                
   t        |       }|syt        j                  d|      }dj                  d |D              }|j	                         }t        j                  dd|      }t        j                  dd|      }t        j                  dd	|      }t        j                  d
d|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd |      }t        j                  d!d"|      }t        j                  d#d$|      }t        j                  d%d&|      }t        j                  d'd(|      }t        j                  d)d*|      }t        j                  d+d,|      }t        j                  d-d.|      }t        j                  d/d0|      }t        j                  d1d2|      }t        j                  d3d4|      }t        j                  d5d6|      }t        j                  d7d8|      }t        j                  d9d:|      }t        j                  d;d<|      }t        j                  d=d8|      }t        j                  d>d?|      }t        j                  d@dA|      }t        j                  dBdC|      }t        j                  dDdE|      }t        j                  dFdG|      }t        j                  dHdA|      }t        j                  dIdJ|      }t        j                  dKdL|      }t        j                  dMdG|      }t        j                  dNd8|      }t        j                  dOd<|      }t        j                  dPdQ|      }t        j                  dRdS|      }t        j                  dTdU|      }t        j                  dVdW|      }t        j                  dXdY|      }t        j                  dZd[|      }t        j                  d\d]|      }t        j                  d^d]|      }t        j                  d_d`|      }t        j                  dadb|      }t        j                  dcdd|      }t        j                  dedf|      }t        j                  dgd]|      }t        j                  dhd]|      j                         S )iNr   NFKDc              3  L   K   | ]  }t        j                  |      r|  y wr   )unicodedata	combiningr   	characters     r   r   z(_normalize_match_text.<locals>.<genexpr>  s     gykF[F[\eFfgs   $$z\bkg\s+grande\s+cuvee\bz krug grande cuvee z\bkg\bz krug z\bas\bz armand de brignac z\bbv\bz belvedere z\bdp\bz
 dom peri z\bro\s*(\d{2})\bz rose 20\1 z\bmgm\b|\bmagnum\bz magnum 1 5l z\bmc\bz moet z\bmp\bz minuty z\brur\bz	 ruinart z\bru\bz\bvo\bz volcan z\bes\bz whispering angel z\btz\bz
 terrazas z\bbomsapp\b|\bbomsap\bz bombay sapphire z\bvodka\s*10\b|\bvodka10\bz ten z\bsaphire\bz
 sapphire z\bbacb\bz bacardi carta bianca z\bsat1796\bz santa teresa z\bpaxocaf\bz patron xo cafe z\bparepal\bz patron el alto z\bgreyori\bz grey goose z\bred\s*bull\b|\bredbull\bz	 redbull z,\bamaretto\s+di\s+saronno\b|\bdi\s+saronno\bz disaronno z\bderby\s*blue\b|\bderbyblue\bz succhi derby z\bseed\s*lip\b|\bseedlip\bz	 seedlip z\b1\s*/\s*1\bz 1l z\b1\s*/\s*2\bz 0 5l z"\blt\s*1[,.]\s*5\b|\blt1[,.]\s*5\bz 1 5l z\blt\s*1\b|\blt1\bz\bcl\s*18\bz 0 18l z\bcl\s*20\bz 0 2l z\bcl\s*25\bz 0 25l z\bcl\s*34\bz 0 34l z\bcl\s*70\bz 0 7l z\bml\s*200\b|\b200\s*ml\bz\bml\s*750\b|\b750\s*ml\bz 0 75l z\bnat\bz
 naturale z\b\d+\s*x\s*70\bz\b\d+\s*x\s*100\bz\b\d+\s*x\s*150\bz\b\d+\s*x\s*175\bz 1 75l z\bschw\.?\bz schweppes z\bpre[\s.\-]*mix\b|\bpremix\bz fusto z
\blimone\bz lemon z\bbobb?in[ae]\bz bobina z\bneutr[oi]\bz secco z=\b(srl|s\.r\.l\.|snc|s\.n\.c\.|sas|s\.a\.s\.|spa|s\.p\.a\.)\br   r  z \bmoet imperial magnum(?: nh)?\bz moet magnum 1 5l z\bmoet imperial(?: nh)?\bz moet 0 7l z!\bminuty prestige rose 2025 1 5\bz minuty magnum 1 5l z \bminuty prestige 2025 75cl c6\bz minuty 0 7l z"\b(?:lt18|kg10|liit|paper|super)\b\s{2,})r   r  	normalizer  r   r   r  r   )r   rawr   s      r   r  r    sZ   
*5
1C&&vs3JgJggJ$$&J24I:VJ	8Z8J	#8*EJ	=*=J	<<J+^ZHJ-
KJ	8Z8J	:z:J
K<J	;
;J	:z:J	#7DJ	<<J13F
SJ5w
KJjAJ%=zJJ(8*EJ(:JGJ(:JGJ
CJ5{JOJGXbcJ9;KZXJ5{JOJ(&*=J((J?J=xTJ-vzBJ	:>J*=J	:>J	:>J*=J4h
KJ4iLJ
L*=J+XzBJ,fjAJ,h
CJ,iDJzBJ8)ZPJy*=J*J
CJ()Z@JXZ]_ijJsJ7J;=QS]^J4mZPJ<>TV`aJ;_jYJ=sJOJ66)S*-3355r   c                    t        |       j                  d      D ch c]  }|st        |      dkD  s| }}|D ch c]  }|t        vs|j	                         r|  c}S c c}w c c}w )Nr   r   )r  r  r   _MATCH_TOKEN_STOPWORDSisdigit)r   r   r  s      r   
_token_setr  V  sd    !6u!=!C!CC!HeEVYZ_V`cdVdeeFe%ee6L)LUZUbUbUdEee fes    A$A$A$A)A)A)c                    ddddddddd	d
dd}|j                         D ch c]  \  }}t        j                  ||       s|  c}}S c c}}w )Nz\b0\s*18l\b|\b18cl\bz\b0\s*2l\b|\b20cl\bz\b0\s*25l\b|\b25cl\bz\b0\s*33l\b|\b33cl\bz\b0\s*5l\b|\b50cl\bz\b0\s*7l\b|\b70cl\bz\b0\s*75l\b|\b75cl\bz\b1l\b|\b100cl\bz\b1\s*5l\b|\b150cl\bz\b1\s*75l\b|\b175cl\bz\b3l\b|\b300cl\b)z0.18lz0.2lz0.25lz0.33lz0.5l0.7l0.75l1lz1.5lz1.75l3l)r>  r   r   )normalized_valuepatternslabelr   s       r   _product_volume_tokensr  [  sY    (&((&&(!')!H )1(8aneWBIIgO_<`Eaaas   A	A	c                @    t        t        j                  d|             S )Nz\d+(?:\s*\d+)?l)r   r   r-  )r   s    r   _is_volume_fragment_tokenr  l  s    /788r   c                8    | r|sy| |z  ryddh}| |k  xr ||k  S )NTr  r  r   )left_tokensright_tokenschampagne_standard_sizess      r   !_volume_token_sets_are_compatibler  p  s7    l\! &022_|G_7__r   c                R   t        |       }t        |      }|r|sy||k(  ry||v s||v ryt        |      }t        |      }d}|r)|r't        ||z        t        t        ||z        d      z  }t	        d ||      j                         }||z  D ch c]  }t        |      s| }	}|r|r|	st        |dz  d      S t        ||      }
|t        z  }|t        z  }|r|r||z  st        |
dz  d      S t        |      }t        |      }t        ||      st        |
dz  d      S |
S c c}w )Nr:        ?q=
ףp?r   ?g(\?皙?)r  r  r   r  r   ratior  r  _DISTINCTIVE_PRODUCT_TOKENSr  r  )leftrightleft_normalizedright_normalizedr  r   token_scoresequence_scorer   non_volume_overlapcombined_scoreleft_distinctive_tokensright_distinctive_tokensleft_volume_tokensright_volume_tokenss                  r   _name_similarityr  y  sk   +D1O,U3"2****.>/.Q_-K./LK|+45Cl@Z<[]^8__$T?<LMSSUN "L0(/ 	 
 |,>>D($//n5N),GG+.II#;E\_wEw>D($///@01AB,-?ATU>D($//!s   D$c           	        t        |       }t        |      }|r|syt        |      }t        |      }t        ||      ryt        |      D ch c]  }t	        |      r| }}t        |      D ch c]  }t	        |      r| }}|r|sy|t
        z  }	|t
        z  }
|	r|
r|	|
z  sy||z  }|syt        |      t        t        t        |      t        |            d      z  }t        d dj                  t        |            dj                  t        |                  j                         }t        ||      S c c}w c c}w )Nr:  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  overlapr  r  s                 r   /_product_family_similarity_for_variant_mismatchr    s<   +D1O,U3"2/@01AB();=PQ&0&AjUIbchIi5jKj'12B'CleKdejKkElLll),GG+.II#;E\_wEwL(Gg,S[)93|;L%Mq!QQK$T388F;4G+H#((SYZfSgJhiooqN{N++ kls   D;D;0E E c                |    t        t        | xs d            j                         }t        j                  dd|      S )Nr   z[^a-z0-9$]+)r   r   r   r   r  r   s     r   !_normalize_product_code_for_matchr    s1    1#ekr2BCLLNJ66."j11r   c                J    t        |       }t        |      }|r|sy||k(  rdS dS )Nr:  r  )r  )r
  r  	left_code
right_codes       r   _product_code_match_scorer    s0    1$7I259JJz)32s2r   c                r    t        |       }t        |      }t        D ]  }||v s||v s y t        | |      S )Nr  )r  _SUPPLIER_ALIAS_GROUPSr  )r
  r  r  r  alias_groups        r   _supplier_similarityr#    sH    +D1O,U3- k).>+.M D%((r   c                    t        |       dv sdv sdv rydv sdv sdv rdv ry	d
v sdv rydv sdv rydv rt        fddD              ryy )Nzbibite laconibibitelaconibibitelaconisrlzBIBITE LACONI S.R.L.ztonino cavallarotoninocavallaro	cavallarozvia seychelleszTONINO CAVALLARO & C. S.n.c.zmoet hennessyzmoethennessy itMOETzmartini rossizgruppo bacardi martiniMARTINIrr   c              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   z9_extract_known_supplier_name_from_text.<locals>.<genexpr>  s      * 	*r   )zvecchia romagnazbrandy 1820zruzzeddu marcellozgruppo montenegrozMARCELLO REDUZZI - MONTENEGRO)r  r   )r  r   s    @r   &_extract_known_supplier_name_from_textr,    s    &t,J*$*(DHY]gHg%Z'+<
+Jz!&6*&D-*$(9Z(G*$(@J(Nz!c *
* ' /r   c                $    t        |       t        v S r   )r  _GENERIC_ORDER_SUPPLIER_NAMESr   s    r   _is_generic_order_supplierr/    s     '+HHHr   c                l    t        |j                  d      xs d      t        fd| D        d      S )Nproduct_namer   c              3     K   | ]<  }t        |t              r*t        t        |j	                  d       xs d             > yw)r9  r   N)r   r"  r  r   r  )r   document_item
order_names     r   r   z@_best_document_name_similarity_for_order_item.<locals>.<genexpr>  s?      	
-. S!2!2=!A!GRH*U	
s   AAr:  default)r   r  r  )document_items
order_itemr4  s     @r   -_best_document_name_similarity_for_order_itemr9    s<     Z^^N39r:J	
!/	

  r   gQ?	tolerancec               <    | yt        | t        |       z
        |k  S )NF)r  r#  )r   r;  s     r   _is_integer_liker=    s#    }uuU|#$	11r   c                D   g }dD ];  }| j                  |      }|	 t        |      dk  r)|j	                  |f       = g }g }|D ]>  \  }t        fd|D              r|j	                         |j	                  |f       @ |S # t        t        f$ r Y w xY w)N)r   r   r   r   r   c              3  @   K   | ]  }t        |z
        d k    yw)g-C6?Nr  )r   existingr   s     r   r   z0_delivery_quantity_candidates.<locals>.<genexpr>  s      K8s58#$.Kr  )r  r   	TypeErrorr   r   r   )doc_item
candidatesrN  r   dedupedseen_valuesr  r   s          @r   _delivery_quantity_candidatesrF    s    *,JK 
(LL%		)$E 193,'
( (*G!K# (K{KK5!'	(
 N :& 		s   BBBc                    | y t        |       }t        |t        |      z
        dk  rt        t        t        |                  S t        |d      S )Ngư>rd   )r   r  r#  r   )r   numeric_values     r   _round_quantity_for_storagerI    sL    }%LM
=5//0H<S}-.//""r   c                R    | |yt        t        |       t        |      z
        dk  S )NFr  )r  r   )r
  r  s     r   _quantities_matchrK    s+    |u}uT{U5\)*e33r   c                R    t        t        | xs d            j                         dv S )Nr   >   r   r   cassacasser  r  )r   r   r   r   s    r   _is_pack_lot_coderO  #  s%    EKR 01::<@tttr   c                R    t        t        | xs d            j                         dv S )Nr   >   r   r   r   r"   pezzipezzor  r0   r   r   r   r   s    r   _is_single_unit_lot_coderT  '  s,    +C,<=FFH 	M 	 	r   c                d    t        t        | xs d            j                         }|dv ry|dv ryy )Nr   >   r   r  r0   r   >   r   r   r"   rQ  rR  r"   rS  r   s     r   #_single_unit_lot_code_from_documentrV  4  s9    1#ekr2BCLLNJ5599r   c                6    dt        t        | xs d            v S )Nr(  r   )r  r   r   s    r   _is_cavallaro_supplier_namerX  =  s    /EKR0@AAAr   c                    t        | j                  d            dvryt        | j                  d            yt        | j                  d            d uxs t        | j                  d            d uS )Nrt     r    kgskilo
kilogrammi
kilogrammoFr   r   r   _normalized_document_unit_coder  r   )rB  s    r   (_document_has_weighed_produce_quantitiesra  A  sj    %hll;&?@Hyy&x||O'DEM'^(DETQ 	Q*8<<
+CDDPr   c               j    |dk  ryt        |      st        |      syt        |      syt        |       S )Nr  F)rX  rT  ra  )rB  supplier_nameorder_supplier_nameorder_lot_code
name_scores        r   6_weighed_cavallaro_delivery_fulfills_single_unit_orderrg  M  s9     D'6:UVi:j#N33H==r   c                R    dD ]"  }t        | j                  |            }| |c S  y )N)r   r   r   )r   r  )rB  rN  r   s      r   _document_weighed_quantityri  ^  s4    = 28<<3DEO r   c                   t        |       }|syd }d }d }t        |xs d      j                         }| j                  d      }	t	        |	      }
t        |      xr |
xr |d uxr |dkD  }|rg n|D cg c]
  \  }}|||f c}}}t        |      r|D ]  \  }}||dkD  r|nd }|L|dk(  s|
rE|dkD  r@|t        |      z  }t        t        |            }t        |      r|t        v rt        |      }|b|dkD  sh|j                  | d||z  |f        |D ]  \  }}}t        |      }|t        |t        |      z
        }t        |      rdnd	}d}t        |      r#|j                  d      rd
}n(|dk(  rd}n |dv rd}nt	        |      r|dv rd}n|dk(  rd	}||z   |z   t        ||z
        f}|||k  s|}|}|} ||fS c c}}w )Nr   r   rt  r   r   r   _converted_packr:  g      ?gܿr   gffffffֿ>   r   r   333333?>   r   r   r   g333333ÿ)rF  r   r   r  rT  rO  r   r   r#  r=  _COMMON_PACK_SIZESr   rI  r  endswith)rB  ordered_quantityre  units_per_packrC  
best_scorebest_quantitybest_rawnormalized_lot_codedocument_unit_codedocument_uses_single_units)document_uses_single_units_for_pack_orderr  r   expanded_candidates	pack_sizeinferred_pack_sizerounded_pack_size_sourcecomparable_valuer   candidate_quantitydistanceinteger_penaltysource_penaltyscores                             r   "_best_comparable_delivery_quantityr  f  sw    /x8J-1J"&M!H.~/CDMMO!k2!9:L!M-. 	&	$&	 Q	 . Aj"4>p#065p ,-' 	cMFE*8*DZ[I[aeI f0@&@D^dtwxdx%*U3C-D%D"$'.@(A$B!#$67<MQc<c %&7 8I$Q#**vho,FPYHY[`+ab	c 1D !,!989IJ%'%0@*AAB!12B!C#01 12!&L(!&88!%%&9:HH!&L(!%O+n<cBTWgBg>hi!3J.M H/!0 8$$Kps   3Gc                Z    t        j                  |       }t         j                  |_        |S r   )sqlite3connectRowrow_factory)database_path
connections     r   _open_tenant_order_connectionr    s"    /J$[[Jr   c                    | j                  d| d      j                         D ch c]  }t        |d          c}S c c}w )NzPRAGMA table_info()name)executefetchallr   )r  
table_namerW  s      r   _sqlite_table_columnsr    s?    (2(:(:=OPZ|[\;](^(g(g(ijCFjjjs   >c                l   t        | j                  d            }t        | j                  d            }t        | j                  d            }t        | j                  d            }t        | j                  d            }t        |       d u}|8|6|4t        t	        ||z  d      t	        |d      z
        dk  rt	        |d      S ||t	        ||z  d      S |r|t	        |d      S ||t	        ||z  d      S |y |%|#t        ||z
        d	kD  rt	        ||z  |z  d      S t	        |d      S )
Ncomparable_delivered_quantitydelivered_quantitydocument_line_totaldocument_unit_priceapplied_quantityra   g{Gz?rd   r  )r   r  *_document_weight_quantity_for_order_updater  r#  )r   comparable_quantityr  r  r  r  is_weight_updates          r   &_document_price_for_matched_order_liner    sc   9$((Cb:cd8BV9WX0:O1PQJ0:O1PQJ6txx@R7STA$GtS 	$""j#33Q7%
A:NNOSWWZ##"2">Z"22A66J2Z##"5"AZ"55q99'*"%889EAZ"447JJANNQr   c                N    t        t        | xs d            j                         S r   rS  r   s    r   r`  r`    s    +C,<=FFHHr   c                    t        | j                  d            dvry t        | j                  d            y dD ]"  }t        | j                  |            }| |c S  y )Nru  rZ  document_tare_quantity)document_net_quantitydocument_quantityr  document_gross_quantityr_  )r   rN  r   s      r   r  r    sh    %dhh/C&DEM~~ 'txx0H'IJRn 2488C=AO r   c                    t        | j                  d            }|yt        | j                  d            sydD ]-  }t        | j                  |            }| |t	        |      fc S  y)Nru  r   re  )r  r  r  r  document_pack_count)rV  r  rO  r   rI  )r   next_lot_coderN  r   s       r   +_document_single_unit_update_for_pack_orderr    sv    7AU8VWMTXX&678 F J2488C=A!#>x#HIIJ r   c                    t        |       }|dt        |      fS t        |       \  }}||||fS t        | j	                  d            }d |t        |      fS d fS )Nr    r  )r  rI  r  r   r  )r   weight_quantitysingle_lot_codesingle_quantityr  s        r   _order_update_lot_and_quantityr    s    @FO"1/BCC'RSW'X$O_"'B119$((Cb:cdFYFe-.ABppkoppr   c               	   t        | j                        5 }t        |       g }d}|r|dz  }|j                  ||g       |dz  }|j	                  ||      j                         }d d d        i }D ]d  }t        |d         }t        |d   xs d      }	t        |	      }
t        |d   xs d      }	 t        j                  |j                  dd	            }|j                   |j                  t        j                  
      }|j                  t               j#                         j%                         }t        |d   xs d      j)                         }|rd| nd}||
|f}|j+                  ||g ||d   d g i d      }|d   }t-        |t.              r||vr|j1                  |       |t        |d         k  r||d<   ||d<   |d   |d<   t        |d   xs d      }t        |d   xs d      }t        |      t        |      |
f}t        |d         }|d   }t-        |t2              s|j5                  |      }|||g|d   |||	t7        |d   xs d      |d   t7        |d         nd |d   t7        |d         nd |d   t7        |d         nd |d   t7        |d         nd t        |d   xs d      j)                         d}|||<   |d   j1                  |       w|d    j1                  |       t7        |j5                  d      xs d      t7        |d   xs d      z   |d<   t        |j5                  d      xs d      j)                         sCt        |d   xs d      j)                         r#t        |d   xs d      j)                         |d<   |d   5t7        |j5                  d      xs d      t7        |d         z   |d<   g g }|j9                         D ]  }|j;                  dd        t-        |j5                  d      t.              r|j5                  d      ng }|D cg c]1  }t-        |t2              r|j5                  d      t7        |d         3 }}|rt=        t?        |      d!      nd |d"<   |j1                  |        |S # 1 sw Y   <xY w# t&        $ r	 |d d }Y w xY wc c}w )#Na  
            SELECT
                b.id AS batch_id,
                b.confirmed_at AS confirmed_at,
                b.staff AS staff,
                b.total_estimated_amount AS total_estimated_amount,
                b.fiscal_document_id AS fiscal_document_id,
                i.id AS item_id,
                i.product_id AS product_id,
                i.product_name AS product_name,
                i.lot_code AS lot_code,
                i.supplier_name AS supplier_name,
                i.quantity AS quantity,
                i.final_price_vat_snapshot AS final_price_vat_snapshot,
                i.estimated_line_total AS estimated_line_total,
                i.units_per_pack AS units_per_pack,
                i.liters_per_unit AS liters_per_unit,
                p.product_code AS product_code
            FROM ordini_batches b
            JOIN ordini_items i ON i.batch_id = b.id
            LEFT JOIN ordini_products p ON p.id = i.product_id
        z
            WHERE datetime(b.confirmed_at) >= datetime(?, '-21 days')
              AND datetime(b.confirmed_at) <= datetime(?, '+21 days')
            z< ORDER BY datetime(b.confirmed_at) DESC, b.id DESC, i.id ASCbatch_idrc  r   confirmed_atr   z+00:00)tzinfor  fiscal_document_idzmatched:	unmatchedstaff)r  	batch_idsr  r  total_estimated_amountr>  _items_by_identityr  r1  lot_codeitem_idr  
product_idr   r   final_price_vat_snapshotestimated_line_totalrp  liters_per_unitr|  )r  item_idsr  r1  r  rc  r   r  r  rp  r  r|  r>  r  ra   r  ) r  r  (_ensure_order_batch_fiscal_match_columnsr  r  r  r   r   r  r   r   r   r  r   utc
astimezoner   r   r   r   r   
setdefaultr   r/  r   r"  r  r   rz  r  r#  sum)sessiondocument_dater  
parametersqueryrV  groupedrW  r  rc  supplier_keyr  confirmed_at_valuesupplier_dayr  fiscal_group	group_keybatchr  r1  r  item_identityr  items_by_identityr  resultsr>  line_totalss                               r   '_load_order_batches_for_fiscal_matchingr    sR   
 
'w'<'<	=  @0<#%
,   E }m<=OO!!%4==?A @D >@G B}s:'C06B7,];3~.4"5	-!)!7!78L8LSRZ8[!\!((0%7%?%?x||%?%T"-889JKPPR\\^L !%9!:!@bAGGI:L"4!56R]!<>	""$ ,W*.&(
 +&	i&89+DX&c%
+,, (E*$0E.! \E'N3~.4"5s:,"-.|<>ST\>]_klc)n%!"67+T2 $$]3<"$I!,/ ,$!.!#j/"6Q7VYZtVu  WBE#6P2Q,R  HLNQRhNiNuc2H.I(J{BEFVBWBc%,<(=">imDGHYDZDf5->)?#@lp #C$7$=2 > D D FD 04m,'N!!$'Z( *!5!:;eC
ODXWX>YYZ488N+1r288:s3~CVC\Z\?]?c?c?e#&s>':'@b#A#G#G#ID %&2+0:P1Q1VUV+WZ_`cdz`{Z|+|D'(EB}H (*G! 			&-&071CT&J		'"PR 
$%$((3I*J*V $-./
 

 IT%K0@!*DY]&'u	 Ne @  @Z  	-',L	-|
s%   AR3BR,66SR),R>=R>c                  sdddddddg dS t        | |      }d }	 |rt        j                  |      nd }|D 	]  }|j	                  dg       D cg c]  }t        |t              s| }	}|	s7g }
|	D ]Y  }t        |j	                  d      xs d	      }t        |      }t        |      rt        |      nd}|
j                  |||f       [ |
D cg c]  \  }}}|d
k\  s|dk\  r| }}}}t        d |
D        d      }|st               }g }d}d}D ]  }t        |      \  }}d }|D ]  }t        |j	                  d      xs d      }||v r't!        t        |j	                  d      xs d	      t        |j	                  d      xs d	            }t#        |j	                  d      |j	                  d            }d}d}|dk  rN|dk  rIt%        t        |j	                  d      xs d	      t        |j	                  d      xs d	            }|dk\  }t        ||      }|rt        |t'        |d            }|dk  rt)        |j	                  d      xs d      }t+        ||t        |j	                  d      xs d	      |j	                  d      t)        |d         nd       \  }} t-        ||j	                  d      |j	                  d      |      r|}t/        |      } d}!|Ct        ddt1        t)        |      t)        |      z
        t        t)        |      d      z  z
        }!t3        |dz  |!dz  z   d      }"||"t)        |d         kD  s-d }#d }$d}%|7t        ||z
  d      }#t        ||z
  d      }$t5        ||      rd}%n
||k  rd}%nd}%i d |%d|"d!|d"t7        |j	                  d#      xs |g      d$|j	                  d      d%|j	                  d      d&|j	                  d      d'|j	                  d      d(|d)| d*|d+|#d,|$d-|j	                  d.      d/|j	                  d      d0|j	                  d1      d2|j	                  d      |j	                  d3      |j	                  d4      |j	                  d      |j	                  d5      |j	                  d6      |j	                  d7      |||j	                  d8      d9	} ||j                  i d d:ddd!d d$d d%d d&d'd d(d d)|j	                  d      d*d d+d d,d d-|j	                  d.      d/|j	                  d      d0|j	                  d1      d2|j	                  d      d;|j	                  d3      |j	                  d4      |j	                  d      |j	                  d5      |j	                  d6      |j	                  d7      |||j	                  d8      d<       |j9                  t        |d!                |j                  |       |d=z  }|d    dk(  s	|d=z  } |D ]  }t        |j	                  d      xs d      }||v r&|j                  i d d>ddd!|d"t7        |j	                  d#      xs |g      d$|j	                  d      d%|j	                  d      d&|j	                  d      d'|j	                  d      d(t)        |j	                  d      xs d      d)dd*dd+t)        |j	                  d      xs d      d,dd-d d/d d0d         t;        d? |D              }&t;        d@ |D              }'t        t=              t=        |      d=      }(||(z  })t;        dA |D              t        t=        |      d=      z  }*d}+||j	                  dB      rx	 t        j                  t        |dB         j?                  dCdD            },t1        |jA                         |,jA                         z
  jB                        }-t        dd|-dEz  z
        }+t3        |)d
z  |*dFz  z   |dGz  z   |+dHz  z   d      }.tE        dI |D              }/dJt        |dK         t7        |j	                  dL      xs t        |dK         g      t        |j	                  dB      xs d	      t        |j	                  dM      xs d	      t        t        |fdNO      j	                  d      xs d	      |.|||&|'|/|dP}0|Ut)        |0dQ         t        |0dR         t        |0dS         ft)        |dQ         t        |dR         t        |dS         fkD  s	|0}	! |dTddddt=              dg dS t)        |dQ         tF        k  st        |dR         dk  rdTddddt=              dg dS |S # t        $ r d }Y 	w xY wc c}w c c}}}w # t        $ r d}+Y w xY w)UNno_document_linesr:  r   F)r   r  line_match_countexact_line_countmissing_line_countextra_line_countcan_apply_stornor  )r  r>  rc  r   r  g?c              3  P   K   | ]  \  }}}t        |t        |d                yw)rI  N)r  r  )r   _supplier_match_scoregeneric_product_scores       r   r   z3_build_delivery_note_order_match.<locals>.<genexpr>	  s0      BA+-B (#.CT*JKs   $&r5  r  r9  r1  r|  rI  gףp=
?r   r  rp  )rc  rd  re  rf  r  gffffff?g333333?rc   
confidencepartialexactover_deliveredr   order_item_idorder_item_idsr  order_product_namere  rd  order_product_codero  r  r  missing_quantityextra_quantitydocument_line_indexr{  document_descriptiondocument_raw_row_textr   document_product_codert  r   r   r   r   r  )	ru  r  r  r  r  r  r  r  document_vat_codeextraru  )r  r  r  r  r  r  r  r  r   missingc              3  0   K   | ]  }|d    dv sd  yw)r   >   r  r  r   Nr   r   r   s     r   r   z3_build_delivery_note_order_match.<locals>.<genexpr>H
  s      itXRh@h ir  c              3  2   K   | ]  }|d    dk(  sd  yw)r   r  r   Nr   r  s     r   r   z3_build_delivery_note_order_match.<locals>.<genexpr>I
  s     XTd8nPW>WqXs   c              3  X   K   | ]"  }t        |j                  d       xs d       $ yw)r  r:  N)r   r  r  s     r   r   z3_build_delivery_note_order_match.<locals>.<genexpr>L
  s#     \dU488L#9#@SA\s   (*r  r   r   g      ,@r`   rl  g?c              3     K   | ]G  }|d    du xs: |j                  d      du xs% t        |j                  d      t        t        f       I yw)r  Nr  )r  r   r   r   r  s     r   r   z3_build_delivery_note_order_match.<locals>.<genexpr>W
  s`      
  !T) Sxx78D@S$((#BCc5\RS
s   AAmatchedr  r  r  c           
         t        t        t        | j                  d      xs d            t	        t        | j                  d      xs d            rt        t        |       d            S d      S )Nrc  r   rI  r:  )r  r#  r   r  r/  r  r9  )r  r7  rc  s    r   rL  z2_build_delivery_note_order_match.<locals>.<lambda>f
  sh    S,]C@Y@_]_<`a5c$((?:S:YWY6Z[ I.Z^_aef&  !	& r   rM  )r   matched_batch_idmatched_batch_idsmatched_batch_confirmed_atmatched_batch_staffmatched_supplier_namer  r  r  r  r  r  r  r  r  r  no_candidate)$r  r   r   r   r  r   r"  r   r#  r/  r9  r   r  r  r   r   r  r  r  r  r   r  rg  ri  r  r#  rK  r/  r  r  r   r   r   daysall_MIN_FISCAL_ORDER_MATCH_SCORE)1r  rc  r  r7  candidate_batchesbest_resultdocument_date_valuer  r  batch_itemssupplier_scored_itemsrd  r  r  relevant_itemssupplier_scoreused_item_idsmatched_linesr  r  r3  r  r  best_line_matchr8  r  rf  
code_scorefamily_variant_scoreis_variant_mismatchro  r  delivered_raw_quantityquantity_scorer  r  r  r   r  r  compared_line_countcoverage_scoreavg_confidence
date_scorebatch_date_valueday_distancebatch_scorer  current_results1    ` `                                             r    _build_delivery_note_order_matchr  q	  sn    ) ! !"# ! %	
 		
 @# -1K#GTh44]CZ^ # q)(-		'2(>Y*TSWBXtYYNP 	^D"%dhh&?&E2"F#7GZ#[  ..AB >ndS "
 "(($0DF[)\]	^ F[
 
A*,A#t+/D/K 
 

 F[ 
 "%%13+ |	&M7Mm7\4!48<O, U
jnnY7<1=m+-))-8>B?
~6<"=
 7}7H7H7XZdZhZhiwZxy
'*$&+#?zC'7+ZM--m<BCJNN>:@bA,( +?$*F' Z8
&!$Z5I41P!QJ##(
)C)Hq#I >`!$
z28b9;E>>JZ;[;gE*%567mq	?;#%; J!"/(2(G#->>*#=) +;'-G-V*!$&2%(s5)<#=FV@W#WX[^_deu_vx{[||}&N #J$4#9M#NPQR
"*j5Q]A^;_._'+$%)N&F*6+./?BU/UWX+Y(),-@CS-SUV)W,-@BRS%,F03CC%.F%5F' &'$j' (' )$z~~j/I/VgY*W	'
 -jnn^.L' )*..*D' .z~~o/N' -jnn^.L' +,<' -.D' 89L' +,<' ).' .}/@/@/N' /0A0A-0P'  01B1B>1R!'" 01B1B>1R#'$ /<.?.?.L/</@/@/N-:->->z-J3@3D3DEU3V2?2C2CO2T1>1B1B>1R/B/B-:->->z-J5'OuUl &$$ '$c ( -d	
 )$ .} -d +D -m.?.?
.K 8 +D )$ .}/@/@/N /0A0A-0P 01B1B>1R  01B1B>1R!" -m.?.?.L#$ 0=/@/@/N-:->->z-J3@3D3DEU3V2?2C2CO2T1>1B1B>1R/B/B-:->->z-J3: c//"BCD  1!x(G3 A% y|	&| ) 	J*..38q9G-'  i # $W %d:>>*+E+R'&S	
 )*..*H %jnnZ&@ *:>>/+J )*..*H 'jnnZ.H.MA(N )# 4Q 'jnnZ.H.MA(N %a *4 +D  ,T!		2 ! i} iiX]XX!#n"5s>7JAN),??\m\\_bcfgtcuwx_yy
*uyy/H!#+#9#9#eN>S:T:\:\]`be:f#g "$7$<$<$>AQAVAVAX$X#^#^_ c\D-@&AB
 ^d2~7LMQ_bfQfgkux|k|}  @A  B 
 &	
 
   #E*$5 6!%eii&<&XU:EVAW@X!Y*-eii.G.M2*N#&uyy'9'?R#@%(" #o&	 & ! 0 0"4 0 0"1
4 .)*123123#

 +g&'./0./0
	#
 )Kcq)f $ ! !"# #N 3 %	
 		
 [!"%BBc+VhJiFjnoFo$ ! !"# #N 3 %	
 		
 Y  #"# Z
j  ! 
!s6   f/ g)gg
/A7g/f>=f>ggc               2    |t         vry t        | |||      S )N)rc  r  r7  )"_ORDER_RECONCILABLE_DOCUMENT_TYPESr  )r  rc  r  document_typer7  s        r   !build_fiscal_document_order_matchr  
  s)     >>+##%	 r   c                   t        |       D cg c]  \  }}t        |d|      t        |dd       t        |dd       t        |dd       t        |dd       t        |dd       t        |dd       t        |dd       t        |d	d       t        |d
d       t        |dd       t        |dd       t        |dd       t        |dd       d c}}S c c}}w )Nr{  r9  r   r   r   r   r   r   rt  r~  r|  r  r  r  )r{  r9  r   r   r   r   r   r   rt  r~  r|  r  r  r  )r  getattr)r>  r  r  s      r   &_fiscal_document_items_for_order_matchr  
  s    $ %U+#" E4 "$e<"4=#D.$?!$d;j$7%d,<dC$T?DA#D.$? {D9$T?DA#D.$?!$d;!$d;j$7	
  s   B5Cc                Z   t        | t              r| j                  d      dk7  ryt        | j                  d      xs d      dkD  s!t        | j                  d      xs d      dkD  ryt        | j                  d      t              r| j                  d      ng }t        d	 |D              S )
Nr   r  Fr  r   r  Tr  c              3  f   K   | ])  }t        |t              xr |j                  d       dv + yw)r   >   Nr  Nr   r"  r  r  s     r   r   z8_fiscal_order_match_has_discrepancies.<locals>.<genexpr>
  s.     fX\z$%S$((8*<O*SSfs   /1)r   r"  r  r   r/  r   order_matchr  s     r   %_fiscal_order_match_has_discrepanciesr"  
  s    k4(KOOH,E,R
;??/05A6:c+//RdBeBjij>kno>o(2;??73KT(RKOOG$XZEf`efffr   c                    t        | t              syt        | j                  d      t              r| j                  d      ng }t	        d |D              S )NFr  c              3     K   | ]P  }t        |t              xr: t        |j                  d             duxs t        |j                  d            du R yw)r  Nr  )r   r"  r   r  r  s     r   r   z:_fiscal_order_match_has_document_prices.<locals>.<genexpr>
  sa        	4 	
+DHH5J,KLTXX \.txx8M/NOW[[	
s   AA)r   r"  r  r/  r   r   s     r   '_fiscal_order_match_has_document_pricesr%  
  sN    k4((2;??73KT(RKOOG$XZE    r   c                @   t        | t              r| j                  d      dk7  ryt        | j                  d            syt	        | j                  d      xs d      }|dk  s!t	        | j                  d      xs d      |k7  ryt	        | j                  d      xs d      dkD  s!t	        | j                  d	      xs d      dkD  ryt        | j                  d
      t
              r| j                  d
      ng }|syt        d |D              }| xr t        |       S )Nr   r  Fr  r  r   r  r  r  r  c              3     K   | ]@  }t        |t               xs) |j                  d       dk7  xs |j                  d      du  B yw)r   r  r  Nr  r  s     r   r   z;_fiscal_order_match_is_exact_with_prices.<locals>.<genexpr>
  sM      * tT""hdhhx&8G&ChtxxP_G`dhGhh*s   AA)r   r"  r  r   r   r/  r   r%  )r!  r  r  has_unmatched_or_non_exact_lines       r   (_fiscal_order_match_is_exact_with_pricesr)  
  s	   k4(KOOH,E,R 234;??+=>C!D1KOO4F$G$L1 MQa a
;??/05A6:c+//RdBeBjij>kno>o(2;??73KT(RKOOG$XZE&) ** '# /.g3Z[f3ggr   c                 d    t        j                  t        j                        j	                         S r   )r   r   r   r  r   r   r   r   _utc_iso_nowr+  
  s    <<%//11r   c                    t        | d      }ddddd}|j                         D ]!  \  }}||v r| j                  d| d|        # y )Nordini_batchesTEXT)r  fiscal_document_namefiscal_document_typefiscal_document_matched_atz&ALTER TABLE ordini_batches ADD COLUMN r   )r  r>  r  )r  columnscolumn_specscolumn_namecolumn_types        r   r  r  
  sm    #J0@AG$ & &&,	L %1$6$6$8 a ['!CK=PQR]Q^_`ar   c                    | j                  d      }| j                  d      g}t        |t              r|j                  |       g }|D ]-  }t        |t              r	|dk  s||v r|j                  |       / |S )Nr  r  r   )r  r   r/  r  r   r   )r!  raw_batch_idsrz  r  r   s        r   _matched_order_batch_idsr8     s}    OO$78Moo012F-&m$I  %%!u	7I  r   c          	        t        |      }|sy t               j                  | j                  |      }|y t	        | j
                        5 }t        |       dj                  d |D              }|j                  d| d|j                  |j                  |j                  t               g|       |j                          d d d        y # 1 sw Y   y xY w)N, c              3      K   | ]  }d   yw?Nr   r   r  s     r   r   z9mark_order_batch_fiscal_document_match.<locals>.<genexpr>        @ @   z
            UPDATE ordini_batches
            SET fiscal_document_id = ?,
                fiscal_document_name = ?,
                fiscal_document_type = ?,
                fiscal_document_matched_at = ?
            WHERE id IN (z)
            )r8  r   get_fiscal_document	tenant_idr  r  r  r  r  iddisplay_namer  r+  commit)r  document_idr!  r  rR  r  placeholderss          r   &mark_order_batch_fiscal_document_matchrH    s     1=!55g6G6GUH	&w'<'<	= 0<yy @.? @@ ' ( %%&&	
 #	
" 	)  s   A7CCc                  t        |      }|st        t        j                  d      |d   }|j	                  d      st        t        j                  d      t               j                  | j                  |      }t        |j	                  d      t              r|j	                  d      ng }i }i }|D ]  }	t        |	t              s|	j	                  d      }
t        |
t              s6|	j	                  d      }|Jt        |	      \  }}|[|	j	                  d	      }t        |t              r|ng D cg c]  }t        |t              r|dkD  r| }}|
|vr|j                  d|
       i |	||t        t        |      d
      t        t        |      d
      d||
<   |D ]  }||
k7  s	|
||<     |st        t        j                  d      t!        | j"                        5 }t%        |       dj'                  d |D              }|j)                  d| dt+        |            j-                         }|t        t        j.                  d      |j)                  d| dt+        |            j1                         }t3        |d      }|D ]r  }t        |d         }||v r|j)                  d|f       *||vr/||   }t        |d         }t5        |j	                  d      xs	 |d   xs d      j7                         }t9        |      dk(  }|xs t;        |d         xr t=        |      }t?        |      }||n|d   t        |d         nd }tA        |j	                  d            }|tC        |d      n|tC        ||z  d      nd }|dk  r|j)                  d|f       |$tE        |j	                  d            }|j)                  d ||xs |d   ||t        |      t        |      |f       |d!   } | g }!g }"|r'd"|v r#|!jG                  d#       |"jG                  |       n(|s&d$|v r"|!jG                  d%       |"jG                  |       |&d&|v r"|!jG                  d'       |"jG                  |       d(|v r|!jG                  d)       |!r;|j)                  d*dj'                  |!       d+t+        |"t        |       gz                B|j)                  d,||xs |d   |t        |      t        |      |f       u |D ]}  }#|j)                  d-|#f      j-                         d   }$|j)                  d.|$t        |$      nd ||jH                  n|||jJ                  nd ||jL                  nd tO               |#f        |D ]  }#|#|k(  r	|j)                  d/|#|#f        |jQ                          d d d        t               }%|%jS                  | j                  |d0d12       d3||d4S c c}w # 1 sw Y   =xY w)5Nz7Nessun ordine compatibile trovato per questo documento.status_codedetailr   r  zVQuesto documento richiede ancora una verifica manuale prima dell'aggiornamento ordine.r  r  r  r  r:  )linked_order_item_idsr  next_quantityr  z=Non ho trovato righe ordine aggiornabili da questo documento.r:  c              3      K   | ]  }d   ywr<  r   r>  s     r   r   z>apply_delivery_note_storno_to_matched_order.<locals>.<genexpr>g  r?  r@  z+SELECT id FROM ordini_batches WHERE id IN (z	) LIMIT 1z%Ordine storico associato non trovato.z
            SELECT id, batch_id, product_id, quantity, lot_code, final_price_vat_snapshot, estimated_line_total, supplier_name
            FROM ordini_items
            WHERE batch_id IN (z*)
            ORDER BY id ASC
            ordini_productsrC  z%DELETE FROM ordini_items WHERE id = ?rN  r  r  r   r    r  r  ra   r  a  
                    UPDATE ordini_items
                    SET quantity = ?,
                        lot_code = ?,
                        final_price_vat_snapshot = ?,
                        estimated_line_total = ?,
                        units_per_pack = CASE WHEN ? THEN NULL ELSE units_per_pack END,
                        liters_per_unit = CASE WHEN ? THEN NULL ELSE liters_per_unit END
                    WHERE id = ?
                    r  unit_price_per_kgzunit_price_per_kg = ?final_price_vatzfinal_price_vat = ?vat_ratezvat_rate = ?
updated_atzupdated_at = CURRENT_TIMESTAMPzUPDATE ordini_products SET z WHERE id = ?am  
                UPDATE ordini_items
                SET quantity = ?,
                    lot_code = ?,
                    estimated_line_total = ?,
                    units_per_pack = CASE WHEN ? THEN NULL ELSE units_per_pack END,
                    liters_per_unit = CASE WHEN ? THEN NULL ELSE liters_per_unit END
                WHERE id = ?
                zESELECT SUM(estimated_line_total) FROM ordini_items WHERE batch_id = ?a?  
                UPDATE ordini_batches
                SET total_estimated_amount = ?,
                    fiscal_document_id = ?,
                    fiscal_document_name = ?,
                    fiscal_document_type = ?,
                    fiscal_document_matched_at = ?
                WHERE id = ?
                z
                DELETE FROM ordini_batches
                WHERE id = ?
                  AND NOT EXISTS (SELECT 1 FROM ordini_items WHERE batch_id = ?)
                ready_for_matchreviewed)matching_statusreview_statusT)okr  r  )*r8  r
   r   HTTP_400_BAD_REQUESTr  r   rA  rB  r   r/  r"  r   r  insertr  r   r  r  r  r  r  tuplefetchoneHTTP_404_NOT_FOUNDr  r  r   r   r`  rO  rT  r  r   r#  r(  r   rC  rD  r  r+  rE  update_fiscal_document)&r  rF  r!  r  r  rR  r  adjustmentslinked_item_primariesr   r  r  r  rN  raw_linked_item_idsr  linked_item_idslinked_item_idr  rG  rW  	item_rowsproduct_columnsitem_row
adjustmentr  clear_units_per_packdocument_pricefinal_pricer  
next_totalrS  r  product_assignmentsproduct_valuesr  batch_totalstores&                                         r   +apply_delivery_note_storno_to_matched_orderrq  2  s3    1=(C(C  MF  G  	G(+??-.(C(C  Me  f  	f!55g6G6GUH(2;??73KT(RKOOG$XZE02K,. F$%1--"hh'FG&'Ed'K$} "hh'78 4>>QSW3X/^`
'3'GaK 
 

 /""1m4&
&
%4* }!5s; #E-$8# >&
M" . 	FN.8E%n5	F7F> (C(C  ML  M  	M	&w'<'<	= K0<yy @.? @@  9,yQ#$
 (* 	 ;F,E,ENuvv&&  !-~ . #$
 (* 	 0
<MN! Q	H(4.)G//""#JWJWk)$W-J!*_"=>M
 ? ]8JCW ][]^ddfM=mLPTT#3 $!(:"67 <,]; ! DJON "-  67C 8$>?@  #B*..QfBg"h '2 )1- * =;6:  !""#JWJW)7
GZ8[\""	 #M$IXj5I>[egjk  hA  CF  GW  CX  Za  b &l3
)57'35N',??,R+223JK&--n=16G?6Z+223HI&--n=+
o0M+22>B&--h7#6+223ST*"**9$))DW:X9YYfg!.C
O3D"DE   E*1EzSVWkSlnq  sC  oD  FM  NMQ	f * 	H$,,W hjK  +6*AE+&t#+#7HKK[-5-AH))t.6.BH** N	0 * 
	H++
 8$
	 	WKZ E	  ) 	 !  ,<SdeeS
*K Ks   8W1(OW66W?c                ~   t        |       j                         D cg c]#  }|j                         s|j                         % }}|sg S d }t        |      D ]{  \  }}|j	                         dj                  ||t        |dz   t        |                   j	                         }dv sdv rt        |dz
  d      } nd|v sd|v spd|v sd|v sy|} n |t        |       S d	}||d
z   d  }g }d}	d}
|
t        |      k  r||
   }|j	                         t        fd|D              rnt        j                  d|      }|s|
d
z  }
Xt        |j                  d
            }t        j                  d|      rd|v r|
d
z  }
|g}|
d
z   }|t        |      k  rf||   }|j	                         t        fd|D              rn<t        j                  d|      rn%|j                  |       |d
z  }|t        |      k  rfdj                  |      }g }t         j#                  |      D ]0  }t%        |j                  d
            }| |j                  |       2 t        j&                  d|      }|r|d   nd }t        |      dk\  r|d
   nd }t        |      dk\  r|d   nd }||n||nd }t        |      dk\  r|d   n|}|j                  |	d d ||r|d   nd d |||d |||t        |      dk\  r|d
   nd t        |      d       |	d
z  }	|}
|
t        |      k  rt)        |      }|r|S t        |       S c c}w )Nr   r  r-   r.   rc   r   r  prodotto)r4   r  chiusuratotale colli
peso nettor   c              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   z9_extract_delivery_note_items_from_text.<locals>.<genexpr>  r	  r   z^(?:\d{6,}\s+){1,3}(.+)$rB  r+  c              3  &   K   | ]  }|v  
 y wr   r   r  s     r   r   z9_extract_delivery_note_items_from_text.<locals>.<genexpr>*  s     E5O+Er   r  z\b[A-Z]{2,}\bra   rb   r   rz  )r   r  r   r  r   r  r  r   r  r  r   r   r   r'  r   r   _DECIMAL_NUMBER_PATTERNfinditerr   r   r@  )r  r   r  r  r  r  r  r  r>  r{  r   product_matchr9  block_linesjr  
block_textnumeric_valuesr   r   upper_tokensr  r   r   r   r  r  r  r   s                              @@r   &_extract_delivery_note_items_from_textr    s   &:4&@&K&K&M^dQUQ[Q[Q]TZZ\^E^	#L ' t]]_
%EAIs5z(BCDMMO!Z/3F*3Tuqy!,L"f,"f,6!Z6%9 L <TBBoK!#$D%'EJ	A
c$i-Aw]]_
<<<!<dCFA*=+>+>q+AByy-{;sk?QFAfE#d)mQI'002OEEExx3Y?y)FA #d)m ZZ,
,55jA 	.E'A7F!%%f-	. zz"2J?*8^A&d
*-n*=*B^A&
.1..AQ.F*D!+!7:P^Pjnpt+.~+>!+C^B'
( $ *4@ad!($"0!% (((/2</@A/ELO4 4Z @	
& 	a
y c$i-z *%0M8>>s _s
   L:L:c                   t        |       j                         D cg c]#  }|j                         s|j                         % }}|sg S g }|D ]?  }t        j                  d|      D cg c]  }t        |      st        |       }}t        |      dk  st        j                  d|d         sdt        j                  d|d   t        j                        }|st        |j                  d            }||dk  rt        |d         }t        ||      r|j                  d      j                         }	|	dk(  rd	}	|j                  t        |      |d   d |d |	|||d |t        |d
         t        |d         d t        |      d       B t        |      }
|
r|
S t        |      }|r|S g }t        |      D ]  \  }}t        j                   d|      }|s t        |j                  d            }t        |      rFd }|dkD  r$t        j                  d||dz
           r||dz
     }|g}|dz   }|t        |      k  rA||   }t        j                   d|      rn%|j                  |       |dz  }|t        |      k  rAt        j"                  d|      }|rt%        |j                  d            nd }g }g }|g}|dd  D ]  }|j                         }t        j                  d|      r<t%        |      }|dkD  r:|||k(  rB|j                  |       |j                  |       et        j                  d|      r0t        |      }|"|j                  |       |j                  |       |j'                         dv s|j                  |        |r|d   nd }t        |      dk\  r|d   nd }|}|r|d   nd }|j                  t        |      ||j                  d      |d d	|t)        |      nd |t)        |      nd |t)        |      nd d |t)        |      nd d |d t        dj+                  |            d        t        |      S c c}w c c}w )Nr   r  z\d{1,4}r   z#(\d+(?:[.,]\d+)?)\s*([A-Za-z]{1,4})r   ra   SCr&   rb   rc   rz  z^(\d{10,14})\s+(.+)$z\d{6,12}z^\d{10,14}\s+.+$z\b(\d+)\s*[xX]\s*\dry  r   z\d+[.,]\d{2}>   lettere (*)bottiglie pesoaezvodkar1   r3   r   r  )r   r  r   r   r  r   r-  r.  r   r'  r<  rS  r   r@  /_extract_martini_structured_delivery_note_itemsr  r   r   r   r   r   r  )r  r   r  table_itemsr_  r  quantity_matchr   r9  rt  cleaned_table_itemsstructured_itemsr>  r  description_matchr|  blockr}  r/  pack_size_matchry  integer_valuesdecimal_valuescompact_row_partsstrippedr   r   r   r   r  s                                 r   ._extract_martini_delivery_note_items_from_textr  Y  s   &:4&@&K&K&M^dQUQ[Q[Q]TZZ\^E^	+-K "
8:d8SrWklpWq%d+rru:>j%(!C&LeTUhXZXeXef%n&:&:1&=>x1}*584";5"((+113	I!+. %a *!%&&$"*!% (0q:0q:  4T :	
!"
F 0<""FuM%'E ' F
tHH%<dC *+<+B+B1+EF";/19k53CD +L 6AI#e*naIxx+Y7LL#FA #e*n ))$:KH5DC--a01$	$&&((,v!"I 	3Dzz|H||FH-H4<(Ui-?%%e,!((2||OX6+H5%"))&1%,,X6  "&pp!((2%	3( +9^A&d
.1..AQ.F*D+9^B't
!%j ,-33A6*!%!3=3IeJ/t/7/CE(O;I;U%"7[_!%3;3GhT"(  4UZZ@Q5R S	
iF
N !''q _ ss   QQ*Q;Qc                |    t        j                  d|       D cg c]  }t        |      rt        |       c}S c c}w r]  )r   r  r   r^  s     r   _split_martini_line_cellsr    s<     HH[$/% 	T"  ra  c                    t        |       }|sy |d   }t        j                  d|      }|sy |j                         \  }}}t	        |      }t        ||       ry ||||dd  dS )Nr   z&^(?:(\d{6,12})\s+)?(\d{10,14})\s+(.+)$r   )internal_coder|  r9  quantity_cells)r  r   r   r   r   r<  )r   r  headr   r  ean_coder9  s          r   _parse_martini_product_liner    sw    %d+E8DHH>EE+0<<>(M8[&{3K{D1& ")	 r   c                    t        | xs d      }t        j                  d|      D ]:  }t        |j	                  d            }| d|cxk  rdk  s,n /t        |      c S  y )Nr   z.\b(\d{1,2})\s*[xX]\s*(?:\d{2,3}|[A-Za-z]{1,4})r   0   )r   r   rz  r   r'  r   )r9  r   r   r   s       r   #_martini_pack_size_from_descriptionr    s`    1+2CDJNPZ[ !#EKKN3!v"3"3= ! r   c                    g }| D ]t  }t        |      }|st        j                  d|      r(t        j                  d|      D ]4  }t	        |      }|
|dk  s|dkD  r|j                  t        |             6 v |S )N\d{6,}\d+(?:[.,]\d+)?r   i  )r   r   r-  r   r   r   r   )r  rz  r  r   r   r   s         r   _martini_numeric_cell_valuesr    s    F 
))$/
<<	:.ZZ 2J? 	)E'.F~1MM%-(		)
) Mr   c                    g }| D ]D  }t        |d      st        t        |            }d|cxk  rdk  s1n 4|j                  |       F |S )Nr  r:  r   r   )r=  r   r#  r   )rz  integersr   roundeds       r   _martini_integer_like_valuesr  
  sQ    H %7eEl#w$OOG$% Or   c                  t        |       }|sy||dkD  rt        t        |            }t        |d d       D ]S  \  }}||k7  rt	        ||dz            }|dz   t        |      k  rt	        ||dz            nt        ||z  d      }|||fc S  t        |      dk\  r|d   |d   }
}	t        |	      j                  t        |            r"|
dk  rt	        |
      }||t        ||z  d      fS t        |
||	z  z
        dk  rt	        |	      }||t	        |
      fS |	|kD  r%|	|z  dk(  rt	        |	      }|t        ||z  d      |fS t        |      dk(  rVt	        |d         }|s||k  r||t        ||z  d      fS |d   |z  dk(  r|t        ||z  d      |fS ||t        ||z  d      fS t        |      dk\  rt	        |d         t	        |d         d fS d t	        |d         d fS )	NNNNr   r   r   ra   rd   r  r  )	r  r   r#  r  r   r   r   r  r  )rz  ry  prefer_single_as_cartonsr  pack_integerr  r   cartonsbottlesfirstsecond
only_values               r   _pick_martini_quantitiesr    s2    ,F3H!Q5+,%hsm4 	1LE5$HUQY/0G49AIH4MeHUQY/0SXYbelYlnoSpGw00	1 x=A$QK!6E5z$$S%67FbL-!7E)g2Eq,IJJ6Y./0E9,!7E&M::y U\%9Q%>,!59)<a#@'JJx=Ax{+J':+B!:uY5KQ/OPP{\)Q.!5i)?#CZPPz5Z1G+KLL
8}hqk"E(1+$6==%$d++r   c                ^    t        |       j                         t        fddD              S )Nc              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   z._martini_line_is_table_stop.<locals>.<genexpr>C  s      
 	
r   )r5   r4   zgiorno di chiusurazmodalita idoneezai sensi dell'arttotaler   )r   r   s    @r   _martini_line_is_table_stopr  A  s2    %d+446J 


 
 
r   c                   g }d}g }g }|t        |       k  r;| |   }t        |      r	 t#        |      S t        |      }|@t        |      }|r-t	        |      r"|j                  |       |j                  |       |dz  }xt        |d         }t	        t        |j                  d      xs g             }	t        |      }
t        |	|
d      \  }}}|g}|dz   }|g }|t        |       k  r[| |   }t        |      st        |      n?|j                  |       |j                  t        |             |dz  }|t        |       k  r[t	        ||z         }t        ||
d      \  }}}||rg ||}|||t        ||z  d      }|g }g }t        ||dz         }|j                  t        |      |j                  d	      |j                  d
      |d dt        |      t        |      |t        |      nd d t        |      d d d t        dj!                  |            d       g }g }|	g k(  rt        ||dz         n|dz   }|t        |       k  r;t#        |      S )Nr   r   r9  r  T)ry  r  Frd   r|  r  r&   r  rz  )r   r  r  r  r  r  r   r   r/  r  r  r  r#  r  r   r   r  r@  )r  r>  r  pending_quantity_cellspending_quantity_linesr   r  r  r9  product_quantity_valuesry  parsed_pack_sizer   r   r|  	lookaheadcontinuation_cellsr  continuation_quantity_valuess                      r   r  r  P  s   %'EE(*(*
#e*
U|&t,H !''G .d3?-d3E5e<&--e4&--d3QJE'-01">tGKKP`DaDgeg?h"i7D	7O#%)8
4*n
 fAI	,.c%j(!),	.y9=XYb=c=o""9-"))*CI*NOQ	 c%j( ,HH^asHs+t(;S,#).<8j.
 %*@E 6EE!&6&BzG]"#3j#@!DN%'"%'"	519-E!%j 'N ;#KK8*!%!#J/!*-;I;U%"7[_!% %j 1""  4UZZ5L M	
& "$!#-D-JIuqy)PUXYPYK #e*
N !''r   c                   t        |       j                         D cg c]#  }|j                         s|j                         % }}|sg S d }t        |      D ]O  \  }}t	        dj                  ||t        |dz   t        |                         }d|v s>d|v sCd|v sHd|v sM|} n |g S d}g }|dz   }|t        |      k  r||   }|j                         t        fd	|D              r	 t+        |      S t        j                  d
|      D 	cg c]  }	t        |	      st        |	       }
}	t        |
      dk  st        j                  d|
d         s|dz  }d}d}|dz   t        |      k  rwt        ||dz            }t        j                  d
|      D 	cg c]  }	t        |	      st        |	       }}	d|vr*|rt        j                  d|d         st        |      r|}d}|s||z  }>g }|
dd  D ]:  }t        j                  d|      rt        |      }|(|j                  ||f       < |s||z  }|d   d   }t        |      dk\  r|d   d   nd }t        |      dk\  r|d   d   nd }|	||||z  }t!        |d   d         }|a|d   d   j#                         j%                  dd      j%                  dd      }t        j&                  d|      }|r|j)                  d      nd }|j                  t        |      |
d   d |d ||||d |d d d t        dj                  ||g            d       ||z  }|t        |      k  rt+        |      S c c}w c c}	w c c}	w )Nr   rc   r   lottor  r/   )r  r5   r4   zin caso di reclamorv  ru  r  r   c              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   zD_extract_montenegro_delivery_note_items_from_text.<locals>.<genexpr>  r	  r   r   r  z\d{5,}r   r   r   ra   z\d{10,}rb   r   r   r   r   z\b(CT|CS|BT|PZ|KG|LT)\br  rz  )r   r  r   r  r  r  r  r   r   r   r   r  r-  rK  r  r   r[  rS  r   r   r'  r@  )r  r   r  r  r  r  r  r>  r   r_  r  r9  consumedr  
next_cellsquantity_partsr  r   r   rm  r   rt  latinized_quantity_cell
unit_matchr   s                           @r   1_extract_montenegro_delivery_note_items_from_textr    s   &:4&@&K&K&M^dQUQ[Q[Q]TZZ\^E^	#L ' t&sxxec%!)SQVZ>X0Y'Z[Gv$5-6:QV`djVj L	
 	K &(EqA
c%j.Qx]]_
<<<H !''E 9;d8SrWklpWq%d+rru:>iq!BFAq53u:,U1q5\:IAC+W`Aa  Aeyz~e.t4  AJ  A9$#Y
1(N9)D'MA24!"I 	8D||J-4T:H#%%tX&67	8 MA#A&q)
25n2E2J.+A.PT14^1D1I*1-t!j&<A\'/9N89J19MN	&4Q&7&:&@&@&B&J&J4QT&U&]&]^bdg&h##=?VWJ/9
((+tI!%j %a *!%&(&"0!% *""  4UZZ{@S5T U	
& 	
XM c%j.P !''A _< s As"   M M M%$M%M*/M*c                F   t        |       j                         syt        fddD              ryt        j                  dt        |             }|r5t        |j                  d            rt        |j                  d            ryt        |       r|rt        |      ryy)NFc              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   z:_looks_like_stacked_delivery_item_start.<locals>.<genexpr>  s       C55J  Cr   )r  r/   r  r  impostaclientedestinatario^(\S+)\s+(.+)$r   ra   T)r   r   r   r   r   rT  r'  rK  )r   r  inline_matchr   s      @r   '_looks_like_stacked_delivery_item_startr    s    %d+446J
  C  -B  C  C88-/CD/IJL9,:L:LQ:OPUz  |H  |N  |N  OP  |Q  VR(.9AfgpAqr   c                2
  $% t        |       j                         D cg c]#  }|j                         s|j                         % }}|sg S d }t        |      D ]e  \  }}t	        |      %t	        dj                  ||t        |dz   t        |                         }d%v rd|v rd|v rd|v sd%v sYd%v s^d%v sc|} n |g S d}||dz   d  }g }d	}	|	t        |      k  r||	   }|	dz   t        |      k  r||	dz      nd }
|j                         %t        %fd
|D              r	 t5        |      S t        ||
      s|	dz  }	qd }d }d}t        j                  dt        |            }|r`t        |j                  d            rFt        |j                  d            r,|j                  d      }t        |j                  d            }nt        |      }t        |
xs d      }d}|g}|dk(  r|
r|j!                  |
       |	|z   }|t        |      k  rw||   }|dz   t        |      k  r||dz      nd }|j                         $t        $fd|D              rn2t        ||      rn%|j!                  |       |dz  }|t        |      k  rwd }d }d }d }d }d }|dd  D ]  }t        |      }t#        |      }||}t        j$                  d|t        j&                        }|r6	 t)        |j                  d            }t)        |j                  d            }|t        j$                  d|      r"	 t)        t        j,                  dd|            }t        j$                  d|      r||	 t)        |      }t        j$                  d|      r|t/        |      }t        j$                  d|      }|r-t/        |j                  d            }|j                  d      }Dt1        |      }|S|sW|D cg c]=  }t        d|v r|j3                  d      d   n|j3                  d      d         dk\  s<|? } }| r| d	   nt        |      dk\  r|d	   nd }!|!t/        |!      }"|"|"} d }#||||z  }#n||}#|j!                  t        |      |d |d ||||#d ||||t        dj                  |            d       |}	|	t        |      k  rt5        |      S c c}w # t*        $ r Y w xY w# t*        $ r Y w xY w# t*        $ r Y w xY wc c}w )Nr   r  r  r  r/   r  )r  rH  rI  rF  r  r  r  r4   r   r   c              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   zA_extract_stacked_delivery_note_items_from_text.<locals>.<genexpr>6  r	  r   r  ra   r   c              3  &   K   | ]  }|v  
 y wr   r   ri  s     r   r   zA_extract_stacked_delivery_note_items_from_text.<locals>.<genexpr>P  s     JU500Jr   z(\d+)\s*[xX]\s*(\d+)z
\d+\s*[xX]z\s*[xX]$ry  z\d+[.,]\d{3,4}z([0-9][0-9.,]*)\s+(\d{2})r   r   r   rb   r  rz  )r   r  r   r  r  r  r  r   r   r   r  r   r   rT  r'  rK  r   r[  r-  r.  r   r   r  r   rs  r  r@  )&r  r   r  r  r  r  r  r  r>  r   r  r|  r9  r  r  r|  r}  r/  candidate_nextr  r   rm  r  r  r  
block_liner  rt  qty_pair_matchtotal_matchr  r   high_precision_tokenscandidate_tokenparsed_candidater   rj  r   s&                                       @@r   ._extract_stacked_delivery_note_items_from_textr    s   &:4&@&K&K&M^dQUQ[Q[Q]TZZ\^E^	#L ' 
t*40
&sxxec%"*cRWj>Y0Z'[\z!'f$F"z)jJ.F8WaKa L
 		K !#$D%'E	A
c$i-Aw#$q53t9#4DQK$	]]_
<<<V !''U 7tYGFA#'"&xx 13G3MN=l>P>PQR>STY~  @L  @R  @R  ST  @U  ZV'--a0L.|/A/A!/DEK/5L.yB?KHfq=Yy)L#d)mQI,-ECI,=T!a%[4N#,#5#5#7 JkJJ6y.Qy)FA #d)m 


%ab/ )	6J+J7H"Fx"P"..\\*A8R]][N!&~';';A'>!?J&+N,@,@,C&DO ||M84!&rvvk2x'H!IJ ||FH-*2H_Md&+HoO ||-x8Z=O/9
,,'CXNK/0A0A!0DE
&,,Q/4X>N!n<J  )X5cjmqvjvRWR]R]^aRbceRf  }B  }H  }H  IL  }M  NP  }Q  OR  VW  OW  )X%  )X>S"7":or  tB  pC  GH  pHZhijZk  NR".'9/'J$'3%5
S)	6V !o&A'/9N#'N!%j , *!%%(&"0!% *(($ 4UZZ5L M	
& _ c$i-` !''a _l "  "  "  )XsL   SS$4S$0 S4,T8=T6T$	S10S14	T T	TTc                l    t        | xs d      j                         j                  dd      }|t        v S )Nr   r   )r   r   r   _ELEVEN_UNIT_CODES)r   r   s     r   _looks_like_eleven_unit_coder    s2     "-668@@bIE&&&r   c                    t        | xs d      }|rd|v ry t        j                  d|      }|sy t        |j	                  d            S )Nr   %r  r   )r   r   r   r   r'  )r   r   r   s      r   _parse_eleven_quantity_cellr    sG    $U[b1Iy(II()4Eekk!n--r   c                   | xs dj                         D cg c]  }t        |      st        |       }}g }d}d}|D ]l  }|j                         |sdv r
dv rdv rd}%t        fd|D              r t%        |      S d	|vrJj	                  d
      sdv r`t        j                  d      rw|j                  d	      D cg c]  }t        |      st        |       }}t        |      dk  rd }d }	d }
d }d }t        |      dk\  rYt        |d         rKt        |d         }||d   }|d   }	|d   j                         }
t        |      dk\  rt        |d         }nt        |      dk\  rUt        |d         rGt        |d         }|X|d   }	|d   j                         }
t        |      dk\  r\t        |d         }nMt        |d         }||d   }|d   }	t        |      dk\  r#t        |d         }|r|d   nt        |d         }t        |      }t        |	|      rt        |      }|t        |      dk\  r|d   }t        j                  d|      }|j!                  t        |      |d |	d |
|||d |||r|d   nd |r|j#                  d      nd |d       o t%        |      S c c}w c c}w )Nr   F)
scadenzezcontrollate la mercer  ztotale netto	riepilogozspese bolli	pagamentozbanca d'appoggior  r  r   r  r  Tc              3  &   K   | ]  }|v  
 y wr   r   r  s     r   r   z@_extract_eleven_delivery_note_items_from_text.<locals>.<genexpr>  r  r   r   )ziva |ziva r  z^\d{2}\s*\|\s*iva\brb   rc   ra   r   r   r  z\b(\d{2})\s*$r   rz  )r  r   r   r   r  r   r   r  r   r  r  rS  r   r   r<  r   r   r'  r@  )r  r   r  r>  in_items_tabler  r  r  r|  r9  rt  r   r  amount_tokensr   	vat_matchr  s                   @r   -_extract_eleven_delivery_note_items_from_textr    s   59ZR4K4K4MlDQefjQk!$'lEl%'ENK  M
--/_,/1QV_crVr!%A[AAN !''M d?%%&78<OSb<b88*O<8<

3fK_`dKe%d+ffu:>#'"& $	!%#'
u:?;E!HE258<H 8L(Ka(I5zQ/a9
Z1_!=eAh!G258<H(Ka(I5zQ/a9
258<H 8L(K5zQ :58 D1>]1-DVW\]^W_D`
+D1";=2<@#m"4"9&q)JII.=	!%j , *!%&&$"*!% ((3@mB/d2;IOOA. ,	
wM
\ !''} m> gs   J;J;
K K c                (   | syt        | d         }t        j                  d|      }|r4t        |j	                  d            t        |j	                  d            fS t        |      }t        |       dk\  rt        t        | d               nd }||fS )Nr   r   z9(\d+(?:[.,]\d+)?)\s+(\d{1,3}(?:\.\d{3})*,\d{2}|\d+,\d{2})r   ra   )r   r   r-  r   r'  r   )r  r  combined_matchr   r  s        r   (_parse_moet_line_quantity_and_unit_pricer    s    %eAh/J\\DN ">#7#7#:;=OP^PdPdefPg=hii!*-HGJ5zUV#$8q$BC\`Jj!!r   c                <   t        |       D ]  }t        |      }|st        j                  d|      }|r&t	        |j                  d            }|r	|dkD  r|c S Ot        j                  d|      rf|j                  d      rxt	        |      }|s|dkD  s|c S  y )NzC(\d{1,3}(?:\.\d{3})*,\d{2}|\d+,\d{2})\s+(?:0[,.]00\s+)?22[,.]00\s*$r   r   z0[,.]00\s+22[,.]00-)rl  r   r   r   r   r'  r-  rn  )r  r  r   total_with_vat_matchr   s        r   _parse_moet_line_totalr  &  s     )$/
!yyR 
  '(<(B(B1(EFF&1*<<-z:s##J/fqjM'( r   c                   | D cg c]  }t        |      st        |       }}t        |      dk  ry d }d }g }t        j                  d|d         r |d   }t        |      dk\  r|d   nd }|dd  }nKt        j                  d|d         }|r0|j                  d      }t        |j                  d            }|dd  }|r|r|sy t        |      \  }}	t        |      }
|y ||d |d dd ||d ||	|
dt        d	j                  |            d
}t        t        |j                  d      xs d      t        |j                  d      xs d            ry |S c c}w )Nrb   r  r   ra   r   z^(\d{6,})\s+(.+)$r   22r  rz  r9  r   r   )r   r   r   r-  r   r'  r  r  r  r<  r   r  )r  r{  r  r  r|  r9  r  r  r   r  r  r  s               r   _parse_moet_invoice_item_liner  >  s   ?DctH\]aHb,T2cc
q #L"K L	||I/23'*-01A-Ba-G&q)T'+xx 46Fq6IJ'--a0L.|/A/A!/DEK+AB/L{,CLQHj'5J !$""   ,UZZ8H-IJD" s488M#:#@bA3txxP^G_GeceCfgK[ ds
   EEc                f  	 t        |       j                         D cg c]#  }|j                         s|j                         % }}|sg S g }d}d}|D ]  }|j                         	d	v rd	v rd	v sd	v rd}&|s)t	        	fd|D              r t        |      S t        j                  d	t        |            sit        j                  d
|      D cg c]  }t        |      rt        |       }}t        |t        |            }||j                  |        t        |      S c c}w c c}w )NF)rJ  zcontributo ambientale
imponibileztotale fatturazmh portfoliozla merce viaggiar  r  zq.tau   q.tàTc              3  &   K   | ]  }|v  
 y wr   r   r  s     r   r   z>_extract_moet_delivery_note_items_from_text.<locals>.<genexpr>  r  r   z^\d{6,}(?:\s|\|)r   )r   r  r   r   r   r   r   r  r  r   r   r@  )
r  r   r  r>  r  r  r_  r  r  r  s
            @r   +_extract_moet_delivery_note_items_from_textr  o  sN   &:4&@&K&K&M^dQUQ[Q[Q]TZZ\^E^	%'EHK  --/&=O+KQW[jQjnu  zI  oIHA[AA !'' xx+-A$-GH d3
#D) !&
 

 -UCJ?LL%( !''E _2
s   D)D)D.c                  t        | xs d      j                         }|s|sg S d|v rt        |      }|r|S t        |      S d|v rt        |      }|r|S t        |      S d|v sd|v rt	        |      }|r|S t	        |      S d|v sd|v rt        |      }|r|S t        |      S d|v rt        |      }|r|S t        |xs |      S d	|v rt        |      }|r|S t        |      S g S )
Nr   elevenmartinirr   reduzzimoethennessylaconir(  )	r   r   r  r  r  r  r  r  0_extract_cavallaro_delivery_note_items_from_text)rc  preview_textsource_textsupplierpreview_itemss        r   ._extract_supplier_specific_delivery_note_itemsr    s"    $M$7R8AACHK	8ElS  <[IIHF|T  =kJJx9#8I,W  @MMZ83CLQ  :;GG8Ml[  =k>Y\ZZhHV  ?LLIr   c                   t        |       }|r|S t        |       j                         D cg c]#  }|j                         s|j                         % }}g }|D ]b  }t	        j
                  d|      D cg c]  }t        |      rt        |       }}t        |t        |            }|R|j                  |       d t        |      }|r|S t        |       S c c}w c c}w r]  )r  r   r  r   r   r  r  r   r   r@  r  )	r  split_itemsr   r  r>  r_  rz  parsed_itemr  s	            r   r  r    s    HNK&:4&@&K&K&M^dQUQ[Q[Q]TZZ\^E^%'E & d3
#D) !&
 

 5VSZH"LL%& *%0MCDII _
s   CC4Cc           	        t        | j                  d      xs d      }t        |       }|st        |      S d }t	        |      D ]G  \  }}t        t        |j                  d      xs d            j                         dv s@dv sE|} n |t        |      S d}g }||dz   d  D ]^  }t        t        |j                  d      xs d            j                         t        fd|D              r n|j                  |       ` g }t	        |      D ]  \  }	}t        j                  dt        |j                  d      xs d            D 
cg c]  }
t        |
      rt        |
       }}
t        |      set        ||	      }|tt        t        |j                  d      xs d            |d	<   |j                  |        t        |      }|r|S t        |      S c c}
w )
Nr  r   r.   r  )r  rv  ru  firmar  r   c              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   zA_extract_delivery_note_items_from_ocr_document.<locals>.<genexpr>  r	  r   r   r   )r   r  rY  r  r  r   r   r   r   r   r  r{  r  r@  )rR  r1  rV  r  r  rW  r  	body_rowsr>  r{  r_  rz  r  r  r   s                 @r   ._extract_delivery_note_items_from_ocr_documentr    s   V,23M#H-D5mDD#Lo 
s)#cggfo.C*DENNP
*,Z1G L	
 5mDDK *,IL1$&' )#cggfo.C*DENNP
<<<	 &(E$Y/ "
C c#''&/2GR.HI
#D) !&
 

 2&94VZH&:3swwv?TRT;U&VN#[!" *%0M1-@@!
s   G!c                   t        | j                  d      t              r| j                  d      ng }t        |t              si S i }|D ]  }t        |t              st	        t        |j                  d      xs d            j                         }|sLt        |      xs t        |      }|sg|dv r|j                  d      s||d<   |dv r%|j                  d      st        |      }|s||d<   |dv r|j                  d	      s||d	<   |d
v s|j                  d      t        |      }|||d<    |rd|d<   |S )Nentitiestyper   >   r  vendor_namerc  rc  >   due_dateinvoice_dater  >   
invoice_idinvoice_numberdocument_number>   
amount_due
net_amounttotal_amountr  r]   r  )r   r  r/  r"  r   r   r   r*  r   r   r   )rR  r  	extracted
raw_entityentity_typer   r   parsed_amounts           r   (_extract_invoice_fields_from_document_air    sO   +5hll:6NPT+Ux||J'[]Hh%	#%I :
*d+*3z~~f/E/K+LMVVX3J?gC[\fCgFFy}}]lOm).Io&88A_4U;K-8	/*<<Y]]SdEe+0I'(HHY]][iMjMr.u5M(,9	.)):, %.	/"r   c                    t               }|j                  xs dj                         }|sy | d| }t        ||      dvry 	 t	        | ||      S # t
        $ r Y y w xY w)Nr   r[     r]   r_   )	raw_bytes	mime_typeprocessor_id)r   'google_document_ai_invoice_processor_idr   _classify_document_typer   	Exception)r  r   rD  ocr_textsettingsinvoice_processor_idpreliminary_sources          r   '_maybe_process_invoice_with_document_air)  (  s     ~H$LLRPRYY[(>H:61<@Hff0-
 	

  s   A 	AAc           
        t        |       }|j                         D cg c]#  }|j                         s|j                         % }}t        |      D ]Q  \  }}|j	                         }t        j                  d|t
        j                        rQt        |      }|r|c S t        |dz   t        |dz   t        |                  D ]  }t        ||         }	|	s|	c c S  d|v rd|v s%t        j                  d|t
        j                        r@t        |dz   t        |dz   t        |                  D ]  }t        ||         }	|	s|	c c S  t        |      }
|
s	dj                  |t        d|d	z
        |dz          t              r:t!        fd
dD              sP|
c S  dD ]}  }t        j                  ||t
        j                        }|s+|t        d|j#                         dz
        |j%                         dz    t        |j'                  d            }	|	s{|	c S  t        j(                  d|t
        j                        D ]^  }|t        d|j#                         dz
        |j#                          t              r=t        |j'                  d            }	|	s\|	c S  t        j                  dt+        |      j,                        }|ra	 t/        j0                  dj                  |j3                               d      j5                         }	|	j7                         }t9        |      r|S d S y c c}w # t:        $ r Y y w xY w)Nz4\bdata(?:\s+documento|\s+fattura|\s+ddt|\s+bolla)?\br   rg  numerodatan\.?r   r   rd   c              3  B   K   | ]  }|j                         v   y wr   r   r   r   r   s     r   r   z)_extract_document_date.<locals>.<genexpr>Z  s     w55G,,..w   )	documentofatturarc  bollar+  r,  )z_\b(?:[A-Z0-9]{1,4}[-./])?boll[a-z.]*\s+[A-Z0-9./-]*\d[A-Z0-9./-]*\s+(\d{2}[/-]\d{2}[/-]\d{2,4})zX\bdata(?:\s+documento|\s+fattura|\s+ddt|\s+bolla)?\s*[:.]?\s*(\d{2}[/-]\d{2}[/-]\d{2,4})z9\bpagina\s+\d+\s+\d{1,12}\s+(\d{2}[/-]\d{2}[/-]\d{2,4})\bP   r   z#\bdel\s+(\d{2}[/-]\d{2}[/-]\d{2,4})r  z(\d{2})(\d{2})(20\d{2})r   z%d%m%Y)r   r  r   r  r   r   r   r.  r   r  r  r   r-  r  r  r   r   rx  r4  r'  rz  r   stemr   r   r   r   r   r   r   )r  filenamer   r   r  r  
line_lowerinline_datecandidate_indexr   combined_dater   r   filename_match
parsed_isor   s                  @r   _extract_document_dater>  B  s   %d+J&0&;&;&=NdTZZ\NEN ' %t]]_
99LdTVTaTab@FK""#(C	3u:4N#O "?o@VW!M" 
"v';WVZ\^\i\i@j#(C	3u:4N#O "?o@VW!M" ?tDhhuSEAI%6CDG+G4w<vww$$+%. 

 		':r}}= Q(:!;eiikB>NOG;EKKNT[\F
 CZQSQ^Q^_ SEKKMB$67%++-H'07APWXM YY94>;N;NON	&&rww~/D/D/F'GRWWYF))+J!CJ!O:YUYY k Of  		s#   L>L>AM ;M 	MMc           
        t        |       }g }|dv r|j                  g d       n|dk(  r|j                  g d       |j                  g d       |D ]Y  }t        j                  ||t        j                        }|s+|j                  d      j                  d      }t        |      sW|c S  |j                         D cg c]#  }|j                         s|j                         % }	}t        |	      D ]~  \  }
}t        j                  d|t        j                        rOt        |
dz   t        |
d	z   t        |	                  D ]'  }|	|   j                  d      }t        |      s#|c c S  t        j                  d
|t        j                        }|rgdj                  |	t        d|
dz
        |
dz          t!        fddD              r/|j                  d      j                  d      }t        |      r|c S t        j                  d|t        j                        s0t        |
dz   t        |
dz   t        |	                  D ]'  }|	|   j                  d      }t        |      s#|c c S   t#        |      j$                  j                         }|r0t        j&                  d|      D cg c]  }|s|	 }}|r|d   d d S y c c}w c c}w )Nr  )zS\bn\.?\s*ordine\s*/\s*data\b[\s\S]{0,180}?\|\s*([A-Z0-9]{4,})[./-]\d{2}[./-]\d{2,4}zI\bn\.?\s*ordine\s*/\s*data\s*[:#]?\s*([A-Z0-9]{4,})[./-]\d{2}[./-]\d{2,4}zT\bfattura(?:\s+\w+)?\s*(?:n(?:umero)?\.?|nr\.?)?\s*[:#]?\s*([A-Z0-9][A-Z0-9./-]{3,})z6\bnumero\s+fattura\s*[:#]?\s*([A-Z0-9][A-Z0-9./-]{3,})r^   )z<\bconsegna\s+imm\.?\s+[A-Z]{2,5}\s+([A-Z0-9][A-Z0-9./-]{2,})za\b(?:[A-Z0-9]{1,4}[-./])?boll[a-z.]*\s+([A-Z0-9./-]*\d[A-Z0-9./-]*)\s+(?:\d{2}[/-]\d{2}[/-]\d{4})zC\b(?:[A-Z0-9]{1,4}[-./])?boll[a-z.]*\s+([A-Z0-9./-]*\d[A-Z0-9./-]*)zp\b(?:ddt|d\.d\.t\.|bolla|documento di trasporto)\s*(?:n(?:umero)?\.?|nr\.?)?\s*[:#]?\s*([A-Z0-9][A-Z0-9./-]{2,}))z8\bnumero\s+documento\s*[:#]?\s*([A-Z0-9][A-Z0-9./-]{2,})z@\bn(?:umero)?\.?\s*documento\s*[:#]?\s*([A-Z0-9][A-Z0-9./-]{2,})z7\bpagina\s+\d+\s+(\d{1,12})\s+\d{2}[/-]\d{2}[/-]\d{4}\br   r*  r-  r  z3\b([A-Z0-9./-]{3,})\s+(\d{2}[/-]\d{2}[/-]\d{2,4})\br   r   rd   c              3  B   K   | ]  }|j                         v   y wr   r/  r0  s     r   r   z+_extract_document_number.<locals>.<genexpr>  s     o55G,,..or1  )r2  r3  rc  r4  r+  z&\bnumero(?:\s+documento|\s+fattura)?\brg  z[_\s]+r5  )r   r  r   r   r.  r'  r   r0  r  r  r-  r  r  r   r  r  r   r   r6  r  )r  r  r7  r   r  r   r   r/  r   r  r  r:  r  r6  r   compact_tokensr   s                   @r   _extract_document_numberrB  |  s   %d+JH66	
 
/	)	
 OO	
  !		':r}}=A,,X6I*95  ! '1&;&;&=NdTZZ\NEN ' !t<<r}}5#(C	3u:4N#O %!/288B	.y9$$% #Y[_acananohhuSEAI%6CDGo<noo*00399(C	.y9$$yyBD"--X$UQYEAIs5z0JK 	!Oo.44X>I*95  	!!( >$$&D-/XXi-FPE%%PP!!$Sb))5 O. Qs   KK6K>Kc                ~   | j                         h d}t        fd|D              ryt        t        j                  d|             }|dk  ryt
        j                  |       ryd| v st        j                  d|       ryt        d	 | D              t        t        |       d
      z  }|dkD  ryt        |       dkD  ryy)N>   rif.boll boll.	san paoloocr ricostruitoocr strutturatoorario consegnarc  ivabankibanbancar4  agenter  intesar  valutar  r3  deutscher  r  r  r  destinazionerb  c              3  &   K   | ]  }|v  
 y wr   r   r  s     r   r   z(_is_company_like_line.<locals>.<genexpr>  s     
@5O#
@r   Fr
  ra   Tr  z
\b\d{3,}\bc              3  <   K   | ]  }|j                           y wr   )r  r  s     r   r   z(_is_company_like_line.<locals>.<genexpr>  s     @ii'')@r  r   r  r5  )	r   r   r   r   r   rm  r   r  r  )r   ro  
word_countdigit_ratior  s       @r   rn  rn    s    mmoON: 
@
@@RZZ 4d;<JA~##D)
d{biit4@4@@3s4yRSCTTKS
4y2~r   c                
   g }t        |       j                         D ]A  }t        j                  d|      D ]&  }|j	                         }|s|j                  |       ( C |d d D ]*  }t        j                  |      st        |      s%|d d c S  t        |d d       D ]E  \  }}d|j                         vrt        d|dz
        }||| D ]  }t        |      s|d d c c S  G |d d D ]  }t        |      s|d d c S  y )	Nz\s+\|\s+(   rk     r  r   r     )r   r  r   r  r   r   rm  r   rn  r  r   r  )r  r  raw_liner/  r?  r   r  start_indexs           r   _extract_supplier_namer^    s-   E(.99; &+x8 	&Ioo'GW%	&& cr
  ''-2G2M: !s, 'tDMMO+!URZ({51 	'I$Y/ #&	'	' cr
  &: r   c                R   	 t        j                  t        |             }	 |j                  dk  r	 |j                          y|j                  d      }|j                  }t        j                  |j                  |j                  |j                  |j                  dz  z   |j                  |j                  dz  z         }|j                  t        j                  dd      |d      }t        j                  t!        j"                  |j%                  d                  5 }t'        j(                  |d	d
      }d d d        t+              |j                          S # t        $ r Y yw xY w# 1 sw Y   3xY w# t        $ r Y |j                          yw xY w# |j                          w xY w)Nr   r   r  g)\(?rb   F)matrixclipalphapngita+eng--psm 6langconfig)fitzopenr   r$  
page_countclose	load_pagerectRectrE  rF  widthheight
get_pixmapMatrixr   ioBytesIOtobytespytesseractimage_to_stringr   )pathrR  rS  rn  ra  pixmapimager  s           r   _extract_pdf_header_textr|    s]   99SY'!#  	 !!!$yyyyGGGGGGdjj4''GGdkkD((	
 Aq(9ERZZ

6>>%#89: 	]e#33E	R[\I	]#I. 	+  	] 	]   	sS   E E5 CE5 E)7E5 	E&%E&)E2.E5 5	F>F FF F&c                z   	 t        j                  |       5 }|j                  \  }}|j                  ddt	        dt        |dz              t	        dt        |dz              f      }t        j                  |j                  d      dd      }d d d        t              S # 1 sw Y   xY w# t        $ r Y y	w xY w)
Nr   r   r  gp=
ף?Lrd  re  rf  r   )r   rj  sizecropr  r   rw  rx  convertr   r$  )ry  r{  rp  rq  r  r  s         r   _extract_image_header_textr  "  s    ZZ 	i!JJME6::q!SC,=%>As6TX=GY@Z[\D#33DLL4EI^ghI	i $I..		i 	i
  s)   B. A8B"B. "B+'B. .	B:9B:c                D    |dk(  rt        |       S |dk(  rt        |       S y)Npdfr{  r   )r|  r  )ry  kinds     r   _extract_visual_header_textr  -  s)    u}'--w)$//r   c                J   g }t        |       j                         D ]  }|j                         }|s|j                         }|dv r+|j	                  d      r=|j	                  d      r'd|v r#|j                  dd      d   j                         }t        j                  dd|      }t        j                  dd|t        j                  	      }t        j                  d
d|      j                  d      }|s|j                  |        t        dj                  |            S )N>   ocr ricostruito per card:ocr strutturato con coordinate:zcard x=zrow y=:r   z\[x=\d+\s+[A-Z]+\]\s*r   z^(?:TITLE|DETAIL):\s*)flagsr  r   z |r[  )r   r  r   r   r  r  r   r  r.  r   r  )r   cleaned_linesr\  r   r   s        r   +_sanitize_extracted_text_for_fiscal_parsingr  5  s    !M(/::< '~~]]_
YY  +  *sd{::c1%a(..0Dvv.D9vv.DNvvid+11$7  &'   		- 899r   c                (    t        |       }|sy |d   S )Nr   )r   )r   r   s     r   _extract_amount_from_liner  J  s    (.G2;r   c           
       
 |D cg c]&  }t        j                  |t         j                        ( }}t        t	        |       dz
  dd      D ]  }| |   
t        
fd|D              sg }t        |t        |dz   t	        |                   D ][  }| |   }|j                  t        |             t        j                  d|      D ]!  }t        |      }	|	|j                  |	       # ] |st        |      c S  y c c}w )Nr   r   c              3  @   K   | ]  }|j                          y wr   )r   )r   r   r   s     r   r   z-_extract_amount_near_label.<locals>.<genexpr>U  s     GG7>>$'Gr     z6(?<!\d)(\d{1,3}(?:\.\d{3})*,\d{1,2}|\d+,\d{1,2})(?!\d))r   compiler.  r  r   r   r  r  r   r   r   r   r  )r  labelsr  compiled_labelsr  candidate_amountsr:  candidate_liner/  r   r   s             @r   _extract_amount_near_labelr  Q  s    EKLErzz%7LOLs5zA~r2. *U|GGG)+$UC
CJ,GH 	5O"?3N$$%?%OPZZ(acqr 5	+I6%%,,V45	5 ())*  Ms   +C=c                   t        |       }|j                         D cg c]#  }|j                         s|j                         % }}t        |d      }||S t        |ddd      }||S t        |d      }||S d}|D ]J  }t	        j
                  ||t        j                        }	|	s+t        |	j                  d            }
|
H|
c S  y c c}w )Nz\btotale\s+da\s+pagare\bz\btotale\s+documento\bz\btotale\s+fattura\bz\bimporto\s+totale\bz^totale\s*(?:\|\s*[0-9\.,]+)?$)u`   \b(?:totale(?:\s+documento|\s+fattura|\s+da\s+pagare)?|importo\s+totale)\s*[:€]?\s*([0-9\.,]+)u8   \b(?:totale\s+eur|totale\s+euro)\s*[:€]?\s*([0-9\.,]+)r   )	r   r  r   r  r   r   r.  r   r'  )r  r   r   r  	total_duetotal_documentplain_totalr  r   r   r   s              r   _extract_total_amountr  d  s    %d+J&0&;&;&=NdTZZ\NEN*52MNI/!	N !,U4UVKH  		':r}}=#EKKN3M = Os
   CCc                L   t        |      j                  j                         }t        |        d| j                         t	        fddD              }t	        fddD              }t        j                  d      d uxs> t        j                  d|      d uxs$ t        j                  d      d uxs
 d	v xs d
v }t        j                  dd      }t        j                  d|      ryt        j                  d|      r|rdS dS |ry|r|ry|r|sy|r|sy|ry|ryy)Nr[  c              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   z*_classify_document_type.<locals>.<genexpr>  s       	r   )fattura accompagnatoriazfattura accompzfatt. accompfattura immediatazfattura immedzfatt. immedz	fatt. immzfattura differita immediatazfattura proformazfattura pro formaproformac              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   z*_classify_document_type.<locals>.<genexpr>  s     ~eez)~r   )r  r  r3  r]   z5\b(?:documento di trasporto|d\.?\s*d\.?\s*t\.?|ddt)\bz	\bbolla\bz7\bbolla\s+(?:di\s+consegna|accompagnatoria|merce|ddt)\bzconsegna immzdata uscita merciz[\s|:]+r   z5\btipo documento\s+(?:d\.?\s*d\.?\s*t\.?|ddt|bolla)\br^   z\btipo documento\s+fattura\br_   r]   unknown)r   r  r   r   r   r   r   r  )r  r7  filename_normalizedhas_instant_invoicehas_invoicehas_deliveryr  r   s          @r   r#  r#    sF   x.--668(./r2E1FGPPRJ 
   ~7}~~K
		JJW_cc 	-99\#67tC	-99OQ[\dhh	- Z'	- *,  ffZj1G	yyI7S	yy0':$7 FYF <Kr   c                v   dddddj                  | d      }|g}|r|j                  d|        |r|j                  d|        |r|j                  d	|        |K|d
j                  dd      j                  dd      j                  dd      }|j                  d| d|        dj                  |      S )NFatturazFattura immediataz	Bolla/DDTz!Documento fiscale da classificare)r]   r_   r^   r  Documento fiscalezn. zdel z
emittente z,.2fr   r   r   ztotale r   r  )r  r   r   r  )	r  r  r  rc  r  currency
type_labelre  rendereds	            r   _build_summaryr    s     .$6	
 
c-,-  LEs?+,-tM?+,z-12"4(11#s;CCCMUUVY[^_wxj(45::er   c                   t        | xs d      }t        j                  dd|      }t        j                  dd|      j                  d      }|d d j                  d      xs |S )Nr   z[\\/:*?\"<>|]+r   r  z ._-Z   )r   r   r  r   )r   fallbackr?  s      r   _sanitize_fiscal_filename_partr    s\    "5;B/Gff&W5GffYW-33F;GCRLv&2(3r   r  c                   t        |       }|rt        |      r|S |rt        |      }|rt        |      r|S t        j                  t        j
                        j                         j                         S r   )r   r   r   r   r   r  r   r   )r   r  r   fallback_parseds       r   _safe_fiscal_document_dater    s_    '.F4V<4X>A/R""<<%**,6688r   c                T    t        | xs d      j                         }|dv ry|dk(  ryy)Nr   r  r  r^   Bollar  )r   r   )r  r   s     r   $_fiscal_document_type_filename_labelr    s4    %m&9r:CCEJ33_$r   )fallback_datec                    t        |       }t        |d      }t        ||      }t        t	        |xs dd            j
                  j                         }| d| d| |xs d }	t	        |	| d| |xs d       S )NFornitore sconosciutor  r   documento-fiscaler   .pdf)r  r  r  r   r   suffixlower)
r  rc  r  original_namer  r  r  	safe_dater  r7  s
             r   "build_fiscal_document_display_namer    s     1?E-mF]^H*==QI&}':EXYZaaggiF(1YK0@&/ABHeWAi[IYSYHZ3[\\r   c           	         t        | j                  | j                  | j                  | j                  xs | j
                  | j                  xs dd d       S )Nr   r  r  rc  r  r  r  )r  r  rc  r  r  rD  
created_at)records    r   '_preferred_fiscal_document_display_namer    sS    -********Af.A.A((.B4 r   c                    t        |       }| j                  |k(  r| S t               j                  | j                  | j
                  |      S )N)rD  )r  rD  r   r_  rB  rC  )r  target_display_names     r   #ensure_fiscal_document_display_namer    sO    A&I1144		( 5  r   c                    t        |      d d }d| }t        | xs d      j                         }t        |d      }|dk(  r| d| S |dk(  r| d	| S |d
k(  r| d| S |S )Nrc   zDocumenti fiscali r   r  r  r_   z/Fatture Immediate/r]   z	/Fatture/r^   z/Bolle/)r  r   r   r  )r  r  rc  r   rootnormalized_typesupplier_folders          r   _drive_fiscal_folder_namer    s    
 &m4Ra8Dv&D*=+>B?HHJO4]MdeO++*?*;<<)#y 122/)w/00Kr   r  c                 K   |j                   r%|j                  r|j                   |j                  dS t        |      }	 t        |        d {   }|$	 t        |j                        j                         }|sy t               }	 t        j                  |j                        4 d {   }t        ||j                  |j                  |j                   |t#        |j$                  |j&                  |j(                               d {   }d d d       d {    t+               j-                  |j.                  |j0                  |j                  j3                  d      |j3                  d      t5        j6                  t8        j:                        j=                                |S 7 ^# t        $ r Y y w xY w# t        $ r Y y w xY w7 "7 7 # 1 d {  7  sw Y   xY w# t        $ r Y y w xY ww)N)file_idweb_url)timeout)access_tokenr7  r   r  folder_referencer  r  )rD  drive_file_iddrive_web_urldrive_uploaded_at)r  r  r  r   r$  r   storage_path
read_bytesOSErrorr   httpxAsyncClient(google_workspace_request_timeout_secondsr   r  rD  r   r  r  r  rc  r   r_  rB  rC  r  r   r   r   r  r   )r  r  r  r  r&  clientuploadeds          r   upload_fiscal_document_to_driver  $  s      4 4++++
 	

 18FA'JJ
 	V001<<>I ~H$$X-^-^_ 	 	ci8'44,, **#!:((((((" H	 	  --		((ll9-ll9-",,x||4>>@ .  OM K   				 	 	 	  s   =G8 F/ F,F/ G8#F> 9G8$G) +G,G) /AGGGG) GG)  BG8,F/ /	F;8G8:F;;G8>	G
G8	G

G8G) GG) G&GG&"G) )	G52G84G55G8c                  t        |d       }|dv rN	 | j                         }|r;	 t        ||      }|+t        t        |j                  d      xs d            }|r|S t        | |      S # t        $ r d}Y Vw xY w# t        $ r d }Y Ww xY w)N>   r  r{  r   r  r   r  r   )	r   r  r  r   r$  r   r   r  r   )r  r  rD  r   r  document_ai_resultr  s          r   _extract_fiscal_document_textr  [  s    'd;I	$//1I *%F''&" "-05G5K5KF5S5YWY1Z[	$$"<66  	I	  *%)"*s"   A+ A< +A98A9<B
	B
c                  t        |d       }d }d }d}|dv r[	 | j                         }|rH	 t        ||      }t        t        |xs i j                  d      xs d            }t        ||||      }|st        | |      }|t        |t              r|xs i j                  d      ni t        |t              r|xs i j                  d      dS i dS # t        $ r d}Y w xY w# t        $ r d }Y w xY w)	Nr   >   r  r{  r   r  r  )r  r   rD  r%  rR  )extracted_textocr_documentinvoice_document)r   r  r  r   r$  r   r   r  r)  r   r   r"  )r  r  rD  r   
ocr_resultinvoice_resultr  r  s           r   _build_google_first_contextr  s  s*   'd;I+/J/3NN	$//1I ">''
 2#z7GR6L6LV6T6ZXZ2[\ND##)'	N 0tD )>HUY>Z)r..z:`bFPQ_aeFf^1r66zB  mo +  	I	  "!
"s"   C C# C C #C10C1c          
        t               }t        | ||      }t        |j                  d      t              r|j                  d      ni }t        t        |j                  d      xs d            }t        ||j                        }t        |      }t        t        |t              rt        |      nd|j                        }	|xs t        | |      }
|xs |}t        t        |j                  d      t              r|j                  d      ni       }t        ||      }t        |j                  d      t              r|j                  d      nd }|dk(  rd}n|dk(  rd}nt        |xs |      }t        |	 d	| ||      }t        |j                  d
      t              r|j                  d
      nd }t        |      r|n|}t        |j                  d      t              r|j                  d      nd }t!        |      }|rt#        |      r|nt%        ||      }t'        |	 d	| d	|
       }|r|}nVt        |j                  d      t              r|j                  d      }n%t)        |      xs t+        |      xs t+        |
      }t-        |	 d	|       }|j                  d      t/        |d         nd }||n|}g }|t0        v r<t3        ||	|      }|st        |t              rt5        |      }|st7        |	xs |      }|D cg c]  }t        |t              st9        |        }}t;        |||||d      }||||||||	|d	S c c}w )Nr  rD  r  r  r   r  r  r_   r^   r[  r  r  rc  r  )r  r   EUR)r  r  r  rc  r  r  )	r  r  r  r  rc  r  summary_textr  parsed_items)r   r  r   r  r"  r   r   r   #menu_asset_extracted_text_max_charsr  r]  r  r  r#  rB  r0  r   r   r>  r,  rv  r^  r  r   r  r  r  r  r%  r  )r  r  rD  r&  google_contextr  r  cleaned_textparsing_textr  header_textr   invoice_fieldsclassified_document_typeinvoice_document_typer  extracted_document_numberinvoice_document_numberr  invoice_document_dateparsed_invoice_document_dater  known_supplier_namerc  extracted_total_amountinvoice_total_amountr  r  r  r  s                                 r   _analyze_fiscal_document_filer    s   ~H0DWcdN9CNDVDVWeDfhl9m>%%n5suL)#n.@.@AQ.R.XVX*YZN 1]1]^L>|LL 8B<QU8V&|4\^44L Q"=lD"QK.,K=2<^=O=OPb=cei2j-.prN  7{LQCMnN`N`apNqsvCwN..?  ~B#44)	!_	4'1M5MN 8L>K=9Y[hjv wGQR`RdRdevRwy|G}n001BC  DH ''>? 	 & 
 DNnN`N`apNqsvCwN..?  ~B#=>S#T  (,NOk,l 	%#K> 
 AL>QST_S``bcnboApq+	N&&7	=&**?; 5\B 3%k23%k2 	
 3l^2k]3ST n-9 	n^,- 
 .D-O)UiL,.L::E%#

 
< >I,WLA,B]R]^LDPkDT^_ceiTj1$7kLk!#'##!L '&*&&$$$$
 
 ls   M"Mc                  t               }|j                  | j                  |      }||S |j                  | j                        D ]  }|j                  rt        |j                        }|j                         r|j                         sF	 t        j                  |j                               j                         }||k7  r~|j                  | j                  |j                  |      c S  y # t        $ r Y w xY w)N	file_hash)r   get_fiscal_document_by_hashrB  list_fiscal_documentsr  r   r  existsis_filehashlibsha256r  	hexdigestr  r_  rC  )r  r  rp  direct_matchr/  r  candidate_hashs          r   %find_existing_fiscal_document_by_hashr    s    
 E44W5F5F	RL001B1BC b	I223""$L,@,@,B	$^^L,C,C,EFPPRN Y&++G,=,=y||W`+aab   		s   1C00	C<;C<c                   K   |j                          d {   }t        | |j                  xs d|j                  |      }t	        | ||       d {    t               j                  | j                  |j                        xs |S 7 s7 8w)Nr  )r7  content_typer  r  )	readingest_fiscal_document_bytesr7  r  r  r   rA  rB  rC  )r  uploadr  r  s       r   ingest_fiscal_documentr    s     kkm#I)7$7((	F *'6Y
OOO11'2C2CVYYOYSYY $ Ps!   BB
<BB7BBc               >	   t               }t               }|r#t        j                  |      j	                         nd }|rt        | |      }|t        |      S t        |d      }t        ||      }	t        ||	      }
|
dk(  rt        t        j                  d| d      |st        t        j                  | d      t        |      |j                  kD  r.t        t        j                   | d	|j                  d
z   d      dt#        j$                         j&                   }t)        |      j*                  j-                         xs	 |
dk(  rdnd}|j/                  | j0                        }|| | z  }|j3                  |       |j5                  || j0                  |||	|
t        |      |t7        |      dddd      }d}	 t9        ||
|      }t7        |d   xs d      }t7        |d         }t;        |d   t6              r|d   nd }t;        |d   t6              r|d   nd }t=        ||||t?        j@                  tB        jD                        jG                         jI                               }|jK                  | j0                  |||t;        |d   t6              r|d   nd |||d   tM        |d         nd dt7        |d   xs d      |t7        |d    xs d      d!d"d#      }|jO                  d$      }t;        |tP              r|jS                  | j0                  ||D cg c]  }t;        |tT              s| c}      }tW        | |jX                  |jZ                  |j\                  t_        |      %      }t;        |tT              ry|jO                  d&      d'k(  re|jK                  | j0                  |d()      }ta        | ||*       tc        |      r.te        | ||*       |jg                  | j0                  |      }||}ti        |      rd+d,l5m6}  || ||xs i        |S c c}w # tn        $ rc}tq        t7        |            xs d-}|jK                  | j0                  |ts        ||jt                        d.d/ts        |d0      dd1      cY d }~S d }~ww xY w)2Nr  r  r  otherzFormato non supportato per z. Carica PDF, immagini o testo.rJ  z: file vuoto.z: supera il limite di i   z MB.fdoc_r  r  z.txtr  
processingnot_started	to_review)rF  rB  r  rD  r   r  file_size_bytesr  r  r  r   rW  rX  r   r  r  r  r  rc  r  r  r  r  r  r  readypending)rD  r  r  r  rc  r  r  r  r  r  r   rW  rX  r  )rc  r  r  r7  r   r  rU  )rW  )rF  r!  r   )-send_fiscal_document_discrepancy_notificationz'Analisi documento fiscale non riuscita.zFDocumento fiscale caricato ma non ancora leggibile in modo affidabile.errori  )r  r  r   error_detailrW  rX  );r   r   r  r  r  r  r  r   r   r   r
   r   HTTP_415_UNSUPPORTED_MEDIA_TYPErZ  r   menu_asset_max_upload_bytes!HTTP_413_REQUEST_ENTITY_TOO_LARGEuuiduuid4hexr   r  r  fiscal_documents_directoryrB  write_bytescreate_fiscal_documentr   r  r   r  r   r   r   r  r   r   r_  r   r  r/  replace_fiscal_document_itemsr"  r  rc  r  r  r  rH  r)  rq  rA  r"  &app.services.push_notification_servicer!  r$  r   r   r  )r  r7  r  r  r&  rp  r  r@  rD  r   r  rF  r  storage_dirr  r  r  analysisanalyzed_document_typeanalyzed_document_dateanalyzed_supplier_namefiscal_display_nameupdatedr  r  stored_itemsr!  	refreshedr!  excrL  s                                  r   r  r    s    ~HE9By)335I8IV6x@@';NOL'lCIlI6Dw>>0>]^
 	

 (C(C|n\iLjkk
9~<<<@@"^#9(:^:^cn:o9pptu
 	

 $**,**+,K,&&,,.WTU]6PVF2273D3DEKK=!99LY'))##"!I&%! * F  NP
0DWcdX&67=2>!$Xo%>!?>HRaIbdg>h/!:nr>HRaIbdg>h/!:nr@000&",,x||499;EEG
 ..,0;EhO`Facf;gH%67mq00<D^<T<`x78fjXn5;<)Xn5;<%% / 
"  ||N3lD) >>!!".I$*T42HIL
 <%33%33%33ElSK +t,1Ji1W66%%$5 7 
 7 + +
 <KH?$/$/
 !& 9 9':K:K[ YI ,"+4[Ap=gwP[Pa_abC JD  
%c#h/\3\++(9e9efa&vs3)% , 	
 		

s9   E!P0 )P+?P+C'P0 +P0 0	R9ARRR)r   
str | Noner  r   )r   r9  r  r   )r   r   r  float | None)r   r9  r  r9  )r   r9  r   r   r  r9  )r   r   r  list[float])r   object | Noner  r:  )r   r   r  r;  )r  dict[str, object]r  !tuple[float | None, float | None])r  r=  r  r=  r   )r9  r9  r   r9  r  r   )r>  list[dict[str, object]]r  r?  )r   r9  r  r   )r   r   r  	list[str])re  r@  r  r@  )r   r9  r  ztuple[str | None, str])r   r9  r  r>  )r   r   r  r   )re  r@  r{  r   r  dict[str, object] | None)re  r@  r  r   )r  r   r  r?  )r  r   r  r   )r   r9  r  r:  )r   r   r  r@  )r  r=  r  r   )r0  r=  r1  r   r  r   )r<  r=  r  z!tuple[float, float, float, float])rR  r=  r  r?  )rR  r=  r  r   )r  r   r  r9  )rR  r=  r  r9  )rz  r@  r  r   )r   r9  r  ztuple[float | None, str | None])rz  r@  r{  r   r  rA  )r  r@  r  ztuple[list[float], str | None])r  r@  r  rA  )r  rA  r  rA  r  r=  )r  r@  r  r   )r  r@  r  zStuple[dict[str, object], dict[str, object] | None, dict[str, object] | None] | None)r  r@  r  z
int | None)r  r@  r{  r   r  rA  )r  r=  r  rA  r  r  )r  r=  r  rA  r  rA  r  r@  r{  r   r  rA  )r   r9  r  set[str])r  r   r  rB  )r   r   r  r   )r  rB  r   rB  r  r   )r
  r9  r  r9  r  r   )r   r<  r  r   )r
  r<  r  r<  r  r   )r  r9  r  r9  )r7  r?  r8  r=  r  r   )r   r:  r;  r   r  r   )rB  r=  r  zlist[tuple[str, float]])r   float | int | Noner  r:  )r
  rC  r  rC  r  r   )r   r<  r  r   )r   r<  r  r9  )rB  r=  r  r   )rB  r=  rc  r9  rd  r<  re  r<  rf  r   r  r   )rB  r=  r  r:  r   )
rB  r=  ro  r   re  r9  rp  r:  r  r>  )r  r   r  sqlite3.Connection)r  rD  r  r   r  rB  )r   r=  r  r:  )r   r=  r  ztuple[str | None, float | None])r  r   r  r9  r  r?  )
r  r   rc  r9  r  r9  r7  r?  r  r=  )r  r   rc  r9  r  r9  r  r   r7  r?  r  rA  )r>  zlist[object]r  r?  )r!  rA  r  r   )r  r   )r  rD  r  r  )r!  r=  r  	list[int])r  r   rF  r   r!  r=  r  r  )r  r   rF  r   r!  r=  r  r=  )r   r   r  rA  )r9  r9  r  r:  )r  r@  r  r;  )rz  r;  r  rE  )rz  r;  ry  r:  r  r   r  z/tuple[float | None, float | None, float | None])r   r   r  r   )r  r@  r  r?  )r   r   r  r9  r  r   )r  r@  r  r>  )r  r@  r  r:  )rc  r9  r  r   r   r   r  r?  )rR  r=  r  r=  )
r  bytesr   r   rD  r   r%  r   r  rA  )r  r   r7  r   r  r9  )r  r   r  r   r7  r   r  r9  )ry  r   r  r   )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   r7  r   r  r   )r  r   r  r9  r  r9  rc  r9  r  r:  r  r   r  r   )r   r9  r  r   r  r   )r   r9  r  r9  r  r   )r  r9  r  r   )r  r9  rc  r9  r  r9  r  r9  r  r9  r  r   )r  r   r  r   )r  r   r  r   r  )r  r9  r  r9  rc  r9  r  r   )r  r   r  r   r  zbytes | Noner  zdict[str, str] | None)r  r   r  r   rD  r   r  r   )r  r   r  r   rD  r   r  r=  )r  r   r  r   r  zFiscalDocumentRecord | None)r  r   r  r   r  r   )
r  r   r7  r   r  r9  r  rF  r  r   )
__future__r   r   r   difflibr   r  rt  pathlibr   r   r  
statisticsr   r  r'  zoneinfor	   ri  fastapir
   r   r   r  PILr   rw  app.core.configr   app.services.google_document_air   #app.services.google_workspace_driver   %app.services.google_workspace_sessionr   app.services.menu_asset_servicer   r   r   r   r   r   app.services.tenant_storer   r   r   r  r   r   ry  r.  rm  rX  _LACONI_STRUCTURED_UNIT_CODESr   r8  r  r	  r  r  rm  r.  r!  r7  r  r   	maketransr   r   r   r   r   r   r   r   r   r   r   r  r   r%  r(  r0  r<  r@  rK  rT  r[  r`  rc  rh  rk  rn  rq  rv  r  r  r  r  r  r  r  rs  r   r*  r5  rA  rY  r]  rq  rv  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r,  r/  r9  r=  rF  rI  rK  rO  rT  rV  rX  ra  rg  ri  r  r  r  r  r`  r  r  r  r  r  r  r  r"  r%  r)  r+  r  r8  rH  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>  rB  rn  r^  r|  r  r  r  r  r  r  r#  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   <module>rV     s
   " ' #  	  	       5 5    ( M K X  ^ ] 

CD"**RS$"**%OP "

#wy{  zG  zG  H N  \ ]+     6 &U " $ ) 	!  L!]#e 
 $g  K 2c2c2 	c2 	c	2
 	c2 	c2 	c2 	c2 	c2 	c2 	c2 	c2 	c2 	c2 	c2  	c!2" 	c#2$ 	c%2& 	c'2( 	c)2* 	c+2, 	c-2. 	c/20 	c122 	c324 	c526 	c728 	c92: 	c;2< 	c=2> 	c?2@ 	cA2B 	cC2D 	cE2F c24 nOj
+		8 QS 	$*0$f$	
-0
	!*V+J	)Up5$G?T GF](@xHvP61$0>B(0@0f k 6 0/d
"&  a04$(od$28(v// '/ *	/
 / / /d:(z=6@f
b"9`D,42
3)2I+!  AE 2.#4u
B	>> > '	>
 "> > 
>" "&#'	:%:%:% :% !	:%
 ':%zk @I
qww w 	wtgg g 	g
 ,g gT	  	
  , $,gh(2a
"" " #	"
 
"JGfGf Gf #	Gf
 GfTZ?zy(x( ),), ), #	),
 5),XL(^a(HQ(h'
._(D" 0.b#(L'' ' 	'
 'TJ,/AdB  	
  47t>B-`46:*& F,^   	
    	84 MQ 9 !%]] ] 	]
 ] ] 	]  !% $ $  		, #	44 4 	4
 4n70"JVr  !	4	ZG
G
 G
 	G

 G
 G
r   