# Reglas obligatorias para almacenamiento de documentos Estas reglas complementan `AGENTS.md` y aplican a todo archivo persistido por la aplicación. ## Estructura física La raíz de documentos de la aplicación es: ```text Documentos/ Generales/ Clientes/ {CveCliente}/ ``` - `Generales` contiene documentos que no pertenecen a un cliente específico. - `Clientes` contiene una carpeta por `CveCliente`. - Antes de guardar un archivo, el servicio debe asegurar la existencia de `Documentos`, `Documentos/Generales`, `Documentos/Clientes` y de la carpeta específica del cliente cuando aplique. - No asumir que las carpetas ya existen. Usar una operación idempotente como `Directory.CreateDirectory` para crearlas cuando falten. - La misma regla aplica a futuras subcarpetas de documentos. ## Acceso y seguridad - Las páginas WebForms y handlers no deben construir rutas físicas ni abrir archivos de cliente por su cuenta. - Todo guardado y obtención de archivos debe pasar por un servicio dedicado de documentos. Un handler de descarga sólo puede transmitir el archivo previamente autorizado y resuelto por ese servicio. - Antes de construir o abrir una ruta física, el servicio debe resolver en servidor el cliente propietario a partir de la entidad de negocio y validar el acceso del usuario. - No confiar para autorización en `CveCliente`, rutas físicas, rutas relativas ni nombres de archivo recibidos desde el navegador. - El rol `Empresa` se considera desarrollador y sólo puede acceder a documentos de clientes activos que tenga asignados en `Sis_UsuariosClientes`. - Los demás roles activos, incluidos `Administrador` y `SuperUsuario`, tienen acceso global a documentos, salvo que una regla funcional más restrictiva se defina explícitamente para un módulo. - Las rutas físicas bajo `Documentos` no deben exponerse como URLs públicas. Las descargas deben pasar por un endpoint autenticado que vuelva a validar el acceso mediante el servicio. ## GIS de etapas de fraccionamiento - El botón `Agregar GIS` carga un archivo físico con extensión `.gis`; no solicita nombre ni URL de visualización al usuario. - El archivo se guarda en `Documentos/Clientes/{CveCliente}/`. - El nombre se genera exclusivamente en servidor con el formato: ```text gis-{CveFraccionamiento}-{CveFraccionamientoEtapa}.gis ``` - El usuario no puede elegir ni modificar el nombre final del archivo. - Al reemplazar el GIS de una etapa se conserva el mismo nombre físico y se sobrescribe el archivo correspondiente. - La obtención del GIS debe usar el servicio de documentos y nunca una URL directa al folder `Documentos`.