xonecode 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +167 -0
  2. package/dist/agent/authEnDisco.js +56 -0
  3. package/dist/agent/authEnDisco.js.map +1 -0
  4. package/dist/agent/configEnDisco.js +109 -0
  5. package/dist/agent/configEnDisco.js.map +1 -0
  6. package/dist/agent/crearProyecto.js +34 -0
  7. package/dist/agent/crearProyecto.js.map +1 -0
  8. package/dist/agent/entorno.js +124 -0
  9. package/dist/agent/entorno.js.map +1 -0
  10. package/dist/agent/guionizado.js +53 -0
  11. package/dist/agent/guionizado.js.map +1 -0
  12. package/dist/agent/instantanea.js +129 -0
  13. package/dist/agent/instantanea.js.map +1 -0
  14. package/dist/agent/interrupts.js +83 -0
  15. package/dist/agent/interrupts.js.map +1 -0
  16. package/dist/agent/mensajes.js +24 -0
  17. package/dist/agent/mensajes.js.map +1 -0
  18. package/dist/agent/modelos.js +42 -0
  19. package/dist/agent/modelos.js.map +1 -0
  20. package/dist/agent/normalizar.js +20 -0
  21. package/dist/agent/normalizar.js.map +1 -0
  22. package/dist/agent/perfiles.js +103 -0
  23. package/dist/agent/perfiles.js.map +1 -0
  24. package/dist/agent/proyecto.js +107 -0
  25. package/dist/agent/proyecto.js.map +1 -0
  26. package/dist/agent/puente.js +142 -0
  27. package/dist/agent/puente.js.map +1 -0
  28. package/dist/agent/resumenDeTool.js +48 -0
  29. package/dist/agent/resumenDeTool.js.map +1 -0
  30. package/dist/agent/skills.js +65 -0
  31. package/dist/agent/skills.js.map +1 -0
  32. package/dist/agent/textoDeTool.js +113 -0
  33. package/dist/agent/textoDeTool.js.map +1 -0
  34. package/dist/agent/turnoReal.js +173 -0
  35. package/dist/agent/turnoReal.js.map +1 -0
  36. package/dist/agent/verificador.js +65 -0
  37. package/dist/agent/verificador.js.map +1 -0
  38. package/dist/agent/xoneAgent.js +106 -0
  39. package/dist/agent/xoneAgent.js.map +1 -0
  40. package/dist/bin.js +9 -0
  41. package/dist/bin.js.map +1 -0
  42. package/dist/cli/aprobar.js +82 -0
  43. package/dist/cli/aprobar.js.map +1 -0
  44. package/dist/cli/config.js +133 -0
  45. package/dist/cli/config.js.map +1 -0
  46. package/dist/cli/consola.js +346 -0
  47. package/dist/cli/consola.js.map +1 -0
  48. package/dist/cli/describe.js +53 -0
  49. package/dist/cli/describe.js.map +1 -0
  50. package/dist/cli/doctor.js +45 -0
  51. package/dist/cli/doctor.js.map +1 -0
  52. package/dist/cli/main.js +520 -0
  53. package/dist/cli/main.js.map +1 -0
  54. package/dist/cli/markdown.js +90 -0
  55. package/dist/cli/markdown.js.map +1 -0
  56. package/dist/cli/run.js +164 -0
  57. package/dist/cli/run.js.map +1 -0
  58. package/dist/cli/spinner.js +89 -0
  59. package/dist/cli/spinner.js.map +1 -0
  60. package/dist/cli/stdio.js +193 -0
  61. package/dist/cli/stdio.js.map +1 -0
  62. package/dist/cli/tema.js +40 -0
  63. package/dist/cli/tema.js.map +1 -0
  64. package/dist/cli/verify.js +62 -0
  65. package/dist/cli/verify.js.map +1 -0
  66. package/dist/core/bitacora.js +30 -0
  67. package/dist/core/bitacora.js.map +1 -0
  68. package/dist/core/config.js +236 -0
  69. package/dist/core/config.js.map +1 -0
  70. package/dist/core/contextos.js +56 -0
  71. package/dist/core/contextos.js.map +1 -0
  72. package/dist/core/deps.js +51 -0
  73. package/dist/core/deps.js.map +1 -0
  74. package/dist/core/diff.js +79 -0
  75. package/dist/core/diff.js.map +1 -0
  76. package/dist/core/esqueleto.js +366 -0
  77. package/dist/core/esqueleto.js.map +1 -0
  78. package/dist/core/events.js +2 -0
  79. package/dist/core/events.js.map +1 -0
  80. package/dist/core/modelos.js +85 -0
  81. package/dist/core/modelos.js.map +1 -0
  82. package/dist/core/notify.js +106 -0
  83. package/dist/core/notify.js.map +1 -0
  84. package/dist/core/ports.js +114 -0
  85. package/dist/core/ports.js.map +1 -0
  86. package/dist/core/turno.js +127 -0
  87. package/dist/core/turno.js.map +1 -0
  88. package/dist/vendor/hitl.js +103 -0
  89. package/dist/vendor/hitl.js.map +1 -0
  90. package/dist/vendor/skillLoaders/catalog.js +74 -0
  91. package/dist/vendor/skillLoaders/catalog.js.map +1 -0
  92. package/dist/vendor/tokenTracking.js +58 -0
  93. package/dist/vendor/tokenTracking.js.map +1 -0
  94. package/package.json +41 -0
  95. package/skills/xone-debugging/SKILL.md +52 -0
  96. package/skills/xone-debugging/references/faq.md +561 -0
  97. package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
  98. package/skills/xone-development/SKILL.md +105 -0
  99. package/skills/xone-development/references/anti-patrones.md +94 -0
  100. package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
  101. package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
  102. package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
  103. package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
  104. package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
  105. package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
  106. package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
  107. package/skills/xone-development/references/datos/appdata.md +611 -0
  108. package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
  109. package/skills/xone-development/references/datos/http.md +366 -0
  110. package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
  111. package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
  112. package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
  113. package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
  114. package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
  115. package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
  116. package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
  117. package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
  118. package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
  119. package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
  120. package/skills/xone-development/references/indice-completo.md +77 -0
  121. package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
  122. package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
  123. package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
  124. package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
  125. package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
  126. package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
  127. package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
  128. package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
  129. package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
  130. package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
  131. package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
  132. package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
  133. package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
  134. package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
  135. package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
  136. package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
  137. package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
  138. package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
  139. package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
  140. package/skills/xone-development/references/tipos-de-prop.md +28 -0
  141. package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
  142. package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
  143. package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
  144. package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
  145. package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
  146. package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
  147. package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
  148. package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
  149. package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
  150. package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
  151. package/skills/xone-development/references/xml-ui/mapas.md +685 -0
  152. package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
  153. package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
  154. package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
  155. package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
  156. package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
  157. package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
  158. package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
  159. package/skills/xone-plan-builder/SKILL.md +183 -0
  160. package/skills/xone-plan-builder/agents/openai.yaml +5 -0
  161. package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
  162. package/skills/xone-project-generator/SKILL.md +111 -0
  163. package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
  164. package/skills/xone-project-generator/references/colecciones-base.md +16 -0
  165. package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
  166. package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
  167. package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
  168. package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
  169. package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
  170. package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
  171. package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
  172. package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
  173. package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
  174. package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
  175. package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
  176. package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
  177. package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
  178. package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
  179. package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
  180. package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
  181. package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
  182. package/skills/xone-review/SKILL.md +189 -0
  183. package/skills/xone-spec-builder/SKILL.md +235 -0
  184. package/skills/xone-spec-builder/agents/openai.yaml +5 -0
  185. package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
  186. package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
  187. package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
