Files
mini-erp/mini-backend/routers/auth.py
T
GeorgeandClaude Sonnet 5 ab3c613165 Initial commit: mini-erp (backend FastAPI + frontend React/Vite)
Base para el flujo de ramas por cliente.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 10:34:12 -05:00

90 lines
3.0 KiB
Python

import os
import logging
from fastapi import APIRouter, Request, HTTPException
from core.sap import forward_to_sapb1, ensure_sap_session
from core.session import create_employee_session, remove_employee_session_by_token
from context import set_current_user
from dotenv import load_dotenv
# Cargar variables de entorno desde .env
load_dotenv(dotenv_path=".env")
SAPB1_SL_COMPANYDB = os.getenv("SAPB1_SL_COMPANYDB", "")
logger = logging.getLogger(__name__)
router = APIRouter(
tags=["Autenticación"]
)
@router.post("/api/Login")
async def login(request: Request):
data = await request.json()
webUser = data.get("Username")
password = data.get("Password")
logger.info(f"Intento de login recibido para el usuario web {webUser}")
webUser_escaped = (webUser or "").replace("'", "''")
try:
employee_response = forward_to_sapb1(
method="GET",
endpoint_path="EmployeesInfo",
params={
"$select": "EmployeeID,FirstName,LastName,Active,U_WEB_USER,U_WEB_PASS",
"$filter": f"U_WEB_USER eq '{webUser_escaped}'"
}
)
except HTTPException:
raise HTTPException(status_code=401, detail="Usuario o contraseña incorrectos")
except Exception as exc:
logger.error(f"Error al consultar empleados en SAP a través de proxy: {exc}")
raise HTTPException(status_code=500, detail=f"Error al consultar empleados en SAP: {exc}")
employees = employee_response.json().get("value", [])
employee_data = employees[0] if employees else None
if employee_data is None:
logger.warning(f"Login fallido: no se encontró ningún empleado con U_WEB_USER {webUser}")
raise HTTPException(status_code=401, detail="Usuario no registrado")
empId = employee_data.get("EmployeeID")
if employee_data.get("Active") != "tYES":
logger.warning(f"Login fallido: el empleado {empId} está inactivo")
raise HTTPException(status_code=401, detail="Usuario inactivo")
if employee_data.get("U_WEB_PASS") != password:
logger.warning(f"Login fallido: la contraseña no coincide para el empleado {empId}")
raise HTTPException(status_code=401, detail="Usuario o contraseña incorrectos")
full_name = f"{employee_data.get('FirstName', '')} {employee_data.get('LastName', '')}".strip()
set_current_user(webUser, full_name, empId)
logger.info(f"Login exitoso para el usuario {webUser} (empleado SAP {empId})")
token = create_employee_session(
webUser=webUser,
emp_id=empId,
first_name=employee_data.get('FirstName', ''),
last_name=employee_data.get('LastName', '')
)
ensure_sap_session()
return {
"message": "Login exitoso",
"token": token,
"username": employee_data.get('FirstName'),
"company": SAPB1_SL_COMPANYDB
}
@router.post("/api/Logout")
async def logout(request: Request):
token = request.headers.get("X-Session-Token")
if token:
remove_employee_session_by_token(token)
return {"message": "Logout exitoso"}