U
    Bj00                  
   @  s@  d Z ddlmZ ddlZddlmZ ddlmZ ddl	m
Z
 dZdZG d	d
 d
eZdddddZddddZddddZdddddZddddZdddddZddddd d!d"Zdddd#d$Zdddd%d&Zdddd'd(Zdd)d)d)d*d+dddddddd,d-d.d/Zddd,d0d1d2Zd3dd4d5ZdS )6z?Provisionamento de novos tenants (lojas) no banco multi-tenant.    )annotationsN)conectar)hash_passwordinsert_usuario_row))ZDinheiroS)ZPIXN)u   Cartão débitor   )u   Cartão créditor   )
)g      @      @)r	          @)r
         $@)r         (@)r         .@)r         2@)r         4@)r         9@)r         >@)r   g     A@c                      s&   e Zd Zdddd fddZ  ZS )TenantProvisionError  strint)messagestatusc                   s   t  | || _|| _d S N)super__init__r   r   )selfr   r   	__class__ 5/var/www/html/LojaOnline/services/tenant_provision.pyr       s    zTenantProvisionError.__init__)r   )__name__
__module____qualname__r   __classcell__r   r   r   r   r      s   r   r   zset[str])tablereturnc                 C  st   |  d|  |  pg }t }|D ]>}t|trN|t|dpFd q&|r&|t|d  q&dd |D S )NzSHOW COLUMNS FROM Field r   c                 S  s   h | ]}|r|qS r   r   .0cr   r   r   	<setcomp>/   s      z!_table_columns.<locals>.<setcomp>)executefetchallset
isinstancedictaddr   get)curr$   rowsoutrr   r   r   _table_columns&   s    
r7   r   )r%   c                 C  sJ   |  d |  pi }t|tr*|dn|r6|d nd}t|pBdd S )Nz
        SELECT COALESCE(MAX(id_cliente), 0) AS m FROM (
            SELECT id_cliente FROM usuarios WHERE id_cliente IS NOT NULL
            UNION ALL
            SELECT id_cliente FROM dadosloja WHERE id_cliente IS NOT NULL
        ) AS t
        mr      )r,   fetchoner/   r0   r2   r   )r3   rowr8   r   r   r   _next_id_cliente2   s    	$r<   c                  C  sF   d} d}zt } | jdd}t|W S |r4|   | r@|    X dS )u'   Próximo id_cliente sugerido (MAX + 1).NT
dictionary)closer   cursorr<   )connr3   r   r   r   suggested_next_id_clienteA   s    rB   bool)
id_clienter%   c                 C  s   |  d||f |  d k	S )Nz
        SELECT 1 FROM (
            SELECT id_cliente FROM dadosloja WHERE id_cliente = %s
            UNION ALL
            SELECT id_cliente FROM usuarios WHERE id_cliente = %s
        ) AS t
        LIMIT 1
        r,   r:   )r3   rD   r   r   r   _id_cliente_existsP   s
    rF   c              	   C  s   |d kst | dkr t| S zt|}W n  ttfk
rL   tdY nX |dkr^tdt| |r|td| ddd|S )	Nr'   u0   id_cliente deve ser um número inteiro positivo.r   z#id_cliente deve ser maior que zero.zid_cliente u    já está em uso.  r   )r   stripr<   r   	TypeError
ValueErrorr   rF   )r3   Zid_cliente_rawrD   r   r   r   _resolve_id_cliente_   s    

rL   )usuarior%   c                 C  s   |  d|f |  d k	S )Nz1SELECT 1 FROM usuarios WHERE usuario = %s LIMIT 1rE   )r3   rM   r   r   r   _usuario_login_existsp   s    rN   None)rM   
senha_hashrD   r%   c                 C  s   t | |||ddd d S )Ngerenter9   )funcaoativor   )r3   rM   rP   rD   r   r   r   _insert_usuariou   s    rT   c                 C  sP   |  d |  d k	}tD ]0\}}|r:|  d|||f q|  d||f qd S )Nz-SHOW COLUMNS FROM formapagamento LIKE 'troco'zIINSERT INTO formapagamento (forma, troco, id_cliente) VALUES (%s, %s, %s)z>INSERT INTO formapagamento (forma, id_cliente) VALUES (%s, %s))r,   r:   DEFAULT_FORMAS_PAGAMENTO)r3   rD   Z	has_trocoformatrocor   r   r   _insert_formapagamentoy   s    
rX   c                   s   t | d |ddddd fddD }|s<td	d
dddgt| }d|}tfdd|D }| d| d| d| d S )Nconfiguracaod   r   Simr9   )rD   nromesaservicomesacalculodistanciaimp_comandadeliveryc                   s   g | ]}| kr|qS r   r   r(   )colsr   r   
<listcomp>   s      z(_insert_configuracao.<locals>.<listcomp>zBTabela configuracao sem colunas reconhecidas para provisionamento.  rH   , %sc                 3  s   | ]} | V  qd S r   r   r(   )datar   r   	<genexpr>   s     z'_insert_configuracao.<locals>.<genexpr>zINSERT INTO configuracao (
) VALUES ())r7   r   joinlentupler,   )r3   rD   Zinsert_colsplaceholderscol_listvalsr   )r`   re   r   _insert_configuracao   s(    

ro   c           	      C  s   ddg}d|g}t tddD ]8\}\}}|d| dd| dg |||g qdd	gt| }d|}| d
| d| dt| d S )NchaverD   r9   )startfaixa_d_vrc   rd   zINSERT INTO txentrega (rg   rh   )	enumerateDEFAULT_TXENTREGA_FAIXASextendri   rj   r,   rk   )	r3   rD   r`   rn   idvrl   rm   r   r   r   _insert_txentrega   s    
r{   r'   restaurante)rD   dddtelefonecidadetipo_negocior0   )nomerM   senhar}   r~   r   r   r%   c              
   C  sF  | pd  } |pd  }|pd}|p&d  }|p2d  }|p>d  }t|pLd   }|dkrhtd| sttd|stdt|dk rtdd	}d	}	zzt }|  |jd
