
    ^9jz                     f   d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
 ddlmZmZmZ ddlmZ ddlmZ ddlZ ee      j)                         j*                  Zej*                  Zej0                  j3                  d ee             ddlmZmZmZ dZd	e d
dddZ  ed      Z! ed      Z"dddddddddZ#g dZ$dddddddd dZ%dEd!edz  d"e&eeef   fd#Z'dEd$edz  d"e(e)   fd%Z*d&ed"edz  fd'Z+d(ed"e(e)   fd)Z,d(ed"e)fd*Z- ej\                  d+      Z/ ej\                  d,      Z0d&ed"efd-Z1dFd&ed.e2d"efd/Z3d0ed1ed"e)fd2Z4d3e)d0ed1ed"e)fd4Z5d5e)d6ed7ed8ed"ef
d9Z6d:ed;edz  d5e)d6ed<e(e   f
d=Z7d>Z8d?Z9d@e(e   d5e)d6ed;edz  fdAZ:d:ed;edz  d5e)d6efdBZ;dC Z<e=dDk(  r e<        yy)Gup  
Gerador de Relatorio Semanal — PX3 Lab
Pipeline: PADRAO PX3
Janela: sexta 9:01h ate proxima sexta 9:00h (America/Sao_Paulo)

Uso:
    python3 gerar_relatorio.py                 # semana atual (corrente)
    python3 gerar_relatorio.py --semana 2026-25  # semana especifica (ISO)
    python3 gerar_relatorio.py --enviar         # envia via Telegram outbox apos gerar
    N)ThreadPoolExecutoras_completed)datetime	timedeltatimezone)Path)ZoneInfo)	PX3_TOKENPX3_LOCATION_IDPX3_PIPELINE_PADRAOz$https://services.leadconnectorhq.comzBearer z
2021-07-28application/json)AuthorizationVersionAcceptContent-TypezAmerica/Sao_PauloUTCNOVOCLIENTE RESPONDEUQUALIFICADOLEAD EM TESTEPROPOSTAGANHAMOSPERDIDOJA E CLIENTE)z$3232fe51-0b8a-4738-b0f5-ace6c1c97ebcz$d4c6c1c5-6688-4a0a-9145-155ca7354950z$788ed387-087e-4669-8aad-98ae6d25adf1z$dcd3892d-43e5-47f0-8b40-94fa155afc81z$d67905bd-b19c-4cd4-9244-51a9809c699cz$bf2ac7d3-fa18-470f-a27d-538598314391z$6367d1b0-308a-46be-a930-cf599f5318bdz$cbaf555c-3b17-4524-97c4-0782df16e28d)r   r   r   r   r   r   r   r   z#3b82f6z#06b6d4z#8b5cf6z#f59e0bz#ec4899z#10b981z#22d3eez#ef4444
semana_isoreturnc                 B   | rt        j                  d|       }|st        d      t        |j	                  d            t        |j	                  d            }}t        j                  ||d      j                  ddddt              }|}|t        d	
      z   j                  ddd      }nt        j                  t              }|j                         dz
  d	z  }|t        |
      z
  j                  dddd      }	|j                         dk(  r||	k  r|	t        d	
      z  }	|	}|t        d	
      z   t        d      z
  }||k  r|}|j                  t              }
|j                  t              }|j                  d       d|j                  d       d}|
||||fS )a  
    Retorna (inicio, fim, label) em UTC.
    Janela = sexta 09:01 (BR) ate proxima sexta 09:00 (BR).

    - Se semana_iso=None: janela da semana corrente (ultima sexta 09:01 ate agora).
    - Se semana_iso=YYYY-WW: encontra a sexta que pertence aquela semana ISO.
    z^(\d{4})-W?(\d{1,2})$z'Formato esperado: YYYY-WW (ex: 2026-25)         	   r   )hourminutesecondmicrosecondtzinfo   )days)r"   r#   r$      )r"   r#   r$   r%   )minutes%d/%m/%Y %H:%M a z (Brasilia))rematch
