Ë
    Uþ}j”[  ã                   ó  — d Z ddlZddlZddl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ej                  j                  d«      xs#  ee«      j!                  «       j"                  dz  «      Zej                  j                  d	d
«      Zej                  j                  dd«      Zej                  j                  d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defd#„Z$d$ededz  fd%„Z%	 dGdedededededededed ed!ed&ed$edz  defd'„Z&d$edefd(„Z'dedefd)„Z(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 d0„ d1e«      Z.d2efd3„Z/	 dHded2ed4ed5edede0fd6„Z1dIdedefd7„Z2d8edefd9„Z3d8edefd:„Z4d;e.d4edefd<„Z5d8efd=„Z6d8edefd>„Z7defd?„Z8d8ed@eddfdA„Z9d8eddfdB„Z:dCefdD„Z;dJdedEedefdF„Z<y)KuT   
auth.py - Gerenciamento de usuÃ¡rios, contas e config GHL via SQLite + Flask-Login
é    N)Údatetime)ÚPath)Úgenerate_password_hashÚcheck_password_hash)Ú	UserMixinÚUSERS_DB_PATHzusers.dbÚSUPER_ADMIN_EMAILzremoraes09@gmail.comÚSUPER_ADMIN_SENHAÚ ÚSUPER_ADMIN_NOMEzRenato Moraesc                  ót   — t        j                  t        t        «      «      } t         j                  | _        | S ©N)Úsqlite3ÚconnectÚstrÚDB_PATHÚRowÚrow_factory)Úconns    ú3/opt/mia/workspace/prospeccao_ativa-staging/auth.pyÚ	_get_connr      s%   € Ü�?‰?œ3œw›<Ó(€DÜ—{‘{€DÔØ€Kó    c                  ó<  — t        «       } | j                  d«       | j                  d«       	 | j                  d«       | j                  «        dD ]$  }	 | j                  |«       | j                  «        Œ& | j                  d«       | j                  «        dD ]$  }	 | j                  |«       | j                  «        Œ& | j                  d«       | j                  «        	 | j                  d«       | j                  «        | j                  d	«       | j                  «        | j                  d
«      }|j	                  «       d   dk(  r€t
        ro| j                  dt        t        t        t
        «      t        j                  «       j                  «       f«       | j                  «        t        dt        › d�«       nt        d«       | j                  «        y # t        $ r Y �Œ›w xY w# t        $ r Y �Œ©w xY w# t        $ r Y �Œow 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 NULL)z+ALTER TABLE users ADD COLUMN api_token TEXTz1ALTER TABLE users ADD COLUMN api_allowed_ips TEXTaÈ  
        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 TEXTaÂ  
        CREATE TABLE IF NOT EXISTS crm_perfis (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            conta_id INTEGER NOT NULL REFERENCES contas(id) ON DELETE CASCADE,
            nome TEXT NOT NULL,
            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 '',
            connection_id TEXT NOT NULL DEFAULT '',
            criado_em TEXT NOT NULL
        )
    zHALTER TABLE crm_perfis ADD COLUMN connection_id TEXT NOT NULL DEFAULT ''a  
        CREATE TABLE IF NOT EXISTS jobs_historico (
            id TEXT PRIMARY KEY,
            conta_id INTEGER,
            user_id INTEGER,
            tipo TEXT DEFAULT 'prospeccao',
            nicho TEXT,
            cidade TEXT,
            limite INTEGER DEFAULT 0,
            status TEXT DEFAULT 'pendente',
            progresso INTEGER DEFAULT 0,
            total INTEGER DEFAULT 0,
            leads_enviados INTEGER DEFAULT 0,
            criado_em TEXT,
            concluido_em TEXT
        )
    z6SELECT 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 (ú)uK   [auth] AVISO: nenhum super_admin e SUPER_ADMIN_SENHA vazio â€” seed pulado.)r   ÚexecuteÚcommitÚ	ExceptionÚfetchoner
   r   r	   r   r   ÚnowÚ	isoformatÚprintÚclose)r   ÚddlÚcursors      r   Úinit_dbr%       s÷  € Ü‹;€Dð 	‡L�Lð ô 	ð 	‡L�Lð ô 	ðØ�‰ÐmÔnØ�‰Œð
