Persano commited on
Commit
b3108df
·
verified ·
1 Parent(s): 0f7e3cc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +97 -209
app.py CHANGED
@@ -1,226 +1,114 @@
 
 
1
  from flask import Flask, render_template_string, request, send_file
2
  from fpdf import FPDF
3
  import os
4
  import tempfile
5
  from datetime import date, timedelta
6
- import gradio as gr
7
 
8
  app = Flask(__name__)
9
 
10
- # HTML para o formulário
11
- HTML_FORM = """
12
- <!DOCTYPE html>
13
- <html lang="pt-br">
14
- <head>
15
- <meta charset="UTF-8">
16
- <title>Orçamento de Reforma</title>
17
- <style>
18
- body {
19
- font-family: Arial, sans-serif;
20
- margin: 40px;
21
- background-color: #f7f7f7;
22
- }
23
- h1 {
24
- color: #333;
25
- text-align: center;
26
- }
27
- form {
28
- background-color: #fff;
29
- padding: 20px;
30
- border-radius: 10px;
31
- box-shadow: 0 0 10px rgba(0,0,0,0.1);
32
- max-width: 700px;
33
- margin: auto;
34
- }
35
- label {
36
- font-weight: bold;
37
- }
38
- input, select {
39
- margin-bottom: 15px;
40
- width: 100%;
41
- padding: 8px;
42
- box-sizing: border-box;
43
- }
44
- fieldset {
45
- margin-bottom: 20px;
46
- padding: 10px;
47
- border-radius: 5px;
48
- border: 1px solid #ccc;
49
- }
50
- legend {
51
- font-weight: bold;
52
- }
53
- input[type=submit] {
54
- background-color: #4CAF50;
55
- color: white;
56
- border: none;
57
- cursor: pointer;
58
- }
59
- input[type=submit]:hover {
60
- background-color: #45a049;
61
- }
62
- .checkboxes {
63
- display: flex;
64
- flex-wrap: wrap;
65
- gap: 10px;
66
- }
67
- .checkboxes label {
68
- display: flex;
69
- align-items: center;
70
- gap: 5px;
71
- }
72
- @media (max-width: 768px) {
73
- form {
74
- padding: 15px;
75
- }
76
- }
77
- </style>
78
- <script>
79
- function gerarCamposBanheiros() {
80
- const container = document.getElementById("banheiros_por_tamanho");
81
- container.innerHTML = "";
82
- const total = parseInt(document.getElementsByName("banheiros")[0].value);
83
- for (let i = 1; i <= total; i++) {
84
- container.innerHTML += `
85
- <fieldset>
86
- <legend>Banheiro ${i}</legend>
87
- <label>Tamanho:</label>
88
- <select name="banheiro_${i}_tamanho">
89
- <option value="pequeno">Pequeno</option>
90
- <option value="medio">Médio</option>
91
- <option value="grande">Grande</option>
92
- </select><br>
93
- <label>Acabamento:</label>
94
- <select name="banheiro_${i}_acabamento">
95
- <option value="simples">Simples</option>
96
- <option value="medio">Médio</option>
97
- <option value="luxo">Luxo</option>
98
- </select><br><br>
99
- </fieldset>`;
100
- }
101
- }
102
- </script>
103
- </head>
104
- <body>
105
- <h1>Orçamento de Reforma</h1>
106
- <form method="post">
107
- <label>Nome do contratante:</label>
108
- <input type="text" name="nome_contratante" required><br>
109
-
110
- <label>Endereço da obra:</label>
111
- <input type="text" name="endereco_obra" required><br>
112
-
113
- <label>Dimensão total da obra (m²):</label>
114
- <input type="number" name="dimensao_obra" min="1" required><br>
115
-
116
- <label>Quantidade total de banheiros:</label>
117
- <input type="number" name="banheiros" min="0" required onchange="gerarCamposBanheiros()"><br>
118
-
119
- <div id="banheiros_por_tamanho"></div>
120
-
121
- <label>Tamanho da cozinha:</label>
122
- <select name="cozinha_tamanho">
123
- <option value="pequeno">Pequeno</option>
124
- <option value="medio">Médio</option>
125
- <option value="grande">Grande</option>
126
- </select><br>
127
-
128
- <label>Acabamento da cozinha:</label>
129
- <select name="cozinha_acabamento">
130
- <option value="simples">Simples</option>
131
- <option value="medio">Médio</option>
132
- <option value="luxo">Luxo</option>
133
- </select><br>
134
-
135
- <label>Serviços desejados:</label>
136
- <div class="checkboxes">
137
- <label><input type="checkbox" name="servicos" value="hidraulica"> Hidráulica</label>
138
- <label><input type="checkbox" name="servicos" value="eletrica"> Elétrica</label>
139
- <label><input type="checkbox" name="servicos" value="pintura"> Pintura</label>
140
- <label><input type="checkbox" name="servicos" value="ar_condicionado"> Ar Condicionado</label>
141
- <label><input type="checkbox" name="servicos" value="fechamento_sacada"> Fechamento de Sacada</label>
142
- <label><input type="checkbox" name="servicos" value="gesso"> Gesso</label>
143
- </div><br>
144
-
145
- <input type="submit" name="acao" value="Calcular Orçamento">
146
- </form>
147
-
148
- {% if total is defined and detalhes is defined %}
149
- <div style="background-color:#fff; margin-top:20px; padding:20px; border-radius:10px; box-shadow:0 0 10px rgba(0,0,0,0.1); max-width:700px; margin:auto;">
150
- <h2>Resumo do Orçamento</h2>
151
- <ul>
152
- {% for item in detalhes %}
153
- <li>{{ item }}</li>
154
- {% endfor %}
155
- </ul>
156
- {% if total is not none %}
157
- <p><strong>Valor total:</strong> R$ {{ "%.2f"|format(total) }}</p>
158
- {% else %}
159
- <p><strong>Valor total:</strong> Não calculado</p>
160
- {% endif %}
161
- <form method="post">
162
- {% for key, value in request.form.items() %}
163
- <input type="hidden" name="{{ key }}" value="{{ value }}">
164
- {% endfor %}
165
- <input type="submit" name="acao" value="Gerar Contrato PDF">
166
- </form>
167
- </div>
168
- {% endif %}
169
- </body>
170
- </html>
171
- """
172
 
