
    {i                     2   d dl mZmZmZmZ d dlmZ d dlmZ d dlZd dl	Z	 ej
        e          Z eded          Zd Zd	 Ze                    d
dg          ed                         Ze                    ddg          ed                         ZdS )    )	Blueprintrequestjsonifyrender_templatewraps)datetimeNwarehouse_reportz/api/v1/warehouse)
url_prefixc                 <     t                      fd            }|S )zDecorator per autenticazionec                  6    dddddt           _         | i |S )N   zdemo@studium.itadmin)id	tenant_idemailrole)r   user)argskwargsfs     D/var/www/tmov.alphamb/tmov_inventario/app/routes/warehouse_report.py	decoratedzrequire_auth.<locals>.decorated   s6     &	
 
 q$!&!!!    r   )r   r   s   ` r   require_authr      s4    
1XX" " " " X" r   c                     ddl m}  t          j        dd          t          j        dd          t          j        dd          t          j        d	d
          d}t          j        d          }|st	          d           | ||          S )zFactory per InventoryServicer   )create_inventory_serviceDB_HOST	localhostDB_USERenigma_userDB_PASSWORD
arcana2026DB_NAMEenigma)hostr   passworddatabaseCASSANOVA_API_KEYz'CASSANOVA_API_KEY non trovata nel .env!)app.services.inventory_servicer   osgetenv
ValueError)r   	db_configapi_keys      r   get_servicer0   %   s    GGGGGG 	)[11	)]33Im\::Ii22	 I i+,,G DBCCC##Iw777r   z/report/sede/<int:sede_id>GET)methodsc                 F   	 t                      }t          j        d         }ddl}|                    t          j        dd          t          j        dd          t          j        dd	          t          j        d
d          d|j        j                  }|	                                }|
                    d| |f           |                                }|s<|                                 |                                 t          ddd          dfS |
                    d|| f           |                                d         }|
                    d|| f           g }d}	d}
|                                D ]Y}|                    |d         |d         |d         |d         |d         |d         d           |d         dk    r|	dz  }	T|
dz  }
Z|                                 |                                 t!          j                                        d          }t          d||||t'          |          |	|
d d!d"          d#fS # t(          $ rJ}t*                              d$| d%           t          dt/          |          d          d&fcY d}~S d}~ww xY w)'u  
    Report magazzino: confronta inventario scansionato vs giacenze magazzino.
    
    Mostra SOLO righe con differenza != 0.
    Confronta TUTTI i prodotti scansionati (indipendentemente da data/sessione)
    con le giacenze teoriche del magazzino per la filiale specificata.
    
    NOTA: Il barcode può essere sia EAN13/CODE39 che UUID.
    Il JOIN matcha su entrambi per catturare articoli scansionati con UUID.
    r   r   Nr   r   r    r!   r"   r#   r$   r%   utf8mb4)r&   r   r'   r(   charsetcursorclasszT
            SELECT id, nome FROM inv_sedi WHERE id = %s AND id_tenant = %s
        FzFiliale non trovata)successerrori  z
            SELECT COUNT(DISTINCT barcode) as total
            FROM inv_risultati_inventario
            WHERE id_tenant = %s AND id_sede = %s
        totala  
            SELECT
              r.barcode,
              r.nome_prodotto,
              SUM(r.quantita_fisica) as quantita_inventario,
              COALESCE(g.quantita, 0) as quantita_magazzino,
              (SUM(r.quantita_fisica) - COALESCE(g.quantita, 0)) as differenza,
              CASE WHEN (SUM(r.quantita_fisica) - COALESCE(g.quantita, 0)) > 0 THEN 'excess' ELSE 'deficit' END as status
            FROM inv_risultati_inventario r
            LEFT JOIN (
                SELECT id_prodotto, id_sede, id_tenant,
                    COALESCE(
                        MAX(CASE WHEN id_variante IS NULL THEN quantita END),
                        SUM(CASE WHEN id_variante IS NOT NULL THEN quantita ELSE 0 END)
                    ) as quantita
                FROM inv_giacenze
                GROUP BY id_prodotto, id_sede, id_tenant
            ) g ON r.codice_prodotto = g.id_prodotto
                AND g.id_sede = r.id_sede
                AND g.id_tenant = r.id_tenant
            WHERE r.id_tenant = %s
            AND r.id_sede = %s
            GROUP BY r.barcode, r.nome_prodotto, g.quantita
            HAVING (SUM(r.quantita_fisica) - COALESCE(g.quantita, 0)) != 0
            ORDER BY ABS(differenza) DESC
        nome_prodottobarcodequantita_magazzinoquantita_inventario
differenzastatus)r:   r;   giacenza_negoziogiacenza_inventarior>   r?   r   z%Y-%m-%dT)total_itemsitems_with_difftotal_excesstotal_deficit)sedereport_dateitemssummary)r7   data   zErrore report_magazzino_sede: )exc_infoi  )r0   r   r   pymysqlconnectr+   r,   cursors
DictCursorcursorexecutefetchonecloser   fetchallappendr	   nowstrftimelen	Exceptionloggerr8   str)sede_idservicer   rM   connrQ   rF   rB   report_itemsrD   rE   itemrG   es                 r   report_magazzino_sederc   ;   s:   n--L-	9k229m44Y}l;;Yy(332  
 
  	 y!	# 	# 	#    	LLNNNJJLLL .      	  !		# 	# 	#
 oo''0 	 2 !3	# 	# 	#6 OO%% 	# 	#D!%o!6	?$()=$>'+,A'B"<0x.! !    L!A%%!"

lnn--j99*%#.'*<'8'8$0%2	 	
 

 
    	    9a99DIIIVV
 
    	 	 	 	 	 	s%   DI D6I 
J ?JJ J z/magazzino/<int:sede_id>c                      t          d          S )z)Serve la pagina HTML del report magazzinozwarehouse_report_magazzino.html)r   )r]   s    r   warehouse_report_pagere      s     <===r   )flaskr   r   r   r   	functoolsr   r	   loggingr+   	getLogger__name__r[   warehouse_bpr   r0   routerc   re    r   r   <module>rn      s1   ? > > > > > > > > > > >              						8	$	$y+XBUVVV  8 8 8, 05'BBy y  CByx .@@> >  A@> > >r   