NicollasMarques commited on
Commit
09beb73
·
verified ·
1 Parent(s): e48e2e2

Upload auto.py

Browse files
Files changed (1) hide show
  1. auto.py +381 -0
auto.py ADDED
@@ -0,0 +1,381 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """Auto.ipynb
3
+
4
+ Automatically generated by Colab.
5
+
6
+ Original file is located at
7
+ https://colab.research.google.com/drive/1moovJ7q7nuTt-56J95OBoT_8aEpW_7SK
8
+
9
+ ---
10
+
11
+ # 📘 **Manual de Uso — Ferramenta de Combinação de Cotas (Veículo)**
12
+
13
+ ---
14
+
15
+ ## 🔎 **O que é esta ferramenta?**
16
+
17
+ Essa é uma ferramenta automatizada feita para ajudar vendedores a encontrarem **combinações de cotas de consórcio de veículo** que encaixem exatamente no bolso do cliente.
18
+
19
+ Ela encontra para você, em segundos, as melhores opções combinadas de crédito, entrada e parcela — tudo com base no estoque disponível em uma planilha online. E o melhor: você **não precisa tocar no código**!
20
+
21
+ ---
22
+
23
+ ## 🎯 **Finalidade:**
24
+
25
+ * Criar propostas personalizadas com base no valor desejado pelo cliente.
26
+ * Combinar mais de uma cota para alcançar um crédito maior.
27
+ * Ajustar entrada e parcela conforme a realidade financeira de quem está comprando.
28
+ * Economizar tempo e acelerar o processo de venda.
29
+
30
+ ---
31
+
32
+ ## 🛠️ **Passo a passo para utilizar:**
33
+
34
+ ### 1️⃣ **Abrir o sistema:**
35
+
36
+ * A ferramenta está pronta no **Google Colab**.
37
+ * O link será enviado a você pela gestão ou ficará salvo em um local padrão da equipe.
38
+ * O sistema se conecta automaticamente ao **estoque de cotas** no Google Drive.
39
+
40
+ ### 2️⃣ **Preencher os dados solicitados:**
41
+
42
+ Preencha os **quatro campos obrigatórios** logo no início:
43
+
44
+ * **Crédito:**
45
+ Valor total que o cliente precisa de crédito para comprar o veículo.
46
+ *Exemplo:* 50.000
47
+
48
+ * **Entrada:**
49
+ Quanto o cliente pode dar de entrada (já com comissão da loja embutida).
50
+ *Exemplo:* 8.000
51
+
52
+ * **Parcela (R\$):**
53
+ Quanto o cliente está disposto a pagar por mês.
54
+ *Exemplo:* 900
55
+
56
+ * **Tipo do Bem:**
57
+ Escolha **“Veículo”** neste campo.
58
+
59
+ ### 3️⃣ **Executar a busca:**
60
+
61
+ Clique no botão **“Buscar Combinações”**.
62
+
63
+ O sistema vai processar os dados e em poucos segundos mostrará as propostas disponíveis.
64
+
65
+ ---
66
+
67
+ ## 🔍 **Como funciona a busca:**
68
+
69
+ A mágica está nos bastidores! O sistema faz o seguinte:
70
+
71
+ * Filtra somente cotas de **Veículo**.
72
+ * Verifica se os valores se encaixam nas seguintes tolerâncias:
73
+
74
+ * **Crédito:** até 10% acima ou abaixo.
75
+ * **Entrada:** até 10% para mais ou para menos.
76
+ * **Parcela:** varia entre **50% e 150%** do valor informado.
77
+ * Testa combinações de cotas de uma mesma administradora para montar propostas viáveis.
78
+ * Calcula automaticamente:
79
+
80
+ * Valor total de entrada (já com comissão);
81
+ * Crédito combinado;
82
+ * Parcelas somadas;
83
+ * Maior prazo entre as cotas;
84
+ * Taxas: mensal, anual e total.
85
+
86
+ ---
87
+
88
+ ## 📑 **Interpretação dos resultados:**
89
+
90
+ Cada combinação encontrada será exibida nesse estilo:
91
+
92
+ ```
93
+ --- Combinação 1 ---
94
+ Administradora: [Nome da administradora]
95
+ Categoria: Veículo
96
+ Códigos: [Código das cotas usadas]
97
+ Crédito total: R$ [valor]
98
+ Entrada (com comissão): R$ [valor]
99
+ Saldo Devedor: R$ [valor]
100
+ Valor total das Parcelas: R$ [valor]
101
+ Maior Prazo: [prazo em meses]
102
+ Prazo Médio: [média dos prazos]
103
+ Crédito Líquido (Real): R$ [valor líquido]
104
+ Taxa total: R$ [valor]
105
+ Taxa (%): X%
106
+ Taxa Mensal (%): X%
107
+ Taxa Anual (%): X%
108
+ ```
109
+
110
+ ---
111
+
112
+ ## ✅ **Informações principais para apresentar ao cliente:**
113
+
114
+ * **Crédito total:** é o valor que ele vai receber.
115
+ * **Entrada:** quanto ele precisa pagar na contratação.
116
+ * **Parcelas:** valor mensal das somas.
117
+ * **Códigos:** são as cotas específicas que serão usadas.
118
+ * **Prazo:** tempo de financiamento (em meses).
119
+
120
+ ---
121
+
122
+ ## ✅ **Informações importantes para o vendedor:**
123
+
124
+ * Avalie se a **taxa está competitiva**.
125
+ * Veja se os valores realmente encaixam na condição passada pelo cliente.
126
+ * Use essas propostas como ponto de partida para negociar.
127
+
128
+ ---
129
+
130
+ ## 💡 **Recomendações importantes:**
131
+
132
+ * Se **nenhuma combinação aparecer**, tente:
133
+
134
+ * Reduzir o valor da entrada.
135
+ * Aumentar a parcela.
136
+ * Verificar se o tipo está correto (deve ser **“Veículo”**).
137
+ * Lembre que a parcela aceita uma variação grande — de 50% até 150% do valor informado.
138
+
139
+ ---
140
+
141
+ ## 🚫 **Limitações da ferramenta:**
142
+
143
+ * Funciona somente com as cotas **já cadastradas no estoque**.
144
+ * Não reserva cotas automaticamente — **confirme no sistema oficial antes de fechar a venda**.
145
+ * Não atualiza o estoque em tempo real — ele precisa estar atualizado previamente pela equipe.
146
+
147
+ ---
148
+
149
+ ## 🏁 **Resumo prático:**
150
+
151
+ Quando o cliente disser:
152
+
153
+ > “Quero comprar um carro com crédito de \[X], tenho \[Y] de entrada e posso pagar até \[Z] por mês.”
154
+
155
+ Você:
156
+
157
+ * Abre o Google Colab.
158
+ * Preenche os dados com essas informações.
159
+ * Clica em **Buscar Combinações**.
160
+ * Lê a proposta e mostra para o cliente.
161
+ * Confere a disponibilidade no sistema oficial e segue com a venda.
162
+
163
+ ---
164
+ """
165
+
166
+ # @title Sistema de Busca de Combinações para Consórcio de Automóveis
167
+
168
+
169
+ import pandas as pd
170
+ import requests
171
+ import io
172
+ import itertools
173
+ from collections import defaultdict
174
+ import ipywidgets as widgets
175
+ from IPython.display import display, clear_output
176
+ import time
177
+
178
+ # 🔧 CONFIGURAÇÕES GLOBAIS
179
+ FILE_ID = "1wYWWhbS1RFu5pglkWZXpwpRhIiS8peH9"
180
+ URL = f"https://drive.google.com/uc?export=download&id={FILE_ID}"
181
+
182
+ # Variável global para armazenar o DataFrame
183
+ df = None
184
+
185
+ def carregar_planilha():
186
+ """Carrega e prepara a planilha para análise de consórcios de automóveis."""
187
+ global df
188
+ try:
189
+ response = requests.get(URL)
190
+ response.raise_for_status()
191
+ data = io.BytesIO(response.content)
192
+ df = pd.read_excel(data)
193
+
194
+ # Padroniza nomes das colunas
195
+ df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")
196
+
197
+ # Converte colunas numéricas
198
+ numeric_cols = ['valor_credito', 'valor_entrada', 'valor_parcela', 'saldo_devedor', 'qtd_parcelas']
199
+ for col in numeric_cols:
200
+ if col in df.columns:
201
+ df[col] = pd.to_numeric(df[col], errors='coerce').fillna(0)
202
+
203
+ # Verifica colunas essenciais
204
+ if 'tipo_do_bem' not in df.columns or 'administradora' not in df.columns:
205
+ raise ValueError("Colunas essenciais não encontradas na planilha")
206
+
207
+ # Remove duplicatas
208
+ df.drop_duplicates(inplace=True)
209
+ return True
210
+
211
+ except Exception as e:
212
+ print(f"Erro ao carregar planilha: {str(e)}")
213
+ return False
214
+
215
+ def agrupar_por_administradora(dataframe):
216
+ """Agrupa cotas por administradora."""
217
+ grupos = defaultdict(list)
218
+ for _, row in dataframe.iterrows():
219
+ grupos[row['administradora']].append(row.to_dict())
220
+ return grupos
221
+
222
+ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None):
223
+ """Busca combinações de cotas para automóveis dentro dos parâmetros especificados."""
224
+ if df is None:
225
+ return "Planilha não carregada. Por favor, carregue a planilha primeiro."
226
+
227
+ # Filtra por tipo de bem (Auto) e administradoras selecionadas
228
+ df_filtrado = df[df['tipo_do_bem'].str.lower() == 'auto']
229
+ if administradoras:
230
+ df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
231
+
232
+ if df_filtrado.empty:
233
+ return "Nenhuma cota de automóvel encontrada com os filtros aplicados"
234
+
235
+ # Define faixas de tolerância
236
+ credito_min, credito_max = credito_desejado * 0.93, credito_desejado * 1.07
237
+ entrada_min, entrada_max = entrada_desejada * 0.93, entrada_desejada * 1.07
238
+ parcela_min, parcela_max = parcela_desejada * 0.5, parcela_desejada * 1.5
239
+
240
+ grupos = agrupar_por_administradora(df_filtrado)
241
+ resultados = []
242
+
243
+ for adm, cotas in grupos.items():
244
+ for r in range(1, min(3, len(cotas)) + 1):
245
+ for combinacao in itertools.combinations(cotas, r):
246
+ total_credito = sum(c['valor_credito'] for c in combinacao)
247
+ total_entrada = sum(c['valor_entrada'] for c in combinacao)
248
+ total_parcelas = sum(c['valor_parcela'] for c in combinacao)
249
+
250
+ if (credito_min <= total_credito <= credito_max and
251
+ entrada_min <= total_entrada <= entrada_max and
252
+ parcela_min <= total_parcelas <= parcela_max):
253
+
254
+ total_saldo = sum(c['saldo_devedor'] for c in combinacao)
255
+ valor_final = round(total_entrada + total_saldo, 2)
256
+ diferenca = abs(valor_final - total_credito)
257
+
258
+ resultados.append((adm, combinacao, diferenca))
259
+
260
+ if not resultados:
261
+ return "Nenhuma combinação adequada encontrada para automóveis"
262
+
263
+ resultados.sort(key=lambda x: x[2])
264
+ return formatar_resultados(resultados)
265
+
266
+ def formatar_resultados(resultados):
267
+ """Formata os resultados para exibição ao usuário."""
268
+ resposta = ""
269
+ for idx, (adm, combinacao, _) in enumerate(resultados[:10], 1):
270
+ codigos = [str(c['codigo']) for c in combinacao]
271
+ total_credito = sum(c['valor_credito'] for c in combinacao)
272
+ total_entrada = sum(c['valor_entrada'] for c in combinacao)
273
+ total_saldo = sum(c['saldo_devedor'] for c in combinacao)
274
+ total_parcelas = sum(c['valor_parcela'] for c in combinacao)
275
+ maior_prazo = max(int(c['qtd_parcelas']) for c in combinacao)
276
+
277
+ valor_final = round(total_entrada + total_saldo, 2)
278
+ credito_real = round(total_credito - total_entrada, 2)
279
+ taxa_total = total_saldo - credito_real
280
+ taxa_percentual = (taxa_total / credito_real) * 100 if credito_real > 0 else 0
281
+ taxa_mensal = taxa_percentual / maior_prazo if maior_prazo > 0 else 0
282
+
283
+ resposta += f"""
284
+ === Combinação {idx} ===
285
+ Administradora: {adm}
286
+ Códigos: {', '.join(codigos)}
287
+ Crédito Total: R$ {total_credito:,.2f}
288
+ Entrada: R$ {total_entrada:,.2f}
289
+ Saldo Devedor: R$ {total_saldo:,.2f}
290
+ Parcela: R$ {total_parcelas:,.2f}
291
+ Prazo: {maior_prazo} meses
292
+ Valor Final: R$ {valor_final:,.2f}
293
+ Crédito Líquido: R$ {credito_real:,.2f}
294
+ Taxa Total: {taxa_percentual:.2f}% (R$ {taxa_total:,.2f})
295
+ Taxa Mensal: {taxa_mensal:.2f}%
296
+ Taxa Anual: {taxa_mensal * 12:.2f}%
297
+ """
298
+ return resposta
299
+
300
+ # 👨💻 INTERFACE DO USUÁRIO
301
+ # Widgets de entrada
302
+ entrada_credito = widgets.FloatText(
303
+ value=30000,
304
+ description='Crédito Desejado (R$):',
305
+ layout=widgets.Layout(width='300px')
306
+ )
307
+
308
+ entrada_entrada = widgets.FloatText(
309
+ value=3000,
310
+ description='Entrada Desejada (R$):',
311
+ layout=widgets.Layout(width='300px')
312
+ )
313
+
314
+ entrada_parcela = widgets.FloatText(
315
+ value=500,
316
+ description='Parcela Desejada (R$):',
317
+ layout=widgets.Layout(width='300px')
318
+ )
319
+
320
+ # Seletor de administradoras
321
+ administradoras_widget = widgets.SelectMultiple(
322
+ description='Filtrar por administradora:',
323
+ options=[],
324
+ layout=widgets.Layout(width='400px', height='120px')
325
+ )
326
+
327
+ # Botão de ação
328
+ botao_busca = widgets.Button(
329
+ description='Buscar Combinações',
330
+ button_style='success',
331
+ layout=widgets.Layout(width='300px')
332
+ )
333
+
334
+ # Área de resultados
335
+ saida_resultados = widgets.Output(
336
+ layout={'border': '1px solid #eee', 'padding': '10px', 'min_height': '300px'}
337
+ )
338
+
339
+ def atualizar_administradoras():
340
+ """Atualiza a lista de administradoras disponíveis para automóveis."""
341
+ if df is not None:
342
+ adm_list = df[df['tipo_do_bem'].str.lower() == 'auto']['administradora'].unique()
343
+ administradoras_widget.options = sorted(adm_list)
344
+
345
+ def ao_clicar_botao(b):
346
+ """Executa a busca quando o botão é clicado."""
347
+ with saida_resultados:
348
+ clear_output()
349
+ try:
350
+ resultado = buscar_combinacoes(
351
+ entrada_credito.value,
352
+ entrada_entrada.value,
353
+ entrada_parcela.value,
354
+ administradoras_widget.value
355
+ )
356
+ print(resultado)
357
+ except Exception as e:
358
+ print(f"Ocorreu um erro: {str(e)}")
359
+
360
+ # Configura eventos
361
+ botao_busca.on_click(ao_clicar_botao)
362
+
363
+ # Layout da interface
364
+ interface = widgets.VBox([
365
+ widgets.HTML("<h2>Busca de Combinações para Consórcio de Automóveis</h2>"),
366
+ widgets.HBox([
367
+ widgets.VBox([entrada_credito, entrada_entrada, entrada_parcela]),
368
+ administradoras_widget
369
+ ]),
370
+ botao_busca,
371
+ saida_resultados
372
+ ])
373
+
374
+ # Inicialização
375
+ if carregar_planilha():
376
+ atualizar_administradoras()
377
+ else:
378
+ print("Não foi possível carregar os dados. Verifique a conexão e o ID do arquivo.")
379
+
380
+ # Exibe a interface
381
+ display(interface)