173
  @app.route("/", methods=["GET", "POST"])
174
  def index():
175
- total = None
176
- detalhes = []
177
- erro = None
178
-
179
  if request.method == "POST":
180
- try:
181
- nome_contratante = request.form["nome_contratante"]
182
- endereco_obra = request.form["endereco_obra"]
183
- dimensao_obra = float(request.form["dimensao_obra"])
184
- banheiros = int(request.form["banheiros"])
185
- cozinha_tamanho = request.form["cozinha_tamanho"]
186
- cozinha_acabamento = request.form["cozinha_acabamento"]
187
- servicos = request.form.getlist("servicos")
188
-
189
- # Calculando os valores do orçamento
190
- total = 10000 + dimensao_obra * 50 # Simples cálculo de exemplo
191
-
192
- detalhes = [
193
- f"Nome: {nome_contratante}",
194
- f"Endereço: {endereco_obra}",
195
- f"Dimensão da obra: {dimensao_obra} m²",
196
- f"Quantidade de banheiros: {banheiros}",
197
- f"Tamanho da cozinha: {cozinha_tamanho}",
198
- f"Acabamento da cozinha: {cozinha_acabamento}",
199
- f"Serviços: {', '.join(servicos)}",
200
- ]
201
-
202
- if "acao" in request.form and request.form["acao"] == "Gerar Contrato PDF":
203
- # Gerar o contrato em PDF
204
- pdf = FPDF()
205
- pdf.add_page()
206
- pdf.set_font("Arial", size=12)
207
- pdf.cell(200, 10, txt=f"Orçamento de Reforma - {nome_contratante}", ln=True, align="C")
208
-
209
- for item in detalhes:
210
- pdf.cell(200, 10, txt=item, ln=True)
211
-
212
- # Salvar o PDF temporariamente
213
- temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf")
214
- pdf.output(temp_file.name)
215
- return send_file(temp_file.name, as_attachment=True)
216
-
217
- except Exception as e:
218
- erro = str(e)
219
-
220
- return render_template_string(HTML_FORM, erro=erro, total=total, detalhes=detalhes)
221
 
222
  if __name__ == "__main__":
223
- app.run(debug=True, host="0.0.0.0", port=7860)
 
224
 
225
 
226
 
 
1
+ # app.py
2
+
3
  from flask import Flask, render_template_string, request, send_file
4
  from fpdf import FPDF
5
  import os
6
  import tempfile
7
  from datetime import date, timedelta
 
8
 
9
  app = Flask(__name__)
10
 
11
+ # HTML_FORM vem aqui (omitido neste trecho por brevidade)
12
+ HTML_FORM = """(HTML completo da pergunta anterior)"""
13
+
14
+ # Funções auxiliares
15
+
16
+ def calcular_valor_por_m2(tamanho, acabamento):
17
+ tabela = {
18
+ "simples": 1000,
19
+ "medio": 1500,
20
+ "luxo": 2000
21
+ }
22
+ fator_tamanho = {
23
+ "pequeno": 1,
24
+ "medio": 1.5,
25
+ "grande": 2
26
+ }
27
+ return tabela[acabamento] * fator_tamanho[tamanho]
28
+
29
+ def calcular_orcamento(form):
30
+ detalhes = []
31
+ total = 0
32
+ metros_totais = float(form.get("dimensao_obra", 0))
33
+
34
+ # Cozinha
35
+ cozinha_tamanho = form.get("cozinha_tamanho")
36
+ cozinha_acabamento = form.get("cozinha_acabamento")
37
+ preco_cozinha = calcular_valor_por_m2(cozinha_tamanho, cozinha_acabamento)
38
+ valor_cozinha = preco_cozinha * 5 # Cozinha = 5m² fixo
39
+ detalhes.append(f"Cozinha ({cozinha_tamanho}, {cozinha_acabamento}): R$ {valor_cozinha:.2f}")
40
+ total += valor_cozinha
41
+
42
+ # Banheiros
43
+ num_banheiros = int(form.get("banheiros", 0))
44
+ for i in range(1, num_banheiros + 1):
45
+ tam = form.get(f"banheiro_{i}_tamanho")
46
+ acb = form.get(f"banheiro_{i}_acabamento")
47
+ preco = calcular_valor_por_m2(tam, acb)
48
+ m2 = 3 if tam == "pequeno" else 5 if tam == "medio" else 7
49
+ valor = preco * m2
50
+ detalhes.append(f"Banheiro {i} ({tam}, {acb}): R$ {valor:.2f}")
51
+ total += valor
52
+
53
+ # Serviços adicionais (hidráulica, elétrica, pintura = 10% cada)
54
+ servicos = request.form.getlist("servicos")
55
+ for s in ["hidraulica", "eletrica", "pintura"]:
56
+ if s in servicos:
57
+ valor = total * 0.1
58
+ total += valor
59
+ detalhes.append(f"{s.capitalize()}: R$ {valor:.2f}")
60
+
61
+ # Outros serviços fixos
62
+ servicos_fixos = ["ar_condicionado", "fechamento_sacada", "gesso"]
63
+ precos_fixos = {
64
+ "ar_condicionado": 1500,
65
+ "fechamento_sacada": 3000,
66
+ "gesso": 1000
67
+ }
68
+ for s in servicos_fixos:
69
+ if s in servicos:
70
+ valor = precos_fixos[s]
71
+ total += valor
72
+ detalhes.append(f"{s.replace('_', ' ').capitalize()}: R$ {valor:.2f}")
73
+
74
+ return total, detalhes
75
+
76
+ def gerar_pdf(form, total, detalhes):
77
+ pdf = FPDF()
78
+ pdf.add_page()
79
+ pdf.set_font("Arial", size=12)
80
+ pdf.cell(200, 10, txt="Contrato de Reforma", ln=True, align="C")
81
+ pdf.cell(200, 10, txt=f"Contratante: {form.get('nome_contratante')}", ln=True)
82
+ pdf.cell(200, 10, txt=f"Endereço da Obra: {form.get('endereco_obra')}", ln=True)
83
+ pdf.cell(200, 10, txt=f"Data: {date.today().strftime('%d/%m/%Y')}", ln=True)
84
+ pdf.cell(200, 10, txt="Serviços contratados:", ln=True)
85
+ for item in detalhes:
86
+ pdf.multi_cell(0, 10, txt=f"- {item}")
87
+ pdf.cell(200, 10, txt=f"Valor Total: R$ {total:.2f}", ln=True)
88
+ pdf.cell(200, 10, txt="Assinatura do Contratante: __________________________", ln=True)
89
+
90
+ tmp_dir = tempfile.mkdtemp()
91
+ caminho_pdf = os.path.join(tmp_dir, "contrato.pdf")
92
+ pdf.output(caminho_pdf)
93
+ return caminho_pdf
94
+
95
+ # Rotas
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
  @app.route("/", methods=["GET", "POST"])
98
  def index():
 
 
 
 
99
  if request.method == "POST":
100
+ if request.form.get("acao") == "Calcular Orçamento":
101
+ total, detalhes = calcular_orcamento(request.form)
102
+ return render_template_string(HTML_FORM, total=total, detalhes=detalhes, request=request)
103
+ elif request.form.get("acao") == "Gerar Contrato PDF":
104
+ total, detalhes = calcular_orcamento(request.form)
105
+ caminho_pdf = gerar_pdf(request.form, total, detalhes)
106
+ return send_file(caminho_pdf, as_attachment=True)
107
+ return render_template_string(HTML_FORM)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
  if __name__ == "__main__":
110
+ app.run(host="0.0.0.0", port=7860)
111
+
112
 
113
 
114