ValueErrorintgroupr   fromisocalendarreplaceTZ_BRr   nowweekday
astimezoneTZ_UTCstrftime)r   manosemanabase	inicio_brfim_bragora_brdias_desde_sextaultima_sexta
inicio_utcfim_utclabels                G/opt/mia/workspace/clientes/px3lab/relatorio_semanal/gerar_relatorio.pycalcular_janelarG   T   s    HH-z:FGG!''!*os1771:V ''VQ7??1QAe @ 
 	**331Q3O<<& %,,.2a7 92B#CCLL1QA M 
 "x,'>I1--L 	YA..11EEfF%%f-J'G!!"234CHX8Y7ZZefEwy&88    status_filterc                    g }d}d}d}	 |dz  }t         t        dd}| r
| dk7  r| |d<   |r|r
||d<   ||d	<   t        d
      D ]c  }	 t        j                  t
         dt        |d      }|j                  dk(  rt        j                  d|dz   z         S|j                           n j                         }	|	j	                  dg       }
|j                  |
       |	j	                  di       }|j	                  d      }|j	                  d	      }|j	                  d      r|
s	 |S |dkD  r	 |S t        j                  d       :# t        $ r&}|dk(  r t        j                  d       Y d}~,d}~ww xY w)zRBusca todas as oportunidades paginando. status_filter: open|won|lost|abandoned|allNr   r   d   )location_idpipeline_idlimitallstatus
startAfterstartAfterId   z/opportunities/search   )headersparamstimeout  r   opportunitiesmetanextPageUrl2   g333333?)r   r   rangerequestsgetGHL_BASEHEADERSstatus_codetimesleepraise_for_status	Exceptionjsonextend)rI   todasstart_afterstart_after_idpaginasrV   	tentativaredataoppsrZ   s               rF   buscar_oportunidadesrr      s   EKNG
1*.

 ]e3,F8>#.F< %3F>"q 	ILLj 56#!	 ==C'JJqIM23""$	$ vvxxx,Txx#hh|,.1xx&d
 L	 R< L 	

4S 4  >

1s   AEE	E3E..E3sc                     | sy 	 | j                  d      r| d d dz   } t        j                  |       j                  t              S # t
        $ r Y y w xY w)NZz+00:00)endswithr   fromisoformatr7   r8   rf   )rs   s    rF   parse_iso_utcry      sV    ::c?#2!A%%a(33F;; s   A A 	AA
