U
    ԒFjz8                     @  s  d Z ddlmZ ddlmZmZ ddlmZ G dd deZ	dddd	d
Z
dNddddddZdOdddddZdddddZddddddZddddddZdddd d!d"ZdPddd#d$d%d&Zddd'dd(d)Zdddd*d+d,Zdddd-d.d/d0Zdddd-d1d2d3ZdQdddd#d1d4d5Zddd'dd6d7Zdddd*d8d9Zdddd-d:d;d<Zdddd-d=d>d?Zddddd-d@dAdBZddd'd dCdDZddd'd-dEdFdGZdddd-dHdIdJZddddKdLdMZdS )RuC   CRUD do catálogo retail (categoria, subcategoria, produto_retail).    )annotations)DecimalInvalidOperation)Anyc                   @  s   e Zd ZdZdS )RetailCatalogErroru=   Erro de validação ou regra de negócio do catálogo retail.N)__name__
__module____qualname____doc__ r   r   3/var/www/html/LojaOnline/services/retail_catalog.pyr      s   r   str)nomereturnc                 C  s0   | pd  } | stdt| dkr,td| S )N u   Nome é obrigatório.x   u(   Nome deve ter no máximo 120 caracteres.)stripr   len)r   r   r   r   _normalize_nome   s    r   Nz
int | None)fielddefaultr   c              
   C  sZ   | d ks| dkr|S z
t | W S  ttfk
rT } zt| d|W 5 d }~X Y nX d S Nr   u    inválido.)int	TypeError
ValueErrorr   )valuer   r   excr   r   r   
_parse_int   s    
r      r   )r   r   c                 C  s   | d ks| dkr|S t | tr*| r&dS dS t | ttfrLt| dkrHdS dS t|   }|dkrhdS |dkrtdS tdd S )Nr   r   r   )1truesimsyesy)0falseZnaou   nãonnou   Valor booleano inválido.)
isinstanceboolr   floatr   r   lowerr   )r   r   textr   r   r   _parse_bool   s    
r.   zDecimal | None)r   r   c              
   C  s^   | d ks| dkrd S zt t| W S  ttfk
rX } zt| d|W 5 d }~X Y nX d S r   )r   r   r   r   r   )r   r   r   r   r   r   _parse_decimal-   s    r/   dict)
id_clientecategoria_idr   c                 C  s(   |  d||f |  }|s$td|S )NzHSELECT id, nome FROM categoria WHERE id = %s AND id_cliente = %s LIMIT 1u   Categoria não encontrada.executefetchoner   )curr1   r2   rowr   r   r   _ensure_categoria_loja6   s    r8   )r1   subcategoria_idr   c                 C  s(   |  d||f |  }|s$td|S )Nz
        SELECT s.id, s.nome, s.categoria_id, c.nome AS categoria_nome
        FROM subcategoria s
        JOIN categoria c ON c.id = s.categoria_id AND c.id_cliente = s.id_cliente
        WHERE s.id = %s AND s.id_cliente = %s
        LIMIT 1
        u   Subcategoria não encontrada.r3   )r6   r1   r9   r7   r   r   r   _ensure_subcategoria_lojaA   s    
r:   )r1   
product_idr   c                 C  s(   |  d||f |  }|s$td|S )NzPSELECT chave, produto FROM produtos WHERE chave = %s AND id_cliente = %s LIMIT 1u   Produto não encontrado.r3   )r6   r1   r;   r7   r   r   r   _ensure_produto_lojaR   s    r<   z
list[dict])r1   ativor   c                 C  sL   d}|g}|d k	r(|d7 }| t| |d7 }| |t| |  pJg S )Nz
        SELECT id, nome, ordem_exibicao, ativo, created_at, updated_at
        FROM categoria
        WHERE id_cliente = %s
    z AND ativo = %sz ORDER BY ordem_exibicao, nomeappendr   r4   tuplefetchall)r6   r1   r=   sqlparamsr   r   r   listar_categorias]   s    rD   zdict | Nonec                 C  s   |  d||f |  S )Nz
        SELECT id, nome, ordem_exibicao, ativo, created_at, updated_at
        FROM categoria
        WHERE id = %s AND id_cliente = %s
        LIMIT 1
        r4   r5   )r6   r1   r2   r   r   r   obter_categorial   s
    	rF   )r1   dadosr   c                 C  sV   t |d}t|ddddp$d}t|ddd}| d||||f t| jS )	Nr   ordem_exibicao   Ordem de exibiçãor   r   r=   r   zq
        INSERT INTO categoria (id_cliente, nome, ordem_exibicao, ativo)
        VALUES (%s, %s, %s, %s)
        )r   getr   r.   r4   r   	lastrowid)r6   r1   rG   r   ordemr=   r   r   r   criar_categoriay   s    
