U
    2j                     @   sd   d Z ddlZddlZddlZddlmZ dd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd ZdS )uN   Configuração de impressão por terminal (PC) — tabela terminal_impressora.    N)conectarc                 C   s6   t ddt| pd dd}|r2|dd S dS )z2Normaliza terminal_id recebido do bridge ou da UI.z[^A-Z0-9_-]  Nx   )resubstrupperreplace)terminal_ids r   7/var/www/html/LojaOnline/services/terminal_impressao.pynormalize_terminal_id	   s    "r   c                  C   s2   t  p
d } t pd }t|  d| S )zGGera terminal_id local: HOSTNAME-USUARIO (mesma regra do Print Bridge).HOSTUSER-)socketgethostnamestripgetpassgetuserr   )hostuserr   r   r   get_terminal_id   s    r   c              
   C   s   t |}|r| sg S d}d}zzz8t }|jdd}|dt| |f | pPg W W BS  tk
r } ztd|dd g  W Y W S d}~X Y nX W 5 |r|  |r|  X dS )z,Lista caminhos configurados para o terminal.NT)
dictionaryz
            SELECT impressora_id, TRIM(COALESCE(caminho_local, '')) AS caminho_local
            FROM terminal_impressora
            WHERE id_cliente = %s AND terminal_id = %s
            ORDER BY impressora_id
            z[TERMINAL IMP load ERRO]flush)	r   closer   cursorexecuteintfetchall	Exceptionprint
id_clienter   tidconncurer   r   r   load_terminal_config   s(    
	"r+   c              
   C   s   t |}|r| sdS d}d}ztz4t }| }|dt| |f | dk	W W @S  tk
r } ztd|dd W Y W dS d}~X Y nX W 5 |r|  |r|  X dS )z:True se existir ao menos um registro para terminal + loja.FNz
            SELECT 1 FROM terminal_impressora
            WHERE id_cliente = %s AND terminal_id = %s
            LIMIT 1
            z[TERMINAL IMP configured ERRO]Tr   )	r   r   r   r   r    r!   fetchoner#   r$   r%   r   r   r   terminal_is_configured4   s(    
 r-   c                    s   |sdS t tdd |D }|s&dS ddgt| }| d| dt|t|f  dd	 |  plg D  t fd
d|D S )NTc                 s   s"   | ]}t |d krt |V  qdS )r   Nr!   .0ir   r   r   	<genexpr>T   s      z+_impressoras_ids_validas.<locals>.<genexpr>z, z%sz9
        SELECT id FROM impressoras
        WHERE id IN (z@)
          AND (id_cliente = %s OR id_cliente IS NULL)
        c                 S   s   h | ]}t |d  qS )r   r.   )r0   rr   r   r   	<setcomp>`   s     z+_impressoras_ids_validas.<locals>.<setcomp>c                 3   s   | ]}| kV  qd S )Nr   r/   foundr   r   r2   a   s     )	sortedsetjoinlenr    tupler!   r"   all)r)   r&   Zimpressora_idsidsplaceholdersr   r5   r   _impressoras_ids_validasQ   s    r?   c              
   C   s  t |}|sdS | sdS i }|p"g D ]h}t|ts4q$zt|dpDd}W n ttfk
rf   Y q$Y nX |dkrrq$t|dpd ||< q$d}d}zzlt
 }| }|rt|| | sW W dS | D ]$\}}	|d	|t||	t| f q|  W W \d
S  tk
rX }
 z4|r&|  td|
dd dt|
f W Y W S d}
~
X Y nX W 5 |rl|	  |rz|	  X dS )zKSalva caminhos do terminal sem duplicar (UNIQUE + ON DUPLICATE KEY UPDATE).)Fu   terminal_id inválido.)Fu   Loja inválida.impressora_idr   caminho_localr   N)Fu$   Impressora inválida para esta loja.a  
                INSERT INTO terminal_impressora
                    (terminal_id, impressora_id, caminho_local, id_cliente)
                VALUES (%s, %s, %s, %s)
                ON DUPLICATE KEY UPDATE caminho_local = VALUES(caminho_local)
                )TNz[TERMINAL IMP save ERRO]Tr   F)r   
isinstancedictr!   get	TypeError
ValueErrorr   r   r   r   r   r?   keysitemsr    commitr#   rollbackr$   )r&   r   itensr'   Zmergedrawiidr(   r)   caminhor*   r   r   r   save_terminal_configd   sN    


	
*rO   c           
   
   C   s  t |}|r| sdS zt|pd}W n ttfk
r>   Y dS X |dkrLdS d}d}zzZt }| }|dt| ||f | }|r|d ndpd}t	|
 }|pdW W @S  tk
r }	 ztd|	dd W Y W dS d}	~	X Y nX W 5 | r|  |r|  X dS )zRetorna caminho_local ou None.Nr   z
            SELECT TRIM(COALESCE(caminho_local, '')) AS caminho_local
            FROM terminal_impressora
            WHERE id_cliente = %s AND terminal_id = %s AND impressora_id = %s
            LIMIT 1
            r   z$[TERMINAL IMP get_printer_path ERRO]Tr   )r   r!   rE   rF   r   r   r   r    r,   r   r   r#   r$   )
r&   r   r@   r'   rM   r(   r)   rowrN   r*   r   r   r   get_printer_path   s:    	 rQ   )__doc__r   r   r   databaser   r   r   r+   r-   r?   rO   rQ   r   r   r   r   <module>   s   4