Viewing: dashCajazeiras.py
#Cajazeiras ( '4', '5' ) #http://162.214.65.39:8506/ #nohup python3 -m streamlit run dashCajazeiras.py --server.port 8506 --server.address 0.0.0.0 > dashCajazeiras.log 2>&1 & #GrupoBiG #http://162.214.65.39:8510/ #nohup python3 -m streamlit run 10Cia_Ilheus02.py --server.port 8510 --server.address 0.0.0.0 > dashGrupoBiG.log 2>&1 & import streamlit as st import cx_Oracle import pandas as pd import datetime from sqlalchemy import create_engine import locale import base64 from Crypto.Cipher import AES from Crypto.Protocol.KDF import PBKDF2 # ============================== # CONFIGURAÇÃO DO APP # ============================== st.set_page_config( page_title="10&Cia Ilhéus Zona Sul", page_icon="🛒", layout="wide" ) MASTER_PASSWORD = "MinhaSenhaMestra123!" SALT = b"SaltFixo12345678" ITERATIONS = 10000 # ============================== # LOCALE / FORMATAÇÃO # ============================== try: locale.setlocale(locale.LC_ALL, 'pt_BR.UTF-8') except locale.Error: locale.setlocale(locale.LC_ALL, 'C') def formatar_moeda(valor): try: valor_formatado = "{:,.2f}".format(valor) valor_formatado = valor_formatado.replace(",", "X").replace(".", ",").replace("X", ".") return f"R$ {valor_formatado}" except ValueError: return f"R${valor:,.2f}" def formatar_numero(valor): return f"{valor:,}".replace(",", ".") # ============================== # CRIPTOGRAFIA # ============================== def generate_key_iv(): key_iv = PBKDF2( MASTER_PASSWORD.encode("utf-8"), SALT, dkLen=48, # 32 bytes key + 16 bytes IV count=ITERATIONS ) return key_iv[:32], key_iv[32:] def decrypt(cipher_text: str) -> str: """Descriptografa texto Base64""" key, iv = generate_key_iv() cipher = AES.new(key, AES.MODE_CBC, iv) decrypted = cipher.decrypt(base64.b64decode(cipher_text)) pad_len = decrypted[-1] text = decrypted[:-pad_len].decode("utf-8", errors="ignore") return text.lstrip("\ufeff") # ============================== # CONEXÃO BANCO # ============================== @st.cache_resource def conectar_banco(): try: encrypted_pass = "+ivGpR7n9D4zKHONh/3W2A==" # senha criptografada _pass = decrypt(encrypted_pass) connection = cx_Oracle.connect( user="EDIUSER", password=_pass, dsn="187.109.221.38:1521/PROTON" ) engine = create_engine( f'oracle+cx_oracle://EDIUSER:{_pass}@187.109.221.38:1521/PROTON' ) return connection, engine except cx_Oracle.DatabaseError as e: st.error(f"Erro ao conectar com o banco de dados: {e}") st.stop() connection, engine = conectar_banco() # ============================== # TÍTULO # ============================== #st.markdown( # "<h2 style='text-align: center; color: #2e7d32; margin-bottom: 10px;'>📊 Vendas - 10&Cia Ilhéus Zona Sul</h2>", # unsafe_allow_html=True #) # ============================== # SELEÇÃO DE DATA (CENTRALIZADA) # ============================== col1, col2, col3 = st.columns([1,2,1]) with col2: data_escolhida = st.date_input( "Selecione a data", datetime.datetime.now().date(), format="DD/MM/YYYY", label_visibility="collapsed" # oculta o label ) # ============================== # CONSULTA # ============================== query = """ SELECT COD_UND, UNIDADE, SUM(QNTD_PEDIDOS) AS QNTD_PEDIDOS, SUM(VALOR_TOTAL) AS VALOR_TOTAL, NVL(SUM(MTA_META), 0) AS MTA_META, NVL(SUM(MTA_BIG_META), 0) AS MTA_BIG_META FROM ( SELECT TPED_UNIDADE_FK_PK AS cod_und, TUND_UNIDADE.TUND_FANTASIA AS unidade, COUNT(TPED_PEDIDO_VENDA.TPED_NUMERO_PEDIDO_PK) AS qntd_pedidos, SUM(TPED_PEDIDO_VENDA.TPED_VALOR_TOTAL_PEDIDO) AS valor_total, BIG_METAS.MTA_META, BIG_METAS.MTA_BIG_META FROM TPED_PEDIDO_VENDA LEFT JOIN TUND_UNIDADE ON TUND_UNIDADE.TUND_UNIDADE_PK = TPED_UNIDADE_FK_PK LEFT JOIN DBAUSER.BIG_METAS ON DBAUSER.BIG_METAS.MTA_UNIDADE_FK_PK = TPED_UNIDADE_FK_PK AND TO_CHAR(TRUNC(DBAUSER.BIG_METAS.MTA_MES_ANO, 'MM'), 'MMYYYY') = TO_CHAR(TRUNC(:data_escolhida, 'MM'), 'MMYYYY') WHERE TPED_PEDIDO_VENDA.TPED_UNIDADE_FK_PK = '23' AND TRUNC(TPED_PEDIDO_VENDA.TPED_DATA_EMISSAO) = TRUNC(:data_escolhida) AND TPED_STATUS_PEDIDO = 'MA' AND TPED_PEDIDO_VENDA.TPED_NATUREZA_MOVIMENTACAO = 'VM' GROUP BY TPED_UNIDADE_FK_PK, TUND_UNIDADE.TUND_FANTASIA, BIG_METAS.MTA_META, BIG_METAS.MTA_BIG_META UNION ALL SELECT TPED_UNIDADE_FK_PK AS cod_und, TUND_UNIDADE.TUND_FANTASIA AS unidade, COUNT(TPED_HISTORICO_VENDA.TPED_NUMERO_PEDIDO_PK) AS qntd_pedidos, SUM(TPED_HISTORICO_VENDA.TPED_VALOR_TOTAL_PEDIDO) AS valor_total, BIG_METAS.MTA_META, BIG_METAS.MTA_BIG_META FROM TPED_HISTORICO_VENDA LEFT JOIN TUND_UNIDADE ON TUND_UNIDADE.TUND_UNIDADE_PK = TPED_UNIDADE_FK_PK LEFT JOIN DBAUSER.BIG_METAS ON DBAUSER.BIG_METAS.MTA_UNIDADE_FK_PK = TPED_UNIDADE_FK_PK AND TO_CHAR(TRUNC(DBAUSER.BIG_METAS.MTA_MES_ANO, 'MM'), 'MMYYYY') = TO_CHAR(TRUNC(:data_escolhida, 'MM'), 'MMYYYY') WHERE TPED_HISTORICO_VENDA.TPED_UNIDADE_FK_PK = '23' AND TRUNC(TPED_HISTORICO_VENDA.TPED_DATA_EMISSAO) = TRUNC(:data_escolhida) AND TPED_STATUS_PEDIDO = 'MA' AND TPED_HISTORICO_VENDA.TPED_NATUREZA_MOVIMENTACAO = 'VM' GROUP BY TPED_UNIDADE_FK_PK, TUND_UNIDADE.TUND_FANTASIA, BIG_METAS.MTA_META, BIG_METAS.MTA_BIG_META ) GROUP BY COD_UND, UNIDADE """ # ============================== # ÁREA PRINCIPAL # ============================== if st.button("🔄 Atualizar", use_container_width=True): df = pd.read_sql(query, engine, params={"data_escolhida": data_escolhida}) if df.empty: st.warning("Não há vendas registradas nesta data.") else: valor_total = df['valor_total'].sum() qntd_pedidos = df['qntd_pedidos'].sum() meta = df['mta_meta'].sum() big_meta = df['mta_big_meta'].sum() ticket_medio = valor_total / qntd_pedidos if qntd_pedidos > 0 else 0 st.markdown( f""" <div style='text-align: center; padding: 20px; background-color: #f0f9f0; border-radius: 15px; box-shadow: 0 3px 8px rgba(0,0,0,0.1); margin-top: 15px;'> <h2 style='color: #2e7d32;'>💰 Total de Vendas</h2> <h1 style='font-size: 40px; color: #1b5e20; margin: 5px 0;'>{formatar_moeda(valor_total)}</h1> <p style='font-size: 20px; color: gray; margin: 3px 0;'> 🛒 Quantidade de Vendas: <b>{formatar_numero(qntd_pedidos)}</b> </p> <p style='font-size: 20px; color: gray; margin: 3px 0;'> 🎯 Ticket Médio: <b>{formatar_moeda(ticket_medio)}</b> </p> <p style='font-size: 18px; color: gray; margin-top: 8px;'> Meta: {formatar_moeda(meta)} | BigMeta: {formatar_moeda(big_meta)} </p> </div> """, unsafe_allow_html=True )
Return