- SECRET_KEY desde variable de entorno (warn si no configurado)
- Rutas absolutas para DB, logos y PDFs
- MAX_CONTENT_LENGTH = 16 MB
- Validación de extensión/tipo en subida de logos y firmas
- _doc_list_page: clientes y productos filtrados por empresa del usuario
- login: rate limiting (10 intentos / 15 min por IP)
- load_user: db.session.get() (SQLAlchemy 2.x compatible)
- pay_success: verifica sesión Stripe antes de marcar factura como pagada
- stripe_checkout: api_key por llamada (thread-safe, elimina global mutable)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>