rN   None)r1   r2   rG   r   c                 C  s^   t | || t|d}t|ddddp0d}t|ddd}| d|||||f d S )	Nr   rH   rI   r   rJ   r=   r   z
        UPDATE categoria
        SET nome = %s, ordem_exibicao = %s, ativo = %s
        WHERE id = %s AND id_cliente = %s
        )r8   r   rK   r   r.   r4   )r6   r1   r2   rG   r   rM   r=   r   r   r   editar_categoria   s    rP   )r1   r2   r=   r   c                 C  s&   t | || | dt|||f d S )NzAUPDATE categoria SET ativo = %s WHERE id = %s AND id_cliente = %s)r8   r4   r   )r6   r1   r2   r=   r   r   r   set_categoria_ativo   s
    rQ   c                 C  sj   d}|g}|d k	r(|d7 }| t| |d k	rF|d7 }| t| |d7 }| |t| |  phg S )Na  
        SELECT s.id, s.categoria_id, c.nome AS categoria_nome,
               s.nome, s.ordem_exibicao, s.ativo, s.created_at, s.updated_at
        FROM subcategoria s
        JOIN categoria c ON c.id = s.categoria_id AND c.id_cliente = s.id_cliente
        WHERE s.id_cliente = %s
    z AND s.categoria_id = %sz AND s.ativo = %sz< ORDER BY c.ordem_exibicao, c.nome, s.ordem_exibicao, s.nomer>   )r6   r1   r2   r=   rB   rC   r   r   r   listar_subcategorias   s    rR   c                 C  s   |  d||f |  S )NaA  
        SELECT s.id, s.categoria_id, c.nome AS categoria_nome,
               s.nome, s.ordem_exibicao, s.ativo, s.created_at, s.updated_at
        FROM subcategoria s
        JOIN categoria c ON c.id = s.categoria_id AND c.id_cliente = s.id_cliente
        WHERE s.id = %s AND s.id_cliente = %s
        LIMIT 1
        rE   )r6   r1   r9   r   r   r   obter_subcategoria   s
    rS   c                 C  s   t |dd}|stdt| || t|d}t |ddddpLd}t|d	d
d}| d|||||f t| jS )Nr2   	Categoria   Categoria é obrigatória.r   rH   rI   r   rJ   r=   r   z
        INSERT INTO subcategoria (id_cliente, categoria_id, nome, ordem_exibicao, ativo)
        VALUES (%s, %s, %s, %s, %s)
        )	r   rK   r   r8   r   r.   r4   r   rL   )r6   r1   rG   r2   r   rM   r=   r   r   r   criar_subcategoria   s    rV   )r1   r9   rG   r   c           	   	   C  s   t | ||}|d }|dd k	r2t|dd}|s>tdt| || t|d}t|ddddpnd}t|d	d
