
    p&j10                        d Z ddlZddlmZ ddlmZ ddlmZmZ ddlm	Z	  ed      Z
dZd	Zd
Zd Zd ZdedefdZdefdZdededz  fdZdedefdZdededefdZdededz  fdZdedededededededededdfdZdefdZdedefd Zded!edefd"Zdedefd#Z G d$ d%e	      Z d&efd'Z!	 d2ded&ed(ed)edede"fd*Z#d3dedefd+Z$d,edefd-Z%d,edefd.Z&d/e d(edefd0Z'd,efd1Z(y)4uT   
auth.py - Gerenciamento de usuários, contas e config GHL via SQLite + Flask-Login
    N)datetime)Path)generate_password_hashcheck_password_hash)	UserMixinz,/opt/mia/workspace/prospeccao_ativa/users.dbzremoraes09@gmail.comz
Climb@2026zRenato Moraesc                  t    t        j                  t        t                    } t         j                  | _        | S N)sqlite3connectstrDB_PATHRowrow_factory)conns    +/opt/mia/workspace/prospeccao_ativa/auth.py	_get_connr      s%    ??3w<(D{{DK    c                     t               } | j                  d       | j                  d       	 | j                  d       | j                          | j                  d       | j                          dD ]$  }	 | j                  |       | j                          & | j                  d      }|j	                         d   dk(  rn| j                  dt
        t        t        t              t        j                         j                         f       | j                          t        d	t         d
       | j                          y # t        $ r Y w xY w# t        $ r Y w xY w)Nz
        CREATE TABLE IF NOT EXISTS contas (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            nome TEXT NOT NULL,
            criado_em TEXT NOT NULL
        )
    a  
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            nome TEXT NOT NULL,
            email TEXT UNIQUE NOT NULL,
            password_hash TEXT NOT NULL,
            plano TEXT NOT NULL DEFAULT 'beta',
            conta_id INTEGER REFERENCES contas(id) ON DELETE SET NULL,
            ativo INTEGER NOT NULL DEFAULT 1,
            criado_em TEXT NOT NULL,
            ultimo_acesso TEXT
        )
    zVALTER TABLE users ADD COLUMN conta_id INTEGER REFERENCES contas(id) ON DELETE SET NULLa  
        CREATE TABLE IF NOT EXISTS ghl_config (
            conta_id INTEGER PRIMARY KEY REFERENCES contas(id) ON DELETE CASCADE,
            crm_type TEXT NOT NULL DEFAULT 'ghl',
            token TEXT NOT NULL DEFAULT '',
            location_id TEXT NOT NULL DEFAULT '',
            pipeline_id TEXT NOT NULL DEFAULT '',
            stage_id TEXT NOT NULL DEFAULT '',
            location_name TEXT NOT NULL DEFAULT '',
            pipeline_name TEXT NOT NULL DEFAULT '',
            stage_name TEXT NOT NULL DEFAULT '',
            atualizado_em TEXT,
            leads_limite INTEGER NOT NULL DEFAULT 1000,
            leads_usados INTEGER NOT NULL DEFAULT 0,
            quota_reset_em TEXT
        )
    )zLALTER TABLE ghl_config ADD COLUMN leads_limite INTEGER NOT NULL DEFAULT 1000zIALTER TABLE ghl_config ADD COLUMN leads_usados INTEGER NOT NULL DEFAULT 0z5ALTER TABLE ghl_config ADD COLUMN quota_reset_em TEXTz6SELECT COUNT(*) FROM users WHERE plano = 'super_admin'r   z
            INSERT INTO users (nome, email, password_hash, plano, ativo, criado_em)
            VALUES (?, ?, ?, 'super_admin', 1, ?)
        z![auth] Seed: super_admin criado ())r   executecommit	ExceptionfetchoneSUPER_ADMIN_NOMESUPER_ADMIN_EMAILr   SUPER_ADMIN_SENHAr   now	isoformatprintclose)r   ddlcursors      r   init_dbr#      sC   ;D 	LL  	 	LL  	mn
 	LL  	" 	KKM 	
	LLKKM	 \\RSFq    1$%679Q9Q9SU	V
 	12C1DAFGJJL]  @  		s#   !D? 6!E?	E