@@ -0,0 +1,587 @@
1
+ # Generación XOne — Fases 4-5: estructura de carpetas y configuración
2
+
3
+ > Fuente: `xone/v2/xone-project-generator/references/xone-project-generation-workflow.md` §5–§6. Referencia de la skill; el índice está en [../SKILL.md](../SKILL.md).
4
+
5
+ Contenido: §5 Fase 4 estructura de carpetas, ficheros raíz obligatorios, splash y la regla .xne vs .xml generado · §6 Fase 5 app.xml completo, escalado y resoluciones, app.ini, license.ini y mappings.xne
6
+
7
+ ---
8
+
9
+ ## 5. Fase 4: Creación de Estructura de Carpetas
10
+
11
+ ### 5.1 Objetivo
12
+
13
+ Crear la estructura de carpetas y ficheros raiz obligatorios del proyecto.
14
+
15
+ ### 5.2 Comandos de Creación
16
+
17
+ ```bash
18
+ # Crear estructura completa
19
+ mkdir -p NombreProyecto
20
+ cd NombreProyecto
21
+ mkdir -p bd icons files fonts
22
+ ```
23
+
24
+ ### 5.3 Estructura Completa Resultante
25
+
26
+ ```
27
+ NombreProyecto/
28
+ ├── app.xml # [OBLIGATORIO] Configuración global
29
+ ├── app.ini # [OBLIGATORIO] Metadatos
30
+ ├── license.ini # [OBLIGATORIO] Licencia y conexion/replica
31
+ ├── mappings.xne # [OBLIGATORIO] Solo Empresas y Usuarios
32
+ ├── default.css # [OBLIGATORIO] Estilos globales
33
+ ├── functions.js # [OBLIGATORIO] Funciones JavaScript
34
+ ├── EntradaApp.xne # [OBLIGATORIO] Punto de entrada (o MenuPrincipal.xne)
35
+ ├── Consola.xne # [OBLIGATORIO] Consola tecnica siempre presente
36
+ ├── Login.xne # [CONDICIONAL] Solo si autologon="false"
37
+ ├── splash.png # [OPCIONAL] Imagen de splash de carga inicial
38
+ ├── README.md # [OBLIGATORIO] Descripción del proyecto
39
+
40
+ ├── [Coleccion].xne # Un archivo por coleccion adicional
41
+ ├── [Pantalla].xne # Un archivo por pantalla de negocio
42
+
43
+ ├── bd/ # [OBLIGATORIO]
44
+ │ ├── gestion.db # Se genera en Fase 11
45
+ │ └── README.md
46
+ ├── icons/ # [OBLIGATORIO]
47
+ │ ├── app_icon.png # Se genera en Fase 11
48
+ │ └── README.md
49
+ ├── files/ # [OBLIGATORIO]
50
+ │ └── README.md
51
+ └── fonts/ # [RECOMENDADO]
52
+ └── README.md
53
+ ```
54
+
55
+ ### 5.4 Ficheros Raiz Obligatorios
56
+
57
+ | Fichero | Obligatorio | Generado en |
58
+ |---------|-------------|-------------|
59
+ | `app.xml` | Siempre | Fase 5 |
60
+ | `app.ini` | Siempre | Fase 5 |
61
+ | `license.ini` | Siempre | Fase 5 |
62
+ | `mappings.xne` | Siempre | Fase 5 |
63
+ | `default.css` | Siempre | Fase 3 |
64
+ | `functions.js` | Siempre | Fase 9 |
65
+ | `EntradaApp.xne` / `MenuPrincipal.xne` | Siempre (uno de los dos) | Fase 7 |
66
+ | `Consola.xne` | Siempre | Fase 7 |
67
+ | `Login.xne` | Solo si `autologon="false"` | Fase 7 |
68
+
69
+ ### 5.4.1 Pantalla de splash
70
+
71
+ El splash que se muestra durante la carga inicial **no es una `<coll>` XML** — es un fichero estático en la raíz del proyecto. La carga la hace `LoadAppActivity` antes incluso de que arranque el sistema de colecciones.
72
+
73
+ **Convención:** poner un fichero `splash.png` en la carpeta raíz del proyecto.
74
+
75
+ El framework busca por orden los siguientes ficheros en la raíz y usa el primero que encuentre:
76
+
77
+ | Tipo | Ficheros (por orden de prioridad) |
78
+ |------|-----------------------------------|
79
+ | Vídeo | `splash.3gp`, `splash.mp4` |
80
+ | Imagen | `splash.jpg`, `splash.png`, `splash.gif`, `splash.bmp`, `splash.webp`, `splash.apng` |
81
+
82
+ - Si no hay ninguno, el framework usa un splash interno por defecto.
83
+ - Para vídeos, `LoadAppActivity` añade automáticamente un botón "Saltar".
84
+ - Imágenes animadas: `.gif` (`GifDrawable`), `.webp` animado (Android 9+), `.apng` (`PngReadHelper`).
85
+ - El ancho se ajusta al 100% de la pantalla manteniendo el ratio.
86
+
87
+ **No confundir** con:
88
+ - `load-imgbk` en `<app>`: imagen de fondo del EditView, no el splash.
89
+ - `EntradaApp.xne`: pantalla post-login que se abre tras autenticarse, no el splash.
90
+
91
+ ### 5.5 Regla Crítica sobre Colecciones
92
+
93
+ ```
94
+ mappings.xne -> SOLO Empresas y Usuarios (nunca colecciones de negocio)
95
+ Productos.xne -> Coleccion Productos (archivo separado)
96
+ Pedidos.xne -> Coleccion Pedidos (archivo separado)
97
+ Clientes.xne -> Coleccion Clientes (archivo separado)
98
+ ```
99
+
100
+ ### 5.6 Fuente `.xne` vs Salida Generada `.xml`
101
+
102
+ En XOne hay que distinguir claramente entre **ficheros fuente** (editables, lo que el agente crea/modifica) y **artefactos generados** (producidos automáticamente, se ignoran).
103
+
104
+ | Extensión | Rol | Quien lo edita | El agente... |
105
+ |-----------|-----|----------------|--------------|
106
+ | `.xne` | Fuente de colecciones y pantallas | Programador + agente IA | SI crea, SI edita, SI lee |
107
+ | `.xml` (colecciones/pantallas) | Artefacto generado por XOneStudio a partir del `.xne` | Nadie (se regenera) | NO crea, NO edita, NO lee, NO referencia |
108
+ | `app.xml` | Configuración global (única excepción — es fuente, no tiene `.xne` que lo genere) | Programador + agente IA | SI crea, SI edita, SI lee |
109
+ | `app.ini` | Metadatos de la app (fuente) | Programador + agente IA | SI crea, SI edita, SI lee |
110
+ | `.css` | Estilos propietarios (fuente) | Programador + agente IA | SI crea, SI edita, SI lee |
111
+ | `.js` | JavaScript (fuente) | Programador + agente IA | SI crea, SI edita, SI lee |
112
+
113
+ #### Por que existen los `.xml` de colecciones
114
+
115
+ XOneStudio genera automáticamente un `.xml` por cada `.xne` porque algunos motores de ejecución del framework todavia leen `.xml`. No son legacy ni restos de proyectos antiguos: se generan hoy, en proyectos nuevos. El plan de futuro es eliminarlos y dejar solo `.xne` en todas partes — el trabajo con IA ya se comporta como si esos `.xml` no existieran.
116
+
117
+ #### Regla operativa para el agente
118
+
119
+ > Al generar un proyecto nuevo: crear **solo** ficheros `.xne` para colecciones y pantallas (más `app.xml`, `app.ini`, `.css`, `.js` y recursos). **NUNCA** generar `.xml` de colecciones — eso lo hace XOneStudio automáticamente al abrir el proyecto.
120
+ >
121
+ > Al trabajar sobre un proyecto existente que ya tiene `.xne` y `.xml` conviviendo: tocar **solo** los `.xne`; los `.xml` de colecciones se ignoran por completo. Si se modifica un `.xml` a mano, el cambio se pierde en la siguiente regeneracion de XOneStudio.
122
+
123
+ ---
124
+
125
+ ## 6. Fase 5: Generación de Archivos de Configuración
126
+
127
+ ### 5.1 app.xml - Configuración Global
128
+
129
+ ```xml
130
+ <?xml version="1.0" encoding="iso-8859-15" standalone="yes"?>
131
+ <xml>
132
+ <app
133
+ prefix="gen"
134
+ version="1.0.0"
135
+ debug="false"
136
+ autologon="false"
137
+ screen-orientation="portrait"
138
+ resolution-width="1080"
139
+ resolution-height="1920"
140
+ scale-fontsize="true"
141
+ android-font-factor="7"
142
+ ios-font-factor="8"
143
+ default-language="javascript"
144
+ companycolor="#2196F3"
145
+ forecolor="#FFFFFF">
146
+
147
+ <!-- Conexión a una base de datos alternativa. La base de datos principal NO necesita este nodo. -->
148
+ <connection name="other_db" connstring="bd/other_db.db" />
149
+
150
+ <!-- Estilos CSS — se pueden declarar varios según condicion de plataforma/tamano/orientacion -->
151
+ <style url="default.css" strict-mode="true" />
152
+ <style url="default_hor.css" conditions="phone:horizontal" strict-mode="true" />
153
+
154
+ <!-- Scripts JavaScript -->
155
+ <include file="functions.js" language="javascript" />
156
+
157
+ <!-- Punto de entrada a la aplicación (tras login si lo hay) -->
158
+ <entry-point>
159
+ <item name="EntradaApp" conditions="" />
160
+ </entry-point>
161
+
162
+ <!-- Login personalizado — SOLO si autologon="false" -->
163
+ <!-- <login-coll>
164
+ <item name="LoginColl" conditions="" />
165
+ </login-coll> -->
166
+
167
+ </app>
168
+ </xml>
169
+ ```
170
+
171
+ > **NOTA:** El encoding puede ser UTF-8 o `iso-8859-15` (coherente con los bytes; el motor respeta el declarado). El `entry-point` se define como nodo hijo, no como atributo del nodo `<app>`.
172
+
173
+ #### Atributos del nodo `<app>`
174
+
175
+ | Atributo | Descripción | Valor por Defecto |
176
+ |----------|-------------|-------------------|
177
+ | `prefix` | Define la macro `##PREF##` usada en todos los SQL de las colecciones. **IMPORTANTE:** al sustituirse, la macro inserta un **guion bajo** entre el prefix y el nombre de la tabla. Es decir, `##PREF##Empresas` se expande a `gen_empresas` (NO `genempresas`). En los `.xne` se escribe siempre `##PREF##Empresas` sin guion bajo (la macro lo añade ella), pero al generar DDL/DML literal (`bd/createdb.sql`, `bd/seed.sql`) y al ejecutar SQL directo sin la macro (`appData.executeSql`, `sqlManager.doRawQuery` con string literal), el nombre real de la tabla es `<prefix>_<NombreColeccion>` y hay que escribirlo con el underscore explícito. | `"gen"` — NUNCA cambiar sin indicacion explicita del usuario |
178
+ | `versión` | Versión del mappings. XOneStudio la incrementa automáticamente al guardar | `"1.0.0"` |
179
+ | `debug` | Modo depuracion — muestra más información en el dispositivo | `"false"` (produccion) / `"true"` (desarrollo) |
180
+ | `sql-debug` | Loguea todas las SQL ejecutadas por el framework | `"false"` |
181
+ | `sql-profiler` | Registra las consultas SQL con tiempos de ejecución. **Desactivar en produccion** | `"false"` |
182
+ | `autologon` | Si es `"true"`, salta el login y entra con el usuario `admin` sin password. **Solo desarrollo/pruebas — nunca en produccion** | `"false"` |
183
+ | `autologon-username` | Usuario para el autologin (cuando `autologon="true"`) | `"admin"` |
184
+ | `autologon-password` | Contraseña para el autologin | — |
185
+ | `screen-orientation` | Orientación forzada de pantalla | `"portrait"` / `"landscape"` / `"all"` |
186
+ | `resolution-width` | Ancho en pixeles del dispositivo físico de referencia. Ver sección 5.1b | `"1080"` |
187
+ | `resolution-height` | Alto en pixeles del dispositivo físico de referencia | `"1920"` |
188
+ | `scale-fontsize` | Escala el tamaño de fuente proporcionalmente al cambiar la resolución | `"true"` |
189
+ | `android-font-factor` | Factor de ajuste de fuentes para Android. **Se SUMA al `fontsize`** | `"7"` |
190
+ | `ios-font-factor` | Factor de ajuste de fuentes para iOS. **Se SUMA al `fontsize`** | `"8"` |
191
+ | `default-language` | Lenguaje por defecto para scripts | `"javascript"` |
192
+ | `companycolor` | Color corporativo general (menús, pestañas, selecciones) | — |
193
+ | `forecolor` | Color de texto general de la aplicación | `"#FFFFFF"` |
194
+ | `compatibility-mode` | **CRÍTICO:** Si es `"true"`, desactiva completamente todos los estilos CSS | `"false"` |
195
+ | `load-wait` | Si es `"true"`, muestra una pantalla de espera durante la carga inicial | `"false"` |
196
+ | `load-imgbk` | Imagen de fondo del EditView (NO es el splash de carga). El splash se pone con un fichero `splash.png` en la raíz del proyecto (ver §5.4.1 Pantalla de splash) | — |
197
+ | `application-max-priority` | Marca la app como prioritaria para evitar que el SO la cierre en segundo plano | `"false"` |
198
+ | `application-notification-title` | Título de la notificación persistente de la app en Android | — |
199
+ | `application-notification-text` | Texto de la notificación persistente de la app en Android | — |
200
+ | `gps-service-notification-title` | Título de la notificación del servicio GPS en segundo plano | — |
201
+ | `gps-service-notification-text` | Texto de la notificación del servicio GPS en segundo plano | — |
202
+ | `secure-window` | Si es `"true"`, impide capturar pantalla (screenshot) de la app | `"false"` |
203
+ | `entry-point` | (Forma alternativa como atributo) Nombre de la colección de entrada. Preferir el nodo `<entry-point>` | — |
204
+ | `replica-debug` | Loguea información de debug del proceso de réplica | `"false"` |
205
+
206
+ > **Atributos que NO van en `<app>`:**
207
+ > - `fullscreen` — es atributo de `<coll>` (oculta barras de estado en una pantalla concreta).
208
+ > - `sql-debug` — es atributo de `<coll>` (loguea las SQL de esa colección).
209
+
210
+ #### Subnodos del nodo `<app>`
211
+
212
+ **`<connection>`** — Define una conexión a base de datos:
213
+
214
+ ```xml
215
+ <!-- Conexión a una base de datos alternativa. La base de datos principal NO necesita este nodo. -->
216
+ <connection name="other_db" connstring="bd/other_db.db" />
217
+
218
+ <!-- Conexión a BD de replica de ficheros (solo Android, si hay replica de ficheros) -->
219
+ <connection name="Info_ReplicaFiles"
220
+ connstring="Provider=Xone Remote Provider;Data Source=local;
221
+ ProgID=com.xone.db.impl.replicafiles.RplFilesConnection;
222
+ DBMS Name=Ibd;User Name=sa;Password=;appname=ClientMobility;Timeout=60"
223
+ prefix="" />
224
+
225
+ <!-- Contactos del teléfono como fuente de datos (proveedor del framework) -->
226
+ <connection name="ContactsConnection"
227
+ connstring="Provider=Xone Remote Provider;ProgID=com.xone.db.impl.contacts.ContactsConnection" />
228
+ ```
229
+
230
+ ##### Leer y escribir los contactos del teléfono
231
+
232
+ XOne expone la agenda de contactos del dispositivo como una **fuente de datos consultable con SQL**, mediante el proveedor especial mostrado arriba (`ContactsConnection`). El proveedor forma parte del framework: no hay que activar ningún módulo, solo declarar la conexión, **pedir el permiso** y crear una colección que la use.
233
+
234
+ ```xml
235
+ <!-- En app.xml: permiso obligatorio -->
236
+ <permission name="contacts" />
237
+ ```
238
+
239
+ La "tabla" se llama `Contacts`. Una colección de ejemplo para listar/ver contactos:
240
+
241
+ ```xml
242
+ <coll name="Contacts"
243
+ sql="SELECT id,name,email,phone,photo,photo_thumbnail FROM Contacts"
244
+ connection="ContactsConnection"
245
+ idfieldname="id" stringkey="true"
246
+ check-owner="false" dependent="false"
247
+ show-toolbar="false" notab="true"
248
+ onback="ui.getView(e.objItem).exit();">
249
+ <group name="General" id="1">
250
+ <prop visible="7" name="id" type="T" title="ID" width="100%" labelbox="false" text-border="false" />
251
+ <prop visible="7" name="name" type="T" title="Name" width="100%" labelbox="false" text-border="false" />
252
+ <prop visible="7" name="email" type="T" title="Email" width="100%" labelbox="false" text-border="false" />
253
+ <prop visible="7" name="phone" type="T" title="Phone" width="100%" labelbox="false" text-border="false" />
254
+ <prop visible="7" name="photo" type="IMG" title="Photo" width="100%" height="35%" keep-aspect-ratio="true" />
255
+ <prop visible="7" name="photo_thumbnail" type="IMG" title="Photo thumbnail" width="100%" height="35%" keep-aspect-ratio="true" />
256
+ </group>
257
+ </coll>
258
+ ```
259
+
260
+ **Campos disponibles en el SELECT** (tabla `Contacts`):
261
+
262
+ | Campo | Tipo prop | Contenido |
263
+ |-------|-----------|-----------|
264
+ | `id` | `T` | Identificador del contacto. Es la clave de la coll (`idfieldname="id"` + `stringkey="true"`). |
265
+ | `name` | `T` | Nombre a mostrar del contacto. |
266
+ | `email` | `T` | Primer email del contacto. |
267
+ | `phone` | `T` | Primer teléfono del contacto (vacío si el contacto no tiene ninguno). |
268
+ | `photo` | `IMG` | Foto en alta resolución. El proveedor la vuelca a un fichero en la carpeta `files` del proyecto y devuelve el nombre del fichero; por eso se mapea a `type="IMG"`. |
269
+ | `photo_thumbnail` | `IMG` | Miniatura de la foto, con el mismo mecanismo. |
270
+
271
+ **Notas de la fuente de contactos:**
272
+
273
+ - La consulta devuelve **como máximo 100 contactos**. Usa `WHERE` (filtro) y `ORDER BY` (orden) en el SQL para acotar y ordenar; los nombres de campo del filtro y el orden son los mismos de la tabla (`name`, `phone`, etc.).
274
+ - El SELECT debe incluir al menos uno de los campos anteriores; en caso contrario no devuelve resultados.
275
+ - **Alta y modificación:** un `INSERT`/`UPDATE` sobre `Contacts` crea o actualiza un contacto en la agenda del dispositivo. Además de `name`, `phone` y `email`, al escribir se aceptan `landlinephone` (teléfono fijo), `workphone` (teléfono de trabajo), `company` (empresa) y `job` (puesto). El **borrado de contactos no está soportado**.
276
+
277
+ **`<style>`** — Declara un fichero CSS. Se pueden declarar varios con distintas `conditions` para cargar estilos diferentes según plataforma, tamaño u orientación:
278
+
279
+ ```xml
280
+ <!-- Base: se aplica siempre -->
281
+ <style url="default.css" strict-mode="true" />
282
+ <!-- Solo en movil orientacion horizontal -->
283
+ <style url="default_hor.css" conditions="phone:horizontal" strict-mode="true" />
284
+ <!-- Solo en iOS -->
285
+ <style url="default-ios.css" conditions="ios" strict-mode="true" />
286
+ <!-- Solo en tablet vertical -->
287
+ <style url="default_tablet.css" conditions="tablet:vertical" strict-mode="true" />
288
+ <!-- Solo en Android movil vertical -->
289
+ <style url="default_android_ver.css" conditions="android:phone:vertical" strict-mode="true" />
290
+ <!-- Solo en iPhone -->
291
+ <style url="default_iphone.css" conditions="ios:phone" strict-mode="true" />
292
+ <!-- Solo en iPad vertical -->
293
+ <style url="default_ipad_vertical.css" conditions="ios:tablet:vertical" strict-mode="true" />
294
+ ```
295
+
296
+ | Atributo | Descripción |
297
+ |----------|-------------|
298
+ | `url` | Nombre del fichero CSS |
299
+ | `strict-mode` | Si es `"true"`, el framework parsea el CSS y reporta errores de sintaxis que podrian impedir que estilos posteriores se apliquen correctamente |
300
+ | `conditions` | Condición que debe cumplirse para que se aplique este CSS. Formato: `PLATAFORMA:TAMANO:ORIENTACION` |
301
+
302
+ **Valores posibles para `conditions`:**
303
+
304
+ | Parte | Valores |
305
+ |-------|---------|
306
+ | Plataforma | `android`, `ios`, `wm` (Windows Mobile), `bb` (BlackBerry), `wp` (Windows Phone) |
307
+ | Tamaño | `phone`, `tablet`, `mini` (Android < 3.5"), `hiphone` (Android 4.5"–7") |
308
+ | Orientación | `vertical`, `horizontal` |
309
+
310
+ > **Regla:** El fichero `default.css` (sin `conditions`) se aplica **siempre** como base. Los demas CSS con `conditions` se aplican adicionalmente cuando se cumple la condición, sobreescribiendo los estilos base donde haya conflicto.
311
+
312
+ **`<include>`** — Incluye un fichero de script:
313
+
314
+ ```xml
315
+ <include file="functions.js" language="javascript" />
316
+ ```
317
+
318
+ **`<entry-point>`** — Indica a XOne cual es la primera coleccion que se abre cuando el usuario entra en la app (tras el login, o directamente si `autologon="true"`). La coleccion apuntada es siempre `special="true"`. Nombre habitual: `EntradaApp`.
319
+
320
+ ```xml
321
+ <!-- Simple: siempre la misma coleccion de entrada -->
322
+ <entry-point>
323
+ <item name="EntradaApp" conditions="" />
324
+ </entry-point>
325
+
326
+ <!-- Con condiciones: coleccion distinta según dispositivo -->
327
+ <entry-point>
328
+ <item name="EntradaApp" conditions="" />
329
+ <item name="EntradaAppTablet" conditions="tablet:horizontal" />
330
+ </entry-point>
331
+ ```
332
+
333
+ **`<login-coll>`** — Indica a XOne cual es la coleccion que gestiona la autenticación del usuario. XOne la muestra **antes** del `<entry-point>` y solo pasa al entry-point cuando las credenciales son correctas. Solo necesario si `autologon="false"`. La coleccion es siempre `special="true"`.
334
+
335
+ ```xml
336
+ <login-coll>
337
+ <item name="LoginColl" conditions="" />
338
+ </login-coll>
339
+ ```
340
+
341
+ **Flujo de arranque:**
342
+
343
+ ```
344
+ [Arranque] → autologon="true"? → SI → [entry-point] → App lista
345
+ |
346
+ NO
347
+ |
348
+ [login-coll] → credenciales OK? → SI → [entry-point] → App lista
349
+ |
350
+ NO
351
+ [login-coll] ← vuelve con error
352
+ ```
353
+
354
+ > **REGLA:** Si `autologon="false"` y no se define `<login-coll>`, XOne usa su login interno no personalizable. En produccion siempre definir `<login-coll>`.
355
+
356
+ > **REGLA:** El atributo `prefix` SIEMPRE debe ser `"gen"` a menos que el usuario especifique explicitamente otro valor.
357
+
358
+
359
+ ### 5.1b Sistema de Escalado, Resoluciones y Tamaños de UI
360
+
361
+ #### Como funciona `resolution-width` y `resolution-height`
362
+
363
+ Estos atributos definen la resolución del dispositivo físico con el que se diseña y prueba la app. No son valores fijos — deben coincidir exactamente con la resolución real del dispositivo de referencia.
364
+
365
+ Cuando la app se ejecuta en un dispositivo con distinta resolución, XOne escala automáticamente todos los tamaños con esta formula:
366
+
367
+ ```
368
+ tamaño_real_px = valor_p × (resolucion_real_dispositivo / resolution-width)
369
+ ```
370
+
371
+ **Valores típicos según dispositivo de referencia:**
372
+
373
+ | Dispositivo | `resolution-width` | `resolution-height` |
374
+ |-------------|-------------------|---------------------|
375
+ | HDPI Compact | `"480"` | `"800"` |
376
+ | XHDPI Standard | `"720"` | `"1280"` |
377
+ | XXHDPI Classic (emulador XOneStudio por defecto) | `"1080"` | `"1920"` |
378
+ | Dispositivo típico actual | `"1080"` | `"1920"` |
379
+ | XXXHDPI Premium | `"1440"` | `"2560"` |
380
+
381
+ > **CRITICO:** Si `resolution-width` no coincide con la resolución del dispositivo con el que se diseña, todos los elementos quedaran desproporcionados. El emulador de XOneStudio usa `1080x1920` por defecto — si el dispositivo físico real es distinto (por ejemplo `1080x2220`), hay que cambiar estos valores en `app.xml`.
382
+
383
+ #### La unidad `p` (puntos)
384
+
385
+ Todas las dimensiones en XOne se expresan en puntos (`p`). En el dispositivo de referencia `1p = 1px`. En cualquier otro dispositivo XOne aplica el escalado automáticamente.
386
+
387
+ ```xml
388
+ <!-- Correcto: siempre usar p o % -->
389
+ <frame name="frmTopBar" width="100%" height="164p" />
390
+ <prop name="MAP_BTN" width="60%" height="124p" />
391
+
392
+ <!-- Incorrecto: NUNCA usar px, em, rem, dp -->
393
+ ```
394
+
395
+ #### Tabla de tamaños estándar (para `resolution-width="1080"` / `resolution-height="1920"`)
396
+
397
+ Los siguientes valores funcionan correctamente en proyectos reales diseñados para este dispositivo. Si se usa otra resolución de referencia, escalar proporcionalmente con la formula anterior.
398
+
399
+ | Elemento | `height` | `width` | Notas |
400
+ |----------|----------|---------|-------|
401
+ | TopBar / BottomBar | `164p` | `100%` | Barra de título superior o inferior |
402
+ | Header fijo completo (topBar + tabs) | `404p` | `100%` | Topbar + barra de estado + pestañas |
403
+ | Botón de acción principal (pill) | `124p` | `43–60%` | "Aceptar", "Guardar", "Iniciar viaje" |
404
+ | Botón principal ancho completo | `124p` | `92%` | Botón único centrado en footer |
405
+ | Botón de pestaña / tab | `144p` | `33–50%` | Pestañas tipo "Activa", "Mis OTs" |
406
+ | Campo de texto editable `type="T"` | `144p` | `80–92%` | Campos de formulario estándar |
407
+ | Label `type="L"` estándar | `96p` | `100%` | Etiquetas de sección |
408
+ | Icono de navegación `type="B"` (cuadrado) | `104p` | `104p` | Botones con icono en topbar |
409
+ | Icono de acción grande | `150p` | `150p` | Camara, galería, adjuntar |
410
+ | Modal / popup | `-2` (alto dinámico) | `840p` | Dialogo centrado (~78% del ancho) |
411
+ | Separador fino | `4p` | `100%` | Linea divisoria entre secciones |
412
+ | Separador medio | `8p` | `100%` | Indicador de pestaña activa |
413
+ | Margen entre elementos `tmargin` | `30p` | — | Espacio entre elementos del mismo bloque |
414
+ | Margen entre bloques `tmargin` | `50p` | — | Espacio entre secciones distintas |
415
+ | Margen lateral contenido `lmargin` | `50p` | — | Sangria del contenido respecto al borde |
416
+
417
+ #### Sistema de fuentes
418
+
419
+ El tamaño de fuente se controla con `fontsize` en el prop, o idealmente via clases CSS para reutilizarlo en todo el proyecto. El nombre de la fuente puede ser cualquier tipografía incluida en el proyecto — el fichero `.ttf` o `.otf` debe estar en la carpeta `fonts/`.
420
+
421
+ ```css
422
+ /* Definición en CSS — lo mas recomendable */
423
+ .font5 { fontsize: 5; text-fontsize: 5; labelfontsize: 5; label-fontsize: 5; }
424
+ .font7 { fontsize: 7; text-fontsize: 7; labelfontsize: 7; label-fontsize: 7; }
425
+ .font10 { fontsize: 10; text-fontsize: 10; labelfontsize: 10; label-fontsize: 10; }
426
+ .font-bold { fontname: Roboto-Bold; }
427
+ .font-regular { fontname: Roboto-Regular; }
428
+ ```
429
+
430
+ ```xml
431
+ <!-- Uso en el prop via clase CSS — recomendado -->
432
+ <prop name="MAP_TITULO" type="L" class="font7 font-bold" />
433
+
434
+ <!-- También valido: fontsize directamente en el prop -->
435
+ <prop name="MAP_TITULO" type="L" fontsize="7" />
436
+ ```
437
+
438
+ | Rango de `fontsize` | Uso típico |
439
+ |--------------------|------------|
440
+ | 1–2 | Textos mínimos, contadores, notas |
441
+ | 3–4 | Textos secundarios, metadatos, fechas |
442
+ | 5 | Texto estándar de campos y labels — **el más usado** |
443
+ | 6–7 | Títulos de sección, pestañas, números destacados |
444
+ | 8–9 | Títulos de tarjeta, subtítulos de pantalla |
445
+ | 10–11 | Títulos de topbar, cabeceras de modal |
446
+ | 12 | Títulos grandes, nombre de la app |
447
+
448
+ ### 5.2 app.ini - Metadatos
449
+
450
+ ```ini
451
+ name=NombreProyecto
452
+ icon=icon.png
453
+ IconFolder=icons
454
+ FilesFolder=files
455
+ Title=Titulo de la Aplicación
456
+ Caption=Titulo de la Aplicación
457
+ LocationTrackingEnabled=false
458
+ LocationTrackingInterval=1800000
459
+ LocationTrackingMinimumAccuracy=-1
460
+ LocationTrackingSaveOnLocalDatabase=false
461
+ LocationTrackingReplicate=true
462
+ ```
463
+
464
+ **Campos del app.ini:**
465
+
466
+ | Campo | Descripción | Obligatorio |
467
+ |-------|-------------|-------------|
468
+ | `name` | Nombre interno del proyecto | Si |
469
+ | `icon` | Nombre del fichero de icono de la app | Si |
470
+ | `IconFolder` | Carpeta de iconos. Siempre `icons` | Si |
471
+ | `FilesFolder` | Carpeta de ficheros adjuntos. Siempre `files` | Si |
472
+ | `Title` | Título visible de la aplicación | Recomendado |
473
+ | `Caption` | Subtítulo o descripción corta de la aplicación | Recomendado |
474
+ | `LocationTrackingEnabled` | Activa el tracking de localización en segundo plano | No |
475
+ | `LocationTrackingInterval` | Intervalo entre capturas de posición en milisegundos (por defecto 1800000 = 30 min) | No |
476
+ | `LocationTrackingMinimumAccuracy` | Precisión mínima aceptada en metros (-1 = sin limite) | No |
477
+ | `LocationTrackingSaveOnLocalDatabase` | Guarda las posiciones en la BD local | No |
478
+ | `LocationTrackingReplicate` | Replica las posiciones al servidor | No |
479
+
480
+ ### 5.3 license.ini - Configuración de Conexión y Licencia
481
+
482
+ Fichero obligatorio que define la conexión a la base de datos, los parámetros de replica y la licencia de la aplicación.
483
+
484
+ ```ini
485
+ Database=00000000
486
+ License=000000000000000000000000
487
+ Connstring=bd/gestion.db
488
+ HostName=
489
+ Interval=60
490
+ IntervalType=1
491
+ Timeout=30
492
+ ConnectionMode=direct
493
+ ServerPort=7757
494
+ FullDuplex=false
495
+ LogLevel=0
496
+ WriteLog=false
497
+ Disabled=true
498
+ ```
499
+
500
+ **Campos del license.ini:**
501
+
502
+ | Campo | Descripción | Valor por Defecto |
503
+ |-------|-------------|-------------------|
504
+ | `Database` | Identificador de base de datos de la licencia | `00000000` |
505
+ | `License` | Clave de licencia de la aplicación | `000000000000000000000000` |
506
+ | `Connstring` | Ruta a la base de datos SQLite | `bd/gestion.db` |
507
+ | `HostName` | Host del servidor de replica (vacio = sin replica) | `` |
508
+ | `Interval` | Intervalo de sincronización en segundos | `60` |
509
+ | `IntervalType` | Tipo de intervalo (1 = segundos) | `1` |
510
+ | `Timeout` | Tiempo de espera de conexión en segundos | `30` |
511
+ | `ConnectionMode` | Modo de conexión (`direct` o `online`) | `direct` |
512
+ | `ServerPort` | Puerto del servidor de replica | `7757` |
513
+ | `FullDuplex` | Comunicación full duplex con el servidor | `false` |
514
+ | `LogLevel` | Nivel de log (0 = sin log) | `0` |
515
+ | `WriteLog` | Escribir log en fichero | `false` |
516
+ | `Disabled` | Deshabilitar replica (true = solo local) | `true` |
517
+
518
+ > **REGLA:** Para proyectos sin replica, dejar `HostName` vacio y `Disabled=true`. Los valores de `Database` y `License` son proporcionados por el cliente al activar la aplicación.
519
+
520
+ > **REGLA (tabla `master_replica_queue`):** El framework encola en `master_replica_queue` TODAS las operaciones de `save()` (INSERT/UPDATE/DELETE), **aunque la réplica esté deshabilitada** (`Disabled=true`). Si la tabla no existe en `gestion.db`, el primer `save()` falla con `no such table: master_replica_queue`. XOneStudio la crea al generar la BD; si la BD se crea por otra vía (p. ej. la herramienta de BD del MCP con `create`+`sync`, que NO la incluye), hay que crearla a mano:
521
+ > ```sql
522
+ > CREATE TABLE IF NOT EXISTS master_replica_queue (
523
+ > ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
524
+ > ROWID TEXT, OPERID TEXT, TIMESTAMP TEXT, OPER INTEGER,
525
+ > SESSIONID INTEGER, MID INTEGER, SQL TEXT, DMID INTEGER,
526
+ > CONDITIONAL INTEGER, TBL TEXT, TYPE INTEGER, APPNAME TEXT
527
+ > );
528
+ > ```
529
+ > Verificado en dispositivo: sin esta tabla ninguna coll de datos puede guardar.
530
+
531
+ ### 5.4 mappings.xne - Colecciones Base
532
+
533
+ > **REGLA CRITICA:** Este archivo SOLO contiene las colecciones `Empresas` y `Usuarios`. Todas las demas colecciones van en archivos `.xne` separados sin excepción.
534
+
535
+ ```xml
536
+ <?xml version="1.0" encoding="iso-8859-15"?>
537
+ <xml>
538
+ <collprops type="general">
539
+
540
+ <!-- COLECCION OBLIGATORIA: Empresas -->
541
+ <coll name="Empresas" title="la empresa"
542
+ sql="select e.* from ##PREF##empresa e"
543
+ objname="empresa" updateobj="empresa"
544
+ progid="ASGestion.CASEmpresa">
545
+ <group name="General" id="1">
546
+ <prop name="CODIGO" visible="3" type="N" fieldsize="12" />
547
+ <prop name="NOMBRE" type="T" fieldsize="30" size="250" />
548
+ <!-- Agregar aquí campos adicionales de Empresas si el proyecto lo requiere -->
549
+ </group>
550
+ </coll>
551
+
552
+ <!-- COLECCION OBLIGATORIA: Usuarios -->
553
+ <coll name="Usuarios" title="el usuario"
554
+ sql="select u.* from ##PREF##usuarios u"
555
+ objname="usuarios" updateobj="usuarios"
556
+ progid="ASGestion.CASUser">
557
+ <group name="General" id="1">
558
+ <prop name="IDEMPRESA" visible="0" type="N" mapcol="Empresas" mapfld="ID" />
559
+ <prop name="CODIGO" visible="3" type="T" fieldsize="10" size="50" />
560
+ <prop name="LOGIN" visible="3" type="T" fieldsize="10" size="50" />
561
+ <prop name="PWD" type="X" fieldsize="10" size="50" visible="0" />
562
+ <prop name="NOMBRE" visible="3" type="T" fieldsize="30" size="50" />
563
+ <!-- Agregar aquí campos adicionales de Usuarios si el proyecto lo requiere -->
564
+ </group>
565
+ <create>
566
+ <action name="setval" field="IDEMPRESA" value="##ENTID##" />
567
+ </create>
568
+ </coll>
569
+
570
+ <!-- EL RESTO DE COLECCIONES VAN EN FICHEROS .xne SEPARADOS -->
571
+
572
+ </collprops>
573
+ </xml>
574
+ ```
575
+
576
+ **Reglas críticas para mappings.xne:**
577
+
578
+ 1. **Solo Empresas y Usuarios** — cualquier otra coleccion va en su propio `.xne`
579
+ 2. **Encoding coherente** — UTF-8 (default del motor) o `iso-8859-15`; el declarado debe coincidir con los bytes del fichero
580
+ 3. **`progid` solo en Empresas y Usuarios** — es OPCIONAL en el resto (sin él, objeto de datos genérico ≡ `ASData.CASBasicDataObj`). `ASGestion.CASEmpresa` para Empresas, `ASGestion.CASUser` para Usuarios
581
+ 4. **`##PREF##` en todos los SQL** — nunca hardcodear el prefijo de tabla
582
+ 5. **`objname` y `updateobj`** — obligatorios para persistencia en BD
583
+ 6. **`ID` y `ROWID` los gestiona la plataforma** — ambos existen a nivel de BD (`ID` = clave primaria autoincremental; `ROWID` = GUID de 32 caracteres hex sin guiones, usado por XOne para la replica entre dispositivos) y XOne rellena sus valores solo. No hace falta declararlos como `<prop>` en el `<group>` (declararlos es válido pero redundante; mejor omitirlos por limpieza). En el SQL: **`ID` siempre se rescata en el SELECT** (`SELECT ID, ...`); el `ROWID` no es necesario en el SELECT
584
+ 7. **Prefijo `MAP_`** — todo prop cuyo valor NO sea una columna de la tabla de `objname` debe nombrarse `MAP_ALGO`. El framework excluye los `MAP_*` de los `INSERT`/`UPDATE`, por lo que `MAP_loquesea` no existe ni debe existir como columna en BD. Se aplica en tres casos: (a) campos que vienen de un JOIN en el SQL de la coll, (b) props visibles enlazados via `linkedto` a un combo, (c) props puramente visuales sin origen de datos: etiquetas `L` (o su alias legacy `TL`), botones `B`, imágenes decorativas, valores calculados en runtime, estados de UI, buscadores temporales. Ver sección dedicada 6.2b
585
+ 8. **Evento `<create>` en Usuarios** — asigna `##ENTID##` a `IDEMPRESA` automáticamente al crear un usuario
586
+ 9. **Tipos validos** — solo los documentados en sección 3.3
587
+ 10. **Visible bitmask** — valores típicos: 0 (oculto), 1 (edición), 3 (edición+lista), 7 (edición+lista+content), 8 (combo), 15 (todos). Ver sección 3.4