U
    ԒFj:                     @   sd  d Z ddlZddlmZmZmZmZmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZmZmZ ed	eZd
d Zdd Zejddgde
dd Zede
dd Zejddgde
dd Zejddgde
dd Zejddgde
dd Zejd dgde
d!d" Zejd#d$gde
d%d& Z ejd'd(gde
d)d* Z!dS )+z#Product catalog pages and JSON API.    N)	Blueprintjsonifyrender_templaterequestsession)login_required)conectar)	is_retail)obter_dados_loja)RetailCatalogErrorapply_retail_produto_saveenrich_produto_retailcatalogc                 C   sp   |  d|f |  }t|pi dp(d}|dk r8d}tdD ]*}|  d|f |  sb|  S |d7 }q@|S )uL   Próximo código sugerido: MAX(chave) da loja + 1, evitando colisão global.zNSELECT COALESCE(MAX(chave), 0) + 1 AS prox FROM produtos WHERE id_cliente = %sprox   i  /SELECT 1 FROM produtos WHERE chave = %s LIMIT 1)executefetchoneintgetrange)cursor
id_clienterowZ	candidato_ r   ./var/www/html/LojaOnline/blueprints/catalog.py_proximo_codigo_produto   s    
r   c                 C   sF   |  d |  }t|pi dp$d}|dk r4d}|  d|f d S )Nz8SELECT COALESCE(MAX(chave), 0) + 1 AS prox FROM produtosr   r   z(ALTER TABLE produtos AUTO_INCREMENT = %s)r   r   r   r   )r   r   r   r   r   r   $_sincronizar_auto_increment_produtos    s    
r   z/api/proximo-codigo-produtoGET)methodsc               
   C   s   d} d}zz:t } | jdd}td}t||}td|dW W PS  tjj	k
r } z(t
d| tddd	d
f W Y W S d}~X Y nX W 5 |r|   | r|    X dS )u8   Sugere o próximo código de produto para a loja logada.NT
dictionaryr   )sucessoZcodigo_sugerido
[DB ERROR]Fu"   Erro ao sugerir código do produtor#   erro  )closer   r   r   r   r   r   mysql	connectorErrorprint)connr   r   codigodb_errr   r   r   proximo_codigo_produto)   s    


0r0   z/cadastrar-produtoc                  C   s,   t d} t| }|dd}td| |dS )u   Página para cadastrar produtosr   nomez
Minha Lojazcadastrar_produto.html)r   nome_fantasia)r   r   r
   r   )r   
dados_lojar2   r   r   r   cadastrar_produto_view?   s    
r4   z/api/salvar-produtoPOSTc                  C   s`  d} d}z2z`tjpi }|dd }|dd}|dd  }|dd}|d	d
}|dd}|dd}	|dd}
|dd}|dd}|dpd pd}|d}|r|stddddfW W `S t } | jdd}t	d}d}|dk	rt
| dkrzt|}W n4 ttfk
r\   tddddf Y W W S X |d
k rtddddfW W S |d|f | rtdd| ddd fW W S |||||||	|
||||f}|dk	r|d!|f| |}t| n|d"| |j}t r*t|||| |   td#| d$| d%| d& tdd'| d(| d&d)W W S  tk
r } z0| r|   tdt
|ddf W Y W S d}~X Y n| tjjk
r8 } zXtd*| t|d+dd,krtdd-dd f W Y $W 2S tdd.dd/f W Y W S d}~X Y nX W 5 |rL|   | rZ|    X dS )0z+Salva um novo produto na tabela de produtosNproduto precor   classeporkiloNao
impressorar   cfop5102ncmdisplayvendaliberadaSim	descricaobarcodechaveF+   Classe e nome do produto são obrigatóriosr%     Tr!   r   u   Código do produto inválidou*   Código do produto deve ser maior que zeror   u   Código u    já está em usoi  z
                INSERT INTO produtos (chave, produto, preco, classe, porkilo, impressora, cfop, ncm, display, vendaliberada, descricao, barcode, id_cliente)
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            z
                INSERT INTO produtos (produto, preco, classe, porkilo, impressora, cfop, ncm, display, vendaliberada, descricao, barcode, id_cliente)
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            z[PRODUTO CADASTRADO]     (código: z
, classe: )	Produto 'u$   ' cadastrado com sucesso! (Código: r#   mensagemr$   errnoi&  u#   Código do produto já está em usoz(Erro ao salvar produto no banco de dadosr'   )r(   r   jsonr   stripupperr   r   r   r   strr   	TypeError
ValueErrorr   r   r   	lastrowidr	   r   commitr,   r   rollbackr)   r*   r+   getattr)r-   r   dadosr6   r8   r9   r:   r<   r=   r?   r@   rA   rC   rD   Zchave_informadar   Zchave_explicitavaloreschave_geradaerrr/   r   r   r   salvar_produtoI   s    


 




.
0r\   z/api/listar-produtosc               
   C   s   d} d}zz\t } | jdd}td}t r>|d|f n|d|f | }td|dW W PS  t	j
jk
r } z(td| td	d
ddf W Y W S d}~X Y nX W 5 |r|   | r|    X dS )z#Lista todos os produtos cadastradosNTr!   r   a&  
                SELECT p.chave, p.produto, p.preco, p.classe, p.porkilo, p.impressora, p.cfop, p.ncm,
                       p.display, p.vendaliberada, p.descricao, p.barcode,
                       p.category_id, p.subcategory_id,
                       c.nome AS categoria_nome, s.nome AS subcategoria_nome,
                       pr.estoque, pr.destaque, pr.ativo AS retail_ativo
                FROM produtos p
                LEFT JOIN categoria c ON c.id = p.category_id AND c.id_cliente = p.id_cliente
                LEFT JOIN subcategoria s ON s.id = p.subcategory_id AND s.id_cliente = p.id_cliente
                LEFT JOIN produto_retail pr ON pr.product_id = p.chave AND pr.id_cliente = p.id_cliente
                WHERE p.id_cliente = %s
                ORDER BY p.produto
                a  
                SELECT chave, produto, preco, classe, porkilo, impressora, cfop, ncm, 
                       display, vendaliberada, descricao, barcode
                FROM produtos
                WHERE id_cliente = %s
                ORDER BY produto
            )r#   produtosr$   FzErro ao listar produtosr%   r'   )r(   r   r   r   r   r	   r   fetchallr   r)   r*   r+   r,   )r-   r   r   r]   r/   r   r   r   listar_produtos   s0    

0r_   z/api/obter-produto/<int:chave>c              
   C   s   d}d}zzzt }|jdd}td}|d| |f | }|rjt rVt||| t	d|dW W lS t	ddd	d
fW W TS W nJ t
jjk
r } z(td| t	ddd	df W Y W S d}~X Y nX W 5 |r|   |r|   X dS )u&   Obtém dados de um produto específicoNTr!   r   z
            SELECT chave, produto, preco, classe, porkilo, impressora, cfop, ncm, 
                   display, vendaliberada, descricao, barcode
            FROM produtos
            WHERE chave = %s AND id_cliente = %s
        r#   r6   F   Produto não encontrador%     r$   zErro ao obter produtor'   )r(   r   r   r   r   r   r   r	   r   r   r)   r*   r+   r,   rE   r-   r   r   r6   r/   r   r   r   obter_produto   s.    


0rd   z/api/produto/codigo/<codigo>c              
   C   s,  d}d} zz| pd } | s6tddddfW W S t }|jdd}td	}|  rr|d
|| t	| f n|d|| f |
 }|rtd|dW W jS tddddfW W RS  tjjk
r } z(td| tddddf W Y W S d}~X Y nX W 5 |r|   |r&|   X dS )uA   Busca produto por código de barras ou chave interna (numérica).Nr7   Fu   Código inválidor%   rG   Tr!   r   z
                SELECT chave, produto AS nome, preco, classe, descricao, barcode
                FROM produtos
                WHERE id_cliente = %s AND (barcode = %s OR chave = %s)
                LIMIT 1
                z
                SELECT chave, produto AS nome, preco, classe, descricao, barcode
                FROM produtos
                WHERE id_cliente = %s AND barcode = %s
                LIMIT 1
                r`   ra   rb   r$   zErro ao buscar produtor'   )r(   rO   r   r   r   r   r   isdigitr   r   r   r)   r*   r+   r,   )r.   r-   r   r   r6   r/   r   r   r   obter_produto_por_codigo  s:    