E	EEnomereturnc                 J   t               }|j                  d| j                         t        j                         j                         f      }|j                          |j                  }|j                  d|f      j                         }|j                          t        |      S )Nz2INSERT INTO contas (nome, criado_em) VALUES (?, ?)!SELECT * FROM contas WHERE id = ?)r   r   stripr   r   r   r   	lastrowidr   r    dict)r$   r   curconta_idrows        r   criar_contar.   j   sz    ;D
,,<	x||~//12C 	KKM}}H
,,:XK
H
Q
Q
SCJJL9r   c                      t               } | j                  d      j                         }| j                          |D cg c]  }t	        |       c}S c c}w )Nz"SELECT * FROM contas ORDER BY nome)r   r   fetchallr    r*   )r   rowsrs      r   listar_contasr3   w   sB    ;D<<<=FFHDJJL!"DG"""s   Ar,   c                     t               }|j                  d| f      j                         }|j                          |rt	        |      S d S )Nr'   r   r   r   r    r*   r,   r   r-   s      r   	get_contar7   ~   s?    ;D
,,:XK
H
Q
Q
SCJJL49%%r   c                 ~    t               }|j                  d| f       |j                          |j                          y)NzDELETE FROM contas WHERE id = ?Tr   r   r   r    )r,   r   s     r   deletar_contar:      s/    ;DLL2XK@KKMJJLr   c                     t               }|j                  d|j                         | f       |j                          |j	                          y)Nz'UPDATE contas SET nome = ? WHERE id = ?T)r   r   r(   r   r    )r,   r$   r   s      r   renomear_contar<      s8    ;DLL:TZZ\8<TUKKMJJLr   c                     t               }|j                  d| f      j                         }|j                          |r|d   sy t	        |      S )Nz+SELECT * FROM ghl_config WHERE conta_id = ?tokenr5   r6   s      r   get_ghl_configr?      sD    ;D
,,Dxk
R
[
[
]CJJLc'l9r   crm_typer>   location_idpipeline_idstage_idlocation_namepipeline_name
stage_namec	                     t               }	|	j                  d| ||||||||t        j                         j	                         f
       |	j                          |	j                          y )Nav  
        INSERT INTO ghl_config (conta_id, crm_type, token, location_id, pipeline_id, stage_id,
                                location_name, pipeline_name, stage_name, atualizado_em)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        ON CONFLICT(conta_id) DO UPDATE SET
            crm_type=excluded.crm_type, token=excluded.token,
            location_id=excluded.location_id, pipeline_id=excluded.pipeline_id,
            stage_id=excluded.stage_id, location_name=excluded.location_name,
            pipeline_name=excluded.pipeline_name, stage_name=excluded.stage_name,
            atualizado_em=excluded.atualizado_em
    )r   r   r   r   r   r   r    )
r,   r@   r>   rA   rB   rC   rD   rE   rF   r   s
             r   save_ghl_configrH      s^     ;DLL 
 He[+x

HLLN4L4L4N
PQ 	KKMJJLr   c                     | j                  d|f      j                         }|sE| j                  d|t        j                         j	                         f       | j                          yy)zPGarante que existe uma linha em ghl_config para a conta (com defaults de quota).z2SELECT conta_id FROM ghl_config WHERE conta_id = ?z
            INSERT INTO ghl_config (conta_id, leads_limite, leads_usados, quota_reset_em)
            VALUES (?, 1000, 0, ?)
        N)r   r   r   r   r   r   )r   r,   r-   s      r   _garantir_linha_quotarJ      s`    
,,<xkhj    0023	5 	 r   c                    t               }t        ||        |j                  d| f      j                         }|j	                          |sdddddS t        |d   xs d      }t        |d   xs d      }||t        d||z
        |d   dS )	z<Retorna {limite, usados, disponivel, reset_em} para a conta.zTSELECT leads_limite, leads_usados, quota_reset_em FROM ghl_config WHERE conta_id = ?i  r   N)limiteusados
disponivelreset_emleads_limiteleads_usadosquota_reset_em)r   rJ   r   r   r    intmax)r,   r   r-   rL   rM   s        r   	get_quotarU      s    ;D$)
,,^	 hj  	JJL!4TRR^$)*F^$)*F!Vf_-()	 r   
quantidadec                     |dk  rt        |       S t               }t        ||        |j                  dt	        |      | f       |j                          |j                          t        |       S )z7Soma 'quantidade' ao contador de leads usados da conta.r   zHUPDATE ghl_config SET leads_usados = leads_usados + ? WHERE conta_id = ?)rU   r   rJ   r   rS   r   r    )r,   rV   r   s      r   incrementar_quotarX      s_    Q"";D$)LLR	Z(# 	KKMJJLXr   c                 L   t               }t        ||        |j                  d| f      j                         }t	        j
                         }d}|r|d   nd}|sd}nI	 t	        j                  |      }|j                  |j                  f|j                  |j                  fk7  rd}|rSt	        |j                  |j                  d      j                         }|j                  d|| f       |j                          |j                          t        |       S # t        $ r d}Y }w xY w)uF   Zera leads_usados se quota_reset_em estiver em mês anterior ao atual.z8SELECT quota_reset_em FROM ghl_config WHERE conta_id = ?FrR   NT   zMUPDATE ghl_config SET leads_usados = 0, quota_reset_em = ? WHERE conta_id = ?)r   rJ   r   r   r   r   fromisoformatyearmonthr   r   r   r    rU   )r,   r   r-   agoraprecisa_resetarreset_em_atualult
novo_resets           r   resetar_quota_se_novo_mesrc      s   ;D$)
,,BXKhj  LLNEO.1S)*tN	#((8C#))$U[[(AA"& ejj%++q9CCE
["	
 	JJLX  	#"O	#s   AD D#"D#c                   H    e Zd Zd Zed        Zed        Zed        Zd Z	y)Userc                     t        |d         | _        |d   | _        |d   | _        |d   | _        |d   | _        |d   | _        t        |d         | _        |d   | _	        |d	   | _
        y )
Nidr$   emailpassword_hashplanor,   ativo	criado_emultimo_acesso)r   rg   r$   rh   ri   rj   r,   boolrk   rl   rm   )selfr-   s     r   __init__zUser.__init__  ss    c$i.K	\
 1\
J#g,'
[) 1r   c                      | j                   dk(  S )Nsuper_adminrj   ro   s    r   is_super_adminzUser.is_super_admin  s    zz]**r   c                     | j                   dv S )N)rr   conta_adminrs   rt   s    r   is_conta_adminzUser.is_conta_admin  s    zz;;;r   c                     t               }|j                  d| f      j                         }|j                          |rt	        |      S d S )Nz SELECT * FROM users WHERE id = ?)r   r   r   r    re   )user_idr   r-   s      r   getzUser.get  s?    {ll=zJSSU

tCy)T)r   c                     | j                   S r	   )rk   rt   s    r   	is_activezUser.is_active%  s    zzr   N)
__name__
__module____qualname__rp   propertyru   rx   staticmethodr{   r}    r   r   re   re   
  sH    	2 + + < < * *r   re   rh   c                     t               }|j                  d| j                         j                         f      j	                         }|j                          |rt        |      S d S )Nz#SELECT * FROM users WHERE email = ?)r   r   r(   lowerr   r    re   )rh   r   r-   s      r   buscar_por_emailr   )  sO    ;D
,,<u{{}?R?R?T>V
W
`
`
bCJJL49%%r   senharj   c           
         |j                         j                         }t        |      ry| r|r|sy	 t               }|j	                  d| j                         |t        |      ||t        j                         j                         f       |j                          |j                          t        |      d fS # t        $ r}d t        |      fcY d }~S d }~ww xY w)N)Nu   E-mail já cadastrado.)Nu(   Nome, e-mail e senha são obrigatórios.z
            INSERT INTO users (nome, email, password_hash, plano, conta_id, ativo, criado_em)
            VALUES (?, ?, ?, ?, ?, 1, ?)
        )r(   r   r   r   r   r   r   r   r   r   r    r   r   )r$   rh   r   rj   r,   r   es          r   criar_usuarior   0  s    KKM!E-uE?{  jjlE#9%#@Xx||~779;	<
 	

&,, SV|s   BB9 9	CCCCc                     t               }| "|j                  d| f      j                         }n|j                  d      j                         }|j                          |D cg c]  }t	        |       c}S c c}w )Nz>SELECT * FROM users WHERE conta_id = ? ORDER BY criado_em DESCz+SELECT * FROM users ORDER BY criado_em DESC)r   r   r0   r    re   )r,   r   r1   r2   s       r   listar_usuariosr   E  si    ;D||Lxk

(* 	 ||IJSSUJJL!"DG"""s   "A7rz   c                 X   h d}|j                         D ci c]  \  }}||v s|| }}}|sydj                  d |D              }t        |j                               | gz   }t	               }|j                  d| d|       |j                          |j                          yc c}}w )N>   r$   rk   rh   rj   r,   rm   Fz, c              3   &   K   | ]	  }| d   yw)z = ?Nr   ).0ks     r   	<genexpr>z$atualizar_usuario.<locals>.<genexpr>V  s     7!aS:7s   zUPDATE users SET z WHERE id = ?T)itemsjoinlistvaluesr   r   r   r    )	rz   kwargscampos_permitidosr   vupdates
set_clauser   r   s	            r   atualizar_usuarior   Q  s    X &I1!7H2Hq!tIGI7w77J'.."#wi/F;DLL$ZL>GKKMJJL Js
   B&B&c                 ~    t               }|j                  d| f       |j                          |j                          y)NzDELETE FROM users WHERE id = ?Tr9   )rz   r   s     r   deletar_usuarior   _  s/    ;DLL1G:>KKMJJLr   userc                 .    t        | j                  |      S r	   )r   ri   )r   r   s     r   verificar_senhar   g  s    t11599r   c                 ^    t        | t        j                         j                                y )N)rm   )r   r   r   r   )rz   s    r   registrar_acessor   k  s    gX\\^-E-E-GHr   )betaNr	   ))__doc__r
   r   pathlibr   werkzeug.securityr   r   flask_loginr   r   r   r   r   r   r#   r   r*   r.   r   r3   rS   r7   rn   r:   r<   r?   rH   rJ   rU   rX   rc   re   r   tupler   r   r   r   r   r   r   r   r   <module>r      s      I !
=
>*   " Md
c 
d 
#t #& &t &C D S   S TD[ c S  3 !$03#&7:HKPT,
# 
  *     F9 >&C & 8< C  14@E*	#c 	#T 	#s  S T :$ :s :t :Ic Ir   