Files
2025-05-22 18:33:00 -04:00

76 lines
2.2 KiB
JavaScript

const express = require('express');
const router = express.Router();
const pool = require('../db');
const impressionValidator = require('../validators/impressionValidator');
const handleValidation = require('../middleware/handleValidation');
const verifyToken = require('../middleware/verifyToken');
router.post('/',
verifyToken,
handleValidation,
impressionValidator,
async (req, res) => {
const { cost, numAccount, pages } = req.body;
const idUser = req.user.id_usuario;
let connection;
try {
// Obtener conexión del pool
connection = await pool.getConnection();
// Consultar crédito actual
const [rows] = await connection.execute(
'SELECT credito FROM alumno WHERE id_cuenta = ?',
[numAccount]
);
if (rows.length === 0) {
return res.status(404).json({ error: 'Alumno no encontrado' });
}
const currentCredit = parseFloat(rows[0].credito);
const requestedCost = parseFloat(cost);
if (isNaN(currentCredit) || isNaN(requestedCost)) {
return res.status(400).json({ error: 'Valores numéricos inválidos' });
}
if (currentCredit < requestedCost) {
return res.status(400).json({ error: 'Crédito insuficiente' });
}
// Iniciar transacción
await connection.beginTransaction();
// Insertar detalle de impresión
await connection.execute(
`INSERT INTO detalle_servicio
(monto, fecha_operacion, id_cuenta, id_servicio, id_usuario, numero_hojas)
VALUES (?, NOW(), ?, 1, ?, ?)`,
[requestedCost, numAccount, idUser, pages]
);
// Actualizar crédito
await connection.execute(
'UPDATE alumno SET credito = credito - ? WHERE id_cuenta = ?',
[requestedCost, numAccount]
);
// Confirmar transacción
await connection.commit();
res.json({ message: 'Impresión registrada y crédito actualizado correctamente' });
} catch (err) {
if (connection) await connection.rollback();
console.error(err);
res.status(500).json({ error: 'Error en el servidor durante la impresión' });
} finally {
if (connection) connection.release();
}
});
module.exports = router;
//IO