CoolFace
Apppublic

fmatituy/selectospromanager

sourceHugging Faceupdated 6mo agoView on Hugging Face
0likes
services_personal.py148 linesDownload Raw Back to personal
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