{"id":11,"date":"2026-03-15T23:58:31","date_gmt":"2026-03-15T23:58:31","guid":{"rendered":"https:\/\/vordai.com\/wp\/?page_id=11"},"modified":"2026-03-15T23:58:31","modified_gmt":"2026-03-15T23:58:31","slug":"visa-check-by-vorday-sistems","status":"publish","type":"page","link":"https:\/\/vordai.com\/wp\/visa-check-by-vorday-sistems\/","title":{"rendered":"VISA CHECK By vorday sistems"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/>\n  <title>Visa Profile Check \u2022 USA \/ Jap\u00f3n (NO oficial)<\/title>\n  <style>\n    :root{\n      --bg: #0b1220;\n      --text: #e5e7eb;\n      --muted: #94a3b8;\n      --accent: #60a5fa;\n      --good: #22c55e;\n      --warn: #f59e0b;\n      --bad: #ef4444;\n      --shadow: 0 16px 40px rgba(0,0,0,.35);\n      --radius: 18px;\n    }\n    *{ box-sizing:border-box; }\n    body{\n      margin:0;\n      font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial;\n      background:\n        radial-gradient(1200px 800px at 20% 10%, rgba(96,165,250,.22), transparent 60%),\n        radial-gradient(900px 600px at 80% 30%, rgba(34,197,94,.16), transparent 55%),\n        radial-gradient(900px 700px at 50% 100%, rgba(245,158,11,.12), transparent 55%),\n        var(--bg);\n      color: var(--text);\n    }\n    .wrap{ max-width: 1040px; margin: 28px auto; padding: 0 16px 40px; }\n    header{ display:flex; gap:16px; justify-content: space-between; align-items:flex-start; flex-wrap: wrap; margin-bottom: 18px; }\n    .title{ display:flex; flex-direction: column; gap:6px; }\n    .title h1{ margin:0; font-size: 1.35rem; letter-spacing:.2px; }\n    .title p{ margin:0; color: var(--muted); max-width: 760px; line-height: 1.35; font-size:.95rem; }\n    .pill{\n      display:inline-flex; gap:8px; align-items:center;\n      padding: 8px 12px; border-radius: 999px;\n      background: rgba(255,255,255,.08);\n      border: 1px solid rgba(255,255,255,.12);\n      font-size: .85rem; color: var(--muted); white-space: nowrap;\n    }\n    .pill strong{ color: var(--text); font-weight: 700; }\n    .grid{ display:grid; grid-template-columns: 1.2fr .8fr; gap: 14px; align-items:start; }\n    @media (max-width: 900px){ .grid{ grid-template-columns: 1fr; } }\n\n    .card{\n      background: linear-gradient(180deg, rgba(255,255,255,.08), rgba(255,255,255,.05));\n      border: 1px solid rgba(255,255,255,.10);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      overflow: hidden;\n    }\n    .hd{\n      padding: 14px 16px 12px;\n      border-bottom: 1px solid rgba(255,255,255,.10);\n      display:flex; align-items:center; justify-content: space-between; gap: 10px;\n      background: rgba(255,255,255,.04);\n    }\n    .hd .left{ display:flex; flex-direction:column; gap:4px; }\n    .hd .left .k{ font-size:.92rem; color: var(--muted); }\n    .hd .left .v{ font-size:1.02rem; font-weight: 750; letter-spacing:.2px; }\n    .bd{ padding: 14px 16px 16px; }\n\n    .alert{\n      border-radius: 14px;\n      padding: 12px 12px;\n      background: rgba(245,158,11,.10);\n      border: 1px solid rgba(245,158,11,.22);\n      color: #fde68a;\n      font-size: .9rem;\n      line-height:1.35;\n    }\n    .divider{ height: 1px; background: rgba(255,255,255,.10); margin: 12px 0; }\n\n    form{ display:flex; flex-direction: column; gap: 12px; }\n    .section{\n      border: 1px solid rgba(255,255,255,.10);\n      border-radius: 16px;\n      padding: 12px;\n      background: rgba(255,255,255,.04);\n    }\n    .section h2{ margin:0 0 6px; font-size: .95rem; letter-spacing:.2px; }\n    .section p{ margin: 0 0 10px; color: var(--muted); font-size: .85rem; line-height: 1.35; }\n\n    .row{ display:grid; grid-template-columns: 1fr 1fr; gap: 10px; }\n    @media (max-width: 560px){ .row{ grid-template-columns: 1fr; } }\n\n    label{ display:block; font-size: .85rem; color: var(--muted); margin-bottom: 6px; }\n    input[type=\"number\"], input[type=\"text\"], select, textarea{\n      width: 100%;\n      padding: 10px 11px;\n      border-radius: 12px;\n      border: 1px solid rgba(255,255,255,.14);\n      background: rgba(11,18,32,.55);\n      color: var(--text);\n      outline:none;\n      font-size: .95rem;\n    }\n    textarea{ min-height: 74px; resize: vertical; }\n    input:focus, select:focus, textarea:focus{\n      border-color: rgba(96,165,250,.6);\n      box-shadow: 0 0 0 3px rgba(96,165,250,.12);\n    }\n\n    .radio{ display:flex; flex-wrap: wrap; gap: 8px 12px; margin-top: 4px; }\n    .radio .opt{\n      display:flex; gap:8px; align-items:center;\n      padding: 9px 10px; border-radius: 12px;\n      border: 1px solid rgba(255,255,255,.12);\n      background: rgba(255,255,255,.04);\n      cursor:pointer; user-select:none;\n      font-size: .92rem; color: var(--text);\n    }\n    .radio input{ accent-color: var(--accent); }\n\n    .actions{ display:flex; flex-wrap: wrap; gap: 10px; margin-top: 6px; }\n    .btn{\n      border: 0; padding: 11px 14px; border-radius: 14px;\n      cursor:pointer; font-weight: 750; font-size: .95rem;\n      color: #07111f;\n      background: linear-gradient(180deg, rgba(96,165,250,1), rgba(59,130,246,1));\n      box-shadow: 0 10px 22px rgba(59,130,246,.22);\n      transition: transform .06s ease, filter .12s ease;\n    }\n    .btn:hover{ filter: brightness(1.05); }\n    .btn:active{ transform: translateY(1px); }\n    .btn.ghost{\n      background: rgba(255,255,255,.06);\n      color: var(--text);\n      border: 1px solid rgba(255,255,255,.14);\n      box-shadow: none;\n    }\n\n    .progress{\n      height: 10px; border-radius: 999px;\n      background: rgba(255,255,255,.08);\n      border: 1px solid rgba(255,255,255,.10);\n      overflow:hidden; margin-top: 8px;\n    }\n    .progress > div{\n      height: 100%;\n      width: 0%;\n      background: linear-gradient(90deg, rgba(34,197,94,1), rgba(96,165,250,1), rgba(245,158,11,1));\n      transition: width .35s ease;\n    }\n\n    .scoreBox{ display:flex; flex-direction: column; gap: 10px; }\n    .scoreBig{ display:flex; justify-content: space-between; align-items: baseline; gap: 10px; }\n    .scoreBig .num{ font-size: 2.2rem; font-weight: 900; letter-spacing:-.5px; }\n    .scoreBig .lvl{ font-size: .95rem; color: var(--muted); }\n\n    .badge{\n      display:inline-flex; align-items:center; gap: 8px;\n      padding: 8px 10px; border-radius: 999px;\n      border: 1px solid rgba(255,255,255,.12);\n      background: rgba(255,255,255,.06);\n      font-size: .85rem; color: var(--muted);\n      width: fit-content;\n    }\n    .dot{\n      width: 10px; height: 10px; border-radius: 999px;\n      background: var(--accent);\n      box-shadow: 0 0 0 3px rgba(96,165,250,.12);\n    }\n\n    .tags{ display:flex; flex-wrap: wrap; gap: 8px; margin-top: 6px; }\n    .tag{\n      padding: 6px 9px;\n      border-radius: 999px;\n      font-size: .82rem;\n      border: 1px solid rgba(255,255,255,.12);\n      background: rgba(255,255,255,.06);\n      color: var(--text);\n    }\n    .tag.good{ border-color: rgba(34,197,94,.35); background: rgba(34,197,94,.12); }\n    .tag.warn{ border-color: rgba(245,158,11,.35); background: rgba(245,158,11,.12); }\n    .tag.bad{ border-color: rgba(239,68,68,.35); background: rgba(239,68,68,.12); }\n\n    .list{ margin: 10px 0 0; padding-left: 18px; color: var(--muted); line-height:1.35; font-size: .9rem; }\n    .small{ color: var(--muted); font-size: .82rem; line-height:1.35; }\n\n    .mono{\n      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n      font-size: .82rem;\n      color: rgba(229,231,235,.9);\n      background: rgba(255,255,255,.06);\n      border: 1px solid rgba(255,255,255,.10);\n      border-radius: 14px;\n      padding: 10px;\n      overflow:auto;\n      max-height: 240px;\n    }\n  <\/style>\n<\/head>\n\n<body>\n  <div class=\"wrap\">\n    <header>\n      <div class=\"title\">\n        <h1>Visa Profile Check \u2022 USA \/ Jap\u00f3n (NO oficial)<\/h1>\n        <p>\n          Etapa 1: una \u201cmini-app\u201d en 1 archivo. Ordena tu caso y detecta qu\u00e9 evidencia reforzar (arraigo, plan, solvencia, historial).\n          No es asesor\u00eda legal ni probabilidad real.\n        <\/p>\n      <\/div>\n      <div class=\"pill\">Deploy: <strong>1 HTML<\/strong> \u2022 Sin librer\u00edas \u2022 Autosave<\/div>\n    <\/header>\n\n    <div class=\"grid\">\n      <!-- FORM -->\n      <div class=\"card\">\n        <div class=\"hd\">\n          <div class=\"left\">\n            <div class=\"k\">Formulario<\/div>\n            <div class=\"v\">Completa tu perfil<\/div>\n          <\/div>\n          <div class=\"pill\" id=\"autosavePill\">Autosave: <strong>ON<\/strong><\/div>\n        <\/div>\n        <div class=\"bd\">\n          <div class=\"alert\">\n            \u26a0\ufe0f <strong>Aviso:<\/strong> Esto NO estima probabilidades reales ni representa decisiones de embajadas\/consulados.\n            Sirve para detectar incoherencias y qu\u00e9 documentos conviene reforzar.\n          <\/div>\n\n          <div class=\"divider\"><\/div>\n\n          <form id=\"visaForm\">\n            <!-- 1) Base -->\n            <div class=\"section\">\n              <h2>1) Datos base<\/h2>\n              <p>Selecciona destino para aplicar presets y ajustes de scoring (USA\/Jap\u00f3n).<\/p>\n\n              <div class=\"row\">\n                <div>\n                  <label for=\"destinoPreset\">Pa\u00eds destino (preset) *<\/label>\n                  <select id=\"destinoPreset\" required>\n                    <option value=\"\">Selecciona\u2026<\/option>\n                    <option value=\"usa\">Estados Unidos (USA)<\/option>\n                    <option value=\"japan\">Jap\u00f3n<\/option>\n                  <\/select>\n                <\/div>\n                <div>\n                  <label for=\"moneda\">Moneda (opcional)<\/label>\n                  <select id=\"moneda\">\n                    <option value=\"CLP\">CLP<\/option>\n                    <option value=\"USD\">USD<\/option>\n                    <option value=\"JPY\">JPY<\/option>\n                  <\/select>\n                <\/div>\n              <\/div>\n\n              <div class=\"row\">\n                <div>\n                  <label for=\"edad\">Edad *<\/label>\n                  <input type=\"number\" id=\"edad\" min=\"18\" max=\"90\" required \/>\n                <\/div>\n                <div>\n                  <label for=\"paisOrigen\">Pa\u00eds de origen (opcional)<\/label>\n                  <input type=\"text\" id=\"paisOrigen\" placeholder=\"Ej: Chile\" \/>\n                <\/div>\n              <\/div>\n\n              <div class=\"row\">\n                <div>\n                  <label for=\"genero\">G\u00e9nero (opcional)<\/label>\n                  <select id=\"genero\">\n                    <option value=\"\">Prefiero no decir<\/option>\n                    <option value=\"mujer\">Mujer<\/option>\n                    <option value=\"hombre\">Hombre<\/option>\n                    <option value=\"otro\">Otro<\/option>\n                  <\/select>\n                <\/div>\n                <div>\n                  <label for=\"destinoLibre\">Destino (ciudad\/estado) (opcional)<\/label>\n                  <input type=\"text\" id=\"destinoLibre\" placeholder=\"Ej: Miami \/ Tokyo\" \/>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <!-- 2) Ties -->\n            <div class=\"section\">\n              <h2>2) Arraigo \/ lazos con tu pa\u00eds<\/h2>\n              <p>Lazos familiares, propiedad y obligaciones suelen pesar fuerte para \u201cintenci\u00f3n de retorno\u201d.<\/p>\n\n              <div class=\"row\">\n                <div>\n                  <label for=\"estadoCivil\">Estado civil *<\/label>\n                  <select id=\"estadoCivil\" required>\n                    <option value=\"\">Selecciona\u2026<\/option>\n                    <option value=\"soltero\">Soltero\/a<\/option>\n                    <option value=\"casado\">Casado\/a o uni\u00f3n estable<\/option>\n                    <option value=\"divorciado\">Divorciado\/a<\/option>\n                    <option value=\"viudo\">Viudo\/a<\/option>\n                  <\/select>\n                <\/div>\n                <div>\n                  <label for=\"hijos\">Hijos *<\/label>\n                  <select id=\"hijos\" required>\n                    <option value=\"\">Selecciona\u2026<\/option>\n                    <option value=\"no\">No<\/option>\n                    <option value=\"si_mismo_pais\">S\u00ed, viven en mi pa\u00eds<\/option>\n                    <option value=\"si_otro_pais\">S\u00ed, viven en otro pa\u00eds<\/option>\n                  <\/select>\n                <\/div>\n              <\/div>\n\n              <div class=\"row\">\n                <div>\n                  <label>Propiedades o contrato de arriendo a tu nombre *<\/label>\n                  <div class=\"radio\">\n                    <label class=\"opt\"><input type=\"radio\" name=\"propiedad\" value=\"si\" required \/> S\u00ed<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"propiedad\" value=\"no\" \/> No<\/label>\n                  <\/div>\n                <\/div>\n                <div>\n                  <label>Obligaciones formales (estudios\/contrato\/empresa operando) *<\/label>\n                  <div class=\"radio\">\n                    <label class=\"opt\"><input type=\"radio\" name=\"obligaciones\" value=\"fuertes\" required \/> Fuertes<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"obligaciones\" value=\"medias\" \/> Medias<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"obligaciones\" value=\"bajas\" \/> Bajas<\/label>\n                  <\/div>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <!-- 3) Finance -->\n            <div class=\"section\">\n              <h2>3) Trabajo &#038; solvencia<\/h2>\n              <p>Consistencia: ingresos\/ahorros vs duraci\u00f3n y presupuesto; y respaldo documental.<\/p>\n\n              <div class=\"row\">\n                <div>\n                  <label for=\"laboral\">Situaci\u00f3n laboral *<\/label>\n                  <select id=\"laboral\" required>\n                    <option value=\"\">Selecciona\u2026<\/option>\n                    <option value=\"empleado_estable\">Empleado con contrato estable<\/option>\n                    <option value=\"independiente_estable\">Independiente con ingresos estables<\/option>\n                    <option value=\"empleado_temporal\">Temporal \/ por proyecto<\/option>\n                    <option value=\"estudiante\">Estudiante<\/option>\n                    <option value=\"desempleado\">Desempleado<\/option>\n                  <\/select>\n                <\/div>\n                <div>\n                  <label for=\"antiguedad\">Antig\u00fcedad laboral (meses) *<\/label>\n                  <input type=\"number\" id=\"antiguedad\" min=\"0\" max=\"600\" required \/>\n                <\/div>\n              <\/div>\n\n              <div class=\"row\">\n                <div>\n                  <label for=\"ingreso\">Ingreso mensual aprox. *<\/label>\n                  <input type=\"number\" id=\"ingreso\" min=\"0\" step=\"1\" required \/>\n                <\/div>\n                <div>\n                  <label for=\"ahorros\">Ahorros l\u00edquidos disponibles *<\/label>\n                  <input type=\"number\" id=\"ahorros\" min=\"0\" step=\"1\" required \/>\n                <\/div>\n              <\/div>\n\n              <div class=\"row\">\n                <div>\n                  <label>Documentaci\u00f3n financiera (estados de cuenta \/ impuestos \/ boletas) *<\/label>\n                  <div class=\"radio\">\n                    <label class=\"opt\"><input type=\"radio\" name=\"docFinanzas\" value=\"fuerte\" required \/> Completa<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"docFinanzas\" value=\"medio\" \/> Parcial<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"docFinanzas\" value=\"bajo\" \/> Poco \/ nada<\/label>\n                  <\/div>\n                <\/div>\n                <div>\n                  <label>Patrocinador (sponsor) para el viaje *<\/label>\n                  <div class=\"radio\">\n                    <label class=\"opt\"><input type=\"radio\" name=\"sponsor\" value=\"no\" required \/> No<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"sponsor\" value=\"si_formal\" \/> S\u00ed, formal<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"sponsor\" value=\"si_informal\" \/> S\u00ed, informal<\/label>\n                  <\/div>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <!-- 4) Plan -->\n            <div class=\"section\">\n              <h2>4) Plan de viaje &#038; coherencia<\/h2>\n              <p>Motivo claro, duraci\u00f3n razonable, presupuesto realista y reservas\/direcci\u00f3n ayudan mucho.<\/p>\n\n              <div class=\"row\">\n                <div>\n                  <label for=\"motivo\">Motivo principal *<\/label>\n                  <select id=\"motivo\" required>\n                    <option value=\"\">Selecciona\u2026<\/option>\n                    <option value=\"turismo_corto\">Turismo (corto)<\/option>\n                    <option value=\"turismo_largo\">Turismo (largo)<\/option>\n                    <option value=\"estudios_formales\">Estudios (carta aceptaci\u00f3n)<\/option>\n                    <option value=\"trabajo_oferta_formal\">Trabajo (oferta\/contrato)<\/option>\n                    <option value=\"trabajo_busqueda\">Buscar trabajo (sin contrato)<\/option>\n                    <option value=\"visita_familia\">Visita familia\/pareja<\/option>\n                    <option value=\"medico\">Tratamiento m\u00e9dico<\/option>\n                    <option value=\"otros\">Otros<\/option>\n                  <\/select>\n                <\/div>\n                <div>\n                  <label for=\"dias\">Duraci\u00f3n estimada (d\u00edas) *<\/label>\n                  <input type=\"number\" id=\"dias\" min=\"1\" max=\"730\" required \/>\n                <\/div>\n              <\/div>\n\n              <div class=\"row\">\n                <div>\n                  <label for=\"costoDia\">Gasto estimado por d\u00eda (preset sugerido) *<\/label>\n                  <input type=\"number\" id=\"costoDia\" min=\"0\" step=\"1\" required \/>\n                <\/div>\n                <div>\n                  <label>Itinerario \/ reservas \/ direcci\u00f3n de estad\u00eda *<\/label>\n                  <div class=\"radio\">\n                    <label class=\"opt\"><input type=\"radio\" name=\"itinerario\" value=\"fuerte\" required \/> Claro<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"itinerario\" value=\"medio\" \/> Parcial<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"itinerario\" value=\"bajo\" \/> No definido<\/label>\n                  <\/div>\n                <\/div>\n              <\/div>\n\n              <div class=\"row\">\n                <div>\n                  <label>Seguro de viaje\/salud *<\/label>\n                  <div class=\"radio\">\n                    <label class=\"opt\"><input type=\"radio\" name=\"seguro\" value=\"si\" required \/> S\u00ed \/ lo contratar\u00e9<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"seguro\" value=\"no\" \/> No<\/label>\n                  <\/div>\n                <\/div>\n                <div>\n                  <label>Coherencia (motivo calza con tu situaci\u00f3n) *<\/label>\n                  <div class=\"radio\">\n                    <label class=\"opt\"><input type=\"radio\" name=\"coherencia\" value=\"alta\" required \/> Alta<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"coherencia\" value=\"media\" \/> Media<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"coherencia\" value=\"baja\" \/> Baja<\/label>\n                  <\/div>\n                <\/div>\n              <\/div>\n\n              <div>\n                <label for=\"nota\">Notas (opcional)<\/label>\n                <textarea id=\"nota\" placeholder=\"Ej: hotel reservado, vuelos ida\/vuelta, financio con ahorros, empresa operando, etc.\"><\/textarea>\n              <\/div>\n            <\/div>\n\n            <!-- 5) Compliance -->\n            <div class=\"section\">\n              <h2>5) Cumplimiento migratorio &#038; antecedentes<\/h2>\n              <p>Historial migratorio y antecedentes suelen dominar el an\u00e1lisis.<\/p>\n\n              <div class=\"row\">\n                <div>\n                  <label>Antecedentes penales *<\/label>\n                  <div class=\"radio\">\n                    <label class=\"opt\"><input type=\"radio\" name=\"penales\" value=\"limpio\" required \/> Limpio<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"penales\" value=\"leve\" \/> Leve resuelto<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"penales\" value=\"grave\" \/> Grave<\/label>\n                  <\/div>\n                <\/div>\n                <div>\n                  <label for=\"viajes\">Historial internacional (\u00faltimos 5 a\u00f1os) *<\/label>\n                  <select id=\"viajes\" required>\n                    <option value=\"\">Selecciona\u2026<\/option>\n                    <option value=\"ninguno\">Ninguno<\/option>\n                    <option value=\"pocos\">1\u20132 viajes<\/option>\n                    <option value=\"varios_buen_historial\">Varios y buen cumplimiento<\/option>\n                    <option value=\"incumplimientos\">Problemas (sobreestad\u00eda\/deportaci\u00f3n)<\/option>\n                  <\/select>\n                <\/div>\n              <\/div>\n\n              <div class=\"row\">\n                <div>\n                  <label for=\"rechazo\">Rechazos previos de visa *<\/label>\n                  <select id=\"rechazo\" required>\n                    <option value=\"\">Selecciona\u2026<\/option>\n                    <option value=\"no\">No<\/option>\n                    <option value=\"si_hace_tiempo\">S\u00ed, hace a\u00f1os<\/option>\n                    <option value=\"si_reciente\">S\u00ed, reciente (&lt; 2 a\u00f1os)<\/option>\n                  <\/select>\n                <\/div>\n                <div>\n                  <label>Carta laboral\/estudios\/empresa indicando retorno *<\/label>\n                  <div class=\"radio\">\n                    <label class=\"opt\"><input type=\"radio\" name=\"cartaRetorno\" value=\"si\" required \/> S\u00ed<\/label>\n                    <label class=\"opt\"><input type=\"radio\" name=\"cartaRetorno\" value=\"no\" \/> No<\/label>\n                  <\/div>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"actions\">\n              <button class=\"btn\" type=\"button\" onclick=\"runEvaluation()\">Calcular scoring<\/button>\n              <button class=\"btn ghost\" type=\"button\" onclick=\"resetAll()\">Reset<\/button>\n              <button class=\"btn ghost\" type=\"button\" onclick=\"exportJSON()\">Exportar JSON<\/button>\n            <\/div>\n\n            <div class=\"small\" style=\"margin-top:6px;\">\n              Tip: Selecciona destino primero: as\u00ed te sugiere duraci\u00f3n\/presupuesto y activa reglas espec\u00edficas.\n            <\/div>\n          <\/form>\n        <\/div>\n      <\/div>\n\n      <!-- RESULTS -->\n      <div class=\"card\">\n        <div class=\"hd\">\n          <div class=\"left\">\n            <div class=\"k\">Resultado<\/div>\n            <div class=\"v\">Scoring &#038; recomendaciones<\/div>\n          <\/div>\n          <div class=\"pill\">Score: <strong id=\"scoreMini\">\u2014<\/strong><\/div>\n        <\/div>\n\n        <div class=\"bd\">\n          <div class=\"scoreBox\">\n            <div class=\"scoreBig\">\n              <div class=\"num\" id=\"scoreNum\">\u2014<\/div>\n              <div class=\"lvl\" id=\"scoreLevel\">Completa y calcula<\/div>\n            <\/div>\n\n            <div class=\"badge\" id=\"badge\">\n              <span class=\"dot\" id=\"badgeDot\"><\/span>\n              <span id=\"badgeText\">Sin evaluaci\u00f3n<\/span>\n            <\/div>\n\n            <div class=\"progress\"><div id=\"scoreBar\"><\/div><\/div>\n\n            <div class=\"divider\"><\/div>\n\n            <div>\n              <div class=\"small\">Indicadores detectados<\/div>\n              <div class=\"tags\" id=\"tags\"><\/div>\n            <\/div>\n\n            <div class=\"divider\"><\/div>\n\n            <div>\n              <div class=\"small\">Desglose por categor\u00eda<\/div>\n              <ul class=\"list\" id=\"breakdown\"><\/ul>\n            <\/div>\n\n            <div class=\"divider\"><\/div>\n\n            <div>\n              <div class=\"small\">Checklist de mejora (acci\u00f3n r\u00e1pida)<\/div>\n              <ul class=\"list\" id=\"todo\"><\/ul>\n            <\/div>\n\n            <div class=\"divider\"><\/div>\n\n            <div class=\"small\">Vista t\u00e9cnica (debug) \u2014 para ajustar pesos\/umbrales<\/div>\n            <div class=\"mono\" id=\"debug\">\u2014<\/div>\n\n            <div class=\"divider\"><\/div>\n            <div class=\"small\">\n              Si hay antecedentes graves o incumplimientos migratorios, eso puede dominar el caso.\n              Lo que suele salvar perfiles: plan acotado + evidencia + coherencia.\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"small\" style=\"text-align:center; margin-top:14px;\">\n      \u00a9 Herramienta orientativa \u2014 no reemplaza asesor\u00eda profesional.\n    <\/div>\n  <\/div>\n\n<script>\n  const LS_KEY = \"visa_profile_stage1_usa_japan_v1\";\n  const $ = (id) => document.getElementById(id);\n  const form = $(\"visaForm\");\n\n  function getRadio(name){\n    const el = document.querySelector(`input[name=\"${name}\"]:checked`);\n    return el ? el.value : \"\";\n  }\n  function setRadio(name, value){\n    if(!value) return;\n    const el = document.querySelector(`input[name=\"${name}\"][value=\"${value}\"]`);\n    if(el) el.checked = true;\n  }\n\n  function snapshot(){\n    return {\n      destinoPreset: $(\"destinoPreset\").value,\n      moneda: $(\"moneda\").value,\n      edad: $(\"edad\").value,\n      paisOrigen: $(\"paisOrigen\").value,\n      genero: $(\"genero\").value,\n      destinoLibre: $(\"destinoLibre\").value,\n\n      estadoCivil: $(\"estadoCivil\").value,\n      hijos: $(\"hijos\").value,\n      propiedad: getRadio(\"propiedad\"),\n      obligaciones: getRadio(\"obligaciones\"),\n\n      laboral: $(\"laboral\").value,\n      antiguedad: $(\"antiguedad\").value,\n      ingreso: $(\"ingreso\").value,\n      ahorros: $(\"ahorros\").value,\n      docFinanzas: getRadio(\"docFinanzas\"),\n      sponsor: getRadio(\"sponsor\"),\n\n      motivo: $(\"motivo\").value,\n      dias: $(\"dias\").value,\n      costoDia: $(\"costoDia\").value,\n      itinerario: getRadio(\"itinerario\"),\n      seguro: getRadio(\"seguro\"),\n      coherencia: getRadio(\"coherencia\"),\n      nota: $(\"nota\").value,\n\n      penales: getRadio(\"penales\"),\n      viajes: $(\"viajes\").value,\n      rechazo: $(\"rechazo\").value,\n      cartaRetorno: getRadio(\"cartaRetorno\")\n    };\n  }\n\n  function restore(data){\n    if(!data) return;\n    $(\"destinoPreset\").value = data.destinoPreset ?? \"\";\n    $(\"moneda\").value = data.moneda ?? \"CLP\";\n    $(\"edad\").value = data.edad ?? \"\";\n    $(\"paisOrigen\").value = data.paisOrigen ?? \"\";\n    $(\"genero\").value = data.genero ?? \"\";\n    $(\"destinoLibre\").value = data.destinoLibre ?? \"\";\n\n    $(\"estadoCivil\").value = data.estadoCivil ?? \"\";\n    $(\"hijos\").value = data.hijos ?? \"\";\n    setRadio(\"propiedad\", data.propiedad);\n    setRadio(\"obligaciones\", data.obligaciones);\n\n    $(\"laboral\").value = data.laboral ?? \"\";\n    $(\"antiguedad\").value = data.antiguedad ?? \"\";\n    $(\"ingreso\").value = data.ingreso ?? \"\";\n    $(\"ahorros\").value = data.ahorros ?? \"\";\n    setRadio(\"docFinanzas\", data.docFinanzas);\n    setRadio(\"sponsor\", data.sponsor);\n\n    $(\"motivo\").value = data.motivo ?? \"\";\n    $(\"dias\").value = data.dias ?? \"\";\n    $(\"costoDia\").value = data.costoDia ?? \"\";\n    setRadio(\"itinerario\", data.itinerario);\n    setRadio(\"seguro\", data.seguro);\n    setRadio(\"coherencia\", data.coherencia);\n    $(\"nota\").value = data.nota ?? \"\";\n\n    setRadio(\"penales\", data.penales);\n    $(\"viajes\").value = data.viajes ?? \"\";\n    $(\"rechazo\").value = data.rechazo ?? \"\";\n    setRadio(\"cartaRetorno\", data.cartaRetorno);\n  }\n\n  function save(){\n    try{ localStorage.setItem(LS_KEY, JSON.stringify(snapshot())); }catch(e){}\n  }\n  function load(){\n    try{\n      const raw = localStorage.getItem(LS_KEY);\n      if(!raw) return;\n      restore(JSON.parse(raw));\n    }catch(e){}\n  }\n\n  form.addEventListener(\"input\", save);\n  form.addEventListener(\"change\", save);\n  load();\n\n  \/\/ ----------------------------\n  \/\/ Model base weights (sum 100)\n  \/\/ ----------------------------\n  const WEIGHTS = {\n    compliance: 28,\n    plan: 22,\n    finance: 22,\n    ties: 18,\n    profile: 10\n  };\n\n  function clamp(n,a,b){ return Math.max(a, Math.min(b,n)); }\n  function scoreCategory(parts){\n    const avg = parts.reduce((s,p)=> s + p.score0to1, 0) \/ Math.max(1, parts.length);\n    return clamp(avg, 0, 1);\n  }\n\n  \/\/ ----------------------------\n  \/\/ Destination configs\n  \/\/ ----------------------------\n  const DEST_CONFIG = {\n    usa: {\n      label: \"Estados Unidos\",\n      maxTourismDays: 90,\n      suggestedDailyCostRange: [120, 280],\n      weightTweaks: { compliance: +2, plan: +2, ties: +2, finance: -2, profile: -4 },\n      checklist: [\n        \"Pasaporte vigente + autorizaci\u00f3n (ESTA si aplica) \/ documentos de viaje\",\n        \"Vuelos ida\/vuelta\",\n        \"Itinerario y direcci\u00f3n de estad\u00eda\",\n        \"Fondos demostrables (estados de cuenta \/ ingresos)\",\n        \"Carta laboral\/estudios y pruebas de retorno\"\n      ],\n      extraRules: (ctx) => {\n        if (ctx.motivo === \"trabajo_busqueda\") {\n          ctx.addWarn(\"USA: \u2018buscar trabajo\u2019 sin oferta formal suele ser un red flag fuerte\");\n          ctx.addTodo(\"Re-encuadra el viaje o formaliza oferta\/visado adecuado\");\n          ctx.penalty += 14;\n        }\n        if (ctx.dias > 45 && (ctx.motivo === \"turismo_corto\" || ctx.motivo === \"turismo_largo\")) {\n          ctx.addWarn(\"USA: turismo muy largo aumenta preguntas sobre intenci\u00f3n y fondos\");\n          ctx.addTodo(\"Acota duraci\u00f3n o refuerza fondos + arraigo + coherencia\");\n          ctx.penalty += 8;\n        }\n        if (ctx.itinerario === \"bajo\") {\n          ctx.addWarn(\"USA: itinerario poco definido suele jugar en contra\");\n          ctx.addTodo(\"Reserva alojamiento o arma plan por d\u00edas (aunque sea flexible)\");\n          ctx.penalty += 6;\n        }\n        if (ctx.cartaRetorno !== \"si\" || ctx.obligaciones === \"bajas\") {\n          ctx.addWarn(\"USA: lazos\/retorno d\u00e9biles suelen ser foco de rechazo (intenci\u00f3n de retorno)\");\n          ctx.addTodo(\"Refuerza evidencia de retorno: carta laboral\/estudios\/empresa + obligaciones\");\n          ctx.penalty += 10;\n        }\n      }\n    },\n\n    japan: {\n      label: \"Jap\u00f3n\",\n      maxTourismDays: 90,\n      suggestedDailyCostRange: [90, 220],\n      weightTweaks: { compliance: +1, plan: +1, ties: -2, finance: +2, profile: -2 },\n      checklist: [\n        \"Pasaporte vigente\",\n        \"Vuelos ida\/vuelta\",\n        \"Itinerario con fechas + direcci\u00f3n de estad\u00eda\",\n        \"Fondos para cubrir estad\u00eda\",\n        \"Seguro de viaje (muy recomendable)\",\n        \"Si aplica: carta invitaci\u00f3n \/ documentaci\u00f3n de actividad\"\n      ],\n      extraRules: (ctx) => {\n        if (ctx.dias > 90) {\n          ctx.addWarn(\"Jap\u00f3n: sobre 90 d\u00edas ya no calza como estad\u00eda corta en este preset\");\n          ctx.addTodo(\"Ajusta duraci\u00f3n o revisa visado seg\u00fan actividad\");\n          ctx.penalty += 18;\n        }\n        if (ctx.motivo === \"trabajo_busqueda\") {\n          ctx.addWarn(\"Jap\u00f3n: \u2018buscar trabajo\u2019 sin visado\/soporte formal no calza con turismo\");\n          ctx.addTodo(\"Evita ese encuadre o usa v\u00eda\/visado adecuado\");\n          ctx.penalty += 12;\n        }\n        if (ctx.seguro !== \"si\") {\n          ctx.addWarn(\"Jap\u00f3n: ir sin seguro es mala idea y baja coherencia del plan\");\n          ctx.addTodo(\"Incluye seguro de viaje\/salud\");\n          ctx.penalty += 5;\n        }\n      }\n    }\n  };\n\n  function getDestConfig(){\n    const key = $(\"destinoPreset\").value;\n    return DEST_CONFIG[key] || null;\n  }\n\n  \/\/ Presets on change\n  $(\"destinoPreset\").addEventListener(\"change\", () => {\n    const cfg = getDestConfig();\n    if(!cfg) return;\n\n    const diasEl = $(\"dias\");\n    if(diasEl && (!diasEl.value || parseInt(diasEl.value,10) === 0)){\n      diasEl.value = Math.min(14, cfg.maxTourismDays);\n    }\n\n    const costoEl = $(\"costoDia\");\n    if(costoEl && (!costoEl.value || parseFloat(costoEl.value) === 0)){\n      costoEl.value = Math.round((cfg.suggestedDailyCostRange[0] + cfg.suggestedDailyCostRange[1]) \/ 2);\n    }\n\n    save();\n  });\n\n  function runEvaluation(){\n    if(!form.reportValidity()) return;\n\n    const data = snapshot();\n    const cfg = getDestConfig();\n    if(!cfg){\n      alert(\"Selecciona pa\u00eds destino (USA o Jap\u00f3n) para aplicar presets.\");\n      return;\n    }\n\n    \/\/ Dynamic weights by destination (normalize to 100)\n    const baseWeights = { ...WEIGHTS };\n    let weights = { ...baseWeights };\n    if(cfg.weightTweaks){\n      Object.keys(cfg.weightTweaks).forEach(k => weights[k] = (weights[k] || 0) + cfg.weightTweaks[k]);\n      const sum = Object.values(weights).reduce((a,b)=>a+b,0);\n      Object.keys(weights).forEach(k => weights[k] = Math.round(weights[k] * (100 \/ sum)));\n      const diff = 100 - Object.values(weights).reduce((a,b)=>a+b,0);\n      weights.compliance += diff; \/\/ fix rounding\n    }\n\n    const edad = parseInt(data.edad, 10);\n    const antiguedad = parseInt(data.antiguedad, 10);\n    const ingreso = parseFloat(data.ingreso);\n    const ahorros = parseFloat(data.ahorros);\n    const dias = parseInt(data.dias, 10);\n    const costoDia = parseFloat(data.costoDia);\n\n    const positives = [];\n    const risks = [];\n    const todos = [];\n\n    const addGood = (t)=> positives.push(t);\n    const addWarn = (t)=> risks.push(t);\n    const addTodo = (t)=> todos.push(t);\n\n    \/\/ Add destination checklist first\n    cfg.checklist.forEach(item => addTodo(`${cfg.label}: ${item}`));\n\n    \/\/ Preset cost\/day if missing\n    if(!costoDia || costoDia <= 0){\n      const mid = Math.round((cfg.suggestedDailyCostRange[0] + cfg.suggestedDailyCostRange[1]) \/ 2);\n      $(\"costoDia\").value = mid;\n    }\n\n    let penalty = 0;\n\n    \/\/ Budget sanity checks\n    const [minDay, maxDay] = cfg.suggestedDailyCostRange;\n    if(costoDia < (minDay * 0.5)){\n      addWarn(`${cfg.label}: presupuesto diario muy bajo puede verse poco cre\u00edble`);\n      addTodo(\"Ajusta presupuesto a algo realista o explica c\u00f3mo se cubren gastos\");\n      penalty += 6;\n    }\n    if(costoDia > (maxDay * 2.2)){\n      addWarn(`${cfg.label}: presupuesto diario muy alto puede exigir evidencia de fondos`);\n      addTodo(\"Refuerza estados de cuenta\/ingresos si declaras gastos altos\");\n      penalty += 4;\n    }\n\n    \/\/ Compute trip cost & funds ratio\n    const tripCost = Math.max(0, dias * Math.max(0, costoDia));\n    const fundsRatio = tripCost > 0 ? (Math.max(0, ahorros) \/ tripCost) : 0;\n\n    \/\/ ----------------------------\n    \/\/ PROFILE\n    \/\/ ----------------------------\n    const profileParts = [];\n\n    let ageScore = 0.7;\n    if(edad >= 23 && edad <= 55){ ageScore = 1.0; addGood(\"Edad en rango laboral activo\"); }\n    else if(edad < 23){ ageScore = 0.65; addWarn(\"Edad baja: exige prop\u00f3sito\/evidencia fuerte\"); addTodo(\"Refuerza prop\u00f3sito + v\u00ednculos + plan acotado\"); }\n    else { ageScore = 0.75; addWarn(\"Edad mayor: revisan seguro\/salud y sustento\"); addTodo(\"Incluye seguro y plan financiero claro\"); }\n    profileParts.push({ label:\"Edad\", score0to1: ageScore });\n\n    let antScore = 0.55;\n    if(data.laboral === \"empleado_estable\" || data.laboral === \"independiente_estable\"){\n      if(antiguedad >= 24){ antScore = 1.0; addGood(\"Estabilidad laboral (\u2265 24 meses)\"); }\n      else if(antiguedad >= 12){ antScore = 0.85; addGood(\"Antig\u00fcedad laboral razonable (\u2265 12 meses)\"); }\n      else if(antiguedad >= 6){ antScore = 0.7; addWarn(\"Antig\u00fcedad laboral corta\"); addTodo(\"Aporta continuidad: contrato\/boletas\/impuestos\"); }\n      else { antScore = 0.55; addWarn(\"Antig\u00fcedad muy baja\"); addTodo(\"Explica transici\u00f3n y respalda fondos\"); }\n    }else if(data.laboral === \"empleado_temporal\"){\n      antScore = antiguedad >= 12 ? 0.7 : 0.55;\n      addWarn(\"Trabajo por proyecto: revisan continuidad\");\n      addTodo(\"Incluye contratos, impuestos y estados de cuenta\");\n    }else if(data.laboral === \"estudiante\"){\n      antScore = 0.65;\n      addWarn(\"Perfil estudiante: foco en prop\u00f3sito y soporte econ\u00f3mico\");\n      addTodo(\"Incluye matr\u00edcula, certificado alumno regular, sponsor\/ahorros\");\n    }else{\n      antScore = 0.45;\n      addWarn(\"Desempleo: exige mayor evidencia de fondos y retorno\");\n      addTodo(\"Refuerza arraigo + carta de retorno + plan corto\");\n    }\n    profileParts.push({ label:\"Estabilidad laboral\", score0to1: antScore });\n    const profileScore = scoreCategory(profileParts);\n\n    \/\/ ----------------------------\n    \/\/ TIES\n    \/\/ ----------------------------\n    const tiesParts = [];\n    let familyScore = 0.55;\n    if(data.estadoCivil === \"casado\") familyScore += 0.15;\n    if(data.hijos === \"si_mismo_pais\") familyScore += 0.20;\n    if(data.hijos === \"si_otro_pais\") familyScore -= 0.05;\n    familyScore = clamp(familyScore, 0.35, 0.95);\n    if(data.estadoCivil === \"casado\" || data.hijos === \"si_mismo_pais\") addGood(\"Lazos familiares en pa\u00eds de origen\");\n    tiesParts.push({ label:\"Lazos familiares\", score0to1: familyScore });\n\n    let propScore = data.propiedad === \"si\" ? 0.9 : 0.55;\n    if(data.propiedad === \"si\") addGood(\"Arraigo patrimonial \/ vivienda respaldable\");\n    else { addWarn(\"Sin propiedad\/arriendo formal a tu nombre\"); addTodo(\"Si aplica: contrato arriendo, cuentas servicios, etc.\"); }\n    tiesParts.push({ label:\"Arraigo patrimonial\", score0to1: propScore });\n\n    let oblScore = 0.55;\n    if(data.obligaciones === \"fuertes\"){ oblScore = 0.95; addGood(\"Obligaciones fuertes de retorno\"); }\n    if(data.obligaciones === \"medias\"){ oblScore = 0.75; }\n    if(data.obligaciones === \"bajas\"){ oblScore = 0.5; addWarn(\"Pocas obligaciones formales\"); addTodo(\"Refuerza carta laboral\/estudios\/empresa operando\"); }\n    tiesParts.push({ label:\"Obligaciones de retorno\", score0to1: oblScore });\n\n    const tiesScore = scoreCategory(tiesParts);\n\n    \/\/ ----------------------------\n    \/\/ FINANCE\n    \/\/ ----------------------------\n    const financeParts = [];\n\n    let fundsScore = 0.55;\n    if(tripCost === 0){\n      fundsScore = 0.5;\n      addWarn(\"Costo diario 0: puede verse poco cre\u00edble\");\n      addTodo(\"Define presupuesto realista (alojamiento, comidas, transporte)\");\n    }else{\n      if(fundsRatio >= 1.5){ fundsScore = 1.0; addGood(\"Ahorros cubren holgadamente el viaje\"); }\n      else if(fundsRatio >= 1.0){ fundsScore = 0.85; addGood(\"Ahorros cubren el costo estimado\"); }\n      else if(fundsRatio >= 0.7){ fundsScore = 0.7; addWarn(\"Ahorros ajustados para la duraci\u00f3n\"); addTodo(\"Reduce d\u00edas o refuerza fondos\/sponsor\"); }\n      else if(fundsRatio >= 0.5){ fundsScore = 0.55; addWarn(\"Fondos insuficientes vs costo estimado\"); addTodo(\"Ajusta plan o refuerza sponsor y estados de cuenta\"); }\n      else { fundsScore = 0.4; addWarn(\"Fondos muy por debajo del costo estimado\"); addTodo(\"Plan m\u00e1s acotado + evidencia financiera s\u00f3lida\"); }\n    }\n    financeParts.push({ label:\"Fondos vs costo del viaje\", score0to1: clamp(fundsScore, 0.25, 1.0) });\n\n    let docScore = 0.55;\n    if(data.docFinanzas === \"fuerte\"){ docScore = 1.0; addGood(\"Documentaci\u00f3n financiera completa\"); }\n    if(data.docFinanzas === \"medio\"){ docScore = 0.75; addWarn(\"Documentaci\u00f3n financiera parcial\"); addTodo(\"Completa: estados de cuenta, impuestos, boletas, contrato\"); }\n    if(data.docFinanzas === \"bajo\"){ docScore = 0.45; addWarn(\"Poca evidencia financiera\"); addTodo(\"Consigue respaldo bancario\/tributario consistente\"); }\n    financeParts.push({ label:\"Evidencia financiera\", score0to1: docScore });\n\n    let sponsorScore = 0.6;\n    if(data.sponsor === \"no\"){ sponsorScore = 0.7; }\n    if(data.sponsor === \"si_formal\"){ sponsorScore = 0.85; addGood(\"Patrocinio formal (mejor si incluye fondos verificables)\"); }\n    if(data.sponsor === \"si_informal\"){ sponsorScore = 0.55; addWarn(\"Sponsor informal puede generar dudas\"); addTodo(\"Formaliza sponsor: carta, solvencia, relaci\u00f3n, gastos\"); }\n    financeParts.push({ label:\"Patrocinio\", score0to1: sponsorScore });\n\n    let incomeScore = 0.6;\n    const monthlyBudgetNeed = (tripCost \/ Math.max(1, Math.ceil(dias\/30))) || 0;\n    if(!ingreso || ingreso === 0){\n      incomeScore = 0.45;\n      addWarn(\"Ingreso declarado 0\");\n      addTodo(\"Si eres independiente: muestra facturaci\u00f3n\/boletas\/impuestos; si no, sponsor\/ahorros\");\n    }else if(monthlyBudgetNeed > 0){\n      const ratio = ingreso \/ monthlyBudgetNeed;\n      if(ratio >= 2.0) incomeScore = 0.9;\n      else if(ratio >= 1.2) incomeScore = 0.78;\n      else if(ratio >= 0.8){ incomeScore = 0.65; addWarn(\"Ingreso ajustado vs presupuesto declarado\"); }\n      else { incomeScore = 0.55; addWarn(\"Ingreso bajo vs presupuesto declarado\"); addTodo(\"Alinea presupuesto con realidad y evidencia\"); }\n    }else{\n      incomeScore = 0.7;\n    }\n    financeParts.push({ label:\"Ingreso vs presupuesto\", score0to1: clamp(incomeScore, 0.35, 0.95) });\n\n    const financeScore = scoreCategory(financeParts);\n\n    \/\/ ----------------------------\n    \/\/ PLAN\n    \/\/ ----------------------------\n    const planParts = [];\n\n    let motiveScore = 0.6;\n    if(data.motivo === \"turismo_corto\"){ motiveScore = 0.85; addGood(\"Motivo tur\u00edstico acotado\"); }\n    if(data.motivo === \"turismo_largo\"){ motiveScore = 0.6; addWarn(\"Turismo largo: pide m\u00e1s coherencia y fondos\"); addTodo(\"Reduce duraci\u00f3n o refuerza fondos\/itinerario\"); }\n    if(data.motivo === \"estudios_formales\"){ motiveScore = 0.9; addGood(\"Estudios con carta es m\u00e1s defendible\"); addTodo(\"Adjunta aceptaci\u00f3n, pagos, calendario, alojamiento\"); }\n    if(data.motivo === \"trabajo_oferta_formal\"){ motiveScore = 0.9; addGood(\"Trabajo con oferta formal es m\u00e1s s\u00f3lido\"); addTodo(\"Adjunta contrato\/oferta, rol, sueldo, fechas\"); }\n    if(data.motivo === \"trabajo_busqueda\"){ motiveScore = 0.35; addWarn(\"Buscar trabajo sin contrato es un gran foco de riesgo\"); }\n    if(data.motivo === \"visita_familia\"){ motiveScore = 0.65; addWarn(\"Visita familiar: requiere plan y pruebas de relaci\u00f3n\"); addTodo(\"Carta invitaci\u00f3n, estatus del anfitri\u00f3n, direcci\u00f3n, gastos\"); }\n    if(data.motivo === \"medico\"){ motiveScore = 0.75; addWarn(\"M\u00e9dico: exige cartas, costos y seguro\"); addTodo(\"Carta cl\u00ednica, presupuesto, seguro, acompa\u00f1ante\"); }\n    planParts.push({ label:\"Motivo\", score0to1: clamp(motiveScore, 0.25, 1.0) });\n\n    let durationScore = 0.7;\n    if(dias <= 14) durationScore = 0.9;\n    else if(dias <= 30) durationScore = 0.82;\n    else if(dias <= 60){ durationScore = 0.65; addWarn(\"Duraci\u00f3n moderada\/alta: exige m\u00e1s fondos y evidencia\"); }\n    else { durationScore = 0.5; addWarn(\"Duraci\u00f3n muy alta: revisan intenci\u00f3n y solvencia\"); addTodo(\"Acota duraci\u00f3n o refuerza documentaci\u00f3n y fondos\"); }\n    planParts.push({ label:\"Duraci\u00f3n\", score0to1: durationScore });\n\n    let itinScore = 0.55;\n    if(data.itinerario === \"fuerte\"){ itinScore = 0.95; addGood(\"Itinerario\/reservas claros\"); }\n    if(data.itinerario === \"medio\"){ itinScore = 0.72; addWarn(\"Itinerario parcial\"); addTodo(\"Agrega reservas, direcci\u00f3n de estad\u00eda y fechas\"); }\n    if(data.itinerario === \"bajo\"){ itinScore = 0.5; addWarn(\"Sin itinerario definido\"); addTodo(\"Define plan: vuelos, alojamiento, actividades, retorno\"); }\n    planParts.push({ label:\"Itinerario\", score0to1: itinScore });\n\n    let seguroScore = data.seguro === \"si\" ? 0.8 : 0.55;\n    if(data.seguro === \"si\") addGood(\"Seguro considerado\");\n    else { addWarn(\"Sin seguro: puede ser mal visto seg\u00fan destino\/motivo\"); addTodo(\"Incluye seguro de viaje\/salud\"); }\n    planParts.push({ label:\"Seguro\", score0to1: seguroScore });\n\n    let cohScore = 0.55;\n    if(data.coherencia === \"alta\"){ cohScore = 0.95; addGood(\"Coherencia alta\"); }\n    if(data.coherencia === \"media\"){ cohScore = 0.72; addWarn(\"Coherencia media: cuida narrativa y evidencia\"); }\n    if(data.coherencia === \"baja\"){ cohScore = 0.45; addWarn(\"Coherencia baja: aumenta dudas\"); addTodo(\"Alinea motivo, duraci\u00f3n y capacidad financiera\"); }\n    planParts.push({ label:\"Coherencia\", score0to1: cohScore });\n\n    const planScore = scoreCategory(planParts);\n\n    \/\/ ----------------------------\n    \/\/ COMPLIANCE\n    \/\/ ----------------------------\n    const complianceParts = [];\n\n    let penScore = 0.6;\n    if(data.penales === \"limpio\"){ penScore = 1.0; addGood(\"Antecedentes limpios\"); }\n    if(data.penales === \"leve\"){ penScore = 0.55; addWarn(\"Antecedentes leves: puede requerir explicaci\u00f3n\"); addTodo(\"Incluye certificados, resoluci\u00f3n y contexto\"); }\n    if(data.penales === \"grave\"){ penScore = 0.2; addWarn(\"Antecedentes graves: alto riesgo\"); addTodo(\"Asesor\u00eda profesional especializada\"); }\n    complianceParts.push({ label:\"Antecedentes\", score0to1: clamp(penScore, 0.1, 1.0) });\n\n    let travelScore = 0.55;\n    if(data.viajes === \"ninguno\"){ travelScore = 0.6; }\n    if(data.viajes === \"pocos\"){ travelScore = 0.72; addGood(\"Algo de historial de viajes\"); }\n    if(data.viajes === \"varios_buen_historial\"){ travelScore = 0.95; addGood(\"Cumplimiento migratorio positivo\"); }\n    if(data.viajes === \"incumplimientos\"){ travelScore = 0.2; addWarn(\"Incumplimientos migratorios previos: foco cr\u00edtico\"); addTodo(\"Asesor\u00eda para estrategia y documentaci\u00f3n\"); }\n    complianceParts.push({ label:\"Historial migratorio\", score0to1: clamp(travelScore, 0.1, 1.0) });\n\n    let rejScore = 0.75;\n    if(data.rechazo === \"no\"){ rejScore = 0.9; addGood(\"Sin rechazos previos\"); }\n    if(data.rechazo === \"si_hace_tiempo\"){ rejScore = 0.6; addWarn(\"Rechazo anterior: explica cambios\"); addTodo(\"Explica mejoras: trabajo, fondos, arraigo, plan\"); }\n    if(data.rechazo === \"si_reciente\"){ rejScore = 0.45; addWarn(\"Rechazo reciente: puede pesar si no cambi\u00f3 tu situaci\u00f3n\"); addTodo(\"Revisa causal, ajusta plan y evidencia\"); }\n    complianceParts.push({ label:\"Rechazos\", score0to1: rejScore });\n\n    let retScore = data.cartaRetorno === \"si\" ? 0.85 : 0.55;\n    if(data.cartaRetorno === \"si\") addGood(\"Evidencia de retorno (carta\/permiso\/constancia)\");\n    else { addWarn(\"Sin evidencia de retorno\"); addTodo(\"Gestiona carta laboral\/estudios\/empresa con fechas de regreso\"); }\n    complianceParts.push({ label:\"Evidencia de retorno\", score0to1: retScore });\n\n    const complianceScore = scoreCategory(complianceParts);\n\n    \/\/ Destination extra rules\n    const ctx = {\n      dias,\n      motivo: data.motivo,\n      coherencia: data.coherencia,\n      cartaRetorno: data.cartaRetorno,\n      obligaciones: data.obligaciones,\n      itinerario: data.itinerario,\n      seguro: data.seguro,\n      fundsRatio,\n      penalty,\n      addWarn,\n      addTodo\n    };\n    if(cfg.extraRules) cfg.extraRules(ctx);\n    penalty = ctx.penalty;\n\n    \/\/ Weighted final\n    const weighted =\n      profileScore * weights.profile +\n      tiesScore * weights.ties +\n      financeScore * weights.finance +\n      planScore * weights.plan +\n      complianceScore * weights.compliance;\n\n    let finalScore = Math.round(clamp(weighted - penalty, 0, 100));\n\n    \/\/ Level text\n    let level = \"Incierto \/ requiere refuerzo\";\n    let badgeText = \"Necesitas reforzar evidencia\";\n    let dotColor = \"var(--warn)\";\n    if(finalScore >= 80){\n      level = \"Perfil consistente (orientativo)\";\n      badgeText = \"Bien armado: cuida consistencia y evidencia\";\n      dotColor = \"var(--good)\";\n    }else if(finalScore >= 65){\n      level = \"Buen punto de partida\";\n      badgeText = \"Hay base, pero mejora puntos d\u00e9biles\";\n      dotColor = \"var(--accent)\";\n    }else if(finalScore >= 50){\n      level = \"Riesgo medio (orientativo)\";\n      badgeText = \"Exige documentaci\u00f3n y plan m\u00e1s acotado\";\n      dotColor = \"var(--warn)\";\n    }else{\n      level = \"Riesgo alto (orientativo)\";\n      badgeText = \"Replantea narrativa\/plan o busca asesor\u00eda\";\n      dotColor = \"var(--bad)\";\n    }\n\n    \/\/ Render score\n    $(\"scoreNum\").textContent = finalScore;\n    $(\"scoreMini\").textContent = finalScore + \"\/100\";\n    $(\"scoreLevel\").textContent = `${cfg.label} \u2022 ${level}`;\n    $(\"badgeText\").textContent = badgeText;\n    $(\"badgeDot\").style.background = dotColor;\n    $(\"scoreBar\").style.width = finalScore + \"%\";\n\n    \/\/ Tags\n    const uniq = (arr)=> Array.from(new Set(arr));\n    $(\"tags\").innerHTML = \"\";\n    uniq(positives).slice(0, 12).forEach(t=>{\n      const span = document.createElement(\"span\");\n      span.className = \"tag good\";\n      span.textContent = \"\u2714 \" + t;\n      $(\"tags\").appendChild(span);\n    });\n    uniq(risks).slice(0, 10).forEach(t=>{\n      const span = document.createElement(\"span\");\n      span.className = \"tag warn\";\n      span.textContent = \"\u26a0 \" + t;\n      $(\"tags\").appendChild(span);\n    });\n\n    \/\/ Breakdown\n    $(\"breakdown\").innerHTML = \"\";\n    const catLines = [\n      { name:\"Cumplimiento migratorio\", s: complianceScore, w: weights.compliance },\n      { name:\"Plan y coherencia\", s: planScore, w: weights.plan },\n      { name:\"Finanzas\", s: financeScore, w: weights.finance },\n      { name:\"Arraigo \/ lazos\", s: tiesScore, w: weights.ties },\n      { name:\"Perfil base\", s: profileScore, w: weights.profile }\n    ];\n    catLines.forEach(c=>{\n      const points = Math.round(c.s * c.w);\n      const li = document.createElement(\"li\");\n      li.textContent = `${c.name}: ${points}\/${c.w}`;\n      $(\"breakdown\").appendChild(li);\n    });\n\n    \/\/ Todo list\n    $(\"todo\").innerHTML = \"\";\n    const todoUniq = uniq(todos);\n    if(todoUniq.length === 0){\n      const li = document.createElement(\"li\");\n      li.textContent = \"No se detectaron acciones cr\u00edticas. Aun as\u00ed, revisa consistencia y documentaci\u00f3n.\";\n      $(\"todo\").appendChild(li);\n    }else{\n      todoUniq.slice(0, 12).forEach(t=>{\n        const li = document.createElement(\"li\");\n        li.textContent = t;\n        $(\"todo\").appendChild(li);\n      });\n    }\n\n    \/\/ Debug\n    const debug = {\n      destination: cfg.label,\n      score: finalScore,\n      penalty,\n      weights,\n      categories: {\n        compliance: { score0to1: complianceScore, points: Math.round(complianceScore * weights.compliance) },\n        plan: { score0to1: planScore, points: Math.round(planScore * weights.plan) },\n        finance: { score0to1: financeScore, points: Math.round(financeScore * weights.finance), tripCost, fundsRatio },\n        ties: { score0to1: tiesScore, points: Math.round(tiesScore * weights.ties) },\n        profile: { score0to1: profileScore, points: Math.round(profileScore * weights.profile) }\n      },\n      inputs: data\n    };\n    $(\"debug\").textContent = JSON.stringify(debug, null, 2);\n\n    window.scrollTo({ top: 0, behavior: \"smooth\" });\n  }\n\n  function resetAll(){\n    if(!confirm(\"\u00bfResetear todo el formulario y borrar autosave?\")) return;\n    try{ localStorage.removeItem(LS_KEY); }catch(e){}\n    form.reset();\n    $(\"tags\").innerHTML = \"\";\n    $(\"breakdown\").innerHTML = \"\";\n    $(\"todo\").innerHTML = \"\";\n    $(\"debug\").textContent = \"\u2014\";\n    $(\"scoreNum\").textContent = \"\u2014\";\n    $(\"scoreMini\").textContent = \"\u2014\";\n    $(\"scoreLevel\").textContent = \"Completa y calcula\";\n    $(\"badgeText\").textContent = \"Sin evaluaci\u00f3n\";\n    $(\"badgeDot\").style.background = \"var(--accent)\";\n    $(\"scoreBar\").style.width = \"0%\";\n    window.scrollTo({ top: 0, behavior: \"smooth\" });\n  }\n\n  function exportJSON(){\n    const payload = {\n      exported_at: new Date().toISOString(),\n      data: snapshot(),\n      last_score: $(\"scoreMini\").textContent\n    };\n    const blob = new Blob([JSON.stringify(payload, null, 2)], { type: \"application\/json\" });\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement(\"a\");\n    a.href = url;\n    a.download = \"visa-profile-export.json\";\n    document.body.appendChild(a);\n    a.click();\n    a.remove();\n    URL.revokeObjectURL(url);\n  }\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Visa Profile Check \u2022 USA \/ Jap\u00f3n (NO oficial) Visa Profile Check \u2022 USA \/ Jap\u00f3n (NO oficial) Etapa 1: una \u201cmini-app\u201d en 1 archivo. Ordena tu caso y detecta qu\u00e9 evidencia reforzar (arraigo, plan, solvencia, historial). No es asesor\u00eda legal ni probabilidad real. Deploy: 1 HTML \u2022 Sin librer\u00edas \u2022 Autosave Formulario Completa tu&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"pagelayer_contact_templates":[],"_pagelayer_content":"","footnotes":""},"class_list":["post-11","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/vordai.com\/wp\/wp-json\/wp\/v2\/pages\/11","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vordai.com\/wp\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vordai.com\/wp\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/vordai.com\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vordai.com\/wp\/wp-json\/wp\/v2\/comments?post=11"}],"version-history":[{"count":1,"href":"https:\/\/vordai.com\/wp\/wp-json\/wp\/v2\/pages\/11\/revisions"}],"predecessor-version":[{"id":12,"href":"https:\/\/vordai.com\/wp\/wp-json\/wp\/v2\/pages\/11\/revisions\/12"}],"wp:attachment":[{"href":"https:\/\/vordai.com\/wp\/wp-json\/wp\/v2\/media?parent=11"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}