Base para el flujo de ramas por cliente. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
90 lines
3.0 KiB
Python
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"} |