fmatituy/selectospromanager
0
1from .db import DB_PATH2import sqlite33from datetime import datetime, timedelta4 5def db_execute(query, params=()):6 conn = sqlite3.connect(DB_PATH)7 c = conn.cursor()8 c.execute(query, params)9 conn.commit()10 conn.close()11 12def db_fetchall(query, params=()):13 conn = sqlite3.connect(DB_PATH)14 conn.row_factory = sqlite3.Row15 c = conn.cursor()16 c.execute(query, params)17 res = [dict(row) for row in c.fetchall()]18 conn.close()19 return res20 21# --- CONSULTAS DE CATÁLOGO E INVENTARIO ---22 23def get_epp_catalogo():24 return db_fetchall("SELECT * FROM sst_epp_catalogo ORDER BY nombre ASC")25 26def create_epp_item(data):27 db_execute("""28 INSERT INTO sst_epp_catalogo (nombre, categoria, vida_util_meses, descripcion, stock_minimo, stock_actual, ubicacion, fecha_ingreso)29 VALUES (?, ?, ?, ?, ?, ?, ?, ?)30 """, (data['nombre'], data['categoria'], data['vida_util_meses'], data['descripcion'], 31 data['stock_minimo'], data['stock_actual'], data['ubicacion'], datetime.now().strftime('%Y-%m-%d')))32 33def update_epp_stock(epp_id, cantidad, tipo='Suma'):34 op = "+" if tipo == 'Suma' else "-"35 db_execute(f"UPDATE sst_epp_catalogo SET stock_actual = stock_actual {op} ? WHERE id = ?", (cantidad, epp_id))36 37# --- CONSULTAS DE ENTREGAS ---38 39def registrar_entrega_epp(data):40 # Calcular fecha de vencimiento basada en vida util41 epp = db_fetchall("SELECT vida_util_meses FROM sst_epp_catalogo WHERE id = ?", (data['epp_id'],))[0]42 fecha_entrega = datetime.strptime(data['fecha_entrega'], '%Y-%m-%d')43 fecha_vencimiento = (fecha_entrega + timedelta(days=30 * epp['vida_util_meses'])).strftime('%Y-%m-%d')44 45 db_execute("""46 INSERT INTO sst_epp_entregas (trabajador_id, epp_id, fecha_entrega, cantidad, estado_epp, fecha_vencimiento, firma_digital, foto_url, observacion, responsable_id)47 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)48 """, (data['trabajador_id'], data['epp_id'], data['fecha_entrega'], data['cantidad'], 49 data['estado_epp'], fecha_vencimiento, data.get('firma'), data.get('foto'), data.get('observacion'), data['responsable_id']))50 51 # Descontar de inventario52 update_epp_stock(data['epp_id'], data['cantidad'], tipo='Resta')53 54def get_entregas_historial():55 return db_fetchall("""56 SELECT e.*, u.nombre as trabajador_nombre, c.nombre as epp_nombre, c.categoria, resp.nombre as responsable_nombre57 FROM sst_epp_entregas e58 JOIN usuarios u ON e.trabajador_id = u.id59 JOIN sst_epp_catalogo c ON e.epp_id = c.id60 LEFT JOIN usuarios resp ON e.responsable_id = resp.id61 ORDER BY e.fecha_entrega DESC62 """)63 64def get_epp_por_trabajador(trabajador_id):65 return db_fetchall("""66 SELECT e.*, c.nombre as epp_nombre, c.categoria67 FROM sst_epp_entregas e68 JOIN sst_epp_catalogo c ON e.epp_id = c.id69 WHERE e.trabajador_id = ?70 ORDER BY e.fecha_entrega DESC71 """, (trabajador_id,))72 73# --- CONSULTAS DE REPOSICIONES ---74 75def get_epp_reposiciones():76 return db_fetchall("""77 SELECT r.*, u.nombre as trabajador_nombre, c.nombre as epp_nombre78 FROM sst_epp_reposiciones r79 JOIN usuarios u ON r.trabajador_id = u.id80 JOIN sst_epp_catalogo c ON r.epp_id = c.id81 ORDER BY r.fecha_solicitud DESC82 """)83 84def create_reposicion_epp(trabajador_id, epp_id, motivo, entrega_original_id=None):85 db_execute("""86 INSERT INTO sst_epp_reposiciones (trabajador_id, epp_id, motivo, fecha_solicitud, estado, entrega_id_original)87 VALUES (?, ?, ?, ?, 'Pendiente', ?)88 """, (trabajador_id, epp_id, motivo, datetime.now().strftime('%Y-%m-%d'), entrega_original_id))89 90# --- INDICADORES ---91 92def get_epp_stats():93 conn = sqlite3.connect(DB_PATH)94 c = conn.cursor()95 96 stats = {}97 98 # Stock99 c.execute("SELECT COUNT(*) FROM sst_epp_catalogo")100 stats['total_items'] = c.fetchone()[0]101 102 c.execute("SELECT COUNT(*) FROM sst_epp_catalogo WHERE stock_actual <= stock_minimo AND stock_actual > 0")103 stats['stock_bajo'] = c.fetchone()[0]104 105 c.execute("SELECT COUNT(*) FROM sst_epp_catalogo WHERE stock_actual == 0")106 stats['stock_agotado'] = c.fetchone()[0]107 108 # Entregas mes109 c.execute("SELECT COUNT(*) FROM sst_epp_entregas WHERE fecha_entrega >= date('now', 'start of month')")110 stats['entregas_mes'] = c.fetchone()[0]111 112 # Vencimientos113 c.execute("SELECT COUNT(*) FROM sst_epp_entregas WHERE fecha_vencimiento < date('now')")114 stats['vencidos'] = c.fetchone()[0]115 116 c.execute("SELECT COUNT(*) FROM sst_epp_entregas WHERE fecha_vencimiento >= date('now') AND fecha_vencimiento <= date('now', '+30 days')")117 stats['por_vencer'] = c.fetchone()[0]118 119 conn.close()120 return stats121 