contact_idc                    t        d      D ]  }	 t        j                  t         d|  dt        d      }|j
                  dk(  rt        j                  d|dz   z         U|j
                  d	k(  rg c S |j                          |j                         j                  d
g       xs g c S  g S # t        $ r# |dk(  rg cY c S t        j                  d       Y w xY w)z:Busca notas de um contato. Retorna lista (pode ser vazia).rS   
/contacts/z/notes   rU   rW   rX   r   r     notes      ?r]   r^   r_   r`   ra   rb   rc   rd   re   rg   rf   rz   rm   rn   s      rF   buscar_notasr      s    1X 		*Jzl&9A
 }}#

1	A./}}#	 668<<,22$ I	  	A~	JJsO	s$   AB-!B-43B--CCCc                    t        d      D ]  }	 t        j                  t         d|  t        d      }|j
                  dk(  rt        j                  d|dz   z         T|j
                  dk(  ri c S |j                          |j                         j                  d	i       xs i c S  i S # t        $ r# |dk(  ri cY c S t        j                  d
       Y w xY w)z0Busca dados detalhados do contato (phone, name).rS   r|   r}   r~   rX   r   r   r   contactr   r   r   s      rF   buscar_contator      s    1X 		*Jzl3A
 }}#

1	A./}}#	 668<<	2.4"4$ I	  	A~	JJsO	s$   AB, B,33B,,C CCz<[^>]+>z\s+c                     | syt         j                  d|       }t        j                  |      }t        j                  d|      j                         S )N  )RE_TAGsubhtmlunescapeRE_WSstrip)rs   txts     rF   
strip_htmlr      s@    
**S!
C
--
C99S#$$&&rH   nc                 t    | j                         } t        |       |k  r| S | d |dz
   j                         dz   S )Nr   u   …)r   lenrstrip)rs   r   s     rF   truncarr      s;    		A
1v{Wq1u:&&rH   rC   rD   c                    t        dd       t        d      }t        dt        |       d       g }g }|D ]  }t        |j	                  dd            }t        |j	                  d	d            xs t        |j	                  d
d            }|r1| |cxk  r|k  r&n n#|j                  |       |j                  |       |s| |cxk  r|k  sn |j                  |        t        dt        |       dt        |       dd       t        |D ch c]  }|j	                  d      s|d    c}      }t        dt        |       dd       i }	d }
t        d      5 }|D cg c]  }|j                  |
|       }}t        |      D ]  }|j                         \  }}||	|<    	 d d d        t        dd       i }d }t        d      5 }|D cg c]  }|j                  ||       }}t        |      D ]  }|j                         \  }}|||<    	 d d d        ||||	|dS c c}w c c}w # 1 sw Y   xY wc c}w # 1 sw Y   ,xY w)Nz'[*] Coletando oportunidades (todas) ...TflushrO   )rI   z[*] Total bruto pipeline: 	createdAtr   lastStageChangeAtlastStatusChangeAtz+[*] Oportunidades com atividade na janela: z	 (novos: )	contactIdz[*] Buscando notas de z contatos ...c                 F    t        j                  d       | t        |       fS Ng?)rc   rd   r   cids    rF   _fetchzcoletar_dados.<locals>._fetch'  s    

4L%%%rH   r    )max_workersz![*] Buscando dados de contato ...c                 F    t        j                  d       | t        |       fS r   )rc   rd   r   r   s    rF   _fetch_czcoletar_dados.<locals>._fetch_c5  s    

4N3'''rH   )ri   dentronovos_na_semananotas_por_contatocontatos_full)printrr   r   ry   r_   appendlistr   submitr   result)rC   rD   ri   r   r   opcreatedlast_changecontact_idsr   r   exr   futsfutnotasr   r   cts                      rF   coletar_dadosr     sk   	3DA u5E	&s5zl
34@ FO 	{B 78#BFF+>$CD 
FF',I
 zW77""2&MM"Z;A'AMM"	 

5c&k] C'(	+ &PBBFF;<O;PQK	"3{#3"4M
B$O& 
	* +b2=>3		&#&>>% 	+CJC%*c"	++ 
-d;M( 
	* $b4?@S		(C(@@% 	$CjjlGC!#M#	$$ *.& 9 Q ?+ + A$ $sH   H.-H.&H8+H3*H8I	I3*I	3H88II		Idadosc                   ! | d   }| d   }| d   }| d   }t         D ci c]  }|d }}|D ]l  }	t        j                  |	j                  d      d      }|	j                  d      d	k(  rd
}n|	j                  d      dk(  rd}|j                  |d      dz   ||<   n t        |      }
t        |      }|j                  dd      |j                  dd      z   |j                  dd      z   |j                  dd      z   }|j                  dd      }|j                  d
d      }|r||z  dz  nd}|r||z  dz  nd}g }|D ]H  }	|	j                  d      }|j                  |i       xs i }|j                  d      xs dj	                         xsT |j                  dd      xs d d|j                  dd      xs d j	                         xs |	j                  d      xs d}|j                  d      xs d}|j                  |g       xs g }g }|D ]B  }t        |j                  dd            }|s!||cxk  r|k  s-n 0|j                  ||f       D |j                  d d       |rJ|d   d   }t        |j                  d      xs |j                  d       xs d      }|rt        |d!      nd"}nd"}t        j                  |	j                  d      d      }|	j                  d      d	k(  rd
}n|	j                  d      dk(  rd}t        |	j                  d#d            }|r$|j                  t              j                  d$      nd%}|j                  |	j                  d&      |||||r|j                         nd|d'       K t        t               D  ci c]  \  }} | |
 c} }!|j                  !fd()       ||
|||||||d*	S c c}w c c} }w )+Nr   r   r   r   r   pipelineStageIdDESCONHECIDOrP   lostr   wonr   r   r   r   r   rK   r   contactNamer   	firstNamer   lastNamenamezSem nomephone	dateAddedc                     | d   S )Nr    )xs    rF   <lambda>zagregar.<locals>.<lambda>}  s
    1Q4 rH   T)keyreversebodyTextbody   zSem observacao no periodor   r+   -id)r   nometelefonestagedata_entradadata_entrada_sortobsc                 :    j                  | d   d      | d    fS )Nr   c   r   )r_   )r   	stage_idxs    rF   r   zagregar.<locals>.<lambda>  s$    y}}QwZ4q9L7M6MN rH   )r   )	contagem_stagetotalnovos_totalqualificadosfechamentosperdidos	taxa_qual	taxa_fechlinhas)STAGE_ORDERSTAGESr_   r   r   ry   r   sortr   r   r7   r4   r9   	timestamp	enumerate)"r   rC   rD   r   novosr   r   r   r   r   r   r   r   r   r   r   r   r   r   contator   r   notas_na_janelar   dultimoobs_txtr   
stage_nomer   data_entrada_brirs   r   s"                                    @rF   agregarr   K  s   8_F#$E12/*M +66$dAg6N6 ?zz"&&!23^D66(v%DVVH&D-11$:Q>t? KEe*K=!,


_a
0	1


Z
+	, 

Z
+	,  !$$Z3K!!)Q/H6A+c1qI5@{*S0aI F /
ff[!##C,2[['-2446 ++k"-34Agkk*R6P6VTV5WX^^`vvf~ 	 	 ;;w'-2!%%c2.4" 	/AaeeK45AZ1//&&1v.	/ 	>$Q'*F J!7!S6::f;M!SQSTG+2''3'8SC-CZZ'8 9>J
66(v%"JVVH&#J{B 78DKGu%../?@QT 	 	ffTl$# /<CW%6%6%8
	
K/
d #,K"89$!QA9I
KKN  
 )"$"
 
a 7V :s   
OOaggperiodo_labelr>   r?   c                    t        j                  t              j                  d      }|j                  d       d|j                  d       }t	        | d   j                               xs d}g }t        D ]t  }| d   j                  |d      }	|	|z  dz  }
t        j                  |d	      }|j                  d
| d| d| dt        j                  |       d|	 d|
dd| d|
dd       v g }t        | d   d      D ]  \  }}t        j                  |d   d	      }t        j                  dd|d   xs d      }|rd| dt        j                  |d          dnd}|j                  d| dt        j                  |d          d | d!| d| d| dt        j                  |d          d"t        j                  |d#          d$t        j                  |d%          d&        |s|j                  d'       d(| d)| d*| d+| d,    d-| d.    d/| d0    d1| d2    d3| d4   dd5| d6    d7dj                  |       d8dj                  |       d9}|S ):Nr+   z%d/%mr,   z%d/%m/%Yr   r   r   rK   z#64748bzP
            <tr>
                <td><span class="stage-tag" style="background:z	22;color:z;border:1px solid z55">z-</span></td>
                <td class="num">z|</td>
                <td>
                    <div class="bar-wrap">
                        <div class="bar" style="width:.1fz%;background:z9"></div>
                        <span class="bar-label">zX%</span>
                    </div>
                </td>
            </tr>
            r   r   z\Dr   r   z<a href="https://wa.me/z " target="_blank" class="phone">z</a>z<span class="muted">-</span>z8
            <tr>
                <td class="num muted">z"</td>
                <td><strong>r   z#</strong></td>
                <td>zD</td>
                <td><span class="stage-tag" style="background:z/</span></td>
                <td class="muted">r   z&</td>
                <td class="obs">r   z$</td>
            </tr>
            zx<tr><td colspan="6" class="muted" style="text-align:center;padding:32px">Nenhum lead com atividade no periodo.</td></tr>u   <!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Relatorio Semanal PX3 Lab — u  </title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
    font-family: -apple-system, 'Segoe UI', Roboto, 'Inter', sans-serif;
    background: linear-gradient(135deg, #0a0e1a 0%, #111827 100%);
    color: #e5e7eb;
    line-height: 1.5;
    min-height: 100vh;
    padding: 32px 16px;
}
.container {
    max-width: 1240px;
    margin: 0 auto;
}
header {
    text-align: center;
    margin-bottom: 40px;
    padding-bottom: 32px;
    border-bottom: 1px solid #1f2937;
}
.brand {
    display: inline-flex;
    align-items: center;
    gap: 12px;
    padding: 8px 18px;
    background: linear-gradient(135deg, #6366f1, #ec4899);
    border-radius: 999px;
    font-weight: 700;
    font-size: 12px;
    letter-spacing: 2px;
    text-transform: uppercase;
    color: white;
    margin-bottom: 18px;
}
h1 {
    font-size: 36px;
    font-weight: 800;
    background: linear-gradient(135deg, #fff 0%, #94a3b8 100%);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    margin-bottom: 8px;
}
.subtitle {
    color: #94a3b8;
    font-size: 16px;
    margin-bottom: 4px;
}
.generated {
    color: #64748b;
    font-size: 13px;
    margin-top: 8px;
}
.cards {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    gap: 16px;
    margin-bottom: 40px;
}
.card {
    background: rgba(30, 41, 59, 0.5);
    backdrop-filter: blur(12px);
    border: 1px solid rgba(99, 102, 241, 0.15);
    border-radius: 16px;
    padding: 22px;
    transition: transform .2s, border-color .2s;
}
.card:hover {
    transform: translateY(-2px);
    border-color: rgba(99, 102, 241, 0.45);
}
.card .label {
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 1.5px;
    color: #94a3b8;
    font-weight: 600;
    margin-bottom: 8px;
}
.card .value {
    font-size: 36px;
    font-weight: 800;
    color: #fff;
    line-height: 1.1;
}
.card .sub {
    font-size: 12px;
    color: #64748b;
    margin-top: 4px;
}
.card.accent-blue .value { color: #60a5fa; }
.card.accent-purple .value { color: #a78bfa; }
.card.accent-green .value { color: #34d399; }
.card.accent-red .value { color: #f87171; }
.card.accent-pink .value { color: #f472b6; }

section {
    background: rgba(30, 41, 59, 0.4);
    border: 1px solid rgba(99, 102, 241, 0.15);
    border-radius: 16px;
    padding: 28px;
    margin-bottom: 28px;
}
section h2 {
    font-size: 20px;
    font-weight: 700;
    color: #fff;
    margin-bottom: 6px;
    display: flex;
    align-items: center;
    gap: 10px;
}
section h2::before {
    content: '';
    width: 4px;
    height: 22px;
    background: linear-gradient(180deg, #6366f1, #ec4899);
    border-radius: 4px;
}
section .desc {
    color: #94a3b8;
    font-size: 13px;
    margin-bottom: 20px;
}
table {
    width: 100%;
    border-collapse: collapse;
}
thead th {
    text-align: left;
    padding: 12px 14px;
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 1px;
    color: #94a3b8;
    font-weight: 600;
    border-bottom: 1px solid #1f2937;
    background: rgba(15, 23, 42, 0.5);
}
tbody td {
    padding: 14px;
    border-bottom: 1px solid #1f293755;
    font-size: 14px;
    vertical-align: top;
}
tbody tr:hover { background: rgba(99, 102, 241, 0.05); }
.num { text-align: right; font-variant-numeric: tabular-nums; font-weight: 600; }
.muted { color: #64748b; }
.stage-tag {
    display: inline-block;
    padding: 4px 10px;
    border-radius: 999px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.5px;
    text-transform: uppercase;
}
.bar-wrap {
    position: relative;
    background: rgba(15, 23, 42, 0.7);
    border-radius: 8px;
    height: 24px;
    overflow: hidden;
    border: 1px solid #1f2937;
}
.bar {
    height: 100%;
    border-radius: 8px;
    transition: width .6s ease;
}
.bar-label {
    position: absolute;
    right: 10px;
    top: 50%;
    transform: translateY(-50%);
    font-size: 12px;
    font-weight: 600;
    color: #fff;
    text-shadow: 0 1px 2px rgba(0,0,0,.6);
}
.phone {
    color: #34d399;
    text-decoration: none;
    font-variant-numeric: tabular-nums;
}
.phone:hover { text-decoration: underline; }
.obs {
    color: #cbd5e1;
    font-size: 13px;
    max-width: 380px;
}
footer {
    text-align: center;
    margin-top: 40px;
    padding-top: 24px;
    border-top: 1px solid #1f2937;
    color: #64748b;
    font-size: 12px;
}
@media (max-width: 768px) {
    h1 { font-size: 24px; }
    .card .value { font-size: 28px; }
    section { padding: 18px; }
    .obs { max-width: 200px; }
    table { font-size: 12px; }
    thead th, tbody td { padding: 8px; }
}
</style>
</head>
<body>
<div class="container">
    <header>
        <div class="brand">📊 PX3 LAB · CRM PADRAO PX3</div>
        <h1>Relatorio Semanal</h1>
        <div class="subtitle">z0</div>
        <div class="generated">Gerado em z</div>
    </header>

    <div class="cards">
        <div class="card accent-blue">
            <div class="label">Novos leads</div>
            <div class="value">r   z</div>
            <div class="sub">criados na semana</div>
        </div>
        <div class="card accent-purple">
            <div class="label">Qualificados</div>
            <div class="value">r   z</div>
            <div class="sub">qual+teste+prop+ganhamos</div>
        </div>
        <div class="card accent-green">
            <div class="label">Ganhamos</div>
            <div class="value">r   z</div>
            <div class="sub">fechamentos</div>
        </div>
        <div class="card accent-red">
            <div class="label">Perdidos</div>
            <div class="value">r   z</div>
            <div class="sub">no periodo</div>
        </div>
        <div class="card accent-pink">
            <div class="label">Taxa Qualificacao</div>
            <div class="value">r   z%</div>
            <div class="sub">qualificados/novos</div>
        </div>
        <div class="card">
            <div class="label">Atividade Total</div>
            <div class="value">r   a  </div>
            <div class="sub">opps c/ movimento</div>
        </div>
    </div>

    <section>
        <h2>Distribuicao por Stage</h2>
        <p class="desc">Distribuicao das oportunidades com atividade na semana, agrupadas pelo stage ATUAL.</p>
        <table>
            <thead>
                <tr><th>Stage</th><th class="num">Qtd</th><th style="width:60%">% do total</th></tr>
            </thead>
            <tbody>
                am  
            </tbody>
        </table>
    </section>

    <section>
        <h2>Leads Individuais</h2>
        <p class="desc">Todos os leads com criacao ou movimentacao no periodo, ordenados pelo funil. Clique no telefone para abrir o WhatsApp.</p>
        <table>
            <thead>
                <tr>
                    <th>#</th>
                    <th>Nome</th>
                    <th>Telefone</th>
                    <th>Stage atual</th>
                    <th>Entrada</th>
                    <th>Observacao mais recente</th>
                </tr>
            </thead>
            <tbody>
                u   
            </tbody>
        </table>
    </section>

    <footer>
        Relatorio gerado automaticamente pelo agente Mia · Agencia Climb Digital<br>
        Pipeline: PADRAO PX3 · Fuso: America/Sao_Paulo
    </footer>
</div>
</body>
</html>
)r   r5   r4   r9   sumvaluesr   r_   STAGE_COLORSr   r   escaper   r-   r   join)r   r   r>   r?   	gerado_emperiodo_curtototal_stageslinhas_stager   qtdpctcorlinhas_leadsr   l	tel_cleantel_linkhtml_outs                     rF   render_htmlr    sS   U#,,-=>I ))'233vz7R6STMs+,3356;!LL 
"#''a0L 3&tY/??Be9SEQcdgchhlmqmxmxy}m~l @!!$ &7 8;3i}SE R114S	 :	
	
& L#h-+ 
1qz95FF5"a
m&9r:	  &i[0PQUQ\Q\]^_i]jQkPllpq/ 	
 	''(c *![[634 5J ??Be9SEQcdgchhlmqmxmxyz  |C  zD  nE  mF F##';;q/@#A"B C!!%QuX!6 7 8		

*  G	
&
 '4_ V5l  -o .**3 5  !$M 23 4 
 !$N 34 5 
 !$M 23 4 
 !$J0 1 
 !$K 05 6 
 !$G~ . &' (( &' (yhHR	 OrH   	html_pathlink_publicodestinatariosc           
      ~   dd l }ddlm} ddlm} t
        j                  j                  dd      }t
        j                  j                  dd      j                  dd      }	|	st        d	      }
|
j                         rh|
j                         j                         D ]G  }|j                  d
      s|j                  dd      d   j                         j                  dd      }	I |	st!        dd       y | j                  d      } |d      }d| |d<   d| d|d<   dj#                  |      |d<   d| d}|r	|d| dz  }|d|d    d|d     d!|d"    d#|d$    z  }|j%                   ||d%             |j%                   ||d&             	 |j'                  d'd(      }|j)                          |j+                  ||	       |j-                  |||j/                                |j1                          t!        d)dj#                  |       d       y # t2        $ r}t!        d*| d       Y d }~y d }~ww xY w)+Nr   )MIMEMultipart)MIMEText
