Advertisement
tool684

cashflow_server.js

Apr 17th, 2025
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 5.20 KB | Source Code | 0 0
  1. const express = require('express');
  2. const sqlite3 = require('sqlite3').verbose();
  3. const XLSX = require('xlsx');
  4. const cors = require('cors');
  5. const multer = require('multer');
  6. const path = require('path');
  7. const fs = require('fs');
  8.  
  9. const app = express();
  10. const port = 3002;
  11.  
  12. // Configurar middleware
  13. app.use(cors());
  14. app.use(express.json());
  15. app.use(express.urlencoded({ extended: true }));
  16.  
  17. // Servir ficheiros estáticos de /var/www/html/cashflow/
  18. //app.use(express.static('/var/www/html/cashflow'));
  19. app.use('/cashflow', express.static(path.join(__dirname)));
  20.  
  21. // Configurar multer para upload de ficheiros
  22. const storage = multer.diskStorage({
  23.     destination: (req, file, cb) => {
  24.         cb(null, '/var/www/html/cashflow/');
  25.     },
  26.     filename: (req, file, cb) => {
  27.         cb(null, 'upload.xlsx');
  28.     }
  29. });
  30. const upload = multer({ storage });
  31.  
  32. // Conectar ao banco de dados SQLite
  33. const db = new sqlite3.Database('/var/www/html/cashflow/cashflow.db', (err) => {
  34.     if (err) {
  35.         console.error('Erro ao conectar ao SQLite:', err.message);
  36.     } else {
  37.         console.log('Conectado ao banco de dados SQLite.');
  38.     }
  39. });
  40.  
  41. // Função para converter data serial do Excel para YYYY-MM-DD
  42. function excelSerialToDate(serial) {
  43.     const utc_days = Math.floor(serial - 25569);
  44.     const date = new Date(utc_days * 86400 * 1000);
  45.     const year = date.getFullYear();
  46.     const month = String(date.getMonth() + 1).padStart(2, '0');
  47.     const day = String(date.getDate()).padStart(2, '0');
  48.     return `${year}-${month}-${day}`;
  49. }
  50.  
  51. // Endpoint para obter dados com filtros
  52. app.get('/api/transactions', (req, res) => {
  53.     const { startDate, endDate, categoria, sub_categoria, search } = req.query;
  54.     let query = 'SELECT * FROM cashflow WHERE 1=1';
  55.     const params = [];
  56.  
  57.     if (startDate) {
  58.         query += ' AND data_operacao >= ?';
  59.         params.push(startDate);
  60.     }
  61.     if (endDate) {
  62.         query += ' AND data_operacao <= ?';
  63.         params.push(endDate);
  64.     }
  65.     if (categoria) {
  66.         query += ' AND categoria = ?';
  67.         params.push(categoria);
  68.     }
  69.     if (sub_categoria) {
  70.         query += ' AND sub_categoria = ?';
  71.         params.push(sub_categoria);
  72.     }
  73.     if (search) {
  74.         query += ' AND (descricao LIKE ? OR destino LIKE ?)';
  75.         params.push(`%${search}%`, `%${search}%`);
  76.     }
  77.  
  78.     db.all(query, params, (err, rows) => {
  79.         if (err) {
  80.             res.status(500).json({ error: err.message });
  81.             return;
  82.         }
  83.         res.json(rows);
  84.     });
  85. });
  86.  
  87. // Endpoint para importar Excel
  88. app.post('/api/import', upload.single('excel'), (req, res) => {
  89.     const filePath = path.join('/var/www/html/cashflow/', 'upload.xlsx');
  90.     if (!req.file) {
  91.         res.status(400).json({ error: 'Nenhum ficheiro Excel enviado.' });
  92.         return;
  93.     }
  94.  
  95.     try {
  96.         const workbook = XLSX.readFile(filePath);
  97.         const sheet = workbook.Sheets[workbook.SheetNames[0]];
  98.         const data = XLSX.utils.sheet_to_json(sheet);
  99.  
  100.         db.serialize(() => {
  101.             const stmt = db.prepare(`
  102.                 INSERT INTO cashflow (data_operacao, descricao, montante, destino, categoria, sub_categoria)
  103.                 VALUES (?, ?, ?, ?, ?, ?)
  104.             `);
  105.  
  106.             let successCount = 0;
  107.             let errorCount = 0;
  108.  
  109.             data.forEach((row) => {
  110.                 try {
  111.                     const data_operacao = excelSerialToDate(row['Data Operação']);
  112.                     const descricao = row['Descrição'] || '';
  113.                     const montante = parseFloat(row['Montante']);
  114.                     const destino = row['Destino'] || '';
  115.                     let categoria = 'n/a';
  116.                     let sub_categoria = 'n/a';
  117.  
  118.                     if (row['Categoria'] && row['Categoria'] !== 'n/a') {
  119.                         const [cat, sub] = row['Categoria'].split('-');
  120.                         categoria = cat || 'n/a';
  121.                         sub_categoria = sub || 'n/a';
  122.                     }
  123.  
  124.                     stmt.run(
  125.                         data_operacao,
  126.                         descricao,
  127.                         montante,
  128.                         destino,
  129.                         categoria,
  130.                         sub_categoria,
  131.                         (err) => {
  132.                             if (err) {
  133.                                 errorCount++;
  134.                                 console.error('Erro ao inserir linha:', err.message);
  135.                             } else {
  136.                                 successCount++;
  137.                             }
  138.                         }
  139.                     );
  140.                 } catch (err) {
  141.                     errorCount++;
  142.                     console.error('Erro ao processar linha:', err.message);
  143.                 }
  144.             });
  145.  
  146.             stmt.finalize();
  147.             fs.unlinkSync(filePath);
  148.             res.json({ success: successCount, errors: errorCount });
  149.         });
  150.     } catch (err) {
  151.         res.status(500).json({ error: 'Erro ao processar o ficheiro Excel: ' + err.message });
  152.     }
  153. });
  154.  
  155. // Iniciar servidor
  156. app.listen(port, () => {
  157.     console.log(`Servidor Node.js a correr em http://localhost:${port}`);
  158. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement