-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
298 lines (250 loc) · 11.4 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
from flask import Flask, render_template, request, jsonify
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
# Produto
class Produto:
def __init__(self, nome, preco, codigo, estoque):
self.nome = nome
self.preco = preco
self.codigo = codigo
self.estoque = estoque
def __repr__(self):
return f'Produto({self.nome}, {self.preco}, {self.codigo}, {self.estoque})'
@staticmethod
def carregar_produtos():
produtos = []
try:
with open('produtos.txt', 'r') as arquivo:
for linha in arquivo:
nome, preco, codigo, estoque = linha.strip().split(';')
produtos.append(Produto(nome, preco, codigo, estoque))
except FileNotFoundError:
pass
return produtos
@staticmethod
def atualizar_estoque(codigo, novo_estoque):
produtos = Produto.carregar_produtos()
for produto in produtos:
if produto.codigo == codigo:
produto.estoque = str(novo_estoque)
# Atualiza o arquivo com o novo estoque
with open('produtos.txt', 'w') as arquivo:
for p in produtos:
arquivo.write(f'{p.nome};{p.preco};{p.codigo};{p.estoque}\n')
return True
return False
# Classe para gerenciar vendas
class Venda:
vendas_dia = []
@staticmethod
def registrar_venda(codigo_produto, quantidade, metodo_pagamento):
produto = next((p for p in Produto.carregar_produtos() if p.codigo == codigo_produto), None)
if produto and int(produto.estoque) >= quantidade:
# Atualiza o estoque
novo_estoque = int(produto.estoque) - quantidade
if Produto.atualizar_estoque(codigo_produto, novo_estoque):
valor_venda = float(produto.preco.replace(',', '.')) * quantidade
venda_info = {
"codigo": codigo_produto,
"quantidade": quantidade,
"metodo_pagamento": metodo_pagamento,
"valor": valor_venda
}
Venda.vendas_dia.append(venda_info)
return f'Venda registrada com sucesso! Total: R$ {valor_venda:.2f}'
return 'Estoque insuficiente ou produto não encontrado.'
# Carrinho de compras
carrinho = []
# Rota para adicionar produto ao carrinho
@app.route('/adicionar_carrinho', methods=['POST'])
def adicionar_carrinho():
dados = request.get_json()
nome_produto = dados['nome_produto']
quantidade = dados['quantidade']
# Lê os produtos do arquivo
with open('produtos.txt', 'r') as file:
produtos = [linha.strip().split(';') for linha in file.readlines()]
# Procura o produto pelo nome
for produto in produtos:
if produto[0] == nome_produto: # Supondo que o nome do produto está na primeira coluna
# Substitui vírgula por ponto e converte
preco = float(produto[1].replace(',', '.')) # Supondo que o preço está na segunda coluna
total = preco * quantidade
# Retorna o nome do produto e o preço unitário
return jsonify({
'nome_produto': nome_produto,
'preco_unitario': preco, # Retorna o preço unitário
'total': total # Se precisar do total aqui, mas o total é calculado no frontend
}), 200
return jsonify({"erro": "Produto não encontrado"}), 404
# Rota para cadastro de produtos
@app.route('/cadastro', methods=['POST'])
def cadastro():
nome = request.form.get('nome')
preco = request.form.get('preco')
codigo = request.form.get('codigo')
estoque = request.form.get('estoque')
if not nome or not preco or not codigo or not estoque:
return jsonify({'status': 'error', 'message': 'Dados incompletos'}), 400
# Adiciona o produto ao arquivo produtos.txt
with open('produtos.txt', 'a') as arquivo:
arquivo.write(f'{nome};{preco};{codigo};{estoque}\n')
return jsonify({'status': 'success', 'message': 'Produto cadastrado com sucesso'}), 200
# Rota para atualização de estoque
@app.route('/atualizar_estoque', methods=['POST'])
def processar_formulario():
nome_produto = request.form['nome_produto']
novo_estoque = request.form['estoque']
try:
novo_estoque = int(novo_estoque)
except ValueError:
return jsonify({'status': 'error', 'message': 'Estoque inválido. Insira um número.'}), 400
mensagem = atualizar_estoque(nome_produto, novo_estoque)
if 'atualizado' in mensagem:
return jsonify({'status': 'success', 'message': mensagem}), 200
else:
return jsonify({'status': 'error', 'message': mensagem}), 400
# Função para atualizar estoque
def atualizar_estoque(nome_produto, novo_estoque):
try:
with open('produtos.txt', 'r') as arquivo:
linhas = arquivo.readlines()
except FileNotFoundError:
return "Arquivo produtos.txt não encontrado."
encontrado = False
novas_linhas = []
for linha in linhas:
dados = linha.strip().split(';')
if len(dados) >= 4 and dados[0].strip() == nome_produto.strip():
dados[3] = str(novo_estoque)
encontrado = True
novas_linhas.append(';'.join(dados))
if not encontrado:
return f'Nome de produto "{nome_produto}" não encontrado.'
with open('produtos.txt', 'w') as arquivo:
for linha in novas_linhas:
arquivo.write(linha + '\n')
return f'Estoque do produto "{nome_produto}" atualizado para {novo_estoque}.'
# Rota para processar a venda
@app.route('/realizar_venda', methods=['POST'])
def processar_venda():
nome_produto = request.form['nome_produto']
quantidade = int(request.form['quantidade'])
metodo_pagamento = request.form['metodo_pagamento']
# Busca o produto pelo nome em vez do código
produto = next((p for p in Produto.carregar_produtos() if p.nome == nome_produto), None)
if produto and int(produto.estoque) >= quantidade:
# Atualiza o estoque
novo_estoque = int(produto.estoque) - quantidade
if Produto.atualizar_estoque(produto.codigo, novo_estoque): # A atualização ainda usa o código do produto internamente
valor_venda = float(produto.preco.replace(',', '.')) * quantidade
venda_info = {
"nome_produto": nome_produto,
"quantidade": quantidade,
"metodo_pagamento": metodo_pagamento,
"valor": valor_venda
}
Venda.vendas_dia.append(venda_info)
return jsonify({'status': 'success', 'message': f'Venda registrada com sucesso! Total: R$ {valor_venda:.2f}'}), 200
return jsonify({'status': 'error', 'message': 'Estoque insuficiente ou produto não encontrado.'}), 400
# Rota para finalizar a compra
@app.route('/finalizar_compra', methods=['POST'])
def finalizar_compra():
dados_carrinho = request.get_json()
carrinho = dados_carrinho.get('carrinho', [])
metodo_pagamento = dados_carrinho.get('metodo_pagamento')
if not carrinho:
return jsonify({'status': 'error', 'message': 'Carrinho vazio'}), 400
vendas_realizadas = []
erros = []
for item in carrinho:
nome_produto = item['nome_produto'] # Usando nome do produto ao invés de código
quantidade = int(item['quantidade'])
# Busca o produto pelo nome em vez de código
produto = next((p for p in Produto.carregar_produtos() if p.nome == nome_produto), None)
if produto:
# Verifica se há estoque suficiente
if int(produto.estoque) >= quantidade:
# Atualiza o estoque
novo_estoque = int(produto.estoque) - quantidade
if Produto.atualizar_estoque(produto.codigo, novo_estoque): # Ainda utiliza o código internamente
# Calcula o valor da venda
valor_venda = float(produto.preco.replace(',', '.')) * quantidade
venda_info = {
"nome_produto": nome_produto,
"quantidade": quantidade,
"metodo_pagamento": metodo_pagamento,
"valor": valor_venda
}
Venda.vendas_dia.append(venda_info)
vendas_realizadas.append(venda_info)
else:
erros.append(f"Erro ao atualizar estoque para o produto {nome_produto}")
else:
erros.append(f'Estoque insuficiente para o produto: {nome_produto}')
else:
erros.append(f'Produto {nome_produto} não encontrado')
# Se houver vendas registradas
if vendas_realizadas:
response = {'status': 'success', 'message': 'Compra finalizada com sucesso!', 'vendas': vendas_realizadas}
if erros:
response['errors'] = erros
return jsonify(response), 200
else:
# Se não houver vendas bem-sucedidas
return jsonify({'status': 'error', 'message': 'Nenhuma venda realizada', 'errors': erros}), 400
# Rota para listar produtos
@app.route('/produtos', methods=['GET'])
def listar_produtos():
produtos = Produto.carregar_produtos()
lista_produtos = [
{
"nome": p.nome,
"preco": p.preco,
"codigo": p.codigo,
"estoque": p.estoque
} for p in produtos
]
return jsonify(lista_produtos), 200
# Rota inicial
@app.route('/')
def home():
return render_template('index.html')
# Rota para carregar produtos
@app.route('/carregar_produtos', methods=['GET'])
def carregar_produtos():
produtos = Produto.carregar_produtos()
produtos_json = [{'nome': p.nome, 'preco': p.preco, 'codigo': p.codigo, 'estoque': p.estoque} for p in produtos]
return jsonify(produtos_json)
# Lista para armazenar as vendas
vendas = []
# Função para calcular o resumo das vendas
def obter_resumo_vendas():
resumo = {
'total_vendas': len(vendas),
'vendas_fiado': sum(1 for venda in vendas if venda['metodo_pagamento'] == 'fiado'),
'vendas_dinheiro': sum(1 for venda in vendas if venda['metodo_pagamento'] == 'dinheiro'),
'vendas_cartao': sum(1 for venda in vendas if venda['metodo_pagamento'] == 'cartao'),
'vendas_pix': sum(1 for venda in vendas if venda['metodo_pagamento'] == 'pix'),
'valor_total': sum(venda['valor_total'] for venda in vendas)
}
return resumo
vendas = [] # Lista para armazenar as vendas
@app.route('/adicionar_venda', methods=['POST'])
def adicionar_venda():
dados = request.get_json()
metodo_pagamento = dados.get('metodo_pagamento')
valor_total = dados.get('valor_total')
# Adiciona a venda à lista
vendas.append({
'metodo_pagamento': metodo_pagamento,
'valor_total': valor_total
})
return jsonify({'mensagem': 'Venda adicionada com sucesso!'}), 200
@app.route('/vendas_dia', methods=['GET'])
def vendas_dia():
resumo_vendas = obter_resumo_vendas() # Chama a função que retorna o resumo
return jsonify(resumo_vendas), 200
if __name__ == '__main__':
app.run(port=5000, debug=True)