GMAIL_USERzremoraes09@gmail.comGMAIL_APP_PASSWORDr   r   z/opt/mia/.envzGMAIL_APP_PASSWORD==r   u6   [!] GMAIL_APP_PASSWORD não configurado, pulando emailTr   utf-8encodingalternativeu$   📊 Relatório Semanal PX3 Lab — SubjectzMia - Climb Digital <>From, Tou   Relatório semanal PX3 Lab — 
z
Acesse online: z
Total: r   z | Qualificados: r   z | Fechamentos: r   z | Perdidos: r   plainr   zsmtp.gmail.comiK  z[ok] Email enviado para: z[!] Erro ao enviar email: )smtplibemail.mime.multipartr  email.mime.textr  osenvironr_   r3   r   exists	read_text
splitlines
startswithsplitr   r   r   attachSMTPstarttlsloginsendmail	as_stringquitrf   )r	  r
  r   r   r  r  r  r  
gmail_userapp_passwordenv_pathlinehtml_contentmsgtexto_plainserverro   s                    rF   enviar_emailr6    sK   2(.DEJ::>>"6;CCCLL(?? **,779 R??#89#'::c1#5a#8#>#>#@#H#Hb#QLR FdS&&&8L

&C;M?KC	N)*Q7CK		-(CI3M?"EK*<.;;Ys7|n,=c.>Q=RRbcfgtcubv  wD  EH  IS  ET  DU  V  VKJJxW-.JJxf-.<.4Z.
M3==?C)$))M*B)CDDQ <*1#.d;;<s   BH 	H<"H77H<z"https://dinastiapi.agentesclimb.usKSDFJKSFJSLFJSFnumerosc                    d| d|d    d|d    d|d    d|d	    d
|d   dd}|r|d| z  }| D ]  }	 t        j                  t         dt        dd||ddd      }|j                  r0|j                         j                  d      rt        d| d       n t        d| d|j                  d d  d        y # t        $ r}t        d| d| d       Y d }~d }~ww xY w)Nu(   📊 *Relatório Semanal PX3 Lab*

