Viewing: 10Cia_Ilheus02.py
#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}" # ============================== # 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" # remove o texto do label ) # ============================== # CONSULTA # ============================== query = """ SELECT COD_UND, UNIDADE, QNTD_PEDIDOS, VALOR_TOTAL, NVL(MTA_META, 0) AS MTA_META, NVL(MTA_BIG_META, 0) AS MTA_BIG_META FROM ( SELECT TPED_UNIDADE_FK_PK AS cod_und, TUND_UNIDADE.TUND_FANTASIA AS unidade, SUM(QTD) AS qntd_pedidos, SUM(TPED_VALOR_TOTAL_PEDIDO) AS valor_total, BIG_METAS.MTA_META, BIG_METAS.MTA_BIG_META FROM ( SELECT TPED_PEDIDO_VENDA.TPED_UNIDADE_FK_PK, TPED_DATA_EMISSAO, COUNT(TPED_PEDIDO_VENDA.TPED_NUMERO_PEDIDO_PK) AS QTD, SUM(TPED_PEDIDO_VENDA.TPED_VALOR_TOTAL_PEDIDO) AS TPED_VALOR_TOTAL_PEDIDO FROM TPED_PEDIDO_VENDA 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, TPED_DATA_EMISSAO UNION ALL SELECT TPED_HISTORICO_VENDA.TPED_UNIDADE_FK_PK, TPED_DATA_EMISSAO, COUNT(TPED_HISTORICO_VENDA.TPED_NUMERO_PEDIDO_PK) AS QTD, SUM(TPED_HISTORICO_VENDA.TPED_VALOR_TOTAL_PEDIDO) AS TPED_VALOR_TOTAL_PEDIDO FROM TPED_HISTORICO_VENDA 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, TPED_DATA_EMISSAO ) 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') GROUP BY TPED_UNIDADE_FK_PK, TUND_UNIDADE.TUND_FANTASIA, BIG_METAS.MTA_META, BIG_METAS.MTA_BIG_META ) """ # ============================== # Á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() meta = df['mta_meta'].sum() big_meta = df['mta_big_meta'].sum() 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;'> <h3 style='color: #2e7d32; margin-bottom: 5px;'>💰 Total de Vendas</h3> <h1 style='font-size: 70px; color: #1b5e20; margin: 10px 0;'>{formatar_moeda(valor_total)}</h1> <p style='font-size: 18px; color: gray; margin-top: 0;'> Meta: {formatar_moeda(meta)} | BigMeta: {formatar_moeda(big_meta)} </p> </div> """, unsafe_allow_html=True )
Return