ò ˆð	Ø�L‰L˜ÔØ�K‰K�Mðð 	‡L�Lð ô 	ð" 	‡K�K„Mðò 	ˆð
	Ø�L‰L˜ÔØ�K‰K�Mð	ð 	‡L�Lð ô 	ð" 	‡K�K„MðØ�‰Ð_Ô`Ø�‰Œð
 	‡L�Lð ô 	ð" 	‡K�K„Mð �\‰\ÐRÓS€FØ‡�Ó˜Ñ˜qÒ ÝØ�L‰Lð ô #Ô$5Ü(Ô):Ó;¼X¿\¹\»^×=UÑ=UÓ=WðYôZð
 �K‰KŒMÜÐ5Ô6GÐ5HÈÐJÕKäÐ_Ô`à‡J�J…LøôY ò Úðûô ò 	Úð	ûô@ ò 	Úð	ûô6 ò ÚðúsG   ®!G Á!G.Â!G>Ã$!H Ç	G+Ç*G+Ç.	G;Ç:G;Ç>	HÈ
HÈ	HÈHÚ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_contar0   °   sz   € Ü‹;€DØ
�,‰,Ø<Ø	�‰‹”x—|‘|“~×/Ñ/Ó1Ð2ó€Cð 	‡K�K„MØ�}‰}€HØ
�,‰,Ð:¸X¸KÓ
H×
QÑ
QÓ
S€CØ‡J�J„LÜ�‹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_contasr6   ½   sB   € Ü‹;€DØ�<‰<Ð<Ó=×FÑFÓH€DØ‡J�J„LØ!Ö"˜Œ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_contar:   Ä   s?   € Ü‹;€DØ
�,‰,Ð:¸X¸KÓ
H×
QÑ
QÓ
S€CØ‡J�J„LÙŒ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Ø‡L�LÐ2°X°KÔ@Ø‡K�K„MØ‡J�J„LØ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Ø‡L�LÐ:¸T¿Z¹Z»\È8Ð<TÔUØ‡K�K„MØ‡J�J„LØr   c                 óž   — t        «       }|j                  d| f«      j                  «       }|j                  «        |r|d   sy t	        |«      S )Nz+SELECT * FROM ghl_config WHERE conta_id = ?Útokenr8   r9   s      r   Úget_ghl_configrB   Ý   sD   € Ü‹;€DØ
�,‰,ÐDÀxÀkÓ
R×
[Ñ
[Ó
]€CØ‡J�J„LÙ�c˜'’lØÜ�‹9Ðr   Úcrm_typerA   Ú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.   rC   rA   rD   rE   rF   rG   rH   rI   r   s
             r   Úsave_ghl_configrK   æ   s^   € ô ‹;€DØ‡L�Lð 
ð �H˜e [°+¸xØ
˜¨
´H·L±L³N×4LÑ4LÓ4Nð
PôQð 	‡K�K„MØ‡J�J…Lr   c                 ó´   — t        «       }|j                  d| f«      j                  «       }|j                  «        |D �cg c]  }t	        |«      ‘Œ c}S c c}w )uH   Retorna todos os perfis de CRM de uma conta, ordem alfabÃ©tica por nome.zHSELECT * FROM crm_perfis WHERE conta_id = ? ORDER BY nome COLLATE NOCASEr2   ©r.   r   r4   r5   s       r   Úlistar_perfis_crmrN   ü   sN   € ä‹;€DØ�<‰<ØRØ	ˆó÷ �hƒjð 	ð 	‡J�J„LØ!Ö"˜ŒD��GÒ"Ð"ùÒ"s   Á AÚ	perfil_idc                 ó–   — t        «       }|j                  d| f«      j                  «       }|j                  «        |rt	        |«      S dS )z!Retorna um perfil de CRM pelo id.ú%SELECT * FROM crm_perfis WHERE id = ?Nr8   )rO   r   r/   s      r   Úget_perfil_crmrR     s?   € ä‹;€DØ
�,‰,Ð>ÀÀÓ
M×
VÑ
VÓ
X€CØ‡J�J„LÙŒ4�‹9Ð% Ð%r   Úconnection_idc                 óè  — t        «       }|r?|j                  d|j                  «       ||||||||	|
|| f«       |j                  «        |}nh|j                  d| |j                  «       ||||||||	|
t	        j
                  «       j                  «       f«      }|j                  «        |j                  }|j                  d|f«      j                  «       }|j                  «        |rt        |«      S i S )zKCria (perfil_id=None) ou atualiza um perfil de CRM. Retorna o perfil salvo.a&  
            UPDATE crm_perfis
               SET nome = ?, crm_type = ?, token = ?, location_id = ?,
                   pipeline_id = ?, stage_id = ?, location_name = ?,
                   pipeline_name = ?, stage_name = ?, connection_id = ?
             WHERE id = ? AND conta_id = ?
        á  
            INSERT INTO crm_perfis
                (conta_id, nome, crm_type, token, location_id, pipeline_id, stage_id,
                 location_name, pipeline_name, stage_name, connection_id, criado_em)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        rQ   )r   r   r*   r   r   r   r    r+   r   r"   r,   )r.   r&   rC   rA   rD   rE   rF   rG   rH   rI   rS   rO   r   Únew_idr-   r/   s                   r   Úsalvar_perfil_crmrW     sì   € ô
 ‹;€DÙØ�‰ð ð �j‰j‹l˜H e¨[¸+ÀxØ˜]¨J¸Ø˜ð#ô	$ð 	�‰ŒØ‰à�l‰lð ð
 ˜Ÿ
™
› h°°{ÀKÐQYØ˜]¨J¸Ü�l‰l‹n×&Ñ&Ó(ð*ó+ˆð 	�‰ŒØ—‘ˆØ
�,‰,Ð>ÀÀ	Ó
J×
SÑ
SÓ
U€CØ‡J�J„LÙŒ4�‹9Ð# Ð#r   c                 ó~   — t        «       }|j                  d| f«       |j                  «        |j                  «        y)u=   Deleta um perfil pelo id. Retorna True mesmo se nÃ£o existir.z#DELETE FROM crm_perfis WHERE id = ?Tr<   )rO   r   s     r   Údeletar_perfil_crmrY   1  s/   € ä‹;€DØ‡L�LÐ6¸¸ÔEØ‡K�K„MØ‡J�J„LØr   c                 óœ   — t        «       }|j                  d| f«      j                  «       }|j                  «        |rt	        |d   «      S dS )z3Retorna a quantidade de perfis de CRM de uma conta.ú7SELECT COUNT(*) as n FROM crm_perfis WHERE conta_id = ?Únr   )r   r   r   r"   Úintr9   s      r   Úcontar_perfis_crmr^   :  sH   € ä‹;€DØ
�,‰,ØAÀHÀ;óç�hƒjð ð 	‡J�J„LÙŒ3ˆs�3‰x‹=Ð& QÐ&r   c                  óh  — dddœ} t        «       }|j                  d«      j                  «       }d}|D ]Ü  }|d   }|j                  d|f«      j                  «       }|r	|d   dkD  rŒ4| j	                  |«      xs |d	   xs d
j                  «       xs d}|j                  d|||d   xs d|d   xs d
|d   xs d
|d   xs d
|d   xs d
|d	   xs d
|d   xs d
|d   xs d
d
t        j                  «       j                  «       f«       |dz  }ŒÞ |j                  «        |j                  «        |S )u  MigraÃ§Ã£o one-shot: para cada conta com ghl_config e sem perfis, cria um perfil.
    Nomes especiais: conta 1 -> "Smile", conta 3 -> "Climb Digital".
    Para outras contas usa location_name (ou "CRM Principal" se vazio).
    Idempotente: pula contas que jÃ¡ tÃªm ao menos um perfil.ÚSmilezClimb Digital)é   é   z*SELECT * FROM ghl_config WHERE token != ''r   r.   r[   r\   rG   r   zCRM PrincipalrU   rC   ÚghlrA   rD   rE   rF   rH   rI   ra   )r   r   r3   r   Úgetr*   r   r   r    r   r"   )Únomes_especiaisr   r4   ÚcriadosÚcfgr.   Ú
existentesr&   s           r   Úmigrar_ghl_config_para_perfisri   D  se  € ð
 " oÑ6€OÜ‹;€DØ�<‰<ÐDÓE×NÑNÓP€DØ€GØò ˆØ�z‘?ˆØ—\‘\ØEÈÀ{ó
ç
‰(‹*ð 	ñ ˜* S™/¨AÒ-ØØ×"Ñ" 8Ó,Òg°°_Ñ1EÒ1KÈ×0RÑ0RÓ0TÒgÐXgˆØ�‰ð ð �dØ�
‰OÒ$˜uØ�‰LÒ˜BØ�ÑÒ$ "Ø�ÑÒ$ "Ø�
‰OÒ!˜rØ�Ñ Ò& BØ�Ñ Ò& BØ�ÑÒ# ØÜ�L‰L‹N×$Ñ$Ó&ð
ô	ð$ 	�1‰‰ð5ð6 	‡K�K„MØ‡J�J„LØ€Nr   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_quotark   o  s`   € à
�,‰,Ø<¸x¸kóç�hƒjð ñ Ø�‰ð ð œŸ™›×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   rk   r   r   r"   r]   Úmax)r.   r   r/   rm   rn   s        r   Ú	get_quotaru   |  s¡   € ä‹;€DÜ˜$ Ô)Ø
�,‰,Ø^Ø	ˆó÷ �hƒjð ð 	‡J�J„LÙØ¨!¸4ÈTÑRÐRÜ��^Ñ$Ò)¨Ó*€FÜ��^Ñ$Ò)¨Ó*€FàØÜ˜!˜V f™_Ó-ØÐ(Ñ)ñ	ð 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   rk   r   r]   r   r"   )r.   rv   r   s      r   Úincrementar_quotarx   ‘  s_   € à�Q‚Ü˜Ó"Ð"Ü‹;€DÜ˜$ Ô)Ø‡L�LØRÜ	ˆZ‹˜(Ð#ôð 	‡K�K„MØ‡J�J„LÜ�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 = ?Frs   NTra   zMUPDATE ghl_config SET leads_usados = 0, quota_reset_em = ? WHERE conta_id = ?)r   rk   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_mesr‚      s  € ä‹;€DÜ˜$ Ô)Ø
�,‰,ØBÀXÀKóç�hƒjð ô �L‰L‹N€EØ€OÙ.1�SÐ)Ò*°t€NáØ‰ð	#Ü×(Ñ(¨Ó8ˆCØ—‘˜#Ÿ)™)Ð$¨¯©°U·[±[Ð(AÒAØ"&�ñ Ü˜eŸj™j¨%¯+©+°qÓ9×CÑCÓEˆ
Ø�‰Ø[Ø˜Ð"ô	
ð 	�‰ŒØ‡J�J„LÜ�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	   | _
        	 d
|j                  «       v r|d
   nd | _        	 d|j                  «       v r|d   | _        y d | _        y # t        $ r
 d | _        Y Œ8w xY w# t        $ r
 d | _        Y y w xY w)NÚidr&   ÚemailÚpassword_hashÚplanor.   ÚativoÚ	criado_emÚultimo_acessoÚ	api_tokenÚapi_allowed_ips)r   r†   r&   r‡   rˆ   r‰   r.   ÚboolrŠ   r‹   rŒ   Úkeysr�   r   rŽ   )Úselfr/   s     r   Ú__init__zUser.__init__Ä  sð   € Ü�c˜$‘i“.ˆŒØ˜‘KˆŒ	Ø˜‘\ˆŒ