📅 u   

👥 Total de leads: *r      *
✅ Qualificados: *r   u   *
🏆 Fechamentos: *r      *
❌ Perdidos: *r   u   *
📈 Taxa: *r   r   z%*u   

🔗 z/chat/send/textr   )tokenr   T)PhoneBodyNumberCheckr}   )rU   rg   rW   successz[ok] WhatsApp enviado para r   z[!] WhatsApp erro para z: rK   u   [!] WhatsApp exceção para )
r^   postDINASTIA_BASEDINASTIA_TOKENokrg   r_   r   textrf   )r8  r   r   r
  textonumerorn   ro   s           rF   enviar_whatsapprH  G  sA    !!$W /!.12 3!-01 2j/* +;',B	0 
 9\N++ L	L /1"0BTU%uTJ	A ttY/3F8<DI/xr!&&#,HPTUL  	L01#>dKK	Ls   BC  	C&	C!!C&c                 d   t        d      }|j                         st        dd       y d| d|d    d|d	    d
|d    d|d    d|d   dd}|r|d| z  }t        t	        j                         dz        }|| dz  }t        |d      5 }t        j                  d|i|       d d d        |dz   }	||	 dz  }
t        |
d      5 }t        j                  t        |       dd|       d d d        t        d|j                   d|
j                   d       y # 1 sw Y   uxY w# 1 sw Y   =xY w)Nz/opt/mia-bot/outboxz-[!] outbox nao existe, pulando envio TelegramTr   u'   📊 *Relatorio Semanal PX3 Lab*

📅 u   

👥 Novos leads: *r   r:  r   u   *
🏆 Ganhamos: *r   r;  r   u   *
📈 Taxa qualificacao: *r   r   z%*
u   
🔗 g    eAz.jsonwrE  r   u   📎 Relatorio HTML completo)documentcaptionz"[ok] mensagens criadas no outbox: r  )
r   r"  r   r0   rc   openrg   dumpstrr   )r	  r
  r   r   outboxrF  tsmsg_pathfts2doc_paths              rF   enviar_telegramrV  g  st   '(F==?=TJ !-01 2!.12 3}-. /j/* +$$'$4S#9	? 
 7<.))	TYY[3	B2$e$H	h	 &		65/1%& q&C3%u%H	h	 
		Y4RSUV	

 
.x}}oR
OW[\& &
 
s   D#D&D#&D/c                  b   t        j                         } | j                  dd       | j                  ddd       | j                  dd	       | j                  d
ddd       | j                  dddd       | j                  dt        t        dz        d       | j                         }t        |j                        \  }}}}}t        d| d       t        d|j                          d|j                          d       t        ||      }t        |||      }t        ||||      }	t        |j                        }
|
j                  j!                  dd       |
j#                  |	d       t        d|
 d       t        d|d     d!|d"    d#|d$    d%|d&    d'|d(    
d       |j$                  rt'        |
|j(                  ||       |j*                  r#t-        |
|j(                  |||j*                         |j.                  r#t1        |j.                  |||j(                         y y ))Nz--semanaz9Semana ISO (YYYY-WW), ex: 2026-25. Default: semana atual.)helpz--enviar
store_truez%Envia via Telegram outbox apos gerar.)actionrX  z--linkz7Link publico do HTML (para incluir na msg do Telegram).z--email+ADDRz-Envia por email para os enderecos informados.)nargsmetavarrX  z
--whatsappPHONEzAEnvia por WhatsApp (via Dinastia API) para os numeros informados.z--saidazrelatorio_atual.htmlzPath do HTML de saida.)defaultrX  z[*] Janela: Tr   z
    UTC:  z -> )parentsexist_okr  r  z[ok] HTML salvo em: z[stats] total=r   z novos=r   z qualif=r   z
 ganhamos=r   z
 perdidos=r   )argparseArgumentParseradd_argumentrO  
SCRIPT_DIR
parse_argsrG   r<   r   	isoformatr   r   r  r   saidaparentmkdir
write_textenviarrV  linkemailr6  whatsapprH  )parserargsrC   rD   rE   r>   r?   r   r   html_strout_paths              rF   mainru    sT   $$&F
H   4  
 F   <	   P	   J!778%  
 D4CDKK4P1J	6	L
 -	Jz++-.d73D3D3F2G
HPTU*g.E
%W
-C3y&9HDJJHOO$673	 

+48	
Wgc-.@-A Bn%&j]1C0DJsS]N_	a {{$))S%8zzXtyy#udjjA}}sE499= rH   __main__)N)r   )>__doc__rc  r   rg   r   r-   sysrc   concurrent.futuresr   r   r   r   r   pathlibr   zoneinfor	   r^   __file__resolverj  rf  
PX3LAB_DIRpathinsertrO  
config_ghlr
   r   r   r`   ra   r4   r8   r   r   r   tuplerG   r   dictrr   ry   r   r   compiler   r   r   r0   r   r   r   r  r6  rB  rC  rH  rV  ru  __name__r   rH   rF   <module>r     s  	    	 	 
  ? 2 2   
 (^##%,,

 3z? # F F1yk* &	 	$%	% -3,?,9,;,6,6,5,:	
	 "	(9d
 (9eHhPS<S6T (9\1d
 1d4j 1hS X_ S T$Z .s t 4 
J	

6'# '# ''s 's 'S '=h = =d =Fb4 bX b bT bP]T ]# ]( ]H ]Y\ ]F(<D (<d
 (< (<VY (<jnorjs (<\ 5"LT#Y LT L# LUX[_U_ L@]t ]3: ]D ]Y\ ]H:>z zF rH   