Crear su propio sistema empresarial
En SetFN Workspace puede crear sistemas propios de la empresa, como groupware o ERP.
Encargue a la AI el diseño de la base de datos y la creación de las interfaces; solo tendrá que preparar los resultados y cargarlos en el espacio de trabajo.
Debe crear 2 archivos. Sus tareas consisten en cargarlos y seleccionar el botón Deploy.
Este ejemplo crea un programa de gestión de inventario para una planta de fabricación.
Si desea probar directamente los archivos terminados sin usar los prompts, descargue conjuntamente el esquema, index.html, mock-db-upload.html y README desde Descargar el ZIP completo de ejemplo.
1. Crear el archivo .sfn de la base de datos
En SetFN Workspace puede crear una base de datos mediante un archivo .sfn. Copie un ejemplo de este archivo, entréguelo a una AI como Claude, GPT o Gemini y describa los requisitos, por ejemplo, «Quiero gestionar las existencias de piezas y productos». La AI creará el archivo.
Copie el siguiente contenido, modifique los requisitos de la parte inferior y entrégueselo a la AI.
Eres un ingeniero que diseña archivos de esquema (.sfn) para la plataforma backend sin código SetFN.
Un archivo .sfn es un archivo JSON con la siguiente estructura.
{
"content-type": "application/setfn-schema",
"dbType": "sqlite3",
"apiBuild": {
"dbName": "nombre_bd_en_ingles_minusculas",
"dbEngine": "sqlite",
"includeClient": false,
"features": {
"realtime": { "enabled": false },
"upload": { "enabled": false },
"ai-chat": { "enabled": false }
}
},
"data": [
{
"table": { "name": "nombre_tabla", "cmt": "Descripción de esta tabla" },
"columns": [
{ "name": "id", "type": "serial4", "primary": true, "default": "auto_increment" },
{ "name": "nombre_columna", "type": "text", "notnull": true, "cmt": "Descripción de la columna" },
{ "name": "columna_numerica", "type": "int4", "notnull": true, "default": "0" },
{ "name": "_created_at", "type": "timestamp", "default": "now()" }
],
"permissions": {
"security": { "login": true },
"ops": {
"list": { "login": true },
"view": { "login": true },
"create": { "login": true },
"update": { "login": true },
"delete": { "login": true, "roles": ["admin"] }
}
}
}
]
}
Para el campo type de las columnas, usa únicamente serial4 (clave primaria autoincremental), text, int4 (entero) y timestamp.
Añade notnull, default, unique, index y cmt a las columnas cuando sea necesario.
Escribe en inglés snake_case los nombres de la base de datos, las tablas y las columnas. Escribe en español todos los valores cmt y los demás textos destinados a las personas.
Con este formato, diseña una base de datos para un "sistema de gestión de inventario" destinado a una empresa de fabricación. Debe cumplir estos requisitos:
- Permitir registrar piezas y gestionar las existencias actuales de cada pieza.
- Permitir registrar productos y gestionar las existencias actuales de cada producto.
- Cada producto se fabrica ensamblando varias piezas. Debe gestionarse qué piezas necesita cada producto y en qué cantidad mediante una BOM o lista de materiales.
- Registrar el historial de entradas y salidas de piezas y productos. En particular, cuando se produzca el evento "fabricar un producto ensamblando piezas", las piezas utilizadas y la cantidad de productos fabricados deben poder seguirse juntas como un único evento. Más adelante debe ser posible consultar cuántas piezas se usaron para fabricar un producto.
Usa "inventory_management" como nombre de la base de datos (dbName).
Diseña un máximo de cuatro tablas y procura que el resultado sea lo bastante práctico como para utilizarlo directamente en un entorno real.
Devuelve únicamente el código JSON completo del archivo .sfn, sin explicaciones adicionales.
A continuación se muestra un ejemplo de la respuesta generada. El resultado puede variar según la AI y la ejecución; basta con que tenga una estructura similar. Debe comenzar por { y terminar por }, sin otra explicación, para que pueda pegarlo directamente en el editor.
{
"content-type": "application/setfn-schema",
"dbType": "sqlite3",
"apiBuild": {
"dbName": "inventory_management",
"dbEngine": "sqlite",
"includeClient": false,
"features": {
"realtime": { "enabled": false },
"upload": { "enabled": false },
"ai-chat": { "enabled": false }
}
},
"data": [
{
"table": { "name": "parts", "cmt": "부품 마스터. 조회/등록/수정은 회원 누구나, 삭제는 관리자만" },
"columns": [
{ "name": "id", "type": "serial4", "primary": true, "default": "auto_increment" },
{ "name": "part_code", "type": "text", "notnull": true, "unique": true, "cmt": "부품 코드" },
{ "name": "name", "type": "text", "notnull": true, "cmt": "부품명" },
{ "name": "spec", "type": "text", "cmt": "규격 (예: M2, 220V/50Hz). 같은 이름이라도 규격이 다르면 별도 part_code로 등록" },
{ "name": "category", "type": "text", "cmt": "부품 분류 (전자부품/기구부품/포장재 등)" },
{ "name": "unit", "type": "text", "notnull": true, "default": "EA", "cmt": "단위" },
{ "name": "unit_cost", "type": "int4", "notnull": true, "default": "0", "cmt": "단가" },
{ "name": "current_stock", "type": "int4", "notnull": true, "default": "0", "cmt": "현재고" },
{ "name": "safety_stock", "type": "int4", "notnull": true, "default": "0", "cmt": "안전재고(재주문점)" },
{ "name": "supplier", "type": "text", "cmt": "공급업체" },
{ "name": "_user_id", "type": "int4", "notnull": true, "index": true },
{ "name": "_nick", "type": "text", "cmt": "최종 등록/수정한 회원 표시 이름" },
{ "name": "_created_at", "type": "timestamp", "default": "now()" }
],
"permissions": {
"security": { "login": true, "ownerColumn": "_user_id" },
"ops": {
"list": { "login": true },
"view": { "login": true },
"create": { "login": true },
"update": { "login": true },
"delete": { "login": true, "roles": ["admin"] }
}
}
},
{
"table": { "name": "products", "cmt": "제품 마스터. 조회/등록/수정은 회원 누구나, 삭제는 관리자만" },
"columns": [
{ "name": "id", "type": "serial4", "primary": true, "default": "auto_increment" },
{ "name": "product_code", "type": "text", "notnull": true, "unique": true, "cmt": "제품 코드" },
{ "name": "name", "type": "text", "notnull": true, "cmt": "제품명" },
{ "name": "category", "type": "text", "cmt": "제품 분류" },
{ "name": "unit", "type": "text", "notnull": true, "default": "EA", "cmt": "단위" },
{ "name": "price", "type": "int4", "notnull": true, "default": "0", "cmt": "판매가" },
{ "name": "current_stock", "type": "int4", "notnull": true, "default": "0", "cmt": "현재고" },
{ "name": "_user_id", "type": "int4", "notnull": true, "index": true },
{ "name": "_nick", "type": "text", "cmt": "최종 등록/수정한 회원 표시 이름" },
{ "name": "_created_at", "type": "timestamp", "default": "now()" }
],
"permissions": {
"security": { "login": true, "ownerColumn": "_user_id" },
"ops": {
"list": { "login": true },
"view": { "login": true },
"create": { "login": true },
"update": { "login": true },
"delete": { "login": true, "roles": ["admin"] }
}
}
},
{
"table": { "name": "bom", "cmt": "제품별 부품 구성표(단일 단계). bom_key(product_id:part_id)에 unique 제약을 걸어 같은 제품에 같은 부품이 중복 등록되지 않게 함" },
"columns": [
{ "name": "id", "type": "serial4", "primary": true, "default": "auto_increment" },
{ "name": "product_id", "type": "int4", "notnull": true, "index": true },
{ "name": "part_id", "type": "int4", "notnull": true, "index": true },
{ "name": "qty_per_unit", "type": "int4", "notnull": true, "default": "1", "cmt": "제품 1개를 만드는 데 필요한 부품 수량" },
{ "name": "bom_key", "type": "text", "notnull": true, "unique": true, "cmt": "product_id:part_id 조합. 중복 등록 방지용" },
{ "name": "_user_id", "type": "int4", "notnull": true, "index": true },
{ "name": "_nick", "type": "text", "cmt": "등록한 회원 표시 이름" },
{ "name": "_created_at", "type": "timestamp", "default": "now()" }
],
"permissions": {
"security": { "login": true, "ownerColumn": "_user_id" },
"ops": {
"list": { "login": true },
"view": { "login": true },
"create": { "login": true },
"update": { "login": true },
"delete": { "login": true, "roles": ["admin"] }
}
}
},
{
"table": { "name": "stock_transactions", "cmt": "입출고/조립 통합 이력. item_type=part|product, tx_type=입고|출고|조립사용|조립생산. 하나의 조립생산 이벤트는 같은 batch_id를 공유하는 조립사용(부품 소모) 여러 건 + 조립생산(제품 증가) 1건으로 구성되어, 제품에 어떤 부품이 얼마나 쓰였는지 추적할 수 있음" },
"columns": [
{ "name": "id", "type": "serial4", "primary": true, "default": "auto_increment" },
{ "name": "item_type", "type": "text", "notnull": true, "cmt": "part | product" },
{ "name": "item_id", "type": "int4", "notnull": true, "index": true, "cmt": "parts.id 또는 products.id" },
{ "name": "item_name", "type": "text", "notnull": true, "cmt": "등록 시점 품목명 스냅샷" },
{ "name": "tx_type", "type": "text", "notnull": true, "cmt": "입고 | 출고 | 조립사용 | 조립생산" },
{ "name": "reason", "type": "text", "cmt": "입출고 사유. 조립사용/조립생산은 tx_type 자체가 사유이므로 비워둠" },
{ "name": "qty", "type": "int4", "notnull": true, "cmt": "항상 양수. 방향은 tx_type으로 판단" },
{ "name": "batch_id", "type": "text", "index": true, "cmt": "조립생산 이벤트 묶음 id. 단순 입출고는 비어 있음" },
{ "name": "note", "type": "text", "cmt": "메모" },
{ "name": "_user_id", "type": "int4", "notnull": true, "index": true },
{ "name": "_nick", "type": "text", "cmt": "등록한 회원 표시 이름" },
{ "name": "_created_at", "type": "timestamp", "default": "now()" }
],
"permissions": {
"security": { "login": true, "ownerColumn": "_user_id" },
"ops": {
"list": { "login": true },
"view": { "login": true },
"create": { "login": true },
"update": { "login": true, "roles": ["admin"] },
"delete": { "login": true, "roles": ["admin"] }
}
}
}
]
}
Copie el resultado y cree un archivo de esquema vacío en el espacio de trabajo mediante Create → Template Files → New Schema DB.