Ø  Ñ1ˆÔØ˜‘\ˆŒ
Ø˜J™ˆŒÜ˜#˜g™,Ó'ˆŒ
Ø˜[Ñ)ˆŒØ  Ñ1ˆÔð	"Ø1<ÀÇÁÃ
Ñ1J˜S Ò-ÐPTˆDŒNð	(Ø=NÐRU×RZÑRZÓR\Ñ=\ 3Ð'8Ñ#9ˆDÕ ÐbfˆDÕ øô ò 	"Ø!ˆDŽNð	"ûô ò 	(Ø#'ˆDÖ ð	(ús*   Á.B2 ÂC Â*C Â2CÃCÃCÃCc                 ó    — | j                   dk(  S )NÚsuper_admin©r‰   ©r‘   s    r   Úis_super_adminzUser.is_super_adminØ  s   € à�z‰z˜]Ñ*Ð*r   c                 ó   — | j                   dv S )N)r”   Úconta_adminr•   r–   s    r   Úis_conta_adminzUser.is_conta_adminÜ  s   € à�z‰zÐ;Ð;Ð;r   c                 ó–   — t        «       }|j                  d| f«      j                  «       }|j                  «        |rt	        |«      S d S )Nz SELECT * FROM users WHERE id = ?)r   r   r   r"   r„   )Úuser_idr   r/   s      r   rd   zUser.getà  s?   € ä‹{ˆØ�l‰lÐ=À¸zÓJ×SÑSÓUˆØ�
‰
ŒÙŒt�C‹yÐ) TÐ)r   c                 ó   — | j                   S r   )rŠ   r–   s    r   Ú	is_activezUser.is_activeç  s   € Ø�z‰zÐr   N)
Ú__name__Ú
__module__Ú__qualname__r’   Úpropertyr—   rš   Ústaticmethodrd   rž   © r   r   r„   r„   Ã  sH   „ ò(ð( ñ+ó ð+ð ñ<ó ð<ð ñ*ó ð*ór   r„   r‡   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"   r„   )r‡   r   r/   s      r   Úbuscar_por_emailr§   ë  sO   € Ü‹;€DØ
�,‰,Ð<¸u¿{¹{»}×?RÑ?RÓ?TÐ>VÓ
W×
`Ñ
`Ó
b€CØ‡J�J„LÙŒ4�‹9Ð% Ð%r   Úsenhar‰   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&   r‡   r¨   r‰   r.   r   Úes          r   Úcriar_usuarior«   ò  sº   € à�K‰K‹M×ÑÓ!€EÜ˜ÔØ-Ù‘u¡EØ?ðÜ‹{ˆØ�‰ð ð �j‰j‹l˜EÔ#9¸%Ó#@Ø�XœxŸ|™|›~×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   r3   r"   r„   rM   s       r   Úlistar_usuariosr­     si   € Ü‹;€DØÐØ�|‰|ØLÈxÈkó
ç
‰(‹*ñ 	ð �|‰|ÐIÓJ×SÑSÓUˆØ‡J�J„LØ!Ö"˜ŒD��GÒ"Ð"ùÒ"s   Á"A7rœ   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&   rŠ   r‡   r‰   r.   rŒ   Fz, c              3   ó&   K  — | ]	  }|› d �–— Œ y­w)z = ?Nr¤   )Ú.0Úks     r   ú	<genexpr>z$atualizar_usuario.<locals>.<genexpr>  s   è ø€ Ò7¨!˜a˜S œ:Ñ7ùs   ‚zUPDATE users SET z WHERE id = ?T)ÚitemsÚjoinÚlistÚvaluesr   r   r   r"   )	rœ   ÚkwargsÚcampos_permitidosr±   ÚvÚupdatesÚ
set_clauser¶   r   s	            r   Úatualizar_usuarior¼     s�   € ÚXÐØ &§¡£×I™˜˜1°!Ð7HÒ2Hˆq�!‰tÐI€GÑIÙØØ—‘Ñ7¨wÔ7Ó7€JÜ�'—.‘.Ó"Ó# w iÑ/€FÜ‹;€DØ‡L�LÐ$ Z L°Ð>ÀÔGØ‡K�K„MØ‡J�J„LØùó Js
   ˜B&¥B&c                 ó~   — t        «       }|j                  d| f«       |j                  «        |j                  «        y)NzDELETE FROM users WHERE id = ?Tr<   ©rœ   r   s     r   Údeletar_usuarior¿   !  s/   € Ü‹;€DØ‡L�LÐ1°G°:Ô>Ø‡K�K„MØ‡J�J„LØr   Úuserc                 ó.   — t        | j                  |«      S r   )r   rˆ   )rÀ   r¨   s     r   Úverificar_senharÂ   )  s   € Ü˜t×1Ñ1°5Ó9Ð9r   c                 ó^   — t        | t        j                  «       j                  «       ¬«       y )N)rŒ   )r¼   r   r   r    )rœ   s    r   Úregistrar_acessorÄ   -  s   € Ü�g¬X¯\©\«^×-EÑ-EÓ-GÖHr   c                 ó¬   — t        j                  d«      }t        «       }|j                  d|| f«       |j	                  «        |j                  «        |S )u9   Gera e salva novo token para o usuÃ¡rio. Retorna o token.é    z+UPDATE users SET api_token = ? WHERE id = ?)ÚsecretsÚ	token_hexr   r   r   r"   )rœ   rA   r   s      r   Úgerar_api_tokenrÉ   3  sD   € ä×Ñ˜bÓ!€EÜ‹;€DØ‡L�LÐ>ÀÈÐ@PÔQØ‡K�K„MØ‡J�J„LØ€Lr   c                 óÀ   — | syt        «       }	 |j                  d| f«      j                  «       }|j	                  «        |rt        |«      S dS # t        $ r d}Y Œ,w xY w)u<   Retorna User se token vÃ¡lido e ativo, None caso contrÃ¡rio.Nz5SELECT * FROM users WHERE api_token = ? AND ativo = 1)r   r   r   r   r"   r„   )rA   r   r/   s      r   Úbuscar_por_tokenrË   =  se   € áØÜ‹;€DðØ�l‰lØCÀeÀXó
