Skip to content

Commit 8149feb

Browse files
authored
Merge pull request #2 from my-python-projects/develop
New Update
2 parents 718e349 + 7414942 commit 8149feb

File tree

14 files changed

+509
-107
lines changed

14 files changed

+509
-107
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
/relatorios
1+
/relatorios
2+
app/__pycache__
3+
app/logs

app.py

Lines changed: 0 additions & 56 deletions
This file was deleted.

app/__init__.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from flask import Flask
2+
3+
# Inicialização do aplicativo Flask
4+
app = Flask(__name__)
5+
6+
# Configuração básica do logger
7+
import logging
8+
import os
9+
10+
LOG_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'logs')
11+
LOG_FILE = os.path.join(LOG_DIR, 'app.log')
12+
#LOG_FILE_DEBUG = os.path.join(LOG_DIR, 'debug.log')
13+
14+
15+
if not os.path.exists(LOG_DIR):
16+
os.makedirs(LOG_DIR)
17+
18+
logging.basicConfig(filename=LOG_FILE, level=logging.INFO)
19+
#logging.basicConfig(filename=LOG_FILE_DEBUG, level=logging.DEBUG)
20+
21+
# Importação de rotas para registrar rotas
22+
from app import routes

app/routes.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from app import app
2+
from flask import render_template, request, send_file, jsonify
3+
from docx import Document
4+
from datetime import datetime
5+
import os
6+
7+
8+
@app.route('/')
9+
def index():
10+
app.logger.info('Acesso à página inicial')
11+
return render_template('index.html')
12+
13+
@app.route('/login')
14+
def login():
15+
return render_template('login.html')
16+
17+
18+
@app.route('/processar_formulario', methods=['POST'])
19+
def processar_formulario():
20+
21+
try:
22+
23+
nome = request.form['nome']
24+
equipamento = request.form['equipamento']
25+
inicio = request.form['inicio']
26+
final = request.form['final']
27+
estoque_utilizado = request.form['estoqueUtilizado']
28+
removido_voltou = request.form['removidoVoltou']
29+
motivo_remocao = request.form.get('motivoRemocao', '')
30+
31+
# Create a Word document and write the data
32+
document = Document('./template.docx')
33+
34+
document.add_paragraph(f'Nome: {nome}')
35+
document.add_paragraph(f'Equipamento: {equipamento}')
36+
document.add_paragraph(f'Período: {inicio} - {final}')
37+
document.add_paragraph(f'Estoque Utilizado: {estoque_utilizado}')
38+
39+
document.add_paragraph('Algo foi removido e voltou ao estoque? ' + ('Sim' if removido_voltou == 'sim' else 'Não'))
40+
41+
if removido_voltou == 'sim':
42+
document.add_paragraph(f'Motivo da Remoção: {motivo_remocao}')
43+
44+
# Get current date
45+
data_atual = datetime.now()
46+
47+
# Format the date as a string
48+
formato_data = "%d-%m-%Y"
49+
data_formatada = data_atual.strftime(formato_data)
50+
51+
caminho = './relatorios/'
52+
53+
# Check that the directory does not exist before creating
54+
if not os.path.exists(caminho):
55+
os.makedirs(caminho)
56+
print(f'The folder at {caminho} was created successfully.')
57+
58+
documento = "{}{}.docx".format(caminho, data_formatada)
59+
60+
document.save(documento)
61+
62+
#send_file(documento, as_attachment=True)
63+
return jsonify(success=True)
64+
65+
except Exception as e:
66+
print(f'Erro: {str(e)}')
67+
return jsonify(success=False)
68+

app/static/img/avatar.png

27.3 KB
Loading

