190 lines
6.5 KiB
Python
190 lines
6.5 KiB
Python
import streamlit as st
|
|
import pandas as pd
|
|
import sqlite3
|
|
import os
|
|
from PIL import Image
|
|
import base64
|
|
|
|
st.set_page_config(layout="wide")
|
|
|
|
ARQUIVO_ORIGEM = r"C:\Users\joao.herculano\GRUPO GINSENG\Assistência Suprimentos - 2025\SUPRIMENTOS\BD_LANÇAMENTOS\BOT\BOT - C16\Lançamento BOTI C202516.xlsx"
|
|
TABELA_SQLITE = "dados_promocao"
|
|
BANCO = r"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\CODIGOS\\Planilha online devolução comercial\\dados.db"
|
|
|
|
BG_PATH = r"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\ANALISE_ESTOQUE\\PACOTE DE COMUNICAÇÃO - GINSENG 2025\\POWER POINT\\BACKGROUNDS\\bg.branco001.jpg"
|
|
|
|
@st.cache_data(show_spinner=False)
|
|
def carregar_dados_excel():
|
|
return pd.read_excel(ARQUIVO_ORIGEM)
|
|
|
|
def set_background(jpg_file):
|
|
with open(jpg_file, "rb") as f:
|
|
base64_img = base64.b64encode(f.read()).decode()
|
|
css = f"""
|
|
<style>
|
|
.stApp {{
|
|
background-image: url("data:image/jpg;base64,{base64_img}");
|
|
background-size: cover;
|
|
}}
|
|
header {{ display: none !important; }}
|
|
#MainMenu {{ visibility: hidden; }}
|
|
footer {{ visibility: hidden; }}
|
|
</style>
|
|
"""
|
|
st.markdown(css, unsafe_allow_html=True)
|
|
|
|
set_background(BG_PATH)
|
|
|
|
if "autenticado" not in st.session_state:
|
|
st.session_state.autenticado = False
|
|
if "pagina_liberada" not in st.session_state:
|
|
st.session_state.pagina_liberada = False
|
|
|
|
conn = sqlite3.connect(BANCO, check_same_thread=False)
|
|
cursor = conn.cursor()
|
|
|
|
# LOGIN via tabela de usuários no banco
|
|
if not st.session_state.autenticado:
|
|
st.header("Bem-vindo!")
|
|
st.subheader("A plataforma GINSENG de pedidos.")
|
|
with st.form(key="login_form"):
|
|
email = st.text_input("Digite seu email:", type="default")
|
|
senha = st.text_input("Digite sua senha:", type="password")
|
|
submit = st.form_submit_button("Entrar")
|
|
|
|
if submit:
|
|
cursor.execute("SELECT supervisor FROM usuarios WHERE email = ? AND senha = ?", (email, senha))
|
|
resultados = cursor.fetchall()
|
|
if resultados:
|
|
supervisores = [r[0] for r in resultados]
|
|
st.session_state.autenticado = True
|
|
st.session_state.email = email
|
|
st.session_state.supervisores = supervisores
|
|
st.rerun()
|
|
else:
|
|
st.error("Email ou senha inválidos.")
|
|
st.stop()
|
|
else:
|
|
st.stop()
|
|
|
|
banco_existe = os.path.exists(BANCO)
|
|
if not banco_existe:
|
|
df_excel = carregar_dados_excel()
|
|
df_excel.to_sql(TABELA_SQLITE, conn, if_exists="replace", index=False)
|
|
|
|
# Criação de tabela apenas se não existir
|
|
cursor.execute(f"""
|
|
CREATE TABLE IF NOT EXISTS {TABELA_SQLITE} AS
|
|
SELECT * FROM carregar_dados_excel() LIMIT 0
|
|
""")
|
|
|
|
# Lê do banco
|
|
df = pd.read_sql(f"SELECT * FROM {TABELA_SQLITE}", conn)
|
|
|
|
if st.session_state.autenticado and not st.session_state.pagina_liberada:
|
|
st.title("Resumo")
|
|
|
|
if "SUGESTÃO COMERCIAL" in df.columns:
|
|
df_supervisor = df[df["SUPERVISOR"].isin(st.session_state.supervisores)]
|
|
|
|
ufs = sorted(df_supervisor["UF"].dropna().unique())
|
|
|
|
filtro_uf = st.multiselect("Filtrar por UF", ufs, default=ufs)
|
|
df_filtro = df_supervisor[df_supervisor["UF"].isin(filtro_uf)]
|
|
|
|
resumo = df_filtro.groupby("DESCRIÇÃO PDV", as_index=False)["SUGESTÃO COMERCIAL"].sum()
|
|
resumo = resumo.sort_values("SUGESTÃO COMERCIAL", ascending=False)
|
|
total = df_filtro["SUGESTÃO COMERCIAL"].sum()
|
|
|
|
st.subheader("Resumo por PDV")
|
|
st.dataframe(resumo, use_container_width=True)
|
|
st.markdown(f"**Total sugerido:** {total:,.2f}")
|
|
|
|
if st.button("Continuar para planilha de edição"):
|
|
st.session_state.pagina_liberada = True
|
|
st.rerun()
|
|
else:
|
|
st.stop()
|
|
|
|
if "edicoes" not in st.session_state:
|
|
st.session_state.edicoes = {}
|
|
|
|
if st.session_state.pagina_liberada:
|
|
if st.button("Voltar para resumo"):
|
|
st.session_state.pagina_liberada = False
|
|
st.rerun()
|
|
|
|
supervisores_usuario = st.session_state.supervisores
|
|
|
|
coluna_editavel = "SUGESTÃO COMERCIAL"
|
|
colunas_usadas = ['SUPERVISOR', 'UF', 'DESCRIÇÃO PDV','DESCRIÇÃO DO LANÇAMENTO', 'IAF','% CONSUMIDOR', '% REVENDEDOR','PV GINSENG',
|
|
'SUGESTÃO ABASTECIMENTO', coluna_editavel]
|
|
|
|
df = df[colunas_usadas]
|
|
df_usuario = df[df["SUPERVISOR"].isin(supervisores_usuario)].copy()
|
|
|
|
pdvs = df_usuario["DESCRIÇÃO PDV"].unique()
|
|
pdv_filtrado = st.multiselect("Filtrar por PDV (opcional)", sorted(pdvs), default=pdvs)
|
|
|
|
df_filtrado = df_usuario[df_usuario["DESCRIÇÃO PDV"].isin(pdv_filtrado)].copy()
|
|
df_filtrado["__idx"] = df_filtrado.index
|
|
|
|
for idx in df_filtrado.index:
|
|
if idx in st.session_state.edicoes:
|
|
for col, val in st.session_state.edicoes[idx].items():
|
|
df_filtrado.at[idx, col] = val
|
|
|
|
st.write("Aqui estão seus dados filtrados:")
|
|
|
|
colunas_desabilitadas = [col for col in df_filtrado.columns if col != coluna_editavel]
|
|
|
|
editado = st.data_editor(
|
|
df_filtrado,
|
|
disabled=colunas_desabilitadas,
|
|
num_rows="fixed",
|
|
use_container_width=True,
|
|
height=800,
|
|
hide_index=True,
|
|
key="editor"
|
|
)
|
|
|
|
if st.button("Salvar alterações"):
|
|
atualizacoes = 0
|
|
for i, row in editado.iterrows():
|
|
original_idx = row["__idx"]
|
|
novo_val = row[coluna_editavel]
|
|
|
|
if pd.isna(novo_val) or str(novo_val).strip() == "":
|
|
continue
|
|
|
|
linha_ref = df_filtrado.loc[original_idx]
|
|
|
|
cursor.execute(f"""
|
|
UPDATE {TABELA_SQLITE}
|
|
SET "{coluna_editavel}" = ?
|
|
WHERE SUPERVISOR = ?
|
|
AND "DESCRIÇÃO PDV" = ?
|
|
AND "DESCRIÇÃO DO LANÇAMENTO" = ?
|
|
""", (
|
|
novo_val,
|
|
linha_ref["SUPERVISOR"],
|
|
linha_ref["DESCRIÇÃO PDV"],
|
|
linha_ref["DESCRIÇÃO DO LANÇAMENTO"]
|
|
))
|
|
|
|
atualizacoes += 1
|
|
if original_idx not in st.session_state.edicoes:
|
|
st.session_state.edicoes[original_idx] = {}
|
|
st.session_state.edicoes[original_idx][coluna_editavel] = novo_val
|
|
|
|
conn.commit()
|
|
|
|
if atualizacoes:
|
|
st.success(f"{atualizacoes} alterações salvas com sucesso!")
|
|
st.session_state.edicoes.clear()
|
|
st.rerun()
|
|
else:
|
|
st.info("Nenhuma alteração válida para salvar.")
|
|
|
|
conn.close()
|