d}	t	|	|rtd| dddt
|	|}t|}
t|	||
| |	d|| |||pd|f |	d|f t|	| t|	| t|	| |  d
||d|  d| ddW W S  tk
r   |r|   Y n tjjk
r } z&|r|  td| dd|W 5 d	}~X Y nF tk
r } z&|r|  td| dd|W 5 d	}~X Y nX W 5 |	r2|	  |r@|  X d	S )u{   
    Cria tenant completo com registros mínimos para operação.
    Retorna dict com id_cliente, usuario e mensagem.
    r'   r|   r|   varejo0tipo_negocio deve ser 'restaurante' ou 'varejo'.u   Nome fantasia é obrigatório.u!   Login do gerente é obrigatório.   z'Senha deve ter pelo menos 4 caracteres.NTr=   zLogin 'u   ' já está em uso.rG   rH   z
            INSERT INTO dadosloja (id_cliente, nome, endereco, bairro, cidade, cep, telefone, cnpj, latitude, longitude, ddd, tipo_negocio)
            VALUES (%s, %s, '', '', %s, '', %s, '', '', '', %s, %s)
            Z11z@INSERT INTO contadorpedido (contador, id_cliente) VALUES (0, %s)zLoja 'z!' criada com sucesso (id_cliente=z).)sucessorD   rM   mensagemErro no banco de dados: rb   zFalha ao provisionar loja: )rI   r   lowerr   rj   r?   r   start_transactionr@   rN   rL   r   rT   r,   ro   rX   r{   commitrollbackmysql	connectorError	Exception)r   rM   r   rD   r}   r~   r   r   rA   r3   rP   er   r   r   provision_tenant   sv    




$*r   )rD   r   r%   c              
   C  s^  zt | } W n$ ttfk
r0   tdddY nX | dkrFtdddt|pNd  }|dkrjtdd}d}zzXt }|	 }|
d	|| f |jdkrtd
dd|  d| |d| ddW W pS  tk
r   |r|   Y nJ tjjk
r6 } z&|r|  td| dd|W 5 d}~X Y nX W 5 |rJ|  |rX|  X dS )zCAtualiza tipo_negocio de uma loja existente (restaurante | varejo).u   ID cliente inválido.r   rH   r   r|   r   r   Nz<UPDATE dadosloja SET tipo_negocio = %s WHERE id_cliente = %su   Loja não encontrada.i  Tu"   Tipo de negócio atualizado para 'z'.)r   rD   r   r   r   rb   )r   rJ   rK   r   r   rI   r   r?   r   r@   r,   rowcountr   r   r   r   r   )rD   r   tiporA   r3   r   r   r   r   update_tenant_tipo_negocio  sL    

*r   z
list[dict]c                  C  sf  d} d}z8zt } | jdd}|d | p4g }g }|D ]}|d}|t|dp^d|dpld	|d
pxd	|dpd	|dpd	|dpd|dpd	|dkrdn
tt|d q>|W W tS  t	j
jk
r> } zJt|dddkr,|d | pg }dd |D  W Y W S  W 5 d}~X Y nX W 5 |rR|   | r`|    X dS )z6Lista lojas provisionadas com login gerente principal.NTr=   ah  
            SELECT
                d.id_cliente,
                d.nome,
                d.cidade,
                d.telefone,
                d.ddd,
                d.tipo_negocio,
                (
                    SELECT u.usuario
                    FROM usuarios u
                    WHERE u.id_cliente = d.id_cliente
                    ORDER BY
                        CASE WHEN LOWER(COALESCE(u.funcao, '')) = 'gerente' THEN 0 ELSE 1 END,
                        u.chave ASC
                    LIMIT 1
                ) AS usuario_gerente,
                (
                    SELECT u.ativo
                    FROM usuarios u
                    WHERE u.id_cliente = d.id_cliente
                    ORDER BY u.chave ASC
                    LIMIT 1
                ) AS ativo
            FROM dadosloja d
            ORDER BY d.id_cliente ASC
            rS   rD   r   r   r'   r   r~   r}   r   r|   usuario_gerente)rD   r   r   r~   r}   r   r   rS   errnoi  a  
                SELECT d.id_cliente, d.nome, d.cidade, d.telefone, d.ddd,
                    (SELECT u.usuario FROM usuarios u WHERE u.id_cliente = d.id_cliente LIMIT 1) AS usuario_gerente
                FROM dadosloja d
                ORDER BY d.id_cliente ASC
                c              
   S  s`   g | ]X}t |d pd|dp$d|dp0d|dp<d|dpHd|dpTddd	qS )
rD   r   r   r'   r   r~   r}   r   T)rD   r   r   r~   r}   r   rS   )r   r2   )r)   r6   r   r   r   ra   u  s   
z list_tenants.<locals>.<listcomp>)r?   r   r@   r,   r-   r2   appendr   rC   r   r   r   getattr)rA   r3   r4   r5   r6   	ativo_rawr   r   r   r   list_tenants5  sL    


r   )__doc__
__future__r   mysql.connectorr   databaser   services.passwordsr   services.usuarios_lojar   rU   rv   r   r   r7   r<   rB   rF   rL   rN   rT   rX   ro   r{   r   r   r   r   r   r   r   <module>   s4    [.