915 lines
28 KiB
Plaintext
915 lines
28 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "318c9652",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import smtplib\n",
|
|
"import ssl\n",
|
|
"import pyodbc\n",
|
|
"import configparser\n",
|
|
"import pandas as pd\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import matplotlib.dates as mdates\n",
|
|
"import matplotlib.ticker as mtick\n",
|
|
"import seaborn as sns\n",
|
|
"from email.message import EmailMessage\n",
|
|
"from email.utils import make_msgid\n",
|
|
"from email.mime.image import MIMEImage\n",
|
|
"from pathlib import Path\n",
|
|
"from datetime import datetime, time"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "b0d5aacc",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_15612\\775955969.py:22: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n",
|
|
" datas = pd.read_sql(query, conn)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"config = configparser.ConfigParser()\n",
|
|
"config.read(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\CODIGOS\\relatório_improdutivo\\credenciais.ini\")\n",
|
|
"\n",
|
|
"# Conexão com o banco\n",
|
|
"conn = pyodbc.connect(\n",
|
|
" f\"DRIVER={{SQL Server}};\"\n",
|
|
" f\"SERVER={config['banco']['host']},1433;\"\n",
|
|
" f\"DATABASE=GINSENG;\"\n",
|
|
" f\"UID={config['banco']['user']};\"\n",
|
|
" f\"PWD={config['banco']['password']}\")\n",
|
|
"\n",
|
|
"# 1. Criar dados fictícios e gerar Excel\n",
|
|
"query = '''\n",
|
|
"SELECT \n",
|
|
" cd.Ciclo,\n",
|
|
" min(emh.data_estoque)\n",
|
|
"FROM estoque_mar_historico emh\n",
|
|
"INNER JOIN ciclos_data_2025 cd \n",
|
|
" ON cd.[Date] = emh.data_estoque and emh.data_estoque > '2025-06-19'\n",
|
|
"GROUP BY cd.Ciclo\n",
|
|
"'''\n",
|
|
"datas = pd.read_sql(query, conn)\n",
|
|
"\n",
|
|
"conn.close()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "1e6373af",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"['2025-06-20', '2025-06-26', '2025-07-16', '2025-08-06']"
|
|
]
|
|
},
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"lista = datas.iloc[:, 1].tolist()\n",
|
|
"lista"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "071290d7",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"datas_lista = datas.iloc[:, 1].tolist() # sua lista de datas\n",
|
|
"\n",
|
|
"# monta os placeholders\n",
|
|
"placeholders = \", \".join([\"?\"] * len(datas_lista))\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"id": "004a9497",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_15612\\485056913.py:25: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n",
|
|
" estoque_data = pd.read_sql(query, conn, params=datas_lista)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Conexão com o banco\n",
|
|
"conn = pyodbc.connect(\n",
|
|
" f\"DRIVER={{SQL Server}};\"\n",
|
|
" f\"SERVER={config['banco']['host']},1433;\"\n",
|
|
" f\"DATABASE=GINSENG;\"\n",
|
|
" f\"UID={config['banco']['user']};\"\n",
|
|
" f\"PWD={config['banco']['password']}\")\n",
|
|
"\n",
|
|
"query = f\"\"\"\n",
|
|
"SELECT \n",
|
|
" emh.PDV,\n",
|
|
" emh.SKU,\n",
|
|
" emh.[ESTOQUE ATUAL],\n",
|
|
" emh.[ESTOQUE EM TRANSITO],\n",
|
|
" emh.[PEDIDO PENDENTE],\n",
|
|
" emh.[DDV PREVISTO],\n",
|
|
" cd.Ciclo,\n",
|
|
" emh.data_estoque\n",
|
|
"FROM estoque_mar_historico emh\n",
|
|
"INNER JOIN ciclos_data_2025 cd \n",
|
|
" ON cd.[Date] = emh.data_estoque and cd.MARCA ='BOT'\n",
|
|
"WHERE emh.data_estoque IN ({placeholders})\n",
|
|
"\"\"\"\n",
|
|
"\n",
|
|
"estoque_data = pd.read_sql(query, conn, params=datas_lista)\n",
|
|
"conn.close()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "9a4ddcad",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>PDV</th>\n",
|
|
" <th>SKU</th>\n",
|
|
" <th>ESTOQUE ATUAL</th>\n",
|
|
" <th>ESTOQUE EM TRANSITO</th>\n",
|
|
" <th>PEDIDO PENDENTE</th>\n",
|
|
" <th>DDV PREVISTO</th>\n",
|
|
" <th>Ciclo</th>\n",
|
|
" <th>data_estoque</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>20968</td>\n",
|
|
" <td>94394</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>C202509</td>\n",
|
|
" <td>2025-06-26</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>20969</td>\n",
|
|
" <td>94394</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>C202509</td>\n",
|
|
" <td>2025-06-26</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>20970</td>\n",
|
|
" <td>94394</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>C202509</td>\n",
|
|
" <td>2025-06-26</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>20986</td>\n",
|
|
" <td>94394</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>C202509</td>\n",
|
|
" <td>2025-06-26</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>20988</td>\n",
|
|
" <td>94394</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>C202509</td>\n",
|
|
" <td>2025-06-26</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" PDV SKU ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE \\\n",
|
|
"0 20968 94394 0 0 0 \n",
|
|
"1 20969 94394 0 0 0 \n",
|
|
"2 20970 94394 0 0 0 \n",
|
|
"3 20986 94394 0 0 0 \n",
|
|
"4 20988 94394 0 0 0 \n",
|
|
"\n",
|
|
" DDV PREVISTO Ciclo data_estoque \n",
|
|
"0 None C202509 2025-06-26 \n",
|
|
"1 None C202509 2025-06-26 \n",
|
|
"2 None C202509 2025-06-26 \n",
|
|
"3 None C202509 2025-06-26 \n",
|
|
"4 None C202509 2025-06-26 "
|
|
]
|
|
},
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"estoque_data.head()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "88bd3679",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_15612\\731793387.py:22: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n",
|
|
" draft_data = pd.read_sql(query, conn, params=datas_lista)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Conexão com o banco\n",
|
|
"conn = pyodbc.connect(\n",
|
|
" f\"DRIVER={{SQL Server}};\"\n",
|
|
" f\"SERVER={config['banco']['host']},1433;\"\n",
|
|
" f\"DATABASE=GINSENG;\"\n",
|
|
" f\"UID={config['banco']['user']};\"\n",
|
|
" f\"PWD={config['banco']['password']}\")\n",
|
|
"\n",
|
|
"query = f\"\"\"\n",
|
|
"SELECT \n",
|
|
" d.loja_id AS PDV,\n",
|
|
" cast(d.code as int) as SKU,\n",
|
|
" d.codcategory AS CATEGORIA,\n",
|
|
" d.salescurve AS Curva,\n",
|
|
" d.isproductdeactivated AS Desativado,\n",
|
|
" d.criticalitem_iscritical AS Item_Critico,\n",
|
|
" d.[data] as data_estoque\n",
|
|
"from draft_historico d\n",
|
|
"where d.[data] in ({placeholders})\n",
|
|
"\"\"\"\n",
|
|
"\n",
|
|
"draft_data = pd.read_sql(query, conn, params=datas_lista)\n",
|
|
"conn.close()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"id": "4590cc77",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>PDV</th>\n",
|
|
" <th>SKU</th>\n",
|
|
" <th>CATEGORIA</th>\n",
|
|
" <th>Curva</th>\n",
|
|
" <th>Desativado</th>\n",
|
|
" <th>Item_Critico</th>\n",
|
|
" <th>data_estoque</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>20986</td>\n",
|
|
" <td>51470</td>\n",
|
|
" <td>CUIDADOS FACIAIS</td>\n",
|
|
" <td>C</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-06-20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>12826</td>\n",
|
|
" <td>86340</td>\n",
|
|
" <td>MAQUIAGEM</td>\n",
|
|
" <td>E</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-06-20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>21278</td>\n",
|
|
" <td>58334</td>\n",
|
|
" <td>MAQUIAGEM</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-06-20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>20995</td>\n",
|
|
" <td>57761</td>\n",
|
|
" <td>SOLAR</td>\n",
|
|
" <td>E</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-06-20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>24254</td>\n",
|
|
" <td>75568</td>\n",
|
|
" <td>MAQUIAGEM</td>\n",
|
|
" <td>C</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-06-20</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" PDV SKU CATEGORIA Curva Desativado Item_Critico data_estoque\n",
|
|
"0 20986 51470 CUIDADOS FACIAIS C 0 0 2025-06-20\n",
|
|
"1 12826 86340 MAQUIAGEM E 0 0 2025-06-20\n",
|
|
"2 21278 58334 MAQUIAGEM B 0 0 2025-06-20\n",
|
|
"3 20995 57761 SOLAR E 0 0 2025-06-20\n",
|
|
"4 24254 75568 MAQUIAGEM C 0 0 2025-06-20"
|
|
]
|
|
},
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"draft_data.head()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"id": "edcfa1bf",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"0 51470\n",
|
|
"1 86340\n",
|
|
"2 58334\n",
|
|
"3 57761\n",
|
|
"4 75568\n",
|
|
"Name: SKU, dtype: object"
|
|
]
|
|
},
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"draft_data['SKU'] = draft_data['SKU'].astype(str)\n",
|
|
"\n",
|
|
"draft_data['SKU'].head()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"id": "300e5866",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>PDV</th>\n",
|
|
" <th>SKU</th>\n",
|
|
" <th>ESTOQUE ATUAL</th>\n",
|
|
" <th>ESTOQUE EM TRANSITO</th>\n",
|
|
" <th>PEDIDO PENDENTE</th>\n",
|
|
" <th>DDV PREVISTO</th>\n",
|
|
" <th>Ciclo</th>\n",
|
|
" <th>data_estoque</th>\n",
|
|
" <th>CATEGORIA</th>\n",
|
|
" <th>Curva</th>\n",
|
|
" <th>Desativado</th>\n",
|
|
" <th>Item_Critico</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>21277</td>\n",
|
|
" <td>88146</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>C202509</td>\n",
|
|
" <td>2025-06-20</td>\n",
|
|
" <td>MAQUIAGEM</td>\n",
|
|
" <td>E</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>3546</td>\n",
|
|
" <td>87960</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0.07</td>\n",
|
|
" <td>C202509</td>\n",
|
|
" <td>2025-06-20</td>\n",
|
|
" <td>MAQUIAGEM</td>\n",
|
|
" <td>C</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>4560</td>\n",
|
|
" <td>87960</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0.07</td>\n",
|
|
" <td>C202509</td>\n",
|
|
" <td>2025-06-20</td>\n",
|
|
" <td>MAQUIAGEM</td>\n",
|
|
" <td>C</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>5699</td>\n",
|
|
" <td>87960</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0.05</td>\n",
|
|
" <td>C202509</td>\n",
|
|
" <td>2025-06-20</td>\n",
|
|
" <td>MAQUIAGEM</td>\n",
|
|
" <td>C</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>12522</td>\n",
|
|
" <td>87960</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0.04</td>\n",
|
|
" <td>C202509</td>\n",
|
|
" <td>2025-06-20</td>\n",
|
|
" <td>MAQUIAGEM</td>\n",
|
|
" <td>C</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" PDV SKU ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE \\\n",
|
|
"0 21277 88146 0 0 0 \n",
|
|
"1 3546 87960 8 0 0 \n",
|
|
"2 4560 87960 3 0 0 \n",
|
|
"3 5699 87960 4 0 0 \n",
|
|
"4 12522 87960 0 1 0 \n",
|
|
"\n",
|
|
" DDV PREVISTO Ciclo data_estoque CATEGORIA Curva Desativado Item_Critico \n",
|
|
"0 0 C202509 2025-06-20 MAQUIAGEM E 0 0 \n",
|
|
"1 0.07 C202509 2025-06-20 MAQUIAGEM C 0 0 \n",
|
|
"2 0.07 C202509 2025-06-20 MAQUIAGEM C 0 0 \n",
|
|
"3 0.05 C202509 2025-06-20 MAQUIAGEM C 0 0 \n",
|
|
"4 0.04 C202509 2025-06-20 MAQUIAGEM C 0 0 "
|
|
]
|
|
},
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"df_junto = pd.merge(estoque_data,draft_data,on =['PDV',\t'SKU','data_estoque'],how='inner')\n",
|
|
"\n",
|
|
"df_junto.head()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"id": "fbc812db",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from datetime import datetime\n",
|
|
"from dateutil.relativedelta import relativedelta\n",
|
|
"\n",
|
|
"# Pegar a primeira data\n",
|
|
"primeira_data = datetime.strptime(datas_lista[0], \"%Y-%m-%d\")\n",
|
|
"\n",
|
|
"# Subtrair 1 mês\n",
|
|
"data_inicio = primeira_data - relativedelta(months=1)\n",
|
|
"\n",
|
|
"# Formatar para string no formato SQL Server (YYYY-MM-DD)\n",
|
|
"data_inicio_str = data_inicio.strftime(\"%Y-%m-%d\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "dffcbc1d",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'2025-05-20'"
|
|
]
|
|
},
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"data_inicio_str"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"id": "1c7e4715",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_15612\\1525897645.py:46: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n",
|
|
" pedidos = pd.read_sql(query, conn, params=[data_inicio_str])\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Conexão com o banco\n",
|
|
"conn = pyodbc.connect(\n",
|
|
" f\"DRIVER={{SQL Server}};\"\n",
|
|
" f\"SERVER={config['banco']['host']},1433;\"\n",
|
|
" f\"DATABASE=GINSENG;\"\n",
|
|
" f\"UID={config['banco']['user']};\"\n",
|
|
" f\"PWD={config['banco']['password']}\")\n",
|
|
"\n",
|
|
"query = \"\"\"\n",
|
|
"SELECT\n",
|
|
" fne.cnpj_destinatario,\n",
|
|
" fne.cnf AS Nota_Fiscal,\n",
|
|
" fne.data_emissao,\n",
|
|
" fnei.codigo_pedido,\n",
|
|
" fnei.n_item,\n",
|
|
" fnei.cod_produto,\n",
|
|
" fnei.produto,\n",
|
|
" fnei.quantidade,\n",
|
|
" fnei.valor_unitario,\n",
|
|
" fnei.valor_total_produtos,\n",
|
|
" b.PDV,\n",
|
|
" p.quantity_accepted as qtd_aceita_industria,\n",
|
|
" p.status \n",
|
|
"FROM fato_notas_entrada fne\n",
|
|
"INNER JOIN fato_notas_entrada_itens fnei ON fne.chave = fnei.chave\n",
|
|
"INNER JOIN base_pdvs b ON fne.cnpj_destinatario = b.CNPJ\n",
|
|
"LEFT JOIN (\n",
|
|
" SELECT\n",
|
|
" sellOrders,\n",
|
|
" sku,\n",
|
|
" storeCode,\n",
|
|
" MAX(quantity_accepted) AS quantity_accepted,\n",
|
|
" MAX(status) AS status,\n",
|
|
" MAX(pedido_id) AS pedido_id,\n",
|
|
" MAX([date]) AS [date],\n",
|
|
" MAX(deliveryDate) AS deliveryDate\n",
|
|
" FROM produtos_pedidos\n",
|
|
" GROUP BY sellOrders, sku, storeCode\n",
|
|
") p \n",
|
|
" ON p.sellOrders = fnei.codigo_pedido \n",
|
|
" AND p.sku = fnei.cod_produto \n",
|
|
" AND p.storeCode = b.PDV \n",
|
|
"WHERE fne.data_emissao >= ?\n",
|
|
"\"\"\"\n",
|
|
"\n",
|
|
"pedidos = pd.read_sql(query, conn, params=[data_inicio_str])\n",
|
|
"conn.close()\n",
|
|
"\n",
|
|
"\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"id": "2a594a3a",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'2025-06-20'"
|
|
]
|
|
},
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"datas_lista[0]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"id": "d6617c7b",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>cnpj_destinatario</th>\n",
|
|
" <th>Nota_Fiscal</th>\n",
|
|
" <th>data_emissao</th>\n",
|
|
" <th>codigo_pedido</th>\n",
|
|
" <th>n_item</th>\n",
|
|
" <th>cod_produto</th>\n",
|
|
" <th>produto</th>\n",
|
|
" <th>quantidade</th>\n",
|
|
" <th>valor_unitario</th>\n",
|
|
" <th>valor_total_produtos</th>\n",
|
|
" <th>PDV</th>\n",
|
|
" <th>qtd_aceita_industria</th>\n",
|
|
" <th>status</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>08489643005545</td>\n",
|
|
" <td>000806049</td>\n",
|
|
" <td>2025-05-24</td>\n",
|
|
" <td>0163731443</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>86019</td>\n",
|
|
" <td>ESTJ ARBO AMOR 25</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>59.1150</td>\n",
|
|
" <td>236.46</td>\n",
|
|
" <td>20986</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>None</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>08489643006193</td>\n",
|
|
" <td>000806913</td>\n",
|
|
" <td>2025-05-27</td>\n",
|
|
" <td>0163731450</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>85294</td>\n",
|
|
" <td>ESTJ QUASAR CLASSIC AMOR/25</td>\n",
|
|
" <td>10</td>\n",
|
|
" <td>55.6330</td>\n",
|
|
" <td>556.33</td>\n",
|
|
" <td>20991</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>None</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>08489643006193</td>\n",
|
|
" <td>000806913</td>\n",
|
|
" <td>2025-05-27</td>\n",
|
|
" <td>0163731450</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>85294</td>\n",
|
|
" <td>ESTJ QUASAR CLASSIC AMOR/25</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>55.6320</td>\n",
|
|
" <td>278.16</td>\n",
|
|
" <td>20991</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>None</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>08489643004654</td>\n",
|
|
" <td>000806533</td>\n",
|
|
" <td>2025-05-27</td>\n",
|
|
" <td>0163731452</td>\n",
|
|
" <td>10</td>\n",
|
|
" <td>86019</td>\n",
|
|
" <td>ESTJ ARBO AMOR 25</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>59.1163</td>\n",
|
|
" <td>1418.79</td>\n",
|
|
" <td>20993</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>None</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>08489643005898</td>\n",
|
|
" <td>000806995</td>\n",
|
|
" <td>2025-05-27</td>\n",
|
|
" <td>0163731459</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>85293</td>\n",
|
|
" <td>ESTJ HER CODE AMOR/25</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>121.9821</td>\n",
|
|
" <td>2927.57</td>\n",
|
|
" <td>20997</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>None</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" cnpj_destinatario Nota_Fiscal data_emissao codigo_pedido n_item \\\n",
|
|
"0 08489643005545 000806049 2025-05-24 0163731443 3 \n",
|
|
"1 08489643006193 000806913 2025-05-27 0163731450 3 \n",
|
|
"2 08489643006193 000806913 2025-05-27 0163731450 4 \n",
|
|
"3 08489643004654 000806533 2025-05-27 0163731452 10 \n",
|
|
"4 08489643005898 000806995 2025-05-27 0163731459 2 \n",
|
|
"\n",
|
|
" cod_produto produto quantidade valor_unitario \\\n",
|
|
"0 86019 ESTJ ARBO AMOR 25 4 59.1150 \n",
|
|
"1 85294 ESTJ QUASAR CLASSIC AMOR/25 10 55.6330 \n",
|
|
"2 85294 ESTJ QUASAR CLASSIC AMOR/25 5 55.6320 \n",
|
|
"3 86019 ESTJ ARBO AMOR 25 24 59.1163 \n",
|
|
"4 85293 ESTJ HER CODE AMOR/25 24 121.9821 \n",
|
|
"\n",
|
|
" valor_total_produtos PDV qtd_aceita_industria status \n",
|
|
"0 236.46 20986 NaN None \n",
|
|
"1 556.33 20991 NaN None \n",
|
|
"2 278.16 20991 NaN None \n",
|
|
"3 1418.79 20993 NaN None \n",
|
|
"4 2927.57 20997 NaN None "
|
|
]
|
|
},
|
|
"execution_count": 15,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"pedidos.head()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "4e64bc1d",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.13.2"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|