ç
‰(‹*ð 	ð
 	‡J�J„LÙŒ4�‹9Ð% Ð%øô ò ØŠðús   �!A ÁAÁAÚipsc                 ó®   — t        «       }|j                  d|rt        j                  |«      nd| f«       |j	                  «        |j                  «        y)z:Define lista de IPs permitidos (vazia/None = qualquer IP).z1UPDATE users SET api_allowed_ips = ? WHERE id = ?N)r   r   ÚjsonÚdumpsr   r"   )rœ   rÌ   r   s      r   Úset_ip_whitelistrÐ   L  s@   € ä‹;€DØ‡L�LØ;ÙŒ�‰�CŒ T¨7Ð3ôð 	‡K�K„MØ‡J�J…Lr   c                 ó~   — t        «       }|j                  d| f«       |j                  «        |j                  «        y)u   Zera o api_token do usuÃ¡rio.z.UPDATE users SET api_token = NULL WHERE id = ?Nr<   r¾   s     r   Úrevogar_api_tokenrÒ   W  s,   € ä‹;€DØ‡L�LÐAÀGÀ:ÔNØ‡K�K„MØ‡J�J…Lr   Újobc                 ó,  — t        «       }|j                  d| j                  d«      | j                  d«      | j                  d«      | j                  dd«      | j                  dd«      | j                  d	d«      | j                  d
