Commit inicial - Sistema de Gestion Hotelera Hacienda San Angel

- Backend Node.js/Express con PostgreSQL
- Frontend React 19 con Vite
- Docker Compose para orquestacion
- Documentacion completa en README.md
- Scripts SQL para base de datos
- Configuracion de ejemplo (.env.example)
This commit is contained in:
Consultoria AS
2026-01-17 18:52:34 -08:00
commit 0211bea186
210 changed files with 47045 additions and 0 deletions

View File

@@ -0,0 +1,269 @@
const pool = require('../db/connection');
const getEmployees = async (req, res) => {
try {
// Leer query params con valores por defecto
const page = parseInt(req.query.page) || 1; // Página actual
const limit = parseInt(req.query.limit) || 500; // Cantidad por página
const offset = (page - 1) * limit; // Desde dónde empezar
// Llamamos a la función con LIMIT y OFFSET
const result = await pool.query(
`SELECT * FROM getemployees() LIMIT $1 OFFSET $2`,
[limit, offset]
);
// Obtener total para calcular páginas
const totalResult = await pool.query('SELECT COUNT(*) FROM employees');
const total = parseInt(totalResult.rows[0].count);
const totalPages = Math.ceil(total / limit);
const employees = result.rows.map(emp => ({
employee_rfc: emp.employee_rfc,
name_employee: emp.name_employee,
nss_employe: emp.nss_employe,
position_employee: emp.position_employee,
area_employee: emp.area_employee,
phone_employee: emp.phone_employee,
end_contract: emp.end_contract,
daily_pay: emp.daily_pay,
uniforms: emp.uniforms,
status: emp.status,
birthday: emp.birthday,
curp: emp.curp
}));
res.json({
page,
limit,
total,
totalPages,
data: employees
});
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Error al obtener empleados' });
}
};
//TOTAL DE EMPLEADOS CON CONTRATO ACTIVO
const getTotalActiveEmployees = async (req, res) => {
try {
const result = await pool.query(
'SELECT * FROM activeemployeesnumber() as activenumber',
);
const activeEmployees = result.rows[0].activenumber;
res.json({
message: 'Total de empleados activos',
data: activeEmployees
});
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Error al obtener el total de empleados ' });
}
};
//OBTENER UN SOLO EMPLEADO
const getEmployee = async (req, res) => {
try {
const { rfcEmployee} = req.body;
const result = await pool.query(
'SELECT * FROM getoneemployee($1)',
[rfcEmployee]
);
const employee = result.rows.map(emp => ({
name_emp: emp.name_emp,
rfc_emp: emp.rfc_emp,
nss_emp: emp.nss_emp,
id_position_emp: emp.id_position_emp,
id_area_emp: emp.id_area_emp,
addres_emp:emp.addres_emp,
phone_emp: emp.phone_emp,
email_emp: emp.email_emp,
daily_pay: emp.daily_pay,
uniforms: emp.uniforms,
birthday: emp.birthday,
curp: emp.curp
}));
if (result.rows.length > 0) {
res.json({
message: 'Empleado existio previamente',
data: employee
});
}
else
{
res.json({
message: 'El pleneado no existe.',
data: 0 // Devuelve la primera fila (o todas si quieres)
});
}
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Error al obtener empleado' });
}
}
const newEmployee = async(req,res)=>{
try{
const {
name_emp,
rfc_emp,
nss_emp,
addres_emp,
phone_emp,
email_emp,
birthday_emp,
curp_emp,
study_emp ,
emergency_name ,
emergency_tel,
relationship_id
} = req.body;
const result = await pool.query('SELECT newemployee($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12) AS STATUS',
[name_emp,rfc_emp,nss_emp,addres_emp,phone_emp,email_emp,birthday_emp,curp_emp, study_emp, emergency_name, emergency_tel,relationship_id]
);
const status = result.rows[0].status;
if(status == 1)
message = "Empleado añadido correctamente";
else
message = "Empleado no se pudo agregar"
res.json({
message,
status: status
});
}catch(error){
console.error(error);
res.status(500).json({ error });
}
}
const updateEmployee = async(req,res)=>{
try{
const {
name_emp,
rfc_emp,
nss_emp,
addres_emp,
phone_emp,
email_emp,
birthday_emp,
curp_emp,
study_emp ,
emergency_name ,
emergency_tel,
relationship_id
} = req.body;
const result = await pool.query('SELECT updateemployee($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12) AS STATUS',
[name_emp,rfc_emp,nss_emp,addres_emp,phone_emp,email_emp,birthday_emp,curp_emp, study_emp,
emergency_name, emergency_tel, relationship_id]
);
const status = result.rows[0].status;
if(status == 1)
message = "Empleado actualizado correctamente";
else
message = "No se pudo agregar el empleado"
res.json({
message,
status: status
});
}catch(error){
console.error(error);
res.status(500).json({ error });
}
}
const getattendance = async (req, res) => {
try {
const result = await pool.query(
'SELECT * FROM getattendance()',
);
const attendance = result.rows.map(emp => ({
aid_attendance: emp.aid_attendance,
aname_emp: emp.aname_emp,
alast_name: emp.alast_name,
aID_tran: emp.aID_tran,
arol: emp.arol,
adate_atten:emp.adate_atten,
atime_atten: emp.atime_atten,
alaboral_day: emp.alaboral_day,
adata_origin: emp.adata_origin,
aname_device: emp.aname_device,
aserie_device: emp.aserie_device,
aperforation: emp.aperforation,
aubication: emp.aubication,
aobservations: emp.aobservations
}));
res.json({
message: 'attendance',
data: attendance
});
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Error al obtener checador' });
}
};
const getGradeOfStudy = async (req, res) => {
try {
const result = await pool.query(
'SELECT * FROM degreeofstudy',
);
const study = result.rows.map(emp => ({
id_study: emp.id_study,
name_study: emp.name_study
}));
res.json({
message: 'grados de estudio',
data: study
});
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Error al obtener los grados de estudio' });
}
};
const getRelationshipEmployee = async (req, res) => {
try {
const result = await pool.query(
'SELECT * FROM relationship_employee',
);
const relationship = result.rows.map(emp => ({
id_relationship: emp.id_relationship,
name_relationship: emp.name_relationship
}));
res.json({
message: 'Parentesco',
data: relationship
});
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Error al obtener los parentescos' });
}
}
module.exports =
{ getEmployees,
getTotalActiveEmployees,
getEmployee,
newEmployee,
updateEmployee,
getattendance,
getGradeOfStudy,
getRelationshipEmployee
};