0rf   z/api/editar-produto/<int:chave>PUTc                 C   sL  d}d}zz|tjpi }|dd }|dd}|dd  }|dd}|d	d
}|dd}	|dd}
|dd}|dd}|dd}|dpd pd}|r|stddddfW W VS t }|jdd}t	d}|
d||||||	|
||||| |f |jdkr<tddddfW W S t rRt||| | |  td| d|  d tdd | d!d"W W S  tk
r } z0|r|  tdt|ddf W Y W ^S d}~X Y nL tjjk
r$ } z(td#| tdd$dd%f W Y W S d}~X Y nX W 5 |r8|   |rF|   X dS )&zEdita um produto existenteNr6   r7   r8   r   r9   r:   r;   r<   r   r=   r>   r?   r@   rA   rB   rC   rD   FrF   r%   rG   Tr!   r   a#  
            UPDATE produtos 
            SET produto = %s, preco = %s, classe = %s, porkilo = %s, 
                impressora = %s, cfop = %s, ncm = %s, display = %s, 
                vendaliberada = %s, descricao = %s, barcode = %s
            WHERE chave = %s AND id_cliente = %s
        ra   rb   z[PRODUTO ATUALIZADO] rH   rI   rJ   z' atualizado com sucesso!rK   r$   zErro ao editar produtor'   )r(   r   rN   r   rO   rP   r   r   r   r   r   rowcountr	   r   rU   r,   r   rV   rQ   r)   r*   r+   )rE   r-   r   rX   r6   r8   r9   r:   r<   r=   r?   r@   rA   rC   rD   r   r[   r/   r   r   r   editar_produtoE  sn    

.
0ri   z /api/excluir-produto/<int:chave>DELETEc              
   C   s  d}d}zzt }|jdd}td}|d| |f | }|s\tdddd	fW W S |d
| |f |  t	d|d  d|  d tdd|d  ddW W PS  t
jjk
r } z(t	d| tddddf W Y W S d}~X Y nX W 5 |r
|   |r|   X dS )zExclui um produtoNTr!   r   zASELECT produto FROM produtos WHERE chave = %s AND id_cliente = %sFra   r%   rb   z9DELETE FROM produtos WHERE chave = %s AND id_cliente = %su   [PRODUTO EXCLUÍDO] r6   rH   rI   rJ   u   ' excluído com sucesso!rK   r$   zErro ao excluir produtor'   )r(   r   r   r   r   r   r   r   rU   r,   r)   r*   r+   rc   r   r   r   excluir_produto  s4    
 

0rk   )"__doc__mysql.connectorr)   flaskr   r   r   r   r   
decoratorsr   databaser   services.business_moder	   services.dados_lojar
   Zservices.retail_catalogr   r   r   __name__
catalog_bpr   r   router0   r4   r\   r_   rd   rf   ri   rk   r   r   r   r   <module>   sD   
	f5'2L