
    0j                       S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKJ	r	  SSK
J
r
Jr  SSKJrJrJrJrJr  SSKJr  SS jrSS	 jrS S
 jrS!S jrS!S jrS"S jrS#S jrS$S jrS%S jrS&S jrS'S jr              S(S jrS'S jr SS.         S)S jjr!S*S jr"S+S jr#            S,S jr$S+S jr%S'S jr&S-S jr'S-S jr(g).uX   Fechamento de período: arquiva linhas de pedido_diarios em pedido_periodos (MySQL 5.x).    )annotationsN)defaultdict)datetime	timedelta)AnyDictListOptionalTuple)conectarc                    U (       a  [        U 5      R                  5       (       d  [        S5      e[        R                  " [        U 5      R                  5       S S S5      $ )Nu   Data obrigatória
   %Y-%m-%d)strstrip
ValueErrorr   strptime)ss    ^C:\Users\user\Desktop\Projetos_em_andamento\_Mexendo\LojaOnline\services\fechamento_periodo.py
_parse_diar      sC    CFLLNN,--SV\\^CR0*==    c                h    [        U 5      n[        U5      [        SS9-   nX#:  a  [        S5      eX#4$ )u;   Retorna [início inclusivo, fim exclusivo) em data_criacao.   )daysz1data_inicio deve ser anterior ou igual a data_fim)r   r   r   )data_iniciodata_fimd0d1s       r   intervalo_datetimesr      s8    	K	 B	H		q 1	1B	xLMM6Mr   c                8   U R                  S5        U R                  5       n/ nU Hp  n[        U[        5      (       d  US   OUR	                  S5      nU(       d  M7  [        U5      R                  5       S:w  d  MV  UR                  [        U5      5        Mr     U$ )Nz SHOW COLUMNS FROM pedido_diariosr   Fieldchave)executefetchall
isinstancedictgetr   lowerappend)cursorrowsoutrnames        r   !_colunas_pedido_diarios_sem_chaver/      sw    
NN56??D
C%a..qtAEE'N4CIOO%0JJs4y!  Jr   c                D    Sn[        U 5      X4nUR                  5       U4$ )u   
Linhas elegíveis ao fechamento: ITEM_REMOVIDO (qualquer origem) ou recebidas.
Recebido: origem MESA usa status_mesa=RECEBIDO; demais origens usam status_pedido=RECEBIDO.
a  
        id_cliente = %s
        AND data_criacao >= %s
        AND data_criacao < %s
        AND (
            UPPER(TRIM(COALESCE(status_pedido, ''))) = 'ITEM_REMOVIDO'
            OR (
                (UPPER(TRIM(COALESCE(origem, ''))) = 'MESA'
                 AND UPPER(TRIM(COALESCE(status_mesa, ''))) = 'RECEBIDO')
                OR (UPPER(TRIM(COALESCE(origem, ''))) <> 'MESA'
                    AND UPPER(TRIM(COALESCE(status_pedido, ''))) = 'RECEBIDO')
            )
        )
    intr   
id_clienter   r   sqlparamss        r   _where_fechamentor7   *   s*    
C *or&F99;r   c                D    Sn[        U 5      X4nUR                  5       U4$ )u7   Intervalo de data_criacao no diário (qualquer status).zZ
        id_cliente = %s
        AND data_criacao >= %s
        AND data_criacao < %s
    r1   r3   s        r   _where_periodo_diarior9   A   s*    C
 *or&F99;r   c                      g)u   
Linha considerada recebida para faturamento / relatórios:
origem MESA → status_mesa = RECEBIDO; caso contrário → status_pedido = RECEBIDO.
z(  (UPPER(TRIM(COALESCE(origem, ''))) = 'MESA'    AND UPPER(TRIM(COALESCE(status_mesa, ''))) = 'RECEBIDO')  OR (UPPER(TRIM(COALESCE(origem, ''))) <> 'MESA'       AND UPPER(TRIM(COALESCE(status_pedido, ''))) = 'RECEBIDO')) r;   r   r   _sql_recebido_para_faturamentor<   L   s    	r   c                   [         R                  " SS[        U =(       d    S5      R                  5       R	                  5       5      nU(       d  gSU;   a  gSU;   d  SU;   d  US	;   a  g
SU;   d  SU;   d  SU;   a  gSU;   d  SU;   d  SU;   a  gSU;   d  SU;   d  SU;   a  gSU;   d  SU;   d  SU;   d  SU;   d  SU;   a  gSU;   a  gSU;   d  S U;   a  g!S"U;   a  g#g)$u   
Agrupa rótulos livres da baixa em categorias para prestação de contas.
Ordem de teste importa (ex.: 'cartão crédito' antes de genérico 'cartão').
z\s+  OutrospixPIXdinheirespeci)dincashDinheirou   crédcredcreditou   Cartão créditou   débdebdebitou   Cartão débitovalerefeialimenu   Vale/refeiçãotransfteddocu   depósdepositou   TransferênciaboletoBoletocartcardu   Cartão (não especificado)mistozMisto (detalhe em baixa))resubr   r   r(   )labelr   s     r   _normalizar_forma_pagamentor[   [   s    
 	vsC,224::<=AzA~Q!*>!|v{i1n!{eqjHM {glh!m 1}
eqjHMZST_1}{fk,!|)r   c                   [        U =(       d    S5      R                  5       n U (       a	  U S   S;  a  g  [        R                  " U 5      n[        U[        5      (       d  g UR                  S5      n[        U[        5      (       d  g / nU H  n[        U[        5      (       d  M  [        UR                  S5      =(       d    S5      R                  5       n [        UR                  S5      =(       d    S5      nUS:  d  Mw  U(       d  M  UR                  XVS.5        M     U=(       d    S $ ! [        R                  [
        [        4 a     g f = f! [
        [        4 a    Sn Nlf = f)	Nr?   r   z{[
pagamentosformavalor        )r^   r_   )r   r   jsonloadsJSONDecodeError	TypeErrorr   r%   r&   r'   listfloatr)   )rawobjpagr,   pr^   r_   s          r   _parse_baixa_pagamentos_jsonrk   x   s)   
ciR.


 C#a&$jjo c4  
'',
Cc4  C!T""AEE'N(b)//1	!%%.-A.E 19JJ78  ;$%   )Z8  :& 	E	s#   D. #E.EEE('E(c           
     N   [         R                  R                  SS5      n [         R                  " USS9  [         R                  " [         R                  R                  U[        [        U 5      5      5      SS9  SUS.$ ! [         a  nS[        U5      US.s SnA$ SnAff = f)	z/Cria C:\Geral\Relatorios e subpasta do cliente.LOJA_RELATORIOS_DIRC:\Geral\RelatoriosTexist_ok)sucessobaseF)rq   errorr   N)	osenvironr'   makedirspathjoinr   r2   OSError)r4   rr   es      r   garantir_diretorio_relatoriosr{      s    ::>>/1GHD@
D4(
BGGLLs3z?';<tL.. @ #a&$??@s   AB 
B$BB$B$c                x     [        U 5      nSUS R                  SS5      -   $ ! [        [        4 a    Sn N+f = f)Nr`   zR$ z.2f.,)rf   rd   r   replace)vns     r   	_money_brr      sI    !H aW%%c3/// z" s   $ 99c           	     8   [        X5      u  p4[        U 5        SnSn [        5       nUR                  SS9n[	        XU5      u  pxUR                  SU S3U5        [        UR                  5       =(       d    0 R                  S5      =(       d    S5      n	UR                  SU S	3U5        UR                  5       =(       d    /  V
s/ s HA  n
U
R                  S
5      =(       d    S[        U
R                  S5      =(       d    S5      S.PMC     nn
UR                  SU S3U5        UR                  5       =(       d    /  V
s/ s HA  n
U
R                  S5      =(       d    S[        U
R                  S5      =(       d    S5      S.PMC     nn
[        XSS USS XU5      nSUSS USS U	UUUS.U(       a  UR                  5         U(       a  UR                  5         $ $ s  sn
f s  sn
f ! U(       a  UR                  5         U(       a  UR                  5         f f = f)ug   Agregados financeiros no período: recebido (MESA: status_mesa; outras: status_pedido) e ITEM_REMOVIDO.NT
dictionaryz
            SELECT COALESCE(SUM(CAST(preco AS DECIMAL(14,4)) * CAST(quantidade AS DECIMAL(14,4))), 0) AS t
            FROM pedido_diarios WHERE 
            tr   a&  
            SELECT
                CASE
                    WHEN UPPER(TRIM(COALESCE(status_pedido, ''))) = 'ITEM_REMOVIDO' THEN 'ITEM_REMOVIDO'
                    WHEN UPPER(TRIM(COALESCE(origem, ''))) = 'MESA'
                         AND UPPER(TRIM(COALESCE(status_mesa, ''))) = 'RECEBIDO' THEN 'RECEBIDO'
                    ELSE UPPER(TRIM(COALESCE(status_pedido, '')))
                END AS st,
                COALESCE(SUM(CAST(preco AS DECIMAL(14,4)) * CAST(quantidade AS DECIMAL(14,4))), 0) AS total
            FROM pedido_diarios WHERE   
            GROUP BY
                CASE
                    WHEN UPPER(TRIM(COALESCE(status_pedido, ''))) = 'ITEM_REMOVIDO' THEN 'ITEM_REMOVIDO'
                    WHEN UPPER(TRIM(COALESCE(origem, ''))) = 'MESA'
                         AND UPPER(TRIM(COALESCE(status_mesa, ''))) = 'RECEBIDO' THEN 'RECEBIDO'
                    ELSE UPPER(TRIM(COALESCE(status_pedido, '')))
                END
            str?   total)statusr   z
            SELECT TRIM(COALESCE(NULLIF(formapagamento, ''), '(sem forma)')) AS fp,
                   COALESCE(SUM(CAST(preco AS DECIMAL(14,4)) * CAST(quantidade AS DECIMAL(14,4))), 0) AS total
            FROM pedido_diarios WHERE z|
            GROUP BY TRIM(COALESCE(NULLIF(formapagamento, ''), '(sem forma)'))
            ORDER BY total DESC
            fp)r^   r   r   )rq   r   r   total_geral
por_statuspor_forma_pagamentotexto_impressao)r   r{   r   r*   r7   r#   rf   fetchoner'   r$    _formatar_resumo_texto_impressaoclose)r4   r   r   r   r   conncurwrj   r   rowpor_status_val	por_formatextos                 r   resumo_financeiro_fechamentor      s*    7FB!*-D
CCzkkTk* 4''(c * 	
 S\\^1r66s;@qA	' ()c *$ '	
. ,",
, +uSWWW=M=RQR7ST, 	 
 	' ()c * 		
 ,",
, wwt}*eCGGG<L<QPQ6RS, 	 
 1CR((3B-V_
 &s+ "&(#,$
 IIKJJL C

" IIKJJL s,   B(G( AG3G( AG#	%G( 
G( (1Hc                   SSU  3SU SU S3S[        U5       3SS/nU H\  nUR                  S	UR                  S
5      =(       d    S S[        [        UR                  S5      =(       d    S5      5       35        M^     UR                  S5        UR                  S5        U H\  nUR                  S	UR                  S5      =(       d    S S[        [        UR                  S5      =(       d    S5      5       35        M^     UR                  S5        UR                  S5        UR                  S5        SR	                  U5      $ )Nz)========== FECHAMENTO DE CAIXA ==========id_cliente: 	Periodo:  a  (fim do dia incluso)zTOTAL GERAL: r?   z--- Por status ---  r   -z : r   r   z5--- Por forma de pagamento (campo formapagamento) ---r^   zu(Linhas elegiveis: ITEM_REMOVIDO; recebido: MESA com status_mesa=RECEBIDO, demais origens com status_pedido=RECEBIDO)z*==========================================
)r   r)   r'   rf   rx   )r4   didfr   r   r   linesxs           r   r   r      s)    	4
zl#
B4s2$34
	+./0
E r!%%/0S1YuQUU7^EXWX?Y5Z4[\] 	LL	LLHIr!%%./C0IeAEE'NDWVW>X4Y3Z[\ 	LL	LL 
LL=>99Ur   c                    [        X5      u  p4[        U 5      nS nS n [        5       nUR                  SS9n[	        XU5      u  pUR                  SU 3U	5        [        UR                  5       =(       d    0 R                  S5      =(       d    S5      n
UR                  SU S3U	5        UR                  5       =(       d    /  Vs/ s H  oS   [        US	   5      S
.PM     nnUR                  SU S3U	5        [        UR                  5       =(       d    0 R                  S5      =(       d    S5      nSUS S US S U
UUS.nUR                  S5      (       a  UR                  S5      US'   O(UR                  S5      US'   UR                  S5      US'   UU(       a  UR                  5         U(       a  UR                  5         $ $ s  snf ! U(       a  UR                  5         U(       a  UR                  5         f f = f)NTr   z/SELECT COUNT(*) AS n FROM pedido_diarios WHERE r   r   a  
            SELECT
                CASE
                    WHEN UPPER(TRIM(COALESCE(status_pedido, ''))) = 'ITEM_REMOVIDO' THEN 'ITEM_REMOVIDO'
                    WHEN UPPER(TRIM(COALESCE(origem, ''))) = 'MESA'
                         AND UPPER(TRIM(COALESCE(status_mesa, ''))) = 'RECEBIDO' THEN 'RECEBIDO'
                    ELSE UPPER(TRIM(COALESCE(status_pedido, '')))
                END AS st,
                COUNT(*) AS c
            FROM pedido_diarios WHERE r   r   c)r   linhasz
            SELECT COUNT(DISTINCT CONCAT(COALESCE(origem,''), ':', CAST(nropedido AS CHAR(20)))) AS n
            FROM pedido_diarios WHERE r   r   )rq   r   r   r   pedidos_origem_numero_distintosr   rq   rr   pasta_relatoriosrs   pasta_relatorios_erro)r   r{   r   r*   r7   r#   r2   r   r'   r$   r   )r4   r   r   r   r   
pasta_infor   r   r   rj   n_linhasr   r   n_gruposr,   s                  r   preview_fechamentor     s    7FB.z:JD
C6zkkTk* 4EaSI1M,"11#6;!<	' ()c *$ '	
* RUQ]Q]Q_QeceQegQeTc#c(mDQe
g''(c * 	
 ,"11#6;!<&s+ "/7$
 >>)$$&0nnV&<C"#&0nnV&<C"#+5>>&+AC'(IIKJJL 5 h0 IIKJJL s   B'G G"B5G G 1G=r*   c               p   [        X5      u  pEUc  [        U 5        [        XU5      u  pgUSS nUSS n	Sn
UnUSL n U(       a$  [        5       n
U
R	                  SS9n[        U 5        Uc;  SSS.U(       a  U(       a  UR                  5         U
(       a  U
R                  5         $ $ [        5       nUR                  SU S	U S
3U5        / nSnSnUR                  5       =(       d    /  H  n[        UR                  S5      =(       d    S5      R                  5       =(       d    Sn[        UR                  S5      =(       d    S5      n[        UR                  S5      =(       d    S5      nUU-  nUU-  nUS:  a  UU-  OSnUR                  UUUUS.5        M     UR                  SU S3U5        UR                  5       =(       d    0 n[        UR                  S5      =(       d    S5      n[        UR                  S5      =(       d    S5      nUR                  SU S3U5        [        UR                  5       =(       d    0 R                  S5      =(       d    S5      nUR                  SU SU S3U5        [        UR                  5       =(       d    0 R                  S5      =(       d    S5      nUR                  SU S3U5        [        UR                  5       =(       d    0 R                  S5      =(       d    S5      nUR                  SU S	U S3U5        UR                  5       =(       d    /  Vs/ s H  nUR                  S5      =(       d    UR                  S5      =(       d    SSS  UR                  S5      =(       d    UR                  S5      =(       d    SSS! [        UR                  S"5      =(       d    S5      [        UR                  S5      =(       d    S5      S#.PM     nnUR                  S$U S	U S%3U5        UR                  5       =(       d    /  Vs/ s Hl  n[        UR                  S&5      =(       d    S5      [        UR                  S'5      =(       d    S5      [        UR                  S5      =(       d    S5      S(.PMn     nnUR                  S)U S	U S*3U5        [!        UR                  5       =(       d    / 5      n[#        [        5      n U GH#  n![        U!R                  S+5      =(       d    S5      R                  5       n"[%        U"5      n#[        U!R                  S,5      =(       d    S5      n$U#(       a^  U# HV  n%['        U%R                  S-5      5      n& [        U%R                  S.5      =(       d    S5      n'U'S:  d  MI  U U&==   U'-  ss'   MX     M  [        U!R                  S/5      =(       d    S5      R                  5       n(['        U((       a  U(OS05      n&U$S:  d  GM  U U&==   U$-  ss'   GM&     [-        U R/                  5        V)V's/ s H  u  n)n'U)[1        [        U'5      S15      S2.PM      sn'n)S3 S49n*Sn+UR                  S55        UR                  5       (       aW  UR                  S6[        U 5      XE45        [        UR                  5       =(       d    0 R                  S5      =(       d    S5      n+/ n,US:  a<  U H6  n-U,R                  U-S7   [1        S8[        U-S9   5      -  U-  S15      S:.5        M8     UU-   S:  a  [1        S8U-  UU-   -  S15      OSn.0 S;S_S<U_S=U	_S>[        U 5      _S?[1        US15      _S@U_SAU_SBU,_SCU_SD[1        US15      _SEU._SFU_SGU_SHU_SIU*_SJU_SKU_SLU+0En/[3        U/5      U/SM'   U/U(       a  U(       a  UR                  5         U
(       a  U
R                  5         $ $ s  snf s  snf ! [(        [*        4 a    Sn' GN^f = fs  sn'n)f ! U(       a  U(       a  UR                  5         U
(       a  U
R                  5         f f = f)NuG  
Relatório gerencial para prestação de contas no mesmo intervalo do fechamento (pedido_diarios).
Pagamentos: prioriza JSON em baixa_pagamento por pedido (origem+nropedido); senão formapagamento + total do pedido.
Se `cursor` for passado (dict cursor), usa a mesma conexão/transação (ex.: antes do DELETE no fechamento).
Nr   Tr   Fu/   Cursor indisponível para relatório gerencial.rq   rs   a[  
            SELECT UPPER(TRIM(COALESCE(origem, ''))) AS og,
                   COALESCE(SUM(CAST(preco AS DECIMAL(14, 4)) * CAST(quantidade AS DECIMAL(14, 4))), 0) AS total,
                   COUNT(DISTINCT CONCAT(UPPER(TRIM(COALESCE(origem, ''))), ':', CAST(nropedido AS CHAR(20)))) AS pedidos
            FROM pedido_diarios
            WHERE z
              AND zD
            GROUP BY UPPER(TRIM(COALESCE(origem, '')))
            r`   r   ogu   —r   pedidos)origemfaturamentor   ticket_medioz
            SELECT COUNT(*) AS n_linhas,
                   COALESCE(SUM(CAST(preco AS DECIMAL(14, 4)) * CAST(quantidade AS DECIMAL(14, 4))), 0) AS total
            FROM pedido_diarios
            WHERE zZ
              AND UPPER(TRIM(COALESCE(status_pedido, ''))) = 'ITEM_REMOVIDO'
            r   z
            SELECT COUNT(DISTINCT CONCAT(UPPER(TRIM(COALESCE(origem, ''))), ':', CAST(nropedido AS CHAR(20)))) AS n
            FROM pedido_diarios
            WHERE zX
              AND UPPER(TRIM(COALESCE(status_comanda, ''))) = 'MODIFICADA'
            r   zc
              AND UPPER(TRIM(COALESCE(status_comanda, ''))) = 'MODIFICADA'
              AND NOT (z)
            zT
              AND UPPER(TRIM(COALESCE(status_pedido, ''))) = 'AGUARDE'
            a  
            SELECT COALESCE(NULLIF(TRIM(codigoproduto), ''), NULLIF(TRIM(produto), ''), '(sem ref)') AS ref,
                   MAX(TRIM(COALESCE(produto, ''))) AS nome,
                   COALESCE(SUM(CAST(quantidade AS DECIMAL(14, 4))), 0) AS qtd,
                   COALESCE(SUM(CAST(preco AS DECIMAL(14, 4)) * CAST(quantidade AS DECIMAL(14, 4))), 0) AS total
            FROM pedido_diarios
            WHERE z
            GROUP BY COALESCE(NULLIF(TRIM(codigoproduto), ''), NULLIF(TRIM(produto), ''), '(sem ref)')
            ORDER BY total DESC
            LIMIT 20
            refnomer?   x      qtd)r   produto
quantidader   z
            SELECT HOUR(data_criacao) AS hr,
                   COUNT(*) AS n_itens,
                   COALESCE(SUM(CAST(preco AS DECIMAL(14, 4)) * CAST(quantidade AS DECIMAL(14, 4))), 0) AS total
            FROM pedido_diarios
            WHERE zM
            GROUP BY HOUR(data_criacao)
            ORDER BY hr
            hrn_itens)horaitensr   ac  
            SELECT origem, nropedido,
                   MAX(COALESCE(baixa_pagamento, '')) AS baixa_pagamento,
                   MAX(COALESCE(formapagamento, '')) AS formapagamento,
                   COALESCE(SUM(CAST(preco AS DECIMAL(14, 4)) * CAST(quantidade AS DECIMAL(14, 4))), 0) AS total_pedido
            FROM pedido_diarios
            WHERE z4
            GROUP BY origem, nropedido
            baixa_pagamentototal_pedidor^   r_   formapagamentor@      )	categoriar   c                    U S   * $ )Nr   r;   )r   s    r   <lambda>-relatorio_gerencial_periodo.<locals>.<lambda>  s
    1W:+r   )keyz.SHOW COLUMNS FROM clientes LIKE 'data_criacao'z
                SELECT COUNT(*) AS n
                FROM clientes
                WHERE id_cliente = %s
                  AND data_criacao >= %s
                  AND data_criacao < %s
                r   g      Y@r   )r   percentual_faturamentorq   r   r   r4   faturamento_recebido_totalpedidos_recebidos_distintos	por_canalmix_percentual_canalitem_removido_linhasitem_removido_valortaxa_remocao_valor_pctcomandas_modificadas_pedidos)comandas_modificadas_nao_recebido_pedidos!pedidos_aguarde_distintos_periodopagamentos_por_categoriatop_produtospor_hora_recebidonovos_clientes_cadastror   )r   r{   r9   r   r*   r   r<   r#   r$   r   r'   r   rf   r2   r)   r   re   r   rk   r[   rd   r   sorteditemsround#_formatar_relatorio_gerencial_texto)0r4   r   r   r*   r   r   wpppr   r   r   r   
own_cursorsrr   tot_recebidotot_pedidos_recebidor   r   r   pedticketrow_rm
rem_linhas	rem_valor	mod_total
mod_abertopedidos_aguarder-   r   por_horapedidos_rowspag_normprbpparsed	total_pedrj   bucketr   r   kpor_forma_normalizadanovos_clientesmixr   taxa_remocao_valorpayloads0                                                   r   relatorio_gerencial_periodor   N  sb    !7FB~%j1":26FB	Sb	B	#2BD
C4JY:D+++.C)*5;$._`^ #IIKJJL _ ,-
 $ $  	
 !#	 <<>'R'CSWWT]+e,224=B#'''*/a0Ecggi(-A.CE!L C' &)Ageck3F5Sbhij ( 	 $ 	 		
 %2J/415
&**W-23	 $  	
 -22237<1=	 $ t  		
 #,,..B33C8=A>
 $  	
 s||~388=BC $ $  	
, lln**
 + e;f;TcBEE&M?QUU5\?R#F#AEE%L$5A6quuW~23	 + 	 
 	
 $ $ 	 	
 lln**
* t)*Sy9I9NQ5OZ_`a`e`efm`n`srsZtu* 	 

 	 $ $ 	 	
 CLLN0b1%0%7BRVV-.4"5;;=B1"5Fbff^49:IA8wHF !!%%."5A6 1u (A-(    017R8>>@42R8Lq=V$	1$# & !'GO~~GWXGWtq!1uU1Xq'9:GWX%!

 DE<<>>KK Z")	 !#,,."6B!;!;C!@!EAFN!

"#H+27aFV@W8WZf8fhi2j  [girZrvwYwU59#4y8P#QSTU  ~A
t
2
 
 #j/	

 )%a*@
 *+?
 
 #C
 #J
 "5A#6
 %&8
 +I
 8
 0
 '(=
  L!
"  #
$ &~%
( &I%Q!"#IIKJJL o
.
: &z2    Yl #IIKJJL sq   2_= &J_= 8B9_16_= 'A3_C_= 2#__= A_= >*_= (%_7
E_= 
_= _40_= 3_44	_= =8`5c                f   SSU R                  S5       3SU R                  S5       SU R                  S5       S3S	S
SS[        [        U R                  S5      =(       d    S5      5       3SU R                  S5       3S
S/
nU R                  S5      =(       d    /  H  nUR                  SUR                  S5       S[        [        UR                  S5      =(       d    S5      5       SUR                  S5       S[        [        UR                  S5      =(       d    S5      5       35        M     UR                  S
5        UR                  S5        U R                  S5      =(       d    /  H9  nUR                  SUR                  S5       SUR                  S5       S35        M;     UR                  S
5        UR                  S5        UR                  S 5        U R                  S!5      =(       d    /  HS  nUR                  SUR                  S"5       S[        [        UR                  S#5      =(       d    S5      5       35        MU     UR                  S
5        UR                  S$5        UR                  S%U R                  S&5       35        UR                  S'[        [        U R                  S(5      =(       d    S5      5       35        UR                  S)U R                  S*5       S35        UR                  S
5        UR                  S+5        UR                  S,U R                  S-5       35        UR                  S.U R                  S/5       35        UR                  S
5        UR                  S05        UR                  S1U R                  S25       35        UR                  S
5        U R                  S35      nUR                  S45        UR                  S5Ub  UOS6 35        UR                  S
5        UR                  S75        [	        U R                  S85      =(       d    / S95       H  u  pgUR                  SU S:UR                  S;5      =(       d    UR                  S<5      =(       d    S=S S>  S?UR                  S@5       SA[        [        UR                  S#5      =(       d    S5      5       35        M     UR                  S
5        UR                  SB5        U R                  SC5      =(       d    /  Hx  nUR                  S[        UR                  SD5      =(       d    S5      SE SFUR                  SG5       SA[        [        UR                  S#5      =(       d    S5      5       35        Mz     UR                  S
5        UR                  SH5        SIR                  U5      $ )JNz?========== RELATORIO GERENCIAL (PRESTACAO DE CONTAS) ==========r   r4   r   r   r   r   r   u[   (Recebido: origem MESA → status_mesa=RECEBIDO; demais origens → status_pedido=RECEBIDO)r?   z--- Faturamento RECEBIDO ---zTotal geral: r   r   zPedidos distintos (recebido): r   z--- Por canal (origem) ---r   r   r   z: r   z | pedidos=r   z | ticket medio=r   z(--- Mix % sobre faturamento recebido ---r   r   %z;--- Pagamentos (baixa_pagamento JSON ou formapagamento) ---zN(Categorias normalizadas: Dinheiro, PIX, cartoes, Vale, Transferencia, Outros)r   r   r   z'--- Cancelamentos / itens removidos ---z  Linhas ITEM_REMOVIDO: r   z  Valor (itens removidos): r   z0  Taxa remocao sobre (recebido+removido) valor: r   z---- Comandas modificadas (status_comanda) ---z$  Pedidos distintos com MODIFICADA: r   z  Destes, ainda nao RECEBIDO: r   z7--- Pedidos em AGUARDE no periodo (ainda no diario) ---z  Pedidos distintos: r   r   z!--- Novos clientes (cadastro) ---z  Quantidade: z"(coluna data_criacao indisponivel)z*--- Top produtos (RECEBIDO, por valor) ---r   r   z. r   r   r   <   z | qtd=r   z | z1--- Movimento por hora (RECEBIDO, soma itens) ---r   r   02dz	h: itens=r   z@================================================================r   )r'   r   rf   r)   	enumerater2   rx   )	dr   r   mrj   ncir   hs	            r   r   r   ?  s   I
quu\*+,
AEE-()QUU:->,??TUe
&
	%.J(K(Pq"QRST
(/L)M(NO
$E UU;%2%x!IeAEE-4H4MA.N$O#P QuuY'((85~I^IcbcCd9e8fh	
 &
 
LL	LL;<UU)*0b0r!%%/*"QUU3K-L,MQOP 1	LL	LLNO	LLabUU-.4"4r!%%,-R	%g@SRS:T0U/VWX 5	LL	LL:;	LL+AEE2H,I+JKL	LL.yquuEZ?[?`_`9a/b.cde	LLCAEEJbDcCddefg	LL	LL@A	LL7>\8]7^_`	LL1!%%8c2d1efg	LL	LLJK	LL(/R)S(TUV	LL	
(	)B	LL45	LL>"<`!abc	LL	LL=>!%%/52q92quuY'>155<>3DE F55&'s9U155>;NQ5O+P*QS	
 :
 
LL	LLDEUU&'-2-QUU6]'a(-YquuW~6Fc)TYZ[Z_Z_`gZhZmlmTnJoIpq	
 . 
LL	LLST99Ur   c                   [         R                  R                  SS5      n[        R                  " S5      n[         R
                  R                  U[        [        U 5      5      U5      n[         R                  " USS9  [        R                  " S5      nSUS S  S	U S
3n[         R
                  R                  XW5      n[        USSS9 n	U	R                  U5        S S S 5        X4$ ! , (       d  f       X4$ = f)Nrm   rn   r   Tro   %H%M%Sfechamento_   _z_gerencial.txtr   utf-8encodingrt   ru   r'   timestrftimerw   rx   r   r2   rv   openwrite
r4   loteconteudorr   diapastasufixor   caminhofs
             r   _gravar_relatorio_gerencial_txtr  |  s    ::>>/1GHD
--

#CGGLLs3z?3S9EKK%]]8$Fcr1VHN;Dggll5'G	gsW	-	 
.= 
.	-=   C((
C8c                2   U=(       d    / nSU  SU SUR                  S5       SUR                  S5       S[        U5       S3nSnS	R                  U5      S
-   nU H  n/ n	U H  n
U
S:X  aL  U	R                  [	        UR                  S5      =(       d    UR                  S5      =(       d    S5      5        MU  U	R                  [	        UR                  U
5      b  UR                  U
5      OS5      5        M     US	R                  U	5      S
-   -  nM     XW-   $ )Nu,   FECHAMENTO DE PERÍODO (arquivo)
id_cliente=z
lote=z
periodo_inicio=z%Y-%m-%d %H:%M:%Sz
periodo_fim_exclusivo=z
linhas_arquivadas=z
---
)

chave_origr   	nropedidostatus_pedidodata_criacaor   r   precor   cliente	r   r   chave_orig_pedido_diariosr"   r?   )r  lenrx   r)   r   r'   )r4   r  r   r   r   header	cols_prefbodyr-   r   r   s              r   _montar_relatorio_textor,    s    \rF \ "v ++&9:; <!!#-@!A B C [M *	 I 99Y$&DAL 

3quu%@AYQUU7^YWYZ[

31558+?quuQxRHI	 
 			#%%  =r   c                   [         R                  R                  SS5      n[        R                  " S5      n[         R
                  R                  U[        [        U 5      5      U5      n[         R                  " USS9  [        R                  " S5      nSUS S  S	U S
3n[         R
                  R                  XW5      n[        USSS9 n	U	R                  U5        S S S 5        X4$ ! , (       d  f       X4$ = f)Nrm   rn   r   Tro   r	  r
  r  r  z.txtr   r  r  r  r  s
             r   _gravar_relatorio_txtr.    s    ::>>/1GHD
--

#CGGLLs3z?3S9EKK%]]8$Fcr1VHD1Dggll5'G	gsW	-	 
.= 
.	-=r  c                	   [        X5      u  p4[        R                  " 5       R                  n[        R
                  " 5       nSnSn [        5       nUR                  5       n UR                  5         UR                  S[        XU5      S   -   S-   [        XU5      S   5        UR                  5        V	s/ s H!  o(       d  M  U	S   c  M  [        U	S   5      PM#     n
n	U
(       dD  UR                  5         SSS.U(       a  UR                  5         U(       a  UR                  5         $ $ [!        U5      nU(       dD  UR                  5         SS	S.U(       a  UR                  5         U(       a  UR                  5         $ $ S
R#                  U5      nSU SU SSR#                  S/[%        U
5      -  5       S3nXe/U
Q7nUR                  X5        SSS.nUR                  SS9n ['        [        U 5      XUS9nUR                  5         SSR#                  S/[%        U
5      -  5       S3nUR                  U[+        U
5      5        UR-                  5         UR                  SS9nUR                  S[        U 5      U45        [/        UR                  5       =(       d    / 5      nUR                  5         [1        XX4U5      n[3        XU5      u  nnSU[%        U
5      UUS.nUR5                  S5      (       a]  [)        UR5                  S5      =(       d    S5      R7                  5       (       a'   [9        X[)        US   5      5      u  nnUUS'   UUS'   O3UR5                  S5      (       d  UR5                  S5      =(       d    S US!'   UU(       a  UR                  5         U(       a  UR                  5         $ $ ! [         a     GNTf = fs  sn	f ! [         a  nS[)        U5      SS.n SnAGNSnAff = f! UR                  5         f = f! [:         a  n[)        U5      US'    SnANSnAff = f! [         ap  nU(       a"   UR                  5         O! [         a     Of = fS[)        U5      S.s SnAU(       a  UR                  5         U(       a  UR                  5         $ $ SnAff = f! U(       a  UR                  5         U(       a  UR                  5         f f = f)"u   
Transação: copia linhas elegíveis para pedido_periodos e remove de pedido_diarios.
Em seguida grava .txt com o lote (dados lidos de pedido_periodos).
Nz'SELECT chave FROM pedido_diarios WHERE r   z FOR UPDATEr   FuO   Nenhuma linha elegível no período (recebido conforme origem / ITEM_REMOVIDO).r   u1   Não foi possível ler colunas de pedido_diarios.z, zINSERT INTO pedido_periodos (z8, arquivado_em, lote, chave_orig_pedido_diarios) SELECT z4, %s, %s, chave FROM pedido_diarios WHERE chave IN (r~   z%s)r?   )rq   r   Tr   r   )rq   rs   r   z+DELETE FROM pedido_diarios WHERE chave IN (a%  
            SELECT chave, chave_orig_pedido_diarios, origem, nropedido, status_pedido, data_criacao,
                   produto, quantidade, preco, formapagamento, cliente
            FROM pedido_periodos
            WHERE id_cliente = %s AND lote = %s
            ORDER BY chave
            )rq   r  linhas_arquivadasarquivor  rq   r   arquivo_gerencialcaminho_gerencialarquivo_gerencial_errors   u%   Falha ao montar relatório gerencial.relatorio_gerencial_erro)r   uuiduuid4hexr   nowr   r*   start_transaction	Exceptionr#   r7   r$   r2   rollbackr   r/   rx   r(  r   r   tuplecommitre   r,  r.  r'   r   r  ry   )r4   r   r   r   r   r  	arquivador   r   r-   chavescolscol_listsql_ins
params_ins	gerencialcur_dicte_gersql_delcur2rel_rowsr   r  r   r,   c_gern_geroerz   s                                r   executar_fechamentorO    s}   
 !7FB::<DID
CXzkkm	""$ 	=@QR\bd@efg@hhkxx  {L  MW  ]_  {`  ab  {c  	d%(\\^N^q)QqT)#ad)^NMMO$.  AR IIKJJL S 15MMO$.abH IIKJJL I 99T? ,H: 6ZSTWT\T\^b]cfijpfq]qTrSsstv 	  //
G(&+C	;;$;/	3C
O[cklI NN?$RUV\R]I]@^?__`aGU6]+{{d{+ _d#		
 -2.

'
"(K-jF !$V
 ==##IMM:K,L,RPR(S(Y(Y([([8>zQTU^_pUqQrsu+0'(+0'( y)).7mmF.C.nGnC*+ IIKJJL e  		 O.  	V$)3u:RTUI	V NNH  803B,-8  2  #a&11IIKJJL 2 IIKJJL s   P0 "N9 2AP0 6
O
O
O
P0 +&P0 A$P0 &O :D4P0 /%P 5P0 9
OP0 OP0 
O3O.(O6 .O33O6 6PP0 
P-P(#P0 (P--P0 0
R*:R%QR%
Q R%Q  R%0R*1R- %R**R- -1Sc                    Sn Sn [        5       n U R                  5       nUR                  S5        UR                  S5        UR                  5       c  UR                  S5        UR                  S5        UR                  5       c   UR                  S5        U R                  5         U(       a  UR                  5         U (       a  U R                  5         gg! [         a     NLf = f! [         a>  n U (       a  U R                  5         O! [         a     Of = f[        SUSS	9   SnANSnAff = f! U(       a  UR                  5         U (       a  U R                  5         f f = f)
zWCria pedido_periodos a partir do layout atual de pedido_diarios e colunas de auditoria.NzX
            CREATE TABLE IF NOT EXISTS pedido_periodos LIKE pedido_diarios
            z5SHOW COLUMNS FROM pedido_periodos LIKE 'arquivado_em'zALTER TABLE pedido_periodos ADD COLUMN arquivado_em DATETIME NULL, ADD COLUMN lote VARCHAR(36) NULL, ADD COLUMN chave_orig_pedido_diarios INT NULLzESHOW INDEX FROM pedido_periodos WHERE Key_name = 'idx_pp_cliente_arq'zMCREATE INDEX idx_pp_cliente_arq ON pedido_periodos (id_cliente, arquivado_em)z[PEDIDO_PERIODOS TABELA ERRO]Tflush)	r   r*   r#   r   r<  r?  r=  printr   )r   r   rz   s      r   ensure_pedido_periodos_tablerT  $  s/   D
C#zkkm	

 	KL<<>!KK@
 	[\<<>!c
 	 IIKJJL     >	 		-q=> IIKJJL sl   B C( C C( 
C%"C( $C%%C( (
D03D
D+
DD+DD+&D3 +D00D3 31E$c                 Z   Sn Sn [        5       n U R                  5       nUR                  S5        [        UR	                  5       =(       d    S/S   5      nUS:X  a!  UR                  S5        U R                  5         U(       a  UR                  5         U (       a  U R                  5         gg! [         a>  n U (       a  U R                  5         O! [         a     Of = f[        SUSS9   SnANsSnAff = f! U(       a  UR                  5         U (       a  U R                  5         f f = f)uQ   Tenta registrar EVENT diário para expurgo > 1 ano (pode falhar sem privilégio).Nz
            SELECT COUNT(*) FROM information_schema.EVENTS
            WHERE EVENT_SCHEMA = DATABASE() AND EVENT_NAME = 'ev_loja_purge_pedido_periodos'
            r   aq  
                CREATE EVENT ev_loja_purge_pedido_periodos
                ON SCHEDULE EVERY 1 DAY
                STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 3 HOUR)
                DO
                  DELETE FROM pedido_periodos
                  WHERE arquivado_em IS NOT NULL
                    AND arquivado_em < DATE_SUB(NOW(), INTERVAL 1 YEAR)
                z[PEDIDO_PERIODOS EVENT ERRO]TrQ  )
r   r*   r#   r2   r   r?  r<  r=  rS  r   )r   r   r   rz   s       r   ensure_purge_eventrV  N  s    D
C"zkkm	
 &A3*+6KK
 KKM IIKJJL   =	 		,at<= IIKJJL sH   A8B. .
C69CC1
CC1CC1,C9 1C66C9 91D*)r   zOptional[str]returnr   )r   r   r   r   rW  zTuple[datetime, datetime])rW  z	List[str])r4   r2   r   r   r   r   rW  zTuple[str, Tuple[Any, ...]])rW  r   )rZ   r   rW  r   )rg   r   rW  zOptional[List[dict]])r4   r2   rW  r&   )r   rf   rW  r   )r4   r2   r   r   r   r   rW  r&   )r4   r2   r   r   r   r   r   rf   r   
List[dict]r   rX  rW  r   )
r4   r2   r   r   r   r   r*   zOptional[Any]rW  r&   )r  r&   rW  r   )r4   r2   r  r   r  r   rW  zTuple[str, str])r4   r2   r  r   r   r   r   r   r   rX  rW  r   )rW  None))__doc__
__future__r   ra   rt   rX   r  r7  collectionsr   r   r   typingr   r   r	   r
   r   databaser   r   r   r/   r7   r9   r<   r[   rk   r{   r   r   r   r   r   r   r  r,  r.  rO  rT  rV  r;   r   r   <module>r_     sO   ^ "  	 	   # ( 3 3 >.:6@0IX 	 	
   	<;F !nnn n
 n 
nb:z
&&
& 	& 		&
 & 	&R
bJ'T&r   