Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const express = require('express');
- const sqlite3 = require('sqlite3').verbose();
- const XLSX = require('xlsx');
- const cors = require('cors');
- const multer = require('multer');
- const path = require('path');
- const fs = require('fs');
- const app = express();
- const port = 3002;
- // Configurar middleware
- app.use(cors());
- app.use(express.json());
- app.use(express.urlencoded({ extended: true }));
- // Servir ficheiros estáticos de /var/www/html/cashflow/
- //app.use(express.static('/var/www/html/cashflow'));
- app.use('/cashflow', express.static(path.join(__dirname)));
- // Configurar multer para upload de ficheiros
- const storage = multer.diskStorage({
- destination: (req, file, cb) => {
- cb(null, '/var/www/html/cashflow/');
- },
- filename: (req, file, cb) => {
- cb(null, 'upload.xlsx');
- }
- });
- const upload = multer({ storage });
- // Conectar ao banco de dados SQLite
- const db = new sqlite3.Database('/var/www/html/cashflow/cashflow.db', (err) => {
- if (err) {
- console.error('Erro ao conectar ao SQLite:', err.message);
- } else {
- console.log('Conectado ao banco de dados SQLite.');
- }
- });
- // Função para converter data serial do Excel para YYYY-MM-DD
- function excelSerialToDate(serial) {
- const utc_days = Math.floor(serial - 25569);
- const date = new Date(utc_days * 86400 * 1000);
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, '0');
- const day = String(date.getDate()).padStart(2, '0');
- return `${year}-${month}-${day}`;
- }
- // Endpoint para obter dados com filtros
- app.get('/api/transactions', (req, res) => {
- const { startDate, endDate, categoria, sub_categoria, search } = req.query;
- let query = 'SELECT * FROM cashflow WHERE 1=1';
- const params = [];
- if (startDate) {
- query += ' AND data_operacao >= ?';
- params.push(startDate);
- }
- if (endDate) {
- query += ' AND data_operacao <= ?';
- params.push(endDate);
- }
- if (categoria) {
- query += ' AND categoria = ?';
- params.push(categoria);
- }
- if (sub_categoria) {
- query += ' AND sub_categoria = ?';
- params.push(sub_categoria);
- }
- if (search) {
- query += ' AND (descricao LIKE ? OR destino LIKE ?)';
- params.push(`%${search}%`, `%${search}%`);
- }
- db.all(query, params, (err, rows) => {
- if (err) {
- res.status(500).json({ error: err.message });
- return;
- }
- res.json(rows);
- });
- });
- // Endpoint para importar Excel
- app.post('/api/import', upload.single('excel'), (req, res) => {
- const filePath = path.join('/var/www/html/cashflow/', 'upload.xlsx');
- if (!req.file) {
- res.status(400).json({ error: 'Nenhum ficheiro Excel enviado.' });
- return;
- }
- try {
- const workbook = XLSX.readFile(filePath);
- const sheet = workbook.Sheets[workbook.SheetNames[0]];
- const data = XLSX.utils.sheet_to_json(sheet);
- db.serialize(() => {
- const stmt = db.prepare(`
- INSERT INTO cashflow (data_operacao, descricao, montante, destino, categoria, sub_categoria)
- VALUES (?, ?, ?, ?, ?, ?)
- `);
- let successCount = 0;
- let errorCount = 0;
- data.forEach((row) => {
- try {
- const data_operacao = excelSerialToDate(row['Data Operação']);
- const descricao = row['Descrição'] || '';
- const montante = parseFloat(row['Montante']);
- const destino = row['Destino'] || '';
- let categoria = 'n/a';
- let sub_categoria = 'n/a';
- if (row['Categoria'] && row['Categoria'] !== 'n/a') {
- const [cat, sub] = row['Categoria'].split('-');
- categoria = cat || 'n/a';
- sub_categoria = sub || 'n/a';
- }
- stmt.run(
- data_operacao,
- descricao,
- montante,
- destino,
- categoria,
- sub_categoria,
- (err) => {
- if (err) {
- errorCount++;
- console.error('Erro ao inserir linha:', err.message);
- } else {
- successCount++;
- }
- }
- );
- } catch (err) {
- errorCount++;
- console.error('Erro ao processar linha:', err.message);
- }
- });
- stmt.finalize();
- fs.unlinkSync(filePath);
- res.json({ success: successCount, errors: errorCount });
- });
- } catch (err) {
- res.status(500).json({ error: 'Erro ao processar o ficheiro Excel: ' + err.message });
- }
- });
- // Iniciar servidor
- app.listen(port, () => {
- console.log(`Servidor Node.js a correr em http://localhost:${port}`);
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement