76 lines
2.2 KiB
JavaScript
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
|