d«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  d«      | j                  d«      f«       |j                  «        |j	                  «        y)zAPersiste metadados do job no banco. Chama ao criar e ao concluir.aÐ  
        INSERT INTO jobs_historico (id, conta_id, user_id, tipo, nicho, cidade, limite, status, progresso, total, leads_enviados, criado_em, concluido_em)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        ON CONFLICT(id) DO UPDATE SET
            status=excluded.status,
            progresso=excluded.progresso,
            total=excluded.total,
            leads_enviados=excluded.leads_enviados,
            concluido_em=excluded.concluido_em
    r†   r.   rœ   ÚtipoÚ
prospeccaoÚnichor   Úcidaderm   r   ÚstatusÚpendenteÚ	progressoÚtotalÚleads_enviadosr‹   Úconcluido_emN)r   r   rd   r   r"   )rÓ   r   s     r   Úsalvar_job_historicorß   a  sÚ   € ä‹;€DØ‡L�Lð 	ð 	�‰�‹�s—w‘w˜zÓ*¨C¯G©G°IÓ,>Ø�‰�˜Ó% s§w¡w¨w¸Ó';¸S¿W¹WÀXÈrÓ=RØ�‰�˜!Ó˜cŸg™g h°
Ó;Ø�‰�˜QÓ §¡¨°!Ó!4°c·g±gÐ>NÐPQÓ6RØ�‰�Ó˜cŸg™g nÓ5ð
ôð  	‡K�K„MØ‡J�J…Lr   Úlimitc                 óþ   — t        «       }| r#|j                  d| |f«      j                  «       }n!|j                  d|f«      j                  «       }|j                  «        |D �cg c]  }t	        |«      ‘Œ c}S c c}w )u2   Retorna os Ãºltimos jobs do histÃ³rico persistido.zMSELECT * FROM jobs_historico WHERE conta_id=? ORDER BY criado_em DESC LIMIT ?z<SELECT * FROM jobs_historico ORDER BY criado_em DESC LIMIT ?r2   )r.   rà   r   r4   r5   s        r   Úlistar_jobs_historicorâ   x  sx   € ä‹;€DÙØ�|‰|Ø[Ø�uÐó
÷ ‰(‹*ñ 	ð
 �|‰|ØJØˆHó
÷ ‰(‹*ð 	ð 	‡J�J„LØ!Ö"˜ŒD��GÒ"Ð"ùÒ"s   Á%A:)r   N)ÚbetaNr   )Né
   )=Ú__doc__ÚosrÎ   rÇ   r   r   Úpathlibr   Úwerkzeug.securityr   r   Úflask_loginr   Úenvironrd   Ú__file__ÚresolveÚparentr   r	   r
   r   r   r%   r   r,   r0   rµ   r6   r]   r:   r�   r=   r?   rB   rK   rN   rR   rW   rY   r^   ri   rk   ru   rx   r‚   r„   r§   Útupler«   r­   r¼   r¿   rÂ   rÄ   rÉ   rË   rÐ   rÒ   rß   râ   r¤   r   r   ú<module>rï      sº  ðñó 