Introduzca un nombre y guarde para crear el archivo de esquema vacío.

Seleccione la pestaña Editor en la esquina superior derecha y pegue la respuesta anterior de la AI sin modificarla.

Después de guardar, abra la pestaña API Build de la parte superior para consultar las API generadas automáticamente para cada tabla.

Seleccione Deploy para desplegar los ajustes, compruebe Database identifier y vuelva a seleccionar Deploy. Después de unos segundos aparecerá el mensaje Deployment complete!. Por último, seleccione el botón de disquete de la parte superior para guardar. La configuración de la base de datos habrá terminado: las cuatro tablas de piezas, productos, lista de materiales e historial de movimientos, además de las API REST que las gestionan, estarán creadas y listas para utilizarse. A continuación, cree la interfaz que se conectará a la base de datos.
2. Crear el archivo .html de la interfaz
Vuelva a pedírselo a la AI. Planifique y organice lo que desea crear y entréguele también el contenido del archivo .sfn anterior como referencia.
- Formulario para registrar piezas y productos.
- Formulario para registrar entradas y salidas.
- Cálculo automático de las piezas necesarias y actualización de las existencias al registrar cuántas unidades de un producto se han fabricado.
- Tabla con las existencias actuales cuyos valores puedan editarse y guardarse directamente.
Pegue el siguiente contenido en la conversación con la AI. Incluya al principio el resultado del paso 1.
[Pegue aquí el resultado del paso 1]
El esquema anterior ya está desplegado. Crea una única interfaz web (index.html) que utilice este esquema.
Para cargar y guardar datos desde la interfaz, realiza las solicitudes al servidor conforme a estas reglas.
1. Para obtener el token de API del usuario que ha iniciado sesión:
POST /api/auth/bootstrap (credentials: "include")
Respuesta: { data: { access_token, user: { id, nick } } }
2. Incluye este encabezado en todas las solicitudes posteriores: Authorization: Bearer <access_token>
3. Operaciones CRUD de las tablas:
Consultar GET /api/web/{dbName}/{table}/list?column=value → respuesta { rows: [...] } (rows puede ser null si no hay resultados; usa siempre rows || [])
Crear POST /api/web/{dbName}/{table}/create → cuerpo: JSON, respuesta { lastInsertId }
Actualizar PUT /api/web/{dbName}/{table}/update/{id} → cuerpo: JSON (puedes enviar solo las columnas modificadas)
Eliminar DELETE /api/web/{dbName}/{table}/delete/{id}
La interfaz debe incluir estas funciones:
- Formularios para registrar nuevas piezas y productos.
- Un formulario para registrar entradas y salidas de piezas y productos; al guardar la operación, también debe actualizar las existencias actuales.
- Una función para registrar que se ha fabricado una cantidad concreta de un producto. Debe calcular automáticamente las piezas necesarias según la lista de materiales registrada, descontarlas de las existencias y aumentar las existencias del producto. Si no hay suficientes piezas, debe impedir el registro y mostrar un aviso.
- Una vista en forma de tabla con las existencias actuales de piezas y productos. Al seleccionar una celda, debe ser posible modificar y guardar su valor en el mismo lugar.
- Una lista cronológica del historial de entradas, salidas y ensamblajes.
Incluye todo el HTML, CSS y JavaScript en un único archivo. Usa un diseño de tarjetas limpio sobre fondo blanco.
Devuelve únicamente el código completo de index.html, sin explicaciones adicionales.
A continuación se muestra un ejemplo del archivo HTML generado. El resultado puede variar según la AI.
Cargue este archivo en el espacio de trabajo para completar la interfaz que utilizarán los miembros del equipo.
3. Añadir datos de prueba
Para comprobar visualmente el funcionamiento necesita datos. También puede pedir a la AI que cree una pantalla que añada datos de ejemplo mediante un solo botón.
[Pegue aquí el resultado del paso 1]
El esquema anterior ya está desplegado y ya existe un archivo index.html que lo utiliza.
Crea una interfaz llamada mock-db-upload.html que permita rellenar automáticamente datos de prueba al seleccionar un único botón.
Inserta los datos en el servidor real del mismo modo que en la interfaz del paso 2: obtén un token mediante POST /api/auth/bootstrap y crea los registros mediante POST /api/web/{dbName}/{table}/create.
- Crea entre 10 y 15 piezas, entre 3 y 5 productos, la composición de piezas de cada producto y varios registros de entradas y salidas.
- Usa nombres de piezas y productos y cantidades que resulten verosímiles en un entorno de fabricación real.
- Si ya existe un registro con el mismo código, omite solo ese elemento y continúa con los demás.
- Muestra el progreso en la pantalla, una línea de registro cada vez, y al terminar muestra "Completado".
Devuelve únicamente el código completo de mock-db-upload.html, sin explicaciones adicionales.
A continuación se muestra un ejemplo del archivo HTML generado. El resultado puede variar según la AI. Esta pantalla no se despliega; ábrala únicamente cuando necesite preparar una demostración.
Después de introducir datos, el sistema funciona de la siguiente manera.




4. Modificarlo de forma iterativa
No necesita terminarlo todo a la primera. A medida que use la interfaz, siga pidiendo a la AI que añada las funciones que falten o corrija lo que necesite. El siguiente paso depende del tipo de cambio.
- Cambios en la estructura de la base de datos, como tablas o columnas: por ejemplo, añadir una columna o una tabla. Obtenga el archivo
.sfnmodificado, péguelo enEditory vuelva a desplegarlo enAPI Build. - Cambios únicamente en la interfaz, sin modificar la estructura de la base de datos: por ejemplo, el diseño, el texto o la posición de los botones. Obtenga de nuevo
index.htmly sobrescriba el archivo existente. No necesita volver a desplegar la API. - Al cambiar la estructura de una tabla que ya contiene datos, revise la opción
Overwrite existing dataen la configuración de despliegue. Si activa la sobrescritura, los datos existentes se eliminan permanentemente.
Con estos cuatro pasos, la AI crea el diseño de la base de datos, las interfaces, los datos de prueba y las modificaciones posteriores. Después puede seguir perfeccionando el diseño y los detalles según sus necesidades.