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,477 @@
1
+ # Generación XOne — Fase 7: plantilla Consola.xne
2
+
3
+ > Fuente: `xone/v2/xone-project-generator/references/xone-project-generation-workflow.md` L2563–3032. Referencia de la skill; el índice está en [../SKILL.md](../SKILL.md).
4
+
5
+ Contenido: §7.7 plantilla Consola.xne completa (obligatoria)
6
+
7
+ ---
8
+
9
+ ### 7.7 Plantilla: Consola.xne (OBLIGATORIA)
10
+
11
+ La consola es una pantalla técnica presente en **todos** los proyectos XOne. No es pantalla principal — se accede desde un botón secundario, un menu de ajustes o similar. Su función es dar al soporte técnico (call center) toda la información necesaria para resolver los problemas del usuario.
12
+
13
+ **Una sola coleccion: `MenuConsolaReplica`**, con los grupos que correspondan según el proyecto:
14
+
15
+ | Grupo | Siempre / Solo con replica |
16
+ |-------|---------------------------|
17
+ | Drawer lateral (id=99) + Header fijo (id=98) | Siempre |
18
+ | **Grupo 1** — Datos del dispositivo | Siempre |
19
+ | **Grupo 2** — Logs de replica | Solo si hay replica |
20
+ | **Grupo 3** — Replica de ficheros (lista pendientes recibir/enviar) | Solo si hay replica |
21
+ | **Grupo 4** — Control de ficheros (botones fotos/envio) | Solo si hay replica |
22
+ | **Grupo 5** — Utilidades (envio de logs y BD al soporte) | Siempre |
23
+
24
+ > El Drawer lateral lista solo los grupos presentes. Si no hay replica, aparecen solo "Datos del dispositivo" y "Utilidades".
25
+
26
+ ---
27
+
28
+ #### Plantilla completa: MenuConsolaReplica
29
+
30
+ ```xml
31
+ <?xml version="1.0" encoding="iso-8859-15"?>
32
+ <xml>
33
+ <coll name="MenuConsolaReplica" title="Consola"
34
+ sql="SELECT t1.* FROM ##PREF##empresa t1"
35
+ objname="empresa" updateobj="empresa"
36
+ progid="ASData.CASBasicDataObj"
37
+ notab="true" group-swipe="true" special="false">
38
+
39
+ <prop name="MAP_CAPTUREIMG" type="T" visible="0" />
40
+ <prop name="MAP_OS" type="T" visible="0" />
41
+ <prop name="MAP_TAB" type="T" visible="0" />
42
+ <prop name="MAP_GROUP" type="N" visible="0" />
43
+ <prop name="MAP_TOTAL_PAGES" type="N" visible="0" />
44
+
45
+ <!-- ================================================================ -->
46
+ <!-- DRAWER lateral (menu de navegacion entre grupos) -->
47
+ <!-- ================================================================ -->
48
+ <group name="Drawer" id="99" drawer-orientation="left" width="65%" height="100%">
49
+ <frame name="barraLateral" bgcolor="#FFFFFF" framebox="false"
50
+ height="100%" align="top|left">
51
+ <prop name="MAP_BT_OPCION1_DR" title="1- Datos del dispositivo"
52
+ type="B" visible="1" method="ExecuteNode(irGrupo(1))" />
53
+ <!-- Solo si la app tiene replica: -->
54
+ <prop name="MAP_BT_OPCION2_DR" title="2- Logs de replica"
55
+ type="B" visible="1" method="ExecuteNode(irGrupo(2))" />
56
+ <prop name="MAP_BT_OPCION3_DR" title="3- Replica de ficheros"
57
+ type="B" visible="1" method="ExecuteNode(irGrupo(3))" />
58
+ <prop name="MAP_BT_OPCION4_DR" title="4- Control de ficheros"
59
+ type="B" visible="1" method="ExecuteNode(irGrupo(4))" />
60
+ <!-- Siempre: -->
61
+ <prop name="MAP_BT_OPCION5_DR" title="5- Utilidades"
62
+ type="B" visible="1" method="ExecuteNode(irGrupo(5))" />
63
+ </frame>
64
+ </group>
65
+
66
+ <!-- ================================================================ -->
67
+ <!-- HEADER fijo -->
68
+ <!-- ================================================================ -->
69
+ <group name="Menu" id="98" fixed="true" orientation="top" height="10%">
70
+ <frame name="frmHeader" bgcolor="#93B359" align="left|center"
71
+ width="100%" height="100%">
72
+ <prop name="MAP_BTN_DRAWER" type="B" img="icon_drawer.png"
73
+ labelwidth="0" title=" " onclick="ui.toggleGroup('99');" />
74
+ <prop name="MAP_BTN_ATRAS" type="B" img="atras.png"
75
+ labelwidth="0" title=" " method="ExecuteNode(onback)" newline="false" />
76
+ <prop name="MAP_TAB" type="T" visible="1" width="60%" newline="false" />
77
+ </frame>
78
+ </group>
79
+
80
+ <!-- ================================================================ -->
81
+ <!-- GRUPO 1: Datos del dispositivo (SIEMPRE) -->
82
+ <!-- ================================================================ -->
83
+ <group name="Device" id="1" bgcolor="#E7E7E7" onfocus="ExecuteNode(irGrupo(1))">
84
+ <frame name="frmDevice" width="100%" height="100%" scroll="true">
85
+ <prop name="MAP_VERSIONAPP" type="T" visible="1" title="Versión aplicación:" locked="true" />
86
+ <prop name="MAP_VERSIONFRAME" type="T" visible="1" title="Versión framework:" locked="true" />
87
+ <prop name="MAP_VERSIONCODE" type="T" visible="1" title="Versión code:" locked="true" />
88
+ <prop name="MAP_MID" type="T" visible="1" title="MID dispositivo:" locked="true" />
89
+ <prop name="MAP_IMEI" type="T" visible="1" title="IMEI:" locked="true" />
90
+ <prop name="MAP_DISPOSITIVO" type="T" visible="1" title="Modelo:" locked="true" />
91
+ <prop name="MAP_FABRICANTE" type="T" visible="1" title="Fabricante:" locked="true" />
92
+ <prop name="MAP_DEVICE_TYPE" type="T" visible="1" title="Tipo dispositivo:" locked="true" />
93
+ <prop name="MAP_OS" type="T" visible="1" title="Sistema operativo:" locked="true" />
94
+ <prop name="MAP_OS_VERSION" type="T" visible="1" title="Versión SO:" locked="true" />
95
+ <prop name="MAP_ORIENTATION_SCREEN" type="T" visible="1" title="Orientación:" locked="true" />
96
+ <prop name="MAP_DENSITY" type="T" visible="1" title="Tipo densidad:" locked="true" />
97
+ <prop name="MAP_DENSITY2" type="T" visible="1" title="Densidad:" locked="true" />
98
+ <prop name="MAP_RESOLUTIONWIDTH" type="T" visible="1" title="Resol. ancho:" locked="true" />
99
+ <prop name="MAP_RESOLUTIONHEIGHT" type="T" visible="1" title="Resol. alto:" locked="true" />
100
+ </frame>
101
+ </group>
102
+
103
+ <!-- ================================================================ -->
104
+ <!-- GRUPO 2: Logs de replica + cola de operaciones (SOLO REPLICA) -->
105
+ <!-- ================================================================ -->
106
+ <group name="ReplicaDatos" id="2" bgcolor="#E7E7E7" onfocus="ExecuteNode(irGrupo(2))">
107
+ <frame name="frmReplicaDatos" width="100%" height="450p" scroll="true">
108
+ <prop name="MAP_CMDDATE" type="T" visible="1" title="Fecha ultima conexión:" locked="true" />
109
+ <prop name="MAP_RECORDSRX" type="T" visible="1" title="Operaciones recibidas:" locked="true" />
110
+ <prop name="MAP_RECORDSTX" type="T" visible="1" title="Operaciones enviadas:" locked="true" />
111
+ <prop name="MAP_RECORDSPEND" type="T" visible="1" title="Operaciones pendientes:" locked="true" />
112
+ <frame name="frmLog" width="98%" height="50%" lmargin="1%"
113
+ framebox="true" border-corner-radius="10" scroll="true">
114
+ <prop name="MAP_LOG" type="T" visible="1" labelwidth="0"
115
+ locked="true" lines="5" text-border="false" />
116
+ </frame>
117
+ </frame>
118
+ <!-- Cola de operaciones pendientes de replica -->
119
+ <frame name="frmOperQueue" width="100%" height="650p">
120
+ <prop name="MAP_TITLECOLA" type="L" title="Cola de operaciones pendientes:" />
121
+ <prop name="@OperQueue" type="Z" visible="1" locked="true"
122
+ contents="OperQueue" width="96%" lmargin="2%" />
123
+ <contents name="OperQueue" src="ContentOperQueue" />
124
+ </frame>
125
+ <frame name="frmBottomReplica" width="100%" height="13%" align="center|center">
126
+ <prop name="MAP_BT_REPLICAR" type="B" title="Replicar"
127
+ method="ExecuteNode(replicar)" width="40%" height="50%" />
128
+ <prop name="MAP_BT_COMPARTIR" type="B" title="Compartir"
129
+ method="ExecuteNode(compartir)"
130
+ width="40%" height="50%" newline="false" lmargin="5%" />
131
+ </frame>
132
+ </group>
133
+
134
+ <!-- ================================================================ -->
135
+ <!-- GRUPO 3: Lista de ficheros pendientes (SOLO REPLICA) -->
136
+ <!-- ================================================================ -->
137
+ <group name="ReplicaFicheros" id="3" bgcolor="#E7E7E7" onfocus="ExecuteNode(irGrupo(3))">
138
+ <frame name="frmReplicaFicheros" height="87%">
139
+ <prop name="MAP_TITLETOTAL" type="L" title="Ficheros pendientes recibir:"
140
+ visible="1" width="40%" />
141
+ <prop name="MAP_TOTAL" type="N" visible="1" newline="false"
142
+ width="50%" locked="true" />
143
+ <frame name="frmListaRecibir" width="100%" height="40%" scroll="true">
144
+ <prop name="replicafile" type="Z" visible="1" contents="replicafile"
145
+ width="100%" height="100%" locked="true"
146
+ disablevisible="MAP_OS='ios'" />
147
+ <contents name="replicafile" src="ContentReplicaFiles"
148
+ filter="STATUS!=201 AND REPLICATYPE=0" />
149
+ </frame>
150
+ <prop name="MAP_TITLETOTAL_ENV" type="L" title="Ficheros pendientes enviar:"
151
+ visible="1" width="40%" />
152
+ <prop name="MAP_TOTAL_ENV" type="N" visible="1" newline="false"
153
+ width="50%" locked="true" />
154
+ <frame name="frmListaEnviar" width="100%" height="40%" scroll="true">
155
+ <prop name="replicafile_ENV" type="Z" visible="1" contents="replicafile_ENV"
156
+ width="100%" height="100%" locked="true"
157
+ disablevisible="MAP_OS='ios'" />
158
+ <contents name="replicafile_ENV" src="ContentReplicaFiles"
159
+ filter="STATUS!=201 AND REPLICATYPE=1" />
160
+ </frame>
161
+ </frame>
162
+ <frame name="frmBottomFicheros" width="100%" height="13%" align="center|center">
163
+ <prop name="MAP_BT_REPLICAR2" type="B" title="Replicar"
164
+ method="ExecuteNode(replicar)" width="40%" height="50%" />
165
+ <prop name="MAP_BT_COMPARTIR2" type="B" title="Compartir"
166
+ method="ExecuteNode(compartir)"
167
+ width="40%" height="50%" newline="false" lmargin="5%" />
168
+ </frame>
169
+ </group>
170
+
171
+ <!-- ================================================================ -->
172
+ <!-- GRUPO 4: Control de ficheros con botones (SOLO REPLICA) -->
173
+ <!-- ================================================================ -->
174
+ <group name="ControlFicheros" id="4" bgcolor="#E7E7E7" onfocus="ExecuteNode(irGrupo(4))">
175
+ <frame name="frmCenter" width="100%" height="100%" align="top|center">
176
+ <prop type="B" name="Ok99" img="hacer_foto.png"
177
+ title="HACER FOTO"
178
+ align="center" width="550p" height="150p" visible="1"
179
+ method="ExecuteNode(camera)" label-wrap="true" />
180
+ <prop type="B" name="Ok3" img="archivos_nocomienza.png"
181
+ title="FOTOS SIN ENVIO INICIADO"
182
+ align="center" width="550p" height="150p" visible="1"
183
+ method="ExecuteNode(verFicheros(nocomienza))" label-wrap="true" />
184
+ <prop type="B" name="Ok4" img="archivos_enproceso.png"
185
+ title="FOTOS EN PROCESO DE ENVIO"
186
+ align="center" width="550p" height="150p" visible="1"
187
+ method="ExecuteNode(verFicheros(enproceso))" label-wrap="true" />
188
+ <prop type="B" name="Ok10" img="archivos_enviados.png"
189
+ title="FOTOS ENVIADAS A LA CENTRAL"
190
+ align="center" width="550p" height="150p" visible="1"
191
+ method="ExecuteNode(verFicheros(enviados))" label-wrap="true" />
192
+ <prop type="B" name="Ok2" img="iniciar_replica.png"
193
+ title="INICIAR ENVIO DE FICHEROS"
194
+ align="center" width="550p" height="150p" visible="1"
195
+ method="ExecuteNode(replicar)" label-wrap="true" />
196
+ </frame>
197
+ </group>
198
+
199
+ <!-- ================================================================ -->
200
+ <!-- GRUPO 5: Utilidades - envio de diagnostico (SIEMPRE) -->
201
+ <!-- ================================================================ -->
202
+ <group name="Utilidades" id="5" bgcolor="#E7E7E7" onfocus="ExecuteNode(irGrupo(5))">
203
+ <frame name="frmUtilidades" align="top|center" height="100%">
204
+ <!-- Enviar log Android (oculto en iOS) -->
205
+ <prop name="MAP_BT_ENVIAR_LOG" type="B" visible="1"
206
+ title="Enviar log" width="90%" height="10%"
207
+ onclick="javascript:doDebugTools(0);"
208
+ disablevisible="MAP_OS='IOS' OR MAP_OS='ios'" />
209
+ <!-- Enviar base de datos -->
210
+ <prop name="MAP_BT_ENVIAR_BD" type="B" visible="1"
211
+ title="Enviar base de datos" width="90%" height="10%"
212
+ onclick="javascript:doDebugTools(1);" />
213
+ <!-- Enviar BD debug replica (solo Android) -->
214
+ <prop name="MAP_BT_ENVIAR_BD_REP" type="B" visible="1"
215
+ title="Enviar BD depuracion replica" width="90%" height="10%"
216
+ onclick="javascript:doDebugTools(2);"
217
+ disablevisible="MAP_OS='IOS' OR MAP_OS='ios'" />
218
+ <!-- Enviar BD debug ficheros (solo Android) -->
219
+ <prop name="MAP_BT_ENVIAR_BD_FIC" type="B" visible="1"
220
+ title="Enviar BD depuracion ficheros" width="90%" height="10%"
221
+ onclick="javascript:doDebugTools(3);"
222
+ disablevisible="MAP_OS='IOS' OR MAP_OS='ios'" />
223
+ </frame>
224
+ </group>
225
+
226
+ <!-- ================================================================ -->
227
+ <!-- before-edit: cargar macros del dispositivo e inicializar datos -->
228
+ <!-- ================================================================ -->
229
+ <before-edit>
230
+ <action name="setval" field="MAP_VERSIONAPP" value="##VERSION##" />
231
+ <action name="setval" field="MAP_VERSIONFRAME" value="##FRAME_VERSION##" />
232
+ <action name="setval" field="MAP_VERSIONCODE" value="##FRAME_VERSION_CODE##" />
233
+ <action name="setval" field="MAP_DISPOSITIVO" value="##DEVICE_MODEL##" />
234
+ <action name="setval" field="MAP_FABRICANTE" value="##DEVICE_MANUFACTURER##" />
235
+ <action name="setval" field="MAP_DEVICE_TYPE" value="##DEVICE_TYPE##" />
236
+ <action name="setval" field="MAP_IMEI" value="##DEVICEID##" />
237
+ <action name="setval" field="MAP_MID" value="##MID##" />
238
+ <action name="setval" field="MAP_ORIENTATION_SCREEN" value="##CURRENT_ORIENTATION##" />
239
+ <action name="setval" field="MAP_OS" value="##DEVICE_OS##" />
240
+ <action name="setval" field="MAP_OS_VERSION" value="##DEVICE_OSVERSION##" />
241
+ <action name="setval" field="MAP_DENSITY" value="##CURRENT_DENSITY##" />
242
+ <action name="setval" field="MAP_DENSITY2" value="##CURRENT_DENSITY_VALUE##" />
243
+ <action name="setval" field="MAP_RESOLUTIONWIDTH" value="##SCREEN_RESOLUTION_WIDTH##" />
244
+ <action name="setval" field="MAP_RESOLUTIONHEIGHT" value="##SCREEN_RESOLUTION_HEIGHT##" />
245
+ <action name="runscript">
246
+ <script language="javascript">
247
+ // Activar flag de consola abierta (para el auto-refresh)
248
+ appData.getCurrentEnterprise().setVariable("ConsolaReplica", 1);
249
+
250
+ if (self.MAP_VERSIONCODE === "##FRAME_VERSION_CODE##") {
251
+ self.MAP_VERSIONCODE = "No disponible";
252
+ }
253
+
254
+ // Cargar datos de replica y ficheros
255
+ inicializarDatosReplica(self);
256
+ inicializarDatosReplicaFicheros(self);
257
+
258
+ // Iniciar auto-refresh cada 5 segundos
259
+ ui.executeActionAfterDelay("refreshDatosReplica", 1);
260
+ </script>
261
+ </action>
262
+ </before-edit>
263
+
264
+ <!-- Navegar entre grupos y actualizar título del header -->
265
+ <irGrupo refresh="false" show-wait-dialog="false">
266
+ <action name="runscript">
267
+ <param name="parametro" />
268
+ <script language="javascript">
269
+ irGrupoConsolaReplica(parametro, self);
270
+ </script>
271
+ </action>
272
+ </irGrupo>
273
+
274
+ <!-- Lanzar replica manual -->
275
+ <replicar refresh="false" show-wait-dialog="false">
276
+ <action name="runscript">
277
+ <script language="javascript">
278
+ replica.start();
279
+ ui.showToast("Iniciando ciclo de replica");
280
+ </script>
281
+ </action>
282
+ </replicar>
283
+
284
+ <!-- Auto-refresh mientras la consola esta abierta -->
285
+ <refreshDatosReplica refresh="false" show-wait-dialog="false">
286
+ <action name="runscript">
287
+ <script language="javascript">
288
+ if (appData.getCurrentEnterprise().getVariable("ConsolaReplica") == 1) {
289
+ inicializarDatosReplica(self);
290
+ inicializarDatosReplicaFicheros(self);
291
+ ui.getView(self).refresh(
292
+ "MAP_RECORDSRX", "MAP_RECORDSTX", "MAP_RECORDSPEND",
293
+ "MAP_LOG", "MAP_CMDDATE",
294
+ "MAP_TOTAL", "MAP_TOTAL_ENV",
295
+ "replicafile", "replicafile_ENV"
296
+ );
297
+ ui.executeActionAfterDelay("refreshDatosReplica", 5);
298
+ }
299
+ </script>
300
+ </action>
301
+ </refreshDatosReplica>
302
+
303
+ <!-- Capturar pantalla y compartir -->
304
+ <compartir show-wait-dialog="false">
305
+ <action name="runscript">
306
+ <script language="javascript">
307
+ try {
308
+ ui.captureImage("MAP_CAPTUREIMG");
309
+ ui.shareData("Compartir byXOne", "", self.MAP_CAPTUREIMG);
310
+ } catch(ex) {}
311
+ </script>
312
+ </action>
313
+ </compartir>
314
+
315
+ <!-- Onback: desactivar flag y salir -->
316
+ <onback show-wait-dialog="false">
317
+ <action name="runscript">
318
+ <script language="javascript">
319
+ appData.getCurrentEnterprise().setVariable("ConsolaReplica", 0);
320
+ exitCollection();
321
+ </script>
322
+ </action>
323
+ </onback>
324
+
325
+ </coll>
326
+ </xml>
327
+ ```
328
+
329
+ ---
330
+
331
+ #### Coleccion ContentOperQueue — Cola de Operaciones Pendientes
332
+
333
+ Muestra las operaciones INSERT/UPDATE/DELETE pendientes en `master_replica_queue`. Se usa como contents en el Grupo 2.
334
+
335
+ ```xml
336
+ <coll name="ContentOperQueue" title="OperQueue"
337
+ sql="SELECT
338
+ CASE WHEN t1.OPER=1 THEN 'INSERT'
339
+ WHEN t1.OPER=2 THEN 'DELETE'
340
+ WHEN t1.OPER=3 THEN 'UPDATE'
341
+ END AS MAP_OPER,
342
+ t1.SQL AS MAP_SQL
343
+ FROM master_replica_queue t1"
344
+ userawsql="true"
345
+ objname="empresa" updateobj="empresa"
346
+ progid="ASData.CASBasicDataObj"
347
+ cell-odd-color="#FFFFFF" cell-even-color="#F2F2F2">
348
+ <group name="General" id="1">
349
+ <prop name="MAP_OPER" class="classgrid" width="30%" />
350
+ <prop name="MAP_SQL" class="classgrid" newline="false" width="68%" />
351
+ </group>
352
+ </coll>
353
+ ```
354
+
355
+ #### Coleccion ContentReplicaFiles — Ficheros con barra de progreso
356
+
357
+ Muestra los ficheros en proceso de envio con barra de progreso visual usando `##FLD_MAP_CALCULOBLOCK##` como ancho dinámico.
358
+
359
+ ```xml
360
+ <coll name="ContentReplicaFiles" fontsize="8" title="ReplicaFiles"
361
+ show-toolbar="false" notab="true"
362
+ objname="master_replica_files" updateobj="master_replica_files"
363
+ progid="ASData.CASBasicDataObj"
364
+ sql="SELECT * FROM master_replica_files"
365
+ connection="Info_ReplicaFiles"
366
+ loadall="false" editmask="8"
367
+ check-owner="false" dependent="false">
368
+ <group name="General" id="1">
369
+ <frame name="page_contact" width="100%" height="100%" bgcolor="#FFFFFF">
370
+ <prop name="LICENSE" type="T" visible="7" locked="true" labelwidth="0" title="Licencia:" />
371
+ <prop name="FILENAME" type="T" visible="7" locked="true" labelwidth="0" title="Nombre:" />
372
+ <prop name="STATUS" type="N" visible="7" locked="true" labelwidth="0" title="Status:" align="center" />
373
+ <prop name="MAP_CALCULOBLOCK" type="N" visible="7" locked="true" labelwidth="0" title="Porciento:" align="center" newline="false" />
374
+ <prop name="BLOCK" type="N" visible="7" locked="true" labelwidth="0" title="B.Tras:" align="center" newline="false" />
375
+ <prop name="BLOCKS" type="N" visible="7" locked="true" labelwidth="0" title="Total:" align="center" newline="false" />
376
+ <!-- Barra de progreso: ancho dinámico según porcentaje -->
377
+ <frame name="progress_frame" width="100" height="30"
378
+ framebox="true" bgcolor="#505050" align="left|center">
379
+ <frame name="progress_bar" width="##FLD_MAP_CALCULOBLOCK##" height="28"
380
+ framebox="true" bgcolor="#FF0000" align="left|center">
381
+ <prop name="MAP_TL" type="L" visible="0" labelwidth="1" locked="true" title="" />
382
+ </frame>
383
+ </frame>
384
+ </frame>
385
+ </group>
386
+ </coll>
387
+ ```
388
+
389
+
390
+ > **NOTA:** `master_replica_files` y `master_replica_queue` son tablas internas del sistema XOne. No requieren definición en el modelo de datos del proyecto.
391
+
392
+ ---
393
+
394
+ #### Funciones JavaScript requeridas en functions.js
395
+
396
+ ```javascript
397
+ // Envia información de diagnostico al servidor de soporte
398
+ // método: 0=log Android, 1=BD, 2=BD replica debug, 3=BD ficheros debug
399
+ function doDebugTools(metodo) {
400
+ var urlLog = "https://xoneisp.com/XoneLogRec/reclog.aspx";
401
+ var debugTools = new DebugTools();
402
+ if (typeof debugTools === "undefined") {
403
+ ui.showToast("Funcion no implementada en IOS");
404
+ return;
405
+ }
406
+ var message, result;
407
+ switch (metodo) {
408
+ case 0: message = "el log de android";
409
+ result = debugTools.sendLog(urlLog); break;
410
+ case 1: message = "la base de datos";
411
+ result = debugTools.sendDatabase(urlLog); break;
412
+ case 2: message = "la base de datos de depuracion";
413
+ result = debugTools.sendReplicaDebugDatabase(urlLog); break;
414
+ case 3: message = "la base de datos de depuracion de ficheros";
415
+ result = debugTools.sendReplicaFilesDatabase(urlLog); break;
416
+ }
417
+ ui.showToast(result === -1 ? "No se pudo enviar " + message : "Enviado correctamente.");
418
+ debugTools = null;
419
+ }
420
+
421
+ // Navega entre grupos de la consola y actualiza el título del header
422
+ function irGrupoConsolaReplica(parametro, objself) {
423
+ try {
424
+ switch (parametro) {
425
+ case '1': objself.MAP_TAB = "Datos del dispositivo 1/5"; break;
426
+ case '2': objself.MAP_TAB = "Logs de replica 2/5"; break;
427
+ case '3': objself.MAP_TAB = "Replica de ficheros 3/5"; break;
428
+ case '4': objself.MAP_TAB = "Control de ficheros 4/5"; break;
429
+ case '5': objself.MAP_TAB = "Utilidades 5/5"; break;
430
+ }
431
+ ui.hideGroup('99');
432
+ ui.showGroup(parametro);
433
+ ui.getView(objself).refresh("MAP_TAB");
434
+ } catch(e) {
435
+ writelogExceptionJSv2("irGrupoConsolaReplica ERROR: " + e.message, "functions.js", false);
436
+ }
437
+ }
438
+
439
+ // Carga los datos de replica en los campos MAP_ de la consola
440
+ function inicializarDatosReplica(coll) {
441
+ if (appData.getGlobalMacro("##DEVICE_OS##") === "android") {
442
+ coll.MAP_RECORDSRX = replica.getRecordsRX() + "/" + replica.getTotalRecordsRX();
443
+ coll.MAP_RECORDSTX = replica.getRecordsTX() + "/" + replica.getTotalRecordsTX();
444
+ coll.MAP_RECORDSPEND = replica.getRecordsPend();
445
+ coll.MAP_LOG = replica.getLog();
446
+ var replicaCMDLOG = appData.getCollection("ReplicaCmdLog");
447
+ replicaCMDLOG.loadAll();
448
+ coll.MAP_CMDDATE = replicaCMDLOG.getCount() > 0
449
+ ? replicaCMDLOG.getItem(0).CMDTIME
450
+ : "Nunca";
451
+ }
452
+ }
453
+
454
+ // Carga los contadores de ficheros pendientes de replica
455
+ function inicializarDatosReplicaFicheros(objself) {
456
+ if (appData.getGlobalMacro("##DEVICE_OS##") === "android") {
457
+ var fc = objself.getContents("replicafile");
458
+ fc.loadAll();
459
+ objself.MAP_TOTAL = fc.getCount();
460
+
461
+ var fe = objself.getContents("replicafile_ENV");
462
+ fe.loadAll();
463
+ objself.MAP_TOTAL_ENV = fe.getCount();
464
+
465
+ ui.getView(objself).refresh(
466
+ "MAP_TOTAL", "MAP_TOTAL_ENV", "replicafile", "replicafile_ENV"
467
+ );
468
+ }
469
+ }
470
+
471
+ // Arranca la replica y cierra la consola
472
+ function exitCollection() {
473
+ replica.start();
474
+ ui.getView(self).exit();
475
+ }
476
+ ```
477
+