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>
This commit is contained in:
commit
ab3c613165
154 files changed
+16872
No files matched your search
@@ -0,0 +1,90 @@
|
||||
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"}
|
||||
Reference in new issue
Block a user