Files
ap_pos/ap-pos/server.js
2025-08-12 20:25:27 -06:00

159 lines
4.3 KiB
JavaScript

const express = require('express');
const sqlite3 = require('sqlite3').verbose();
const cors = require('cors');
const path = require('path');
const app = express();
const port = 3000;
app.use(cors());
app.use(express.json());
// Servir archivos estáticos (CSS, JS, imágenes)
app.use(express.static(__dirname));
// Ruta principal para servir el index.html
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'index.html'));
});
// Initialize SQLite database
const db = new sqlite3.Database('./ap-pos.db', (err) => {
if (err) {
console.error(err.message);
}
console.log('Connected to the ap-pos.db database.');
});
// Create tables if they don't exist
db.serialize(() => {
db.run(`CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT
)`);
db.run(`CREATE TABLE IF NOT EXISTS clients (
id TEXT PRIMARY KEY,
nombre TEXT,
telefono TEXT,
cumpleaños TEXT,
consentimiento INTEGER
)`);
db.run(`CREATE TABLE IF NOT EXISTS movements (
id TEXT PRIMARY KEY,
folio TEXT,
fechaISO TEXT,
clienteId TEXT,
tipo TEXT,
monto REAL,
metodo TEXT,
concepto TEXT,
staff TEXT,
notas TEXT,
FOREIGN KEY (clienteId) REFERENCES clients (id)
)`);
});
// API routes will go here
// --- Settings ---
app.get('/api/settings', (req, res) => {
db.get("SELECT value FROM settings WHERE key = 'settings'", (err, row) => {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json(row ? JSON.parse(row.value) : {});
});
});
app.post('/api/settings', (req, res) => {
const { settings } = req.body;
const value = JSON.stringify(settings);
db.run(`INSERT OR REPLACE INTO settings (key, value) VALUES ('settings', ?)`, [value], function(err) {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json({ message: 'Settings saved' });
});
});
// --- Clients ---
app.get('/api/clients', (req, res) => {
db.all("SELECT * FROM clients", [], (err, rows) => {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json(rows);
});
});
app.post('/api/clients', (req, res) => {
const { client } = req.body;
const { id, nombre, telefono, cumpleaños, consentimiento } = client;
db.run(`INSERT OR REPLACE INTO clients (id, nombre, telefono, cumpleaños, consentimiento) VALUES (?, ?, ?, ?, ?)`,
[id, nombre, telefono, cumpleaños, consentimiento], function(err) {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json({ id });
});
});
app.delete('/api/clients/:id', (req, res) => {
const { id } = req.params;
db.run(`DELETE FROM clients WHERE id = ?`, id, function(err) {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json({ message: 'Client deleted' });
});
});
// --- Movements ---
app.get('/api/movements', (req, res) => {
db.all("SELECT * FROM movements ORDER BY fechaISO DESC", [], (err, rows) => {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json(rows);
});
});
app.post('/api/movements', (req, res) => {
const { movement } = req.body;
const { id, folio, fechaISO, clienteId, tipo, monto, metodo, concepto, staff, notas } = movement;
db.run(`INSERT INTO movements (id, folio, fechaISO, clienteId, tipo, monto, metodo, concepto, staff, notas)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[id, folio, fechaISO, clienteId, tipo, monto, metodo, concepto, staff, notas], function(err) {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json({ id });
});
});
app.delete('/api/movements/:id', (req, res) => {
const { id } = req.params;
db.run(`DELETE FROM movements WHERE id = ?`, id, function(err) {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json({ message: 'Movement deleted' });
});
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});