app/static/js/script.js

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
$('input[type=radio][name=removidoVoltou]').change(function () {
2+
if (this.value === 'sim') {
3+
$('#motivoRemocaoGroup').show();
4+
} else {
5+
$('#motivoRemocaoGroup').hide();
6+
}
7+
});
8+
9+
10+
// Função para limpar os campos do formulário
11+
function limparCampos() {
12+
$('#nome').val('');
13+
$('#data').val('');
14+
$('#equipamento').val('');
15+
$("#inicio").val(''),
16+
$("#final").val(''),
17+
$("#estoqueUtilizado").val(''),
18+
$("[name=removidoVoltou]").val(''),
19+
$("[name=motivoRemocao]").val('');
20+
}
21+
22+
$(document).ready(function () {
23+
$("#botaoEnviar").on("click", function () {
24+
// Adicionar animação de carregamento ao botão
25+
$(this).html('<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> Enviando...').prop('disabled', true);
26+
27+
// Recuperar o nome do formulário
28+
var nome = $("#nome").val(),
29+
equipamento = $("#equipamento").val(),
30+
inicio = $("#inicio").val(),
31+
final = $("#final").val(),
32+
estoqueUtilizado = $("#estoqueUtilizado").val(),
33+
removidoVoltou = $("[name=removidoVoltou]").val(),
34+
motivoRemocao = $("[name=motivoRemocao]").val();
35+
36+
// Simular uma chamada AJAX para o backend
37+
$.ajax({
38+
type: "POST",
39+
url: "/processar_formulario",
40+
data: {
41+
nome: nome,
42+
equipamento: equipamento,
43+
inicio: inicio,
44+
final: final,
45+
estoqueUtilizado: estoqueUtilizado,
46+
removidoVoltou: removidoVoltou,
47+
motivoRemocao: motivoRemocao
48+
},
49+
success: function (data) {
50+
console.log(data);
51+
// Remover animação de carregamento
52+
$("#botaoEnviar").html('Enviar').prop('disabled', false);
53+
54+
// Exibir modal de sucesso
55+
$("#modalSucesso").modal('show');
56+
57+
limparCampos();
58+
59+
// Ocultar modal de sucesso após 3 segundos
60+
setTimeout(function () {
61+
$("#modalSucesso").modal('hide');
62+
}, 3000);
63+
},
64+
error: function () {
65+
// Remover animação de carregamento
66+
$("#botaoEnviar").html('Enviar').prop('disabled', false);
67+
68+
// Exibir modal de erro
69+
$("#modalErro").modal('show');
70+
}
71+
});
72+
});
73+
});

templates/index.html renamed to app/templates/index.html

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,25 @@
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
66
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
7+
8+
<style>
9+
body {
10+
background: linear-gradient(135deg, #3498db, #9b59b6);
11+
}
12+
13+
.form-container {
14+
background-color: #ffffff;
15+
border-radius: 20px;
16+
padding: 40px;
17+
box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
18+
}
19+
</style>
20+
721
<title>Formulário de Estoque</title>
822
</head>
923
<body>
1024

11-
<div class="container mt-5">
25+
<div class="container mt-5 form-container">
1226
<form method="post" action="/processar_formulario">
1327
<div class="form-group">
1428
<label for="nome">Nome:</label>
@@ -60,22 +74,49 @@
6074
<textarea class="form-control" id="motivoRemocao" name="motivoRemocao" rows="3" placeholder="Digite o motivo da remoção"></textarea>
6175
</div>
6276

63-
<button type="submit" class="btn btn-primary">Enviar</button>
77+
<button type="button" class="btn btn-primary" id="botaoEnviar">Enviar</button>
6478
</form>
6579
</div>
6680

67-
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
68-
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
69-
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
70-
<script>
71-
$('input[type=radio][name=removidoVoltou]').change(function () {
72-
if (this.value === 'sim') {
73-
$('#motivoRemocaoGroup').show();
74-
} else {
75-
$('#motivoRemocaoGroup').hide();
76-
}
77-
});
78-
</script>
81+
82+
<!-- Modal de Sucesso -->
83+
<div class="modal fade" id="modalSucesso" tabindex="-1" role="dialog" aria-labelledby="modalSucessoLabel" aria-hidden="true">
84+
<div class="modal-dialog" role="document">
85+
<div class="modal-content">
86+
<div class="modal-header">
87+
<h5 class="modal-title" id="modalSucessoLabel">Sucesso!</h5>
88+
<button type="button" class="close" data-dismiss="modal" aria-label="Fechar">
89+
<span aria-hidden="true">&times;</span>
90+
</button>
91+
</div>
92+
<div class="modal-body">
93+
Nome escrito com sucesso no Word.
94+
</div>
95+
</div>
96+
</div>
97+
</div>
98+
99+
<!-- Modal de Erro -->
100+
<div class="modal fade" id="modalErro" tabindex="-1" role="dialog" aria-labelledby="modalErroLabel" aria-hidden="true">
101+
<div class="modal-dialog" role="document">
102+
<div class="modal-content">
103+
<div class="modal-header">
104+
<h5 class="modal-title" id="modalErroLabel">Erro!</h5>
105+
<button type="button" class="close" data-dismiss="modal" aria-label="Fechar">
106+
<span aria-hidden="true">&times;</span>
107+
</button>
108+
</div>
109+
<div class="modal-body">
110+
Houve um erro ao escrever no Word.
111+
</div>
112+
</div>
113+
</div>
114+
</div>
115+
116+
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
117+
<script src="https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js"></script>
118+
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
119+
<script src="{{ url_for('static', filename='js/script.js') }}"></script>
79120

80121
</body>
81122
</html>

0 commit comments

Comments
 (0)