
    {i"                     n   d dl mZmZ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e                    dd	g
          ed                         Ze                    ddg
          ed                         Ze                    ddg
          ed                         ZdS )    )	BlueprintrequestjsonifywrapsNinventory_itemsz/api/v1/items)
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     C/var/www/tmov.alphamb/tmov_inventario/app/routes/inventory_items.py	decoratedzrequire_auth.<locals>.decorated   s6     &	
 
 q$!&!!!    r   )r   r   s   ` r   require_authr      s4    
1XX" " " " X" r   z/searchGET)methodsc            	         	 t           j                            dt                    } t           j                            dd                                          }| r|st          ddd          dfS 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| ||d| df           |                                }|                                 |                                 t          d|t#          |          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)a  
    Ricerca items scansionati per barcode o nome (parziale).
    
    Query params:
        - sede_id: ID filiale (obbligatorio)
        - q: Query di ricerca - barcode o nome (obbligatorio)
    
    Returns:
        {
            "success": true,
            "data": [
                {
                    "item_id": 123,
                    "nome_prodotto": "...",
                    "barcode": "...",
                    "quantita_fisica": 5,
                    "id_sessione": 45,
                    "nome_sessione": "Inventario 23/01/2026",
                    "timestamp_scansione": "2026-01-23T10:30:00"
                }
            ]
        }
    sede_id)typeq Fzsede_id e q sono obbligatorisuccesserror  r   r   NDB_HOST	localhostDB_USERenigma_userDB_PASSWORD
arcana2026DB_NAMEenigmautf8mb4hostr   passworddatabasecharsetcursorclassa  
            SELECT 
              r.id as item_id,
              r.nome_prodotto,
              r.barcode,
              r.quantita_fisica,
              r.id_sessione,
              s.nome_sessione,
              s.timestamp_fine as timestamp_scansione
            FROM inv_risultati_inventario r
            JOIN inv_sessioni_inventario s ON r.id_sessione = s.id
            WHERE 
              r.id_sede = %s
              AND r.id_tenant = %s
              AND (
                r.barcode = %s 
                OR LOWER(r.nome_prodotto) LIKE LOWER(%s)
              )
            ORDER BY s.timestamp_fine DESC
            LIMIT 50
        %T)r"   datacount   zErrore search_items: exc_info  )r   r   getintstripr   r   pymysqlconnectosgetenvcursors
DictCursorcursorexecutefetchallcloselen	Exceptionloggerr#   str)r   queryr   r>   connrD   itemses           r   search_itemsrP   #   s   4:A,""93"77  b))//11 	e 	 7     
 L-	9k229m44Y}l;;Yy(332  
 
  	 ( y%U6)	8 	8 	8, !!

ZZ
 
   	 	  A A A0Q004@@@53q66::;;S@@@@@@@As%   A/F	 2DF	 	
G?GGGz/<int:item_id>PUTc           	      t   	 t          j                    }|                    d          }||dk     rt          ddd          dfS 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         }|                    d|| |f           |                                 |                                 |                                 t                               d|  d| 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)!uL  
    Modifica la quantità di un item scansionato.
    
    Body:
        {
            "quantita_fisica": 10
        }
    
    Returns:
        {
            "success": true,
            "data": {
                "item_id": 123,
                "quantita_fisica": 10,
                "old_quantity": 5
            }
        }
    quantita_fisicaNr   Fz quantita_fisica deve essere >= 0r!   r$   r   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   z{
            SELECT id, quantita_fisica FROM inv_risultati_inventario
            WHERE id = %s AND id_tenant = %s
        Item non trovato  z
            UPDATE inv_risultati_inventario
            SET quantita_fisica = %s
            WHERE id = %s AND id_tenant = %s
        Item z aggiornato: u    → T)item_idrS   old_quantityr"   r5   r7   zErrore update_item: r8   r:   )r   get_jsonr;   r   r   r>   r?   r@   rA   rB   rC   rD   rE   fetchonerG   commitrJ   inforI   r#   rK   )
rW   r5   nuova_quantitar   r>   rM   rD   itemquantita_vecchiarO   s
             r   update_itemra   ~   s   *@A!!"344!^a%7%7 ;     
 L-	9k229m44Y}l;;Yy(332  
 
  	  y!	# 	# 	#
    	LLNNNJJLLL +     
   12 	  gy1		3 	3 	3 	

YGYY2BYYYYZZZ"#1 0 
 
    	  A A A/A//$???53q66::;;S@@@@@@@As,   AG# DG# BG# #
H7-?H2,H72H7DELETEc           	         	 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         }|	                    d| |f           |                                 |                                 |                                 t                              d|  d| d           t          d| 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)a  
    Elimina completamente un item scansionato.
    
    Returns:
        {
            "success": true,
            "data": {
                "item_id": 123,
                "deleted": true,
                "nome_prodotto": "..."
            }
        }
    r   r   Nr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   zy
            SELECT id, nome_prodotto FROM inv_risultati_inventario
            WHERE id = %s AND id_tenant = %s
        FrT   r!   rU   nome_prodottozg
            DELETE FROM inv_risultati_inventario
            WHERE id = %s AND id_tenant = %s
        rV   z (z) eliminatoT)rW   deletedrd   rY   r7   zErrore delete_item: r8   r:   )r   r   r>   r?   r@   rA   rB   rC   rD   rE   r[   rG   r   r\   rJ   r]   rI   r#   rK   )rW   r   r>   rM   rD   r_   rd   rO   s           r   delete_itemrf      sC    6AL-	9k229m44Y}l;;Yy(332  
 
  	  y!	# 	# 	#
    	LLNNNJJLLL +     
 _- 	  y!	# 	# 	#
 	

AGAA}AAABBB"!. 
 
    	  A A A/A//$???53q66::;;S@@@@@@@As%   DF BF 
G0&?G+%G0+G0)flaskr   r   r   	functoolsr   loggingr@   	getLogger__name__rJ   items_bpr   routerP   ra   rf    r   r   <module>ro      sM   . - - - - - - - - -        						8	$	$9&_MMM  $ 
	E7++RA RA  ,+RAr 
 5'22SA SA  32SAt 
 8*55DA DA  65DA DA DAr   