fmatituy/selectospromanager
0
1import sqlite3
2from datetime import datetime
3from database.db import DB_PATH, hash_password
4
5def db_query(query, params=(), fetchone=False, fetchall=True):
6 conn = sqlite3.connect(DB_PATH)
7 conn.row_factory = sqlite3.Row
8 c = conn.cursor()
9 c.execute(query, params)
10 res = None
11 if fetchall:
12 res = [dict(r) for r in c.fetchall()]
13 elif fetchone:
14 row = c.fetchone()
15 res = dict(row) if row else None
16 conn.commit()
17 conn.close()
18 return res
19
20def db_execute(query, params=()):
21 conn = sqlite3.connect(DB_PATH)
22 c = conn.cursor()
23 c.execute(query, params)
24 last_id = c.lastrowid
25 conn.commit()
26 conn.close()
27 return last_id
28
29# --- Gestión de Empleados ---
30def get_empleados(activos_only=False):
31 sql = "SELECT * FROM empleados"
32 if activos_only: sql += " WHERE estado = 'Activo'"
33 return db_query(sql)
34
35def save_empleado(data):
36 if data.get('id'):
37 db_execute('''
38 UPDATE empleados SET
39 nombre=?, tipo_documento=?, documento=?, cargo=?, area=?,
40 telefono=?, correo=?, fecha_ingreso=?, estado=?, tipo_contrato=?,
41 hoja_vida=?, eps=?, arl=?, fondo_pension=?, nivel_riesgo=?,
42 ciudad=?, centro_trabajo=?, proyecto_id=?, firma_url=?
43 WHERE id=?''',
44 (data['nombre'], data['tipo_documento'], data['documento'], data['cargo'], data['area'],
45 data['telefono'], data['correo'], data['fecha_ingreso'], data['estado'], data['tipo_contrato'],
46 data.get('hoja_vida'), data.get('eps'), data.get('arl'), data.get('fondo_pension'), data.get('nivel_riesgo'),
47 data.get('ciudad'), data.get('centro_trabajo'), data.get('proyecto_id'), data.get('firma_url'), data['id']))
48 return data['id']
49 else:
50 return db_execute('''
51 INSERT INTO empleados (
52 nombre, tipo_documento, documento, cargo, area,
53 telefono, correo, fecha_ingreso, estado, tipo_contrato,
54 hoja_vida, eps, arl, fondo_pension, nivel_riesgo,
55 ciudad, centro_trabajo, proyecto_id, firma_url
56 ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
57 (data['nombre'], data['tipo_documento'], data['documento'], data['cargo'], data['area'],
58 data['telefono'], data['correo'], data['fecha_ingreso'], data['estado'], data['tipo_contrato'],
59 data.get('hoja_vida'), data.get('eps'), data.get('arl'), data.get('fondo_pension'), data.get('nivel_riesgo'),
60 data.get('ciudad'), data.get('centro_trabajo'), data.get('proyecto_id'), data.get('firma_url')))
61
62def delete_empleado(emp_id):
63 # Primero eliminar usuario asociado
64 db_execute("DELETE FROM usuarios WHERE empleado_id=?", (emp_id,))
65 # Eliminar empleado
66 db_execute("DELETE FROM empleados WHERE id=?", (emp_id,))
67
68# --- Gestión de Usuarios ---
69def get_usuarios_personal():
70 return db_query('''
71 SELECT u.id, u.username, u.rol_id, u.activo, u.nombre as nombre_usuario, r.nombre as rol_nombre, e.nombre as empleado_nombre, u.empleado_id
72 FROM usuarios u
73 JOIN roles r ON u.rol_id = r.id
74 LEFT JOIN empleados e ON u.empleado_id = e.id
75 ''')
76
77def create_or_update_user(data):
78 if data.get('id'):
79 if data.get('password'):
80 db_execute("UPDATE usuarios SET username=?, password=?, rol_id=?, activo=?, empleado_id=? WHERE id=?",
81 (data['username'], hash_password(data['password']), data['rol_id'], data['activo'], data['empleado_id'], data['id']))
82 else:
83 db_execute("UPDATE usuarios SET username=?, rol_id=?, activo=?, empleado_id=? WHERE id=?",
84 (data['username'], data['rol_id'], data['activo'], data['empleado_id'], data['id']))
85 else:
86 db_execute("INSERT INTO usuarios (username, password, rol_id, nombre, empleado_id, activo, fecha_creacion) VALUES (?,?,?,?,?,?,?)",
87 (data['username'], hash_password(data['password']), data['rol_id'], data['nombre'], data['empleado_id'], 1, datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
88
89def delete_user(user_id):
90 db_execute("DELETE FROM usuarios WHERE id=?", (user_id,))
91
92# --- Asistencia ---
93def registrar_entrada(empleado_id, ubicacion="", proyecto_id=None):
94 fecha = datetime.now().strftime('%Y-%m-%d')
95 hora = datetime.now().strftime('%H:%M:%S')
96 # Verificar si ya tiene entrada hoy
97 existe = db_query("SELECT id FROM asistencias WHERE empleado_id=? AND fecha=?", (empleado_id, fecha), fetchone=True, fetchall=False)
98 if not existe:
99 db_execute("INSERT INTO asistencias (empleado_id, fecha, hora_entrada, ubicacion, proyecto_id) VALUES (?,?,?,?,?)",
100 (empleado_id, fecha, hora, ubicacion, proyecto_id))
101 return True
102 return False
103
104def registrar_salida(empleado_id):
105 fecha = datetime.now().strftime('%Y-%m-%d')
106 hora_salida = datetime.now().strftime('%H:%M:%S')
107 asist = db_query("SELECT id, hora_entrada FROM asistencias WHERE empleado_id=? AND fecha=? AND hora_salida IS NULL", (empleado_id, fecha), fetchone=True, fetchall=False)
108 if asist:
109 # Calcular horas
110 fmt = '%H:%M:%S'
111 tdelta = datetime.strptime(hora_salida, fmt) - datetime.strptime(asist['hora_entrada'], fmt)
112 horas = tdelta.total_seconds() / 3600.0
113 db_execute("UPDATE asistencias SET hora_salida=?, horas_trabajadas=? WHERE id=?", (hora_salida, round(horas, 2), asist['id']))
114 return True
115 return False
116
117def get_asistencias_reporte(fecha_inicio, fecha_fin, empleado_id=None):
118 sql = """SELECT a.*, e.nombre as empleado_nombre, p.nombre as proyecto_nombre
119 FROM asistencias a
120 JOIN empleados e ON a.empleado_id = e.id
121 LEFT JOIN proyectos p ON a.proyecto_id = p.id
122 WHERE a.fecha BETWEEN ? AND ?"""
123 params = [fecha_inicio, fecha_fin]
124 if empleado_id:
125 sql += " AND a.empleado_id = ?"
126 params.append(empleado_id)
127 return db_query(sql, tuple(params))
128
129# --- Novedades ---
130def registrar_novedad(data):
131 return db_execute("INSERT INTO novedades (empleado_id, tipo, descripcion, fecha_inicio, fecha_fin, registrada_por) VALUES (?,?,?,?,?,?)",
132 (data['empleado_id'], data['tipo'], data['descripcion'], data['fecha_inicio'], data['fecha_fin'], data['registrada_por']))
133
134def get_novedades_activas():
135 hoy = datetime.now().strftime('%Y-%m-%d')
136 return db_query("SELECT n.*, e.nombre as empleado_nombre FROM novedades n JOIN empleados e ON n.empleado_id = e.id WHERE ? BETWEEN n.fecha_inicio AND n.fecha_fin", (hoy,))
137
138# --- Dashboard Stats ---
139def get_dashboard_stats():
140 hoy = datetime.now().strftime('%Y-%m-%d')
141 res = {
142 'total_empleados': db_query("SELECT COUNT(*) as count FROM empleados WHERE estado='Activo'", fetchone=True, fetchall=False)['count'],
143 'presentes_hoy': db_query("SELECT COUNT(*) as count FROM asistencias WHERE fecha=?", (hoy,), fetchone=True, fetchall=False)['count'],
144 'novedades_hoy': db_query("SELECT COUNT(*) as count FROM novedades WHERE ? BETWEEN fecha_inicio AND fecha_fin", (hoy,), fetchone=True, fetchall=False)['count'],
145 'horas_mes': db_query("SELECT SUM(horas_trabajadas) as sum FROM asistencias WHERE strftime('%m', fecha) = ?", (datetime.now().strftime('%m'),), fetchone=True, fetchall=False)['sum'] or 0
146 }
147 return res
148 