mirror of
https://github.com/marcogll/ap_pos.git
synced 2026-01-13 21:25:16 +00:00
Se agrega la capacidad de agendar citas para los servicios. - Se añaden campos de fecha y hora de cita en el formulario de nuevo movimiento. - Se actualiza la tabla de movimientos para mostrar la información de la cita. - Se modifica la base de datos para almacenar la fecha y hora de la cita. - Se ajusta la exportación a CSV para incluir los nuevos campos. - Se reemplaza la generación de folio secuencial por uno aleatorio.
161 lines
4.5 KiB
JavaScript
161 lines
4.5 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,
|
|
fechaCita TEXT,
|
|
horaCita 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, fechaCita, horaCita } = movement;
|
|
db.run(`INSERT INTO movements (id, folio, fechaISO, clienteId, tipo, monto, metodo, concepto, staff, notas, fechaCita, horaCita)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
[id, folio, fechaISO, clienteId, tipo, monto, metodo, concepto, staff, notas, fechaCita, horaCita], 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}`);
|
|
});
|