Û Û Û Ý Ý ß IÝ !ñ
 ˆr�z‰z�~‰~˜oÓ.Ò`±4¸³>×3IÑ3IÓ3K×3RÑ3RÐU_Ñ3_Ó
a€ð —J‘J—N‘NÐ#6Ð8NÓOÐ Ø—J‘J—N‘NÐ#6¸Ó;Ð Ø—:‘:—>‘>Ð"4°oÓFÐ òòKð`
�cð 
˜dó 
ð#�tó #ð&˜ð &  t¡ó &ð˜Cð  Dó ð˜Sð ¨ð °ó ð˜Sð  T¨D¡[ó ð˜cð ¨Sð ¸ð È3ð Ø!$ðØ03ðà#&ðà7:ðàHKðàPTóð,# ð #¨ó #ð&˜cð & d¨T¡kó &ð HLñ$ ð $¨3ð $¸#ð $Àcð $Ø#&ð$Ø58ð$ØDGð$à%(ð$à9<ð$àJMð$ð &)ð$ð ;>À¹*ð$ð QUó$ðD #ð ¨$ó ð' ð '¨ó 'ò&ðV
¨#ó 
ð˜ð  ó ð* ð °ð ¸ó ð¨ð °ó ôF%ˆ9ô %ðP&˜Có &ð 8<ñ˜ð  Cð °ð ØðØ14ðØ@Eóñ*	#˜cð 	#¨Tó 	#ð˜sð °ó ð˜Sð  Tó ð:˜$ð : sð :¨tó :ðI˜có Ið˜Sð  Só ð&˜Có &ð˜cð ¨ð °ó ð˜sð  tó ð˜dó ñ.# Cð #°sð #ÀDô #r   