d}| d||||||f d S )Nr2   rT   rU   r   rH   rI   r   rJ   r=   r   z
        UPDATE subcategoria
        SET categoria_id = %s, nome = %s, ordem_exibicao = %s, ativo = %s
        WHERE id = %s AND id_cliente = %s
        )r:   rK   r   r   r8   r   r.   r4   )	r6   r1   r9   rG   Zatualr2   r   rM   r=   r   r   r   editar_subcategoria   s    rW   )r1   r9   r=   r   c                 C  s&   t | || | dt|||f d S )NzDUPDATE subcategoria SET ativo = %s WHERE id = %s AND id_cliente = %s)r:   r4   r   )r6   r1   r9   r=   r   r   r   set_subcategoria_ativo   s
    rX   )r1   r;   category_idsubcategory_idr   c                 C  s   t | || |dkr"t|dd dnd }|dkr<t|dd dnd }|rP|sPtd|r`t| || |rt| ||}t|d t|krtd| d||||f d S )	NNr   rT   rJ   ZSubcategoriaz1Informe a categoria ao vincular uma subcategoria.r2   u4   Subcategoria não pertence à categoria selecionada.z
        UPDATE produtos
        SET category_id = %s, subcategory_id = %s
        WHERE chave = %s AND id_cliente = %s
        )r<   r   r   r8   r:   r   r4   )r6   r1   r;   rY   rZ   Zcat_idZsub_idsubr   r   r   sync_produto_categorias   s    
r]   c                 C  s   |  d||f |  S )Na0  
        SELECT id, product_id, nome_vitrine, descricao_vitrine,
               preco_varejo, preco_atacado, comissao, estoque,
               permite_venda_sem_estoque, destaque, ativo, ordem_exibicao
        FROM produto_retail
        WHERE product_id = %s AND id_cliente = %s
        LIMIT 1
        rE   )r6   r1   r;   r   r   r   get_produto_retail  s
    r^   )r1   r;   rG   r   c                 C  sB  |sd S t | || |dp d p(d }|dp6d p>d }t|dd}t|dd}t|dd	}|d
}	|	dkrtdnt|	d}
t|ddd}t|ddd}t|ddd}t|ddddpd}t| ||}|r| d||||||
||||||f n$| d||||||||
||||f d S )Nnome_vitriner   descricao_vitrinepreco_varejou   Preço varejopreco_atacadou   Preço atacadocomissaou	   Comissãoestoquer[   r%   ZEstoqueZpermite_venda_sem_estoquer   rJ   destaquer=   r   rH   rI   ac  
            UPDATE produto_retail
            SET nome_vitrine = %s, descricao_vitrine = %s,
                preco_varejo = %s, preco_atacado = %s, comissao = %s,
                estoque = %s, permite_venda_sem_estoque = %s,
                destaque = %s, ativo = %s, ordem_exibicao = %s
            WHERE product_id = %s AND id_cliente = %s
            aP  
            INSERT INTO produto_retail (
                id_cliente, product_id, nome_vitrine, descricao_vitrine,
                preco_varejo, preco_atacado, comissao, estoque,
                permite_venda_sem_estoque, destaque, ativo, ordem_exibicao
            ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            )	r<   rK   r   r/   r   r.   r   r^   r4   )r6   r1   r;   rG   r_   r`   ra   rb   rc   Zestoque_rawrd   Zpermitere   r=   rM   existingr   r   r   upsert_produto_retail%  s`    
	rg   )r1   r;   payloadr   c                 C  sZ   | d}| d}d|ks$d|kr4t| |||| | d}t|trVt| ||| dS )uF   Persiste category_id/subcategory_id e produto_retail num único passo.rY   rZ   retailN)rK   r]   r)   r0   rg   )r6   r1   r;   rh   rY   rZ   ri   r   r   r   apply_retail_produto_savej  s    



rj   )r1   produtor   c                 C  s   |s|S | d}| d||f |  p,i }| d|d< | d|d< | d|d< | d|d< t| ||}|pxi |d< |S )zDAnexa category_id, subcategory_id e bloco retail ao dict do produto.chavea  
        SELECT p.category_id, p.subcategory_id,
               c.nome AS categoria_nome, s.nome AS subcategoria_nome
        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
        WHERE p.chave = %s AND p.id_cliente = %s
        LIMIT 1
        rY   rZ   Zcategoria_nomeZsubcategoria_nomeri   )rK   r4   r5   r^   )r6   r1   rk   rl   r7   ri   r   r   r   enrich_produto_retailu  s    
	rm   )N)r   )N)NN) r
   
__future__r   decimalr   r   typingr   r   r   r   r   r.   r/   r8   r:   r<   rD   rF   rN   rP   rQ   rR   rS   rV   rW   rX   r]   r^   rg   rj   rm   r   r   r   r   <module>   s8   			  !E