{"id":1176,"date":"2025-10-30T13:06:55","date_gmt":"2025-10-30T13:06:55","guid":{"rendered":"https:\/\/zoeflexsolutions.com\/?page_id=1176"},"modified":"2025-12-18T19:20:41","modified_gmt":"2025-12-18T19:20:41","slug":"pesquisa","status":"publish","type":"page","link":"https:\/\/zoeflexsolutions.com\/pt\/pesquisa\/","title":{"rendered":"Pesquisa"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"1176\" class=\"elementor elementor-1176\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e67f20f e-con-full e-flex e-con e-parent\" data-id=\"e67f20f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b99e784 elementor-widget elementor-widget-html\" data-id=\"b99e784\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"pt-BR\">\r\n\r\n<head>\r\n  <meta charset=\"UTF-8\" \/>\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\r\n  <title>Console de Pesquisa \u2013 PF \/ PJ<\/title>\r\n\r\n  <style>\r\n    @import url(\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&family=Poppins:wght@600;700;800&display=swap\");\r\n    @import url(\"https:\/\/api.fontshare.com\/v2\/css?f[]=satoshi@400,500,600,700&display=swap\");\r\n  <\/style>\r\n\r\n  <style>\r\n    \/* ===== RESET E BASE ===== *\/\r\n    * {\r\n      margin: 0;\r\n      padding: 0;\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    html,\r\n    body {\r\n      font-family: \"Inter\", sans-serif;\r\n      color: #fff;\r\n      margin: 0;\r\n      padding: 0;\r\n      background: #000;\r\n      width: 100%;\r\n      min-height: 100vh;\r\n    }\r\n\r\n    body {\r\n      overflow-x: hidden;\r\n      position: relative;\r\n      display: flex;\r\n      flex-direction: column;\r\n    }\r\n\r\n    \/* ===== BACKGROUND & DECORATION ===== *\/\r\n    body::before {\r\n      content: \"\";\r\n      position: fixed;\r\n      top: 0;\r\n      left: 0;\r\n      width: 100%;\r\n      height: 100vh;\r\n      background: linear-gradient(135deg, #000000 0%, #0a0e27 50%, #001a3f 100%);\r\n      z-index: -2;\r\n      pointer-events: none;\r\n      animation: gradientShift 15s ease-in-out infinite;\r\n    }\r\n\r\n    body::after {\r\n      content: \"\";\r\n      position: fixed;\r\n      top: -100px;\r\n      left: -100px;\r\n      width: 400px;\r\n      height: 400px;\r\n      background: radial-gradient(circle, rgba(0, 240, 255, 0.08) 0%, transparent 70%);\r\n      border-radius: 50%;\r\n      z-index: -1;\r\n      pointer-events: none;\r\n      filter: blur(40px);\r\n      animation: floatOrbe 8s ease-in-out infinite;\r\n    }\r\n\r\n    main::before {\r\n      content: \"\";\r\n      position: fixed;\r\n      bottom: -150px;\r\n      right: -150px;\r\n      width: 500px;\r\n      height: 500px;\r\n      background: radial-gradient(circle, rgba(0, 240, 255, 0.06) 0%, transparent 70%);\r\n      border-radius: 50%;\r\n      z-index: -1;\r\n      pointer-events: none;\r\n      filter: blur(50px);\r\n      animation: floatOrbe 10s ease-in-out infinite reverse;\r\n    }\r\n\r\n    \/* ===== ANIMATIONS ===== *\/\r\n    @keyframes gradientShift {\r\n\r\n      0%,\r\n      100% {\r\n        background: linear-gradient(135deg, #000000 0%, #0a0e27 50%, #001a3f 100%);\r\n      }\r\n\r\n      50% {\r\n        background: linear-gradient(135deg, #000000 0%, #0d1a3f 50%, #001a4f 100%);\r\n      }\r\n    }\r\n\r\n    @keyframes floatOrbe {\r\n\r\n      0%,\r\n      100% {\r\n        transform: translate(0, 0);\r\n      }\r\n\r\n      50% {\r\n        transform: translate(30px, -30px);\r\n      }\r\n    }\r\n\r\n    @keyframes slideUp {\r\n      from {\r\n        opacity: 0;\r\n        transform: translateY(40px) scale(0.95);\r\n      }\r\n\r\n      to {\r\n        opacity: 1;\r\n        transform: translateY(0) scale(1);\r\n      }\r\n    }\r\n\r\n    @keyframes spinnerRotate {\r\n      from {\r\n        transform: rotate(0deg);\r\n      }\r\n\r\n      to {\r\n        transform: rotate(360deg);\r\n      }\r\n    }\r\n\r\n    \/* ===== HEADER ===== *\/\r\n    header {\r\n      position: relative;\r\n      z-index: 10;\r\n      padding: 40px 20px 20px;\r\n      text-align: center;\r\n      animation: slideUp 0.8s ease-out forwards;\r\n    }\r\n\r\n    header h1 {\r\n      font-family: \"Poppins\", sans-serif;\r\n      font-size: 2.2em;\r\n      font-weight: 800;\r\n      margin-bottom: 12px;\r\n      background: linear-gradient(135deg, #fff 0%, #00f0ff 100%);\r\n      -webkit-background-clip: text;\r\n      -webkit-text-fill-color: transparent;\r\n      background-clip: text;\r\n      letter-spacing: -0.5px;\r\n      text-shadow: 0 0 30px rgba(0, 240, 255, 0.2);\r\n    }\r\n\r\n    header p {\r\n      font-size: 0.95em;\r\n      color: #aaa;\r\n      margin: 0;\r\n      line-height: 1.5;\r\n    }\r\n\r\n    \/* ===== MAIN ===== *\/\r\n    main {\r\n      position: relative;\r\n      z-index: 10;\r\n      flex: 1;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      padding: 20px;\r\n    }\r\n\r\n    .container {\r\n      width: 100%;\r\n      max-width: 920px;\r\n      animation: slideUp 0.8s ease-out forwards;\r\n      animation-delay: 0.2s;\r\n      opacity: 0;\r\n    }\r\n\r\n    \/* ===== CARD ===== *\/\r\n    .card {\r\n      background: rgba(0, 0, 0, 0.6);\r\n      backdrop-filter: blur(16px);\r\n      border-radius: 20px;\r\n      padding: 32px;\r\n      border: 1px solid rgba(0, 240, 255, 0.15);\r\n      box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), inset 0 1px 1px rgba(255, 255, 255, 0.05);\r\n      position: relative;\r\n      overflow: hidden;\r\n    }\r\n\r\n    .card::before {\r\n      content: \"\";\r\n      position: absolute;\r\n      top: 0;\r\n      left: 0;\r\n      right: 0;\r\n      height: 1px;\r\n      background: linear-gradient(90deg, transparent, rgba(0, 240, 255, 0.3), transparent);\r\n      pointer-events: none;\r\n    }\r\n\r\n    \/* ===== FORM LAYOUT ===== *\/\r\n    form {\r\n      position: relative;\r\n      z-index: 1;\r\n    }\r\n\r\n    .row {\r\n      display: flex;\r\n      gap: 16px;\r\n      flex-wrap: wrap;\r\n      align-items: center;\r\n      margin-bottom: 20px;\r\n    }\r\n\r\n    .row:last-of-type {\r\n      margin-bottom: 0;\r\n    }\r\n\r\n    \/* ===== TOGGLE PF\/PJ ===== *\/\r\n    .toggle {\r\n      display: inline-flex;\r\n      background: rgba(255, 255, 255, 0.05);\r\n      border: 1px solid rgba(0, 240, 255, 0.2);\r\n      border-radius: 12px;\r\n      padding: 4px;\r\n      gap: 4px;\r\n    }\r\n\r\n    .toggle input {\r\n      display: none;\r\n    }\r\n\r\n    .toggle label {\r\n      padding: 10px 16px;\r\n      border-radius: 8px;\r\n      cursor: pointer;\r\n      color: #aaa;\r\n      user-select: none;\r\n      font-weight: 600;\r\n      font-size: 0.9em;\r\n      transition: all 0.2s ease;\r\n      text-transform: uppercase;\r\n      letter-spacing: 0.4px;\r\n    }\r\n\r\n    .toggle input:checked+label {\r\n      background: linear-gradient(135deg, #00f0ff 0%, #0099cc 100%);\r\n      color: #000;\r\n      box-shadow: 0 0 16px rgba(0, 240, 255, 0.3);\r\n    }\r\n\r\n    \/* ===== INPUT FIELDS ===== *\/\r\n    .field {\r\n      position: relative;\r\n      flex: 1 1 100%;\r\n      \/* Ocupa linha inteira no layout novo *\/\r\n      width: 100%;\r\n    }\r\n\r\n    .field input[type=\"text\"] {\r\n      width: 100%;\r\n      padding: 14px 48px 14px 16px;\r\n      border-radius: 12px;\r\n      border: 1px solid rgba(0, 240, 255, 0.2);\r\n      background: rgba(255, 255, 255, 0.05);\r\n      color: #fff;\r\n      font-size: 0.95em;\r\n      font-family: \"Inter\", sans-serif;\r\n      outline: none;\r\n      transition: all 0.3s ease;\r\n    }\r\n\r\n    .field input::placeholder {\r\n      color: rgba(255, 255, 255, 0.3);\r\n    }\r\n\r\n    .field input:focus {\r\n      border-color: rgba(0, 240, 255, 0.6);\r\n      background: rgba(255, 255, 255, 0.08);\r\n      box-shadow: 0 0 16px rgba(0, 240, 255, 0.3), inset 0 0 8px rgba(0, 240, 255, 0.1);\r\n    }\r\n\r\n    .clear-btn {\r\n      position: absolute;\r\n      right: 8px;\r\n      top: 50%;\r\n      transform: translateY(-50%);\r\n      padding: 8px 10px;\r\n      border-radius: 8px;\r\n      border: 1px solid rgba(0, 240, 255, 0.2);\r\n      background: rgba(255, 255, 255, 0.05);\r\n      color: #00f0ff;\r\n      cursor: pointer;\r\n      font-weight: 700;\r\n      transition: all 0.2s ease;\r\n    }\r\n\r\n    .clear-btn:hover {\r\n      background: rgba(0, 240, 255, 0.1);\r\n      box-shadow: 0 0 8px rgba(0, 240, 255, 0.2);\r\n    }\r\n\r\n    \/* ===== BUTTONS ===== *\/\r\n    .actions {\r\n      display: flex;\r\n      gap: 12px;\r\n      align-items: center;\r\n      justify-content: flex-end;\r\n      \/* Bot\u00f5es \u00e0 direita *\/\r\n      width: 100%;\r\n    }\r\n\r\n    .btn {\r\n      appearance: none;\r\n      border: none;\r\n      cursor: pointer;\r\n      padding: 12px 24px;\r\n      border-radius: 10px;\r\n      font-weight: 700;\r\n      font-size: 0.9em;\r\n      font-family: \"Poppins\", sans-serif;\r\n      transition: all 0.3s ease;\r\n      text-transform: uppercase;\r\n      letter-spacing: 0.4px;\r\n      position: relative;\r\n      overflow: hidden;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      gap: 6px;\r\n    }\r\n\r\n    .btn:active {\r\n      transform: scale(0.97);\r\n    }\r\n\r\n    .btn-primary {\r\n      background: linear-gradient(135deg, #00f0ff 0%, #0099cc 100%);\r\n      color: #000;\r\n      box-shadow: 0 8px 20px rgba(0, 240, 255, 0.3);\r\n    }\r\n\r\n    .btn-primary:hover:not(:disabled) {\r\n      box-shadow: 0 12px 30px rgba(0, 240, 255, 0.4);\r\n      transform: translateY(-2px);\r\n    }\r\n\r\n    .btn-primary[disabled] {\r\n      opacity: 0.7;\r\n      cursor: not-allowed;\r\n    }\r\n\r\n    .btn-danger {\r\n      background: rgba(209, 0, 0, 0.15);\r\n      color: #ff6b6b;\r\n      border: 1px solid rgba(209, 0, 0, 0.3);\r\n      box-shadow: 0 0 12px rgba(209, 0, 0, 0.2);\r\n    }\r\n\r\n    .btn-danger:hover {\r\n      background: rgba(209, 0, 0, 0.25);\r\n      box-shadow: 0 0 16px rgba(209, 0, 0, 0.3);\r\n    }\r\n\r\n    \/* ===== STATUS & RESULTS ===== *\/\r\n    .status {\r\n      margin-top: 20px;\r\n      color: #aaa;\r\n      font-size: 0.9em;\r\n      display: flex;\r\n      gap: 10px;\r\n      align-items: center;\r\n      min-height: 24px;\r\n      padding: 12px 16px;\r\n      background: rgba(0, 240, 255, 0.05);\r\n      border: 1px solid rgba(0, 240, 255, 0.15);\r\n      border-radius: 10px;\r\n      animation: slideUp 0.4s ease-out;\r\n    }\r\n\r\n    .pill {\r\n      display: inline-flex;\r\n      align-items: center;\r\n      padding: 6px 12px;\r\n      border-radius: 20px;\r\n      font-weight: 700;\r\n      font-size: 0.75em;\r\n      border: 1px solid rgba(0, 240, 255, 0.3);\r\n      background: rgba(0, 240, 255, 0.1);\r\n      color: #00f0ff;\r\n      text-transform: uppercase;\r\n      letter-spacing: 0.3px;\r\n    }\r\n\r\n    .pill.ok {\r\n      background: rgba(0, 240, 100, 0.15);\r\n      color: #00f064;\r\n      border-color: rgba(0, 240, 100, 0.3);\r\n    }\r\n\r\n    .pill.err {\r\n      background: rgba(209, 0, 0, 0.15);\r\n      color: #ff6b6b;\r\n      border-color: rgba(209, 0, 0, 0.3);\r\n    }\r\n\r\n    .pill.pend {\r\n      background: rgba(0, 150, 255, 0.15);\r\n      color: #00f0ff;\r\n      border-color: rgba(0, 150, 255, 0.3);\r\n    }\r\n\r\n    .result-card {\r\n      margin-top: 24px;\r\n      background: rgba(0, 0, 0, 0.4);\r\n      border: 1px solid rgba(0, 240, 255, 0.2);\r\n      border-radius: 16px;\r\n      padding: 20px;\r\n      overflow: auto;\r\n      max-height: 420px;\r\n      animation: slideUp 0.4s ease-out;\r\n    }\r\n\r\n    .result-header {\r\n      display: flex;\r\n      justify-content: space-between;\r\n      align-items: center;\r\n      margin-bottom: 16px;\r\n      padding-bottom: 12px;\r\n      border-bottom: 1px solid rgba(0, 240, 255, 0.15);\r\n    }\r\n\r\n    .result-header strong {\r\n      font-family: \"Poppins\", sans-serif;\r\n      font-size: 1em;\r\n      color: #fff;\r\n    }\r\n\r\n    \/* ===== PEOPLE\/COMPANY CARDS ===== *\/\r\n    #people-container {\r\n      display: flex;\r\n      flex-direction: column;\r\n      gap: 16px;\r\n    }\r\n\r\n    .person-card {\r\n      background: rgba(0, 0, 0, 0.35);\r\n      border: 1px solid rgba(0, 240, 255, 0.15);\r\n      border-radius: 12px;\r\n      padding: 14px 16px;\r\n      display: flex;\r\n      flex-direction: column;\r\n      gap: 8px;\r\n    }\r\n\r\n    .person-header {\r\n      display: flex;\r\n      justify-content: space-between;\r\n      align-items: baseline;\r\n      gap: 8px;\r\n    }\r\n\r\n    .person-name {\r\n      font-family: \"Poppins\", sans-serif;\r\n      font-size: 0.95em;\r\n      font-weight: 600;\r\n      color: #fff;\r\n    }\r\n\r\n    .person-meta {\r\n      font-size: 0.8em;\r\n      color: #aaa;\r\n    }\r\n\r\n    .person-section-title {\r\n      font-size: 0.8em;\r\n      font-weight: 600;\r\n      text-transform: uppercase;\r\n      letter-spacing: 0.4px;\r\n      color: #00f0ff;\r\n      margin-top: 6px;\r\n    }\r\n\r\n    .person-list {\r\n      margin: 4px 0 0;\r\n      padding-left: 18px;\r\n      font-size: 0.8em;\r\n      color: #ddd;\r\n    }\r\n\r\n    .person-list li {\r\n      margin-bottom: 2px;\r\n    }\r\n\r\n    .person-link {\r\n      margin-top: 6px;\r\n      font-size: 0.8em;\r\n    }\r\n\r\n    .person-link a {\r\n      color: #00f0ff;\r\n      text-decoration: none;\r\n    }\r\n\r\n    .person-link a:hover {\r\n      text-decoration: underline;\r\n    }\r\n\r\n    .spinner {\r\n      width: 16px;\r\n      height: 16px;\r\n      border-radius: 50%;\r\n      border: 2px solid rgba(0, 240, 255, 0.2);\r\n      border-top-color: #00f0ff;\r\n      animation: spinnerRotate 0.8s linear infinite;\r\n      display: inline-block;\r\n    }\r\n\r\n    \/* SCROLLBAR *\/\r\n    .result-card::-webkit-scrollbar {\r\n      width: 8px;\r\n    }\r\n\r\n    .result-card::-webkit-scrollbar-track {\r\n      background: rgba(0, 240, 255, 0.05);\r\n      border-radius: 4px;\r\n    }\r\n\r\n    .result-card::-webkit-scrollbar-thumb {\r\n      background: rgba(0, 240, 255, 0.3);\r\n      border-radius: 4px;\r\n    }\r\n\r\n    .result-card::-webkit-scrollbar-thumb:hover {\r\n      background: rgba(0, 240, 255, 0.5);\r\n    }\r\n\r\n    \/* RESPONSIVE *\/\r\n    @media (max-width: 768px) {\r\n      .actions {\r\n        justify-content: stretch;\r\n      }\r\n\r\n      .btn {\r\n        flex: 1;\r\n      }\r\n    }\r\n  <\/style>\r\n<\/head>\r\n\r\n<body>\r\n  <header>\r\n    <h1>Pesquisa de Pessoa F\u00edsica e Empresa<\/h1>\r\n    <p>Digite o nome, escolha o tipo e clique em Pesquisar.<\/p>\r\n  <\/header>\r\n\r\n  <main>\r\n    <div class=\"container\">\r\n      <div class=\"card\">\r\n        <form id=\"form-pesquisa\" autocomplete=\"off\" novalidate action=\"\">\r\n\r\n          <div class=\"row\">\r\n            <div class=\"toggle\" role=\"tablist\" aria-label=\"Tipo de pessoa\">\r\n              <input type=\"radio\" id=\"opt-pf\" name=\"option\" value=\"pf\" checked \/>\r\n              <label id=\"tab-pf\" role=\"tab\" for=\"opt-pf\">Pessoa F\u00edsica<\/label>\r\n\r\n              <input type=\"radio\" id=\"opt-pj\" name=\"option\" value=\"pj\" \/>\r\n              <label id=\"tab-pj\" role=\"tab\" for=\"opt-pj\">Empresa<\/label>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"row\">\r\n            <div class=\"field\">\r\n              <input id=\"nome\" type=\"text\" placeholder=\"Digite um nome ou raz\u00e3o social...\" required maxlength=\"180\" \/>\r\n              <button type=\"button\" class=\"clear-btn\" id=\"btn-clear-name\" aria-label=\"Limpar\">\u2715<\/button>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"row\" id=\"row-localizacao\">\r\n            <div class=\"field\">\r\n              <input id=\"location\" type=\"text\" placeholder=\"Orlando, FL or Orlando\" maxlength=\"100\" \/>\r\n              <button type=\"button\" class=\"clear-btn\" id=\"btn-clear-loc\" aria-label=\"Limpar\">\u2715<\/button>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"row\">\r\n            <div class=\"actions\">\r\n              <button class=\"btn btn-primary\" type=\"submit\" id=\"btn-enviar\">Pesquisar<\/button>\r\n              <button class=\"btn btn-danger\" type=\"button\" id=\"btn-cancel\" style=\"display:none\">Cancelar<\/button>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div id=\"status\" class=\"status\" aria-live=\"polite\"><\/div>\r\n        <input type=\"hidden\" name=\"trp-form-language\" value=\"pt\"\/><\/form>\r\n\r\n        <div id=\"resultado\" class=\"result-card\" hidden>\r\n          <div class=\"result-header\">\r\n            <strong>Resultado da Pesquisa<\/strong>\r\n            <span id=\"badge\" class=\"pill pend\">Aguardando...<\/span>\r\n          <\/div>\r\n          <div id=\"people-container\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/main>\r\n\r\n  <script>\r\n    (function () {\r\n      const BASE_URL = 'https:\/\/zoeflexsolutions.com';\r\n      const SEARCH_ENDPOINT = BASE_URL + '\/wp-json\/custom\/v1\/search';\r\n      const RESULT_ENDPOINT = BASE_URL + '\/wp-json\/custom\/v1\/result';\r\n\r\n      const form = document.getElementById('form-pesquisa');\r\n      const nome = document.getElementById('nome');\r\n      const localizacaoInput = document.getElementById('location');\r\n      const rowLocalizacao = document.getElementById('row-localizacao');\r\n\r\n      const btnEnviar = document.getElementById('btn-enviar');\r\n      const btnCancel = document.getElementById('btn-cancel');\r\n      const btnClearName = document.getElementById('btn-clear-name');\r\n      const btnClearLoc = document.getElementById('btn-clear-loc');\r\n\r\n      const statusEl = document.getElementById('status');\r\n      const resultado = document.getElementById('resultado');\r\n      const badge = document.getElementById('badge');\r\n      const peopleContainer = document.getElementById('people-container');\r\n\r\n      \/\/ Radios\r\n      const radioPf = document.getElementById('opt-pf');\r\n      const radioPj = document.getElementById('opt-pj');\r\n\r\n      let pollingAbort = null;\r\n\r\n      function updateFormVisibility() {\r\n        const isPf = radioPf.checked;\r\n        if (isPf) {\r\n          rowLocalizacao.style.display = 'flex';\r\n          nome.placeholder = \"Jane Doe\";\r\n        } else {\r\n          rowLocalizacao.style.display = 'none';\r\n          nome.placeholder = \"Enterprise LLC\";\r\n          \/\/ Limpa o valor para n\u00e3o enviar lixo se mudar pra PJ\r\n          localizacaoInput.value = '';\r\n        }\r\n      }\r\n\r\n      \/\/ Inicializa visibilidade\r\n      updateFormVisibility();\r\n\r\n      \/\/ Listeners de troca de tipo\r\n      radioPf.addEventListener('change', updateFormVisibility);\r\n      radioPj.addEventListener('change', updateFormVisibility);\r\n\r\n      function setStatus(text, type = 'info') {\r\n        const icon = type === 'loading' ? '<span class=\"spinner\" aria-hidden=\"true\"><\/span>' :\r\n          type === 'ok' ? '\u2705' :\r\n            type === 'err' ? '\u26a0\ufe0f' : '\u2139\ufe0f';\r\n        statusEl.innerHTML = `<span>${icon} <span>${text}<\/span><\/span>`;\r\n      }\r\n\r\n      function setBadge(status) {\r\n        badge.className = 'pill';\r\n        if (status === 'done') { badge.classList.add('ok'); badge.textContent = 'Conclu\u00eddo'; }\r\n        else if (status === 'error') { badge.classList.add('err'); badge.textContent = 'Erro'; }\r\n        else if (status === 'pending') { badge.classList.add('pend'); badge.textContent = 'Aguardando...'; }\r\n        else { badge.textContent = '\u2014'; }\r\n      }\r\n\r\n      function renderPeople(data) {\r\n        peopleContainer.innerHTML = '';\r\n        resultado.hidden = false;\r\n\r\n        if (!data || (Array.isArray(data) && data.length === 0)) {\r\n          peopleContainer.innerHTML = '<p style=\"font-size:0.9em;color:#ccc;text-align:center;padding:20px;\">Nenhum resultado encontrado.<\/p>';\r\n          return;\r\n        }\r\n\r\n        const listaPrincipal = Array.isArray(data) ? data : [];\r\n\r\n        listaPrincipal.forEach(item => {\r\n\r\n          \/\/ ===================================================\r\n          \/\/ CASO 1: EMPRESA (Verifica se tem 'dados_empresa')\r\n          \/\/ ===================================================\r\n          if (item.dados_empresa) {\r\n            const emp = item.dados_empresa || {};\r\n            const oficiais = item.oficiais_nomes || [];\r\n            const meta = item.metadata || {};\r\n\r\n            const card = document.createElement('div');\r\n            card.className = 'person-card';\r\n\r\n            \/\/ Vari\u00e1veis seguras\r\n            const nome = emp.nome || 'Nome desconhecido';\r\n            const status = emp.status || 'Unknown';\r\n            const registro = emp.numero_registro || '-';\r\n            const juris = emp.jurisdicao || '-';\r\n            const tipo = emp.tipo_empresa || '-';\r\n            const dataInc = emp.data_incorporacao || '-';\r\n            const endereco = emp.endereco_formatado || null;\r\n\r\n            let html = `\r\n              <div class=\"person-header\">\r\n                  <div class=\"person-name\">${nome}<\/div>\r\n                  <div class=\"pill ${status === 'Active' ? 'ok' : 'pend'}\" style=\"font-size:0.75em\">${status}<\/div>\r\n              <\/div>\r\n              <div style=\"margin-top:12px; display:grid; grid-template-columns: 1fr 1fr; gap:10px; font-size:0.85em; color:#ddd;\">\r\n                  <div><strong style=\"color:#00f0ff;\">Registro:<\/strong> ${registro}<\/div>\r\n                  <div><strong style=\"color:#00f0ff;\">Jurisdi\u00e7\u00e3o:<\/strong> ${juris}<\/div>\r\n                  <div><strong style=\"color:#00f0ff;\">Tipo:<\/strong> ${tipo}<\/div>\r\n                  <div><strong style=\"color:#00f0ff;\">Inc:<\/strong> ${dataInc}<\/div>\r\n              <\/div>\r\n              ${endereco ? `<div style=\"margin-top:12px; font-size:0.85em; color:#ddd; border-top:1px solid rgba(255,255,255,0.1); padding-top:8px;\"><strong style=\"color:#00f0ff;\">Endere\u00e7o:<\/strong> ${endereco}<\/div>` : ''}\r\n              ${oficiais.length > 0 ? `<div style=\"margin-top:12px; border-top:1px solid rgba(255,255,255,0.1); padding-top:8px;\"><div class=\"person-section-title\" style=\"margin-bottom:6px;\">Oficiais<\/div><ul class=\"person-list\">${oficiais.map(o => `<li>${o}<\/li>`).join('')}<\/ul><\/div>` : ''}\r\n              <div style=\"margin-top:10px; font-size:0.7em; color:#666; text-align:right;\">Busca: ${meta.termo_pesquisado || '-'}<\/div>\r\n            `;\r\n            card.innerHTML = html;\r\n            peopleContainer.appendChild(card);\r\n            return; \/\/ Passa para o pr\u00f3ximo item do loop principal\r\n          }\r\n\r\n          \/\/ ===================================================\r\n          \/\/ CASO 2: PESSOA F\u00cdSICA (Procura pelo array interno 'dados')\r\n          \/\/ ===================================================\r\n          if (item.dados && Array.isArray(item.dados)) {\r\n\r\n            \/\/ Aqui iteramos sobre as pessoas encontradas dentro do grupo\r\n            item.dados.forEach(pessoa => {\r\n              const card = document.createElement('div');\r\n              card.className = 'person-card';\r\n\r\n              \/\/ Mapeamento dos campos do seu JSON de PF\r\n              const nome = pessoa.name || 'Nome desconhecido';\r\n              const idade = pessoa.age ? `${pessoa.age} anos` : '';\r\n              const local = pessoa.location || '';\r\n              const enderecoAtual = pessoa.current_address || null;\r\n\r\n              \/\/ Arrays internos (aka, phones, past_addresses)\r\n              const telefones = Array.isArray(pessoa.phones) ? pessoa.phones : [];\r\n              const aka = Array.isArray(pessoa.aka) ? pessoa.aka : [];\r\n              const enderecosAntigos = Array.isArray(pessoa.past_addresses) ? pessoa.past_addresses : [];\r\n              const parentes = Array.isArray(pessoa.relatives) ? pessoa.relatives : [];\r\n\r\n              let htmlPF = `\r\n                  <div class=\"person-header\">\r\n                      <div class=\"person-name\">${nome}<\/div>\r\n                      <div class=\"person-meta\">${idade} ${idade && local ? '\u00b7' : ''} ${local}<\/div>\r\n                  <\/div>\r\n                  \r\n                  ${enderecoAtual ? `<div style=\"margin-top:12px; font-size:0.85em; color:#fff; border-top:1px solid rgba(255,255,255,0.1); padding-top:8px;\"><strong style=\"color:#00f0ff\">Endere\u00e7o Atual:<\/strong> ${enderecoAtual}<\/div>` : ''}\r\n\r\n                  ${telefones.length ? `\r\n                    <div style=\"margin-top:12px;\">\r\n                      <div class=\"person-section-title\">Telefones<\/div>\r\n                      <ul class=\"person-list\">\r\n                        ${telefones.map(p => {\r\n                \/\/ O JSON mostra {number: \"...\", type: \"...\"}\r\n                const num = p.number || p;\r\n                const tipo = p.type ? ` <span style=\"color:#777; font-size:0.85em\">(${p.type})<\/span>` : '';\r\n                return `<li>${num}${tipo}<\/li>`;\r\n              }).join('')}\r\n                      <\/ul>\r\n                    <\/div>` : ''}\r\n\r\n                  ${aka.length ? `\r\n                    <div style=\"margin-top:12px;\">\r\n                      <div class=\"person-section-title\">Conhecido como<\/div>\r\n                      <ul class=\"person-list\">${aka.slice(0, 5).map(a => `<li>${a}<\/li>`).join('')}<\/ul>\r\n                    <\/div>` : ''}\r\n                    \r\n                   ${enderecosAntigos.length ? `\r\n                    <div style=\"margin-top:12px;\">\r\n                      <div class=\"person-section-title\">Endere\u00e7os Antigos<\/div>\r\n                      <ul class=\"person-list\">${enderecosAntigos.slice(0, 3).map(e => `<li>${e}<\/li>`).join('')}${enderecosAntigos.length > 3 ? '<li style=\"color:#777\">...<\/li>' : ''}<\/ul>\r\n                    <\/div>` : ''}\r\n\r\n                    ${parentes.length ? `\r\n                    <div style=\"margin-top:12px;\">\r\n                      <div class=\"person-section-title\">Parentes<\/div>\r\n                      <ul class=\"person-list\">${parentes.slice(0, 5).map(r => `<li>${r}<\/li>`).join('')}<\/ul>\r\n                    <\/div>` : ''}\r\n                `;\r\n\r\n              card.innerHTML = htmlPF;\r\n              peopleContainer.appendChild(card);\r\n            });\r\n          }\r\n        });\r\n      }\r\n\r\n      function disableDuringFetch(disabled) {\r\n        btnEnviar.disabled = disabled;\r\n        btnCancel.style.display = disabled ? 'inline-flex' : 'none';\r\n      }\r\n\r\n      async function postSearch(option, name, location) {\r\n        \/\/ Monta o body da requisi\u00e7\u00e3o\r\n        const bodyData = { option, name };\r\n\r\n        \/\/ Se for PF e tiver localiza\u00e7\u00e3o, adiciona\r\n        if (option === 'pf' && location) {\r\n          bodyData.location = location;\r\n        }\r\n\r\n        const resp = await fetch(SEARCH_ENDPOINT, {\r\n          method: 'POST',\r\n          headers: { 'Content-Type': 'application\/json' },\r\n          body: JSON.stringify(bodyData)\r\n        });\r\n        const json = await resp.json().catch(() => ({}));\r\n        if (!resp.ok || !json.ok) {\r\n          const msg = json.error || `HTTP ${resp.status}`;\r\n          throw new Error('Falha ao iniciar busca: ' + msg);\r\n        }\r\n        if (!json.sessionid) {\r\n          throw new Error('Servidor n\u00e3o retornou sessionid.');\r\n        }\r\n        return json.sessionid;\r\n      }\r\n\r\n      async function getResult(sessionid, signal) {\r\n        const resp = await fetch(RESULT_ENDPOINT, {\r\n          method: 'GET',\r\n          signal,\r\n          headers: { 'Accept': 'application\/json', 'X-Sessionid': sessionid }\r\n        });\r\n        const json = await resp.json().catch(() => ({}));\r\n        if (!resp.ok || !json.ok) {\r\n          const msg = json.error || `HTTP ${resp.status}`;\r\n          throw new Error('Falha ao obter resultado: ' + msg);\r\n        }\r\n        return json;\r\n      }\r\n\r\n      async function startPolling(sessionid) {\r\n        const controller = new AbortController();\r\n        pollingAbort = controller;\r\n        const signal = controller.signal;\r\n        const TIMEOUT_MS = 360_000;\r\n        const INTERVAL_MS = 2000;\r\n        const started = Date.now();\r\n\r\n        setBadge('pending');\r\n\r\n        while (true) {\r\n          if (signal.aborted) throw new Error('Cancelado.');\r\n          if (Date.now() - started > TIMEOUT_MS) throw new Error('Tempo esgotado.');\r\n\r\n          let res;\r\n          try {\r\n            res = await getResult(sessionid, signal);\r\n          } catch (err) {\r\n            await new Promise(r => setTimeout(r, 1000));\r\n            continue;\r\n          }\r\n\r\n          \/\/ CORRE\u00c7\u00c3O: Se tiver dados (array n\u00e3o vazio), considera conclu\u00eddo IMEDIATAMENTE,\r\n          \/\/ ignorando se o status \u00e9 'pending' ou qualquer outra coisa.\r\n          if (res.data && Array.isArray(res.data) && res.data.length > 0) {\r\n            setStatus('Resultados encontrados.', 'ok');\r\n            setBadge('done');\r\n            renderPeople(res.data);\r\n            break; \/\/ <--- ONDE O LOOP PARA\r\n          }\r\n\r\n          if (res.status === 'done') {\r\n            setStatus('Conclu\u00eddo.', 'ok');\r\n            setBadge('done');\r\n            renderPeople(res.data || []);\r\n            break;\r\n          }\r\n\r\n          if (res.status === 'error') {\r\n            setStatus('Erro na busca.', 'err');\r\n            setBadge('error');\r\n            break;\r\n          }\r\n\r\n          \/\/ Se n\u00e3o caiu em nenhum dos casos acima, continua esperando\r\n          setStatus('Processando...', 'loading');\r\n          await new Promise(r => setTimeout(r, INTERVAL_MS));\r\n        }\r\n      }\r\n\r\n\r\n      \/\/ SUBMIT\r\n      form.addEventListener('submit', async (e) => {\r\n        e.preventDefault();\r\n        const option = document.querySelector('input[name=\"option\"]:checked')?.value || 'pf';\r\n        const nameValue = nome.value.trim();\r\n        const locValue = localizacaoInput.value.trim();\r\n\r\n        if (!nameValue) {\r\n          setStatus('Informe um nome antes de pesquisar.', 'err');\r\n          nome.focus();\r\n          return;\r\n        }\r\n\r\n        resultado.hidden = true;\r\n        setStatus('Enviando...', 'loading');\r\n        disableDuringFetch(true);\r\n        setBadge('pending');\r\n\r\n        try {\r\n          const sessionid = await postSearch(option, nameValue, locValue);\r\n          setStatus(`Busca iniciada.`, 'ok');\r\n          await startPolling(sessionid);\r\n        } catch (err) {\r\n          setStatus(err.message, 'err');\r\n          setBadge('error');\r\n        } finally {\r\n          disableDuringFetch(false);\r\n          pollingAbort = null;\r\n        }\r\n      });\r\n\r\n      btnCancel.addEventListener('click', () => {\r\n        if (pollingAbort) { pollingAbort.abort(); }\r\n        setStatus('Opera\u00e7\u00e3o cancelada.', 'err');\r\n        setBadge('error');\r\n        disableDuringFetch(false);\r\n      });\r\n\r\n      \/\/ Bot\u00f5es de limpar\r\n      btnClearName.addEventListener('click', () => { nome.value = ''; nome.focus(); });\r\n      btnClearLoc.addEventListener('click', () => { localizacaoInput.value = ''; localizacaoInput.focus(); });\r\n\r\n    })();\r\n  <\/script>\r\n<\/body>\r\n\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Console de Pesquisa \u2013 PF \/ PJ Pesquisa de Pessoa F\u00edsica e Empresa Digite o nome, escolha o tipo e clique em Pesquisar. Pessoa F\u00edsica Empresa \u2715 \u2715 Pesquisar Cancelar Resultado da Pesquisa Aguardando&#8230;<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-1176","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/zoeflexsolutions.com\/pt\/wp-json\/wp\/v2\/pages\/1176","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zoeflexsolutions.com\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/zoeflexsolutions.com\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/zoeflexsolutions.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zoeflexsolutions.com\/pt\/wp-json\/wp\/v2\/comments?post=1176"}],"version-history":[{"count":68,"href":"https:\/\/zoeflexsolutions.com\/pt\/wp-json\/wp\/v2\/pages\/1176\/revisions"}],"predecessor-version":[{"id":1556,"href":"https:\/\/zoeflexsolutions.com\/pt\/wp-json\/wp\/v2\/pages\/1176\/revisions\/1556"}],"wp:attachment":[{"href":"https:\/\/zoeflexsolutions.com\/pt\/wp-json\/wp\/v2\/media?parent=1176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}