{"id":718,"date":"2026-05-05T22:24:36","date_gmt":"2026-05-05T22:24:36","guid":{"rendered":"https:\/\/360bizbrokers.com\/?page_id=718"},"modified":"2026-05-22T16:05:01","modified_gmt":"2026-05-22T16:05:01","slug":"biz-brokers-transaction-dashboard","status":"publish","type":"page","link":"https:\/\/360bizbrokers.com\/pt\/biz-brokers-transaction-dashboard\/","title":{"rendered":"Biz Brokers Transactions Dashboard"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"718\" class=\"elementor elementor-718\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0895f70 e-flex e-con-boxed e-con e-parent\" data-id=\"0895f70\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-365165a elementor-widget elementor-widget-html\" data-id=\"365165a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <title>Transactions Desk - Check List & Docs Tracker<\/title>\n  <style>\n    :root {\n      --bg: #f6f8fb;\n      --card: #ffffff;\n      --text: #1f2937;\n      --muted: #6b7280;\n      --border: #e5e7eb;\n      --primary: #2563eb;\n      --primary-dark: #1d4ed8;\n      --red: #dc2626;\n      --yellow: #d97706;\n      --blue: #2563eb;\n      --green: #16a34a;\n      --gray: #9ca3af;\n      --orange: #ea580c;\n    }\n\n    * { box-sizing: border-box; }\n\n    body {\n      margin: 0;\n      font-family: Arial, Helvetica, sans-serif;\n      background: var(--bg);\n      color: var(--text);\n    }\n\n    .login-screen {\n      min-height: 100vh;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      padding: 24px;\n    }\n\n    .login-card {\n      width: min(520px, 100%);\n      background: var(--card);\n      border: 1px solid var(--border);\n      border-radius: 20px;\n      box-shadow: 0 20px 60px rgba(15, 23, 42, 0.12);\n      padding: 28px;\n    }\n\n    .login-card h1 {\n      margin: 0 0 10px;\n      font-size: 30px;\n      line-height: 1.2;\n    }\n\n    .login-card p {\n      margin: 0 0 20px;\n      color: var(--muted);\n      line-height: 1.5;\n    }\n\n    .login-note {\n      margin-top: 14px;\n      padding: 12px;\n      border-radius: 12px;\n      background: #f9fafb;\n      border: 1px solid var(--border);\n      color: var(--muted);\n      font-size: 13px;\n      line-height: 1.45;\n    }\n\n    .tracker-app {\n      max-width: 1200px;\n      margin: 0 auto;\n      padding: 32px 16px;\n      display: none;\n    }\n\n    .tracker-header {\n      display: flex;\n      justify-content: space-between;\n      gap: 16px;\n      align-items: flex-start;\n      margin-bottom: 24px;\n      flex-wrap: wrap;\n    }\n\n    .tracker-header h1 {\n      margin: 0 0 8px;\n      font-size: 32px;\n      line-height: 1.2;\n    }\n\n    .tracker-header p {\n      margin: 0;\n      color: var(--muted);\n      max-width: 720px;\n      font-size: 16px;\n    }\n\n    .header-actions {\n      display: flex;\n      gap: 10px;\n      flex-wrap: wrap;\n      justify-content: flex-end;\n    }\n\n    .agent-pill {\n      display: inline-flex;\n      align-items: center;\n      gap: 8px;\n      border-radius: 999px;\n      background: #eef2ff;\n      color: var(--primary);\n      padding: 10px 13px;\n      font-size: 13px;\n      font-weight: 800;\n    }\n\n    .button {\n      border: 0;\n      border-radius: 10px;\n      background: var(--primary);\n      color: #fff;\n      padding: 11px 16px;\n      font-size: 14px;\n      font-weight: 700;\n      cursor: pointer;\n      transition: 0.2s ease;\n    }\n\n    .button:hover { background: var(--primary-dark); }\n\n    .button.secondary {\n      background: #eef2ff;\n      color: var(--primary);\n    }\n\n    .button.secondary:hover { background: #dbeafe; }\n\n    .button.danger {\n      background: #fee2e2;\n      color: var(--red);\n    }\n\n    .button.danger:hover { background: #fecaca; }\n\n    .summary-grid {\n      display: grid;\n      grid-template-columns: repeat(4, minmax(0, 1fr));\n      gap: 16px;\n      margin-bottom: 24px;\n    }\n\n    .summary-card, .panel, .listing-card {\n      background: var(--card);\n      border: 1px solid var(--border);\n      border-radius: 16px;\n      box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06);\n    }\n\n    .summary-card { padding: 18px; }\n\n    .summary-label {\n      color: var(--muted);\n      font-size: 13px;\n      font-weight: 700;\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n    }\n\n    .summary-value {\n      margin-top: 8px;\n      font-size: 30px;\n      font-weight: 800;\n    }\n\n    .layout {\n      display: grid;\n      grid-template-columns: 360px 1fr;\n      gap: 20px;\n    }\n\n    .panel { padding: 18px; }\n\n    .panel h2 {\n      margin: 0 0 14px;\n      font-size: 20px;\n    }\n\n    .listing-list { display: grid; gap: 12px; }\n\n    .empty-state {\n      background: #f9fafb;\n      border: 1px dashed var(--border);\n      border-radius: 14px;\n      padding: 18px;\n      color: var(--muted);\n      line-height: 1.5;\n    }\n\n    .listing-card {\n      padding: 16px;\n      cursor: pointer;\n      transition: 0.2s ease;\n    }\n\n    .listing-card:hover, .listing-card.active {\n      border-color: var(--primary);\n      transform: translateY(-1px);\n    }\n\n    .listing-title-row {\n      display: flex;\n      justify-content: space-between;\n      gap: 10px;\n      align-items: flex-start;\n    }\n\n    .listing-card h3 { margin: 0; font-size: 17px; }\n\n    .listing-meta {\n      margin-top: 6px;\n      color: var(--muted);\n      font-size: 13px;\n    }\n\n    .progress-wrap { margin-top: 12px; }\n\n    .progress-bar {\n      height: 9px;\n      background: #e5e7eb;\n      border-radius: 999px;\n      overflow: hidden;\n    }\n\n    .progress-fill {\n      height: 100%;\n      background: var(--green);\n      border-radius: 999px;\n      width: 0;\n    }\n\n    .progress-text {\n      display: flex;\n      justify-content: space-between;\n      margin-top: 6px;\n      color: var(--muted);\n      font-size: 13px;\n      gap: 8px;\n    }\n\n    .badge {\n      display: inline-flex;\n      align-items: center;\n      border-radius: 999px;\n      padding: 5px 9px;\n      font-size: 12px;\n      font-weight: 800;\n      white-space: nowrap;\n    }\n\n    .badge.red { background: #fee2e2; color: var(--red); }\n    .badge.yellow { background: #fef3c7; color: var(--yellow); }\n    .badge.blue { background: #dbeafe; color: var(--blue); }\n    .badge.green { background: #dcfce7; color: var(--green); }\n    .badge.gray { background: #f3f4f6; color: #4b5563; }\n    .badge.orange { background: #ffedd5; color: var(--orange); }\n\n    .detail-header {\n      display: flex;\n      justify-content: space-between;\n      gap: 14px;\n      flex-wrap: wrap;\n      align-items: flex-start;\n      margin-bottom: 16px;\n    }\n\n    .detail-header h2 { margin: 0 0 6px; font-size: 24px; }\n\n    .detail-meta { color: var(--muted); font-size: 14px; }\n\n    .toolbar {\n      display: flex;\n      gap: 10px;\n      flex-wrap: wrap;\n      margin-bottom: 16px;\n    }\n\n    .toolbar input, .toolbar select {\n      border: 1px solid var(--border);\n      border-radius: 10px;\n      padding: 10px 12px;\n      font-size: 14px;\n      background: #fff;\n      min-width: 170px;\n    }\n\n    .table-wrap {\n      overflow-x: auto;\n      border: 1px solid var(--border);\n      border-radius: 14px;\n    }\n\n    table {\n      width: 100%;\n      border-collapse: collapse;\n      min-width: 820px;\n      background: #fff;\n    }\n\n    th, td {\n      padding: 13px 12px;\n      border-bottom: 1px solid var(--border);\n      text-align: left;\n      font-size: 14px;\n      vertical-align: top;\n    }\n\n    th {\n      background: #f9fafb;\n      color: #374151;\n      font-size: 12px;\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n    }\n\n    tr:last-child td { border-bottom: 0; }\n\n    .doc-name { font-weight: 800; }\n\n    .notes { color: var(--muted); max-width: 260px; }\n\n    select.status-select {\n      min-width: 135px;\n      border: 1px solid var(--border);\n      border-radius: 9px;\n      padding: 8px;\n      background: #fff;\n    }\n\n    .reminder-box {\n      margin-top: 20px;\n      background: #fff7ed;\n      border: 1px solid #fed7aa;\n      border-radius: 16px;\n      padding: 16px;\n    }\n\n    .reminder-box h3 { margin: 0 0 8px; color: #9a3412; }\n\n    .reminder-box ul {\n      margin: 10px 0 0;\n      padding-left: 18px;\n      color: #7c2d12;\n    }\n\n    .modal-backdrop {\n      position: fixed;\n      inset: 0;\n      background: rgba(15, 23, 42, 0.55);\n      display: none;\n      align-items: center;\n      justify-content: center;\n      padding: 20px;\n      z-index: 9999;\n    }\n\n    .modal {\n      width: min(540px, 100%);\n      background: #fff;\n      border-radius: 18px;\n      padding: 22px;\n      box-shadow: 0 20px 60px rgba(0,0,0,0.25);\n      max-height: calc(100vh - 40px);\n      overflow-y: auto;\n    }\n\n    .modal h2 { margin: 0 0 14px; }\n\n    .form-grid { display: grid; gap: 12px; }\n\n    .form-grid label {\n      display: grid;\n      gap: 6px;\n      font-size: 13px;\n      font-weight: 800;\n    }\n\n    .form-grid input, .form-grid select, .form-grid textarea {\n      border: 1px solid var(--border);\n      border-radius: 10px;\n      padding: 10px 12px;\n      font-size: 14px;\n      font-family: Arial, Helvetica, sans-serif;\n    }\n\n    .form-grid textarea { min-height: 82px; resize: vertical; }\n\n    .modal-actions {\n      margin-top: 16px;\n      display: flex;\n      justify-content: flex-end;\n      gap: 10px;\n      flex-wrap: wrap;\n    }\n\n    @media (max-width: 920px) {\n      .summary-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n      .layout { grid-template-columns: 1fr; }\n    }\n\n    @media (max-width: 560px) {\n      .summary-grid { grid-template-columns: 1fr; }\n      .tracker-header h1, .login-card h1 { font-size: 26px; }\n      .header-actions { justify-content: flex-start; }\n      .progress-text { flex-direction: column; }\n    }\n  <\/style>\n<\/head>\n<body>\n  <section class=\"login-screen\" id=\"loginScreen\">\n    <div class=\"login-card\">\n      <h1>Transactions Desk - Check List & Docs Tracker<\/h1>\n      <p>Enter your agent name and access code. Your transactions will be saved only in this browser under your individual access profile.<\/p>\n      <div class=\"form-grid\">\n        <label>\n          Agent Name\n          <input id=\"agentNameInput\" placeholder=\"Enter your name\" autocomplete=\"name\" \/>\n        <\/label>\n        <label>\n          Access Code\n          <input id=\"agentCodeInput\" placeholder=\"Create or enter your code\" type=\"password\" autocomplete=\"current-password\" \/>\n        <\/label>\n        <button class=\"button\" onclick=\"loginAgent()\">Access My Tracker<\/button>\n      <\/div>\n      <div class=\"login-note\">\n        This is lightweight individual access, not a secure server login. Data is stored locally in the browser being used. Clearing browser data or switching computers may remove or hide saved transactions.\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <div class=\"tracker-app\" id=\"trackerApp\">\n    <header class=\"tracker-header\">\n      <div>\n        <h1>Transactions Desk - Check List & Docs Tracker<\/h1>\n        <p>Track collected documents, missing paperwork, review status, due dates, owners, and reminders for every active transaction.<\/p>\n      <\/div>\n      <div class=\"header-actions\">\n        <span class=\"agent-pill\" id=\"agentPill\">Agent<\/span>\n        <button class=\"button secondary\" onclick=\"switchAgent()\">Switch Agent<\/button>\n        <button class=\"button\" onclick=\"openListingModal()\">+ Add Transaction<\/button>\n      <\/div>\n    <\/header>\n\n    <section class=\"summary-grid\">\n      <div class=\"summary-card\">\n        <div class=\"summary-label\">Active Transactions<\/div>\n        <div class=\"summary-value\" id=\"activeListings\">0<\/div>\n      <\/div>\n      <div class=\"summary-card\">\n        <div class=\"summary-label\">Missing Docs<\/div>\n        <div class=\"summary-value\" id=\"missingDocs\">0<\/div>\n      <\/div>\n      <div class=\"summary-card\">\n        <div class=\"summary-label\">Overdue Docs<\/div>\n        <div class=\"summary-value\" id=\"overdueDocs\">0<\/div>\n      <\/div>\n      <div class=\"summary-card\">\n        <div class=\"summary-label\">Avg. Completion<\/div>\n        <div class=\"summary-value\" id=\"avgCompletion\">0%<\/div>\n      <\/div>\n    <\/section>\n\n    <main class=\"layout\">\n      <aside class=\"panel\">\n        <h2>Active Transactions<\/h2>\n        <div class=\"listing-list\" id=\"listingList\"><\/div>\n      <\/aside>\n\n      <section class=\"panel\">\n        <div class=\"detail-header\">\n          <div>\n            <h2 id=\"detailTitle\">Select a transaction<\/h2>\n            <div class=\"detail-meta\" id=\"detailMeta\"><\/div>\n          <\/div>\n          <span class=\"badge gray\" id=\"readinessBadge\">No transaction selected<\/span>\n        <\/div>\n\n        <div class=\"toolbar\">\n          <input type=\"text\" id=\"searchInput\" placeholder=\"Search documents...\" oninput=\"renderDetail()\" \/>\n          <select id=\"statusFilter\" onchange=\"renderDetail()\">\n            <option value=\"all\">All statuses<\/option>\n            <option value=\"Missing\">Missing<\/option>\n            <option value=\"Requested\">Requested<\/option>\n            <option value=\"Received\">Received<\/option>\n            <option value=\"Reviewed\">Reviewed<\/option>\n            <option value=\"Overdue\">Overdue<\/option>\n            <option value=\"N\/A\">N\/A<\/option>\n          <\/select>\n          <button class=\"button secondary\" onclick=\"openDocumentModal()\">+ Add Document<\/button>\n          <button class=\"button secondary\" onclick=\"sendReminderSummary()\">Generate Reminder Summary<\/button>\n        <\/div>\n\n        <div class=\"table-wrap\">\n          <table>\n            <thead>\n              <tr>\n                <th>Document<\/th>\n                <th>Status<\/th>\n                <th>Owner<\/th>\n                <th>Due Date<\/th>\n                <th>Last Updated<\/th>\n                <th>Reminder<\/th>\n                <th>Notes<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody id=\"documentRows\"><\/tbody>\n          <\/table>\n        <\/div>\n\n        <div class=\"reminder-box\" id=\"reminderBox\">\n          <h3>Reminder Center<\/h3>\n          <p>Select a transaction to see missing and overdue document reminders.<\/p>\n        <\/div>\n      <\/section>\n    <\/main>\n  <\/div>\n\n  <div class=\"modal-backdrop\" id=\"listingModalBackdrop\">\n    <div class=\"modal\">\n      <h2>Add New Transaction<\/h2>\n      <div class=\"form-grid\">\n        <label>\n          Transaction Name\n          <input id=\"newListingName\" placeholder=\"Business or deal name\" \/>\n        <\/label>\n        <label>\n          Transaction Type\n          <select id=\"newListingType\">\n            <option>Restaurant<\/option>\n            <option>Franchise<\/option>\n            <option>Retail<\/option>\n            <option>Service Business<\/option>\n            <option>Manufacturing<\/option>\n            <option>Other<\/option>\n          <\/select>\n        <\/label>\n        <label>\n          Broker \/ Coordinator\n          <input id=\"newListingOwner\" placeholder=\"Broker or coordinator name\" \/>\n        <\/label>\n      <\/div>\n      <div class=\"modal-actions\">\n        <button class=\"button secondary\" onclick=\"closeListingModal()\">Cancel<\/button>\n        <button class=\"button\" onclick=\"addListing()\">Create Transaction<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"modal-backdrop\" id=\"documentModalBackdrop\">\n    <div class=\"modal\">\n      <h2>Add Document<\/h2>\n      <div class=\"form-grid\">\n        <label>\n          Document Name\n          <input id=\"newDocName\" placeholder=\"Example: Buyer Proof of Funds\" \/>\n        <\/label>\n        <label>\n          Status\n          <select id=\"newDocStatus\">\n            <option>Missing<\/option>\n            <option>Requested<\/option>\n            <option>Received<\/option>\n            <option>Reviewed<\/option>\n            <option>Overdue<\/option>\n            <option>N\/A<\/option>\n          <\/select>\n        <\/label>\n        <label>\n          Owner\n          <input id=\"newDocOwner\" placeholder=\"Seller, buyer, CPA, landlord, etc.\" \/>\n        <\/label>\n        <label>\n          Due Date\n          <input id=\"newDocDueDate\" type=\"date\" \/>\n        <\/label>\n        <label>\n          Notes\n          <textarea id=\"newDocNotes\" placeholder=\"Optional notes\"><\/textarea>\n        <\/label>\n      <\/div>\n      <div class=\"modal-actions\">\n        <button class=\"button secondary\" onclick=\"closeDocumentModal()\">Cancel<\/button>\n        <button class=\"button\" onclick=\"addDocument()\">Add Document<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <script>\n    const APP_KEY_PREFIX = \"transactionsDeskTracker\";\n    const SESSION_KEY = \"transactionsDeskCurrentAgent\";\n\n    const defaultDocs = [\n      \"Tax Returns\",\n      \"P&L Statement\",\n      \"Lease\",\n      \"Franchise Agreement\",\n      \"Equipment List\",\n      \"Utility Bills\",\n      \"Payroll Reports\",\n      \"Bank Statements\",\n      \"Inventory List\",\n      \"Seller Disclosure\"\n    ];\n\n    let currentAgent = null;\n    let listings = [];\n    let selectedListingId = null;\n\n    function slugify(value) {\n      return value.trim().toLowerCase().replace(\/[^a-z0-9]+\/g, \"-\").replace(\/^-+|-+$\/g, \"\");\n    }\n\n    function agentStorageKey(agent) {\n      return `${APP_KEY_PREFIX}:${agent.id}`;\n    }\n\n    function buildAgent(name, code) {\n      return {\n        name: name.trim(),\n        code: code.trim(),\n        id: `${slugify(name)}-${slugify(code)}`\n      };\n    }\n\n    function loginAgent() {\n      const name = document.getElementById(\"agentNameInput\").value.trim();\n      const code = document.getElementById(\"agentCodeInput\").value.trim();\n\n      if (!name || !code) {\n        alert(\"Please enter both your agent name and access code.\");\n        return;\n      }\n\n      currentAgent = buildAgent(name, code);\n      sessionStorage.setItem(SESSION_KEY, JSON.stringify(currentAgent));\n      loadAgentData();\n      showApp();\n    }\n\n    function loadSessionAgent() {\n      const saved = sessionStorage.getItem(SESSION_KEY);\n      if (!saved) return null;\n\n      try {\n        return JSON.parse(saved);\n      } catch (error) {\n        sessionStorage.removeItem(SESSION_KEY);\n        return null;\n      }\n    }\n\n    function loadAgentData() {\n      listings = [];\n      selectedListingId = null;\n\n      if (!currentAgent) return;\n\n      const savedData = localStorage.getItem(agentStorageKey(currentAgent));\n      if (!savedData) return;\n\n      try {\n        const parsed = JSON.parse(savedData);\n        listings = Array.isArray(parsed.listings) ? parsed.listings : [];\n        selectedListingId = parsed.selectedListingId || (listings[0] ? listings[0].id : null);\n      } catch (error) {\n        console.error(\"Could not load saved tracker data:\", error);\n        listings = [];\n        selectedListingId = null;\n      }\n    }\n\n    function saveAgentData() {\n      if (!currentAgent) return;\n\n      const dataToSave = {\n        agentName: currentAgent.name,\n        selectedListingId,\n        listings\n      };\n\n      localStorage.setItem(agentStorageKey(currentAgent), JSON.stringify(dataToSave));\n    }\n\n    function showApp() {\n      document.getElementById(\"loginScreen\").style.display = \"none\";\n      document.getElementById(\"trackerApp\").style.display = \"block\";\n      document.getElementById(\"agentPill\").textContent = `Agent: ${currentAgent.name}`;\n      render();\n    }\n\n    function showLogin() {\n      document.getElementById(\"loginScreen\").style.display = \"flex\";\n      document.getElementById(\"trackerApp\").style.display = \"none\";\n    }\n\n    function switchAgent() {\n      saveAgentData();\n      currentAgent = null;\n      listings = [];\n      selectedListingId = null;\n      sessionStorage.removeItem(SESSION_KEY);\n      document.getElementById(\"agentNameInput\").value = \"\";\n      document.getElementById(\"agentCodeInput\").value = \"\";\n      showLogin();\n    }\n\n    function doc(name, status, owner, dueDate, notes) {\n      return {\n        name,\n        status,\n        owner,\n        dueDate,\n        lastUpdated: new Date().toISOString().slice(0, 10),\n        reminder: status !== \"Reviewed\" && status !== \"N\/A\",\n        notes\n      };\n    }\n\n    function completion(listing) {\n      const required = listing.documents.filter(d => d.status !== \"N\/A\");\n      const done = required.filter(d => d.status === \"Reviewed\").length;\n      return required.length ? Math.round((done \/ required.length) * 100) : 100;\n    }\n\n    function readiness(listing) {\n      const overdue = listing.documents.filter(d => d.status === \"Overdue\").length;\n      const missing = listing.documents.filter(d => d.status === \"Missing\").length;\n      const pct = completion(listing);\n      if (overdue || missing) return { label: \"Needs Attention\", color: \"orange\" };\n      if (pct < 100) return { label: \"Nearly Ready\", color: \"blue\" };\n      return { label: \"Complete\", color: \"green\" };\n    }\n\n    function renderSummary() {\n      const allDocs = listings.flatMap(l => l.documents);\n      const missing = allDocs.filter(d => d.status === \"Missing\").length;\n      const overdue = allDocs.filter(d => d.status === \"Overdue\").length;\n      const avg = listings.length ? Math.round(listings.reduce((sum, l) => sum + completion(l), 0) \/ listings.length) : 0;\n\n      document.getElementById(\"activeListings\").textContent = listings.length;\n      document.getElementById(\"missingDocs\").textContent = missing;\n      document.getElementById(\"overdueDocs\").textContent = overdue;\n      document.getElementById(\"avgCompletion\").textContent = avg + \"%\";\n    }\n\n    function renderListings() {\n      const wrap = document.getElementById(\"listingList\");\n      wrap.innerHTML = \"\";\n\n      if (!listings.length) {\n        wrap.innerHTML = `<div class=\"empty-state\">No transactions yet. Click <strong>+ Add Transaction<\/strong> to create your first one.<\/div>`;\n        return;\n      }\n\n      listings.forEach(listing => {\n        const pct = completion(listing);\n        const missing = listing.documents.filter(d => d.status === \"Missing\").length;\n        const overdue = listing.documents.filter(d => d.status === \"Overdue\").length;\n        const ready = readiness(listing);\n\n        const card = document.createElement(\"div\");\n        card.className = \"listing-card\" + (listing.id === selectedListingId ? \" active\" : \"\");\n        card.onclick = () => {\n          selectedListingId = listing.id;\n          saveAgentData();\n          render();\n        };\n\n        card.innerHTML = `\n          <div class=\"listing-title-row\">\n            <div>\n              <h3>${escapeHtml(listing.name)}<\/h3>\n              <div class=\"listing-meta\">${escapeHtml(listing.type)} \u00b7 ${escapeHtml(listing.owner)}<\/div>\n            <\/div>\n            <span class=\"badge ${ready.color}\">${ready.label}<\/span>\n          <\/div>\n          <div class=\"progress-wrap\">\n            <div class=\"progress-bar\"><div class=\"progress-fill\" style=\"width:${pct}%\"><\/div><\/div>\n            <div class=\"progress-text\">\n              <span>${pct}% complete<\/span>\n              <span>${missing} missing \u00b7 ${overdue} overdue<\/span>\n            <\/div>\n          <\/div>\n        `;\n        wrap.appendChild(card);\n      });\n    }\n\n    function renderDetail() {\n      const listing = listings.find(l => l.id === selectedListingId);\n      const rows = document.getElementById(\"documentRows\");\n      const search = document.getElementById(\"searchInput\").value.toLowerCase();\n      const filter = document.getElementById(\"statusFilter\").value;\n\n      rows.innerHTML = \"\";\n\n      if (!listing) {\n        document.getElementById(\"detailTitle\").textContent = \"Select a transaction\";\n        document.getElementById(\"detailMeta\").textContent = \"\";\n        document.getElementById(\"readinessBadge\").textContent = \"No transaction selected\";\n        document.getElementById(\"readinessBadge\").className = \"badge gray\";\n        document.getElementById(\"reminderBox\").innerHTML = `\n          <h3>Reminder Center<\/h3>\n          <p>Select a transaction to see missing and overdue document reminders.<\/p>\n        `;\n        return;\n      }\n\n      const ready = readiness(listing);\n      document.getElementById(\"detailTitle\").textContent = listing.name;\n      document.getElementById(\"detailMeta\").textContent = `${listing.type} \u00b7 Coordinator: ${listing.owner} \u00b7 ${completion(listing)}% complete`;\n      document.getElementById(\"readinessBadge\").textContent = ready.label;\n      document.getElementById(\"readinessBadge\").className = `badge ${ready.color}`;\n\n      const docs = listing.documents.filter(d => {\n        const docName = (d.name || \"\").toLowerCase();\n        const docNotes = (d.notes || \"\").toLowerCase();\n        const matchesSearch = docName.includes(search) || docNotes.includes(search);\n        const matchesFilter = filter === \"all\" || d.status === filter;\n        return matchesSearch && matchesFilter;\n      });\n\n      if (!docs.length) {\n        rows.innerHTML = `<tr><td colspan=\"7\" class=\"notes\">No documents match this view.<\/td><\/tr>`;\n      }\n\n      docs.forEach(d => {\n        const actualIndex = listing.documents.indexOf(d);\n        const tr = document.createElement(\"tr\");\n        tr.innerHTML = `\n          <td><div class=\"doc-name\">${escapeHtml(d.name)}<\/div><\/td>\n          <td>\n            <select class=\"status-select\" onchange=\"updateStatus(${listing.id}, ${actualIndex}, this.value)\">\n              ${[\"Missing\", \"Requested\", \"Received\", \"Reviewed\", \"Overdue\", \"N\/A\"].map(s => `\n                <option value=\"${s}\" ${d.status === s ? \"selected\" : \"\"}>${s}<\/option>\n              `).join(\"\")}\n            <\/select>\n          <\/td>\n          <td>${escapeHtml(d.owner || \"\")}<\/td>\n          <td>${d.dueDate || \"\u2014\"}<\/td>\n          <td>${d.lastUpdated || \"\u2014\"}<\/td>\n          <td>${d.reminder ? \"On\" : \"Off\"}<\/td>\n          <td class=\"notes\">${escapeHtml(d.notes || \"\")}<\/td>\n        `;\n        rows.appendChild(tr);\n      });\n\n      renderReminders(listing);\n    }\n\n    function renderReminders(listing) {\n      const box = document.getElementById(\"reminderBox\");\n      const reminders = listing.documents.filter(d =>\n        d.reminder && [\"Missing\", \"Requested\", \"Overdue\"].includes(d.status)\n      );\n\n      if (!reminders.length) {\n        box.innerHTML = `\n          <h3>Reminder Center<\/h3>\n          <p>No active reminders. This transaction is in good shape.<\/p>\n        `;\n        return;\n      }\n\n      box.innerHTML = `\n        <h3>Reminder Center<\/h3>\n        <p>${reminders.length} document reminder${reminders.length === 1 ? \"\" : \"s\"} need attention.<\/p>\n        <ul>\n          ${reminders.map(d => `<li><strong>${escapeHtml(d.name)}<\/strong> \u2014 ${d.status}, owned by ${escapeHtml(d.owner || \"\")}, due ${d.dueDate || \"TBD\"}.<\/li>`).join(\"\")}\n        <\/ul>\n      `;\n    }\n\n    function updateStatus(listingId, docIndex, status) {\n      const listing = listings.find(l => l.id === listingId);\n      if (!listing || !listing.documents[docIndex]) return;\n\n      listing.documents[docIndex].status = status;\n      listing.documents[docIndex].lastUpdated = new Date().toISOString().slice(0, 10);\n      listing.documents[docIndex].reminder = status !== \"Reviewed\" && status !== \"N\/A\";\n      saveAgentData();\n      render();\n    }\n\n    function sendReminderSummary() {\n      const listing = listings.find(l => l.id === selectedListingId);\n      if (!listing) {\n        alert(\"Please select a transaction first.\");\n        return;\n      }\n\n      const reminders = listing.documents.filter(d =>\n        d.reminder && [\"Missing\", \"Requested\", \"Overdue\"].includes(d.status)\n      );\n\n      if (!reminders.length) {\n        alert(\"No reminders needed for this transaction.\");\n        return;\n      }\n\n      const summary = reminders.map(d => `- ${d.name}: ${d.status}, owner: ${d.owner}, due: ${d.dueDate || \"TBD\"}`).join(\"\\n\");\n      alert(`Reminder Summary for ${listing.name}\\n\\n${summary}`);\n    }\n\n    function openListingModal() {\n      document.getElementById(\"listingModalBackdrop\").style.display = \"flex\";\n    }\n\n    function closeListingModal() {\n      document.getElementById(\"listingModalBackdrop\").style.display = \"none\";\n      document.getElementById(\"newListingName\").value = \"\";\n      document.getElementById(\"newListingOwner\").value = \"\";\n      document.getElementById(\"newListingType\").value = \"Restaurant\";\n    }\n\n    function addListing() {\n      const name = document.getElementById(\"newListingName\").value.trim();\n      const type = document.getElementById(\"newListingType\").value;\n      const owner = document.getElementById(\"newListingOwner\").value.trim() || currentAgent.name;\n\n      if (!name) {\n        alert(\"Please enter a transaction name.\");\n        return;\n      }\n\n      const newListing = {\n        id: Date.now(),\n        name,\n        type,\n        owner,\n        documents: defaultDocs.map(docName => doc(\n          docName,\n          docName === \"Franchise Agreement\" && type !== \"Franchise\" ? \"N\/A\" : \"Missing\",\n          \"Seller\",\n          \"\",\n          \"\"\n        ))\n      };\n\n      listings.push(newListing);\n      selectedListingId = newListing.id;\n      closeListingModal();\n      saveAgentData();\n      render();\n    }\n\n    function openDocumentModal() {\n      const listing = listings.find(l => l.id === selectedListingId);\n      if (!listing) {\n        alert(\"Please select or create a transaction before adding a document.\");\n        return;\n      }\n\n      document.getElementById(\"documentModalBackdrop\").style.display = \"flex\";\n    }\n\n    function closeDocumentModal() {\n      document.getElementById(\"documentModalBackdrop\").style.display = \"none\";\n      document.getElementById(\"newDocName\").value = \"\";\n      document.getElementById(\"newDocStatus\").value = \"Missing\";\n      document.getElementById(\"newDocOwner\").value = \"\";\n      document.getElementById(\"newDocDueDate\").value = \"\";\n      document.getElementById(\"newDocNotes\").value = \"\";\n    }\n\n    function addDocument() {\n      const listing = listings.find(l => l.id === selectedListingId);\n      if (!listing) {\n        alert(\"Please select a transaction first.\");\n        return;\n      }\n\n      const name = document.getElementById(\"newDocName\").value.trim();\n      const status = document.getElementById(\"newDocStatus\").value;\n      const owner = document.getElementById(\"newDocOwner\").value.trim() || \"Unassigned\";\n      const dueDate = document.getElementById(\"newDocDueDate\").value;\n      const notes = document.getElementById(\"newDocNotes\").value.trim();\n\n      if (!name) {\n        alert(\"Please enter a document name.\");\n        return;\n      }\n\n      listing.documents.push(doc(name, status, owner, dueDate, notes));\n      closeDocumentModal();\n      saveAgentData();\n      render();\n    }\n\n    function escapeHtml(value) {\n      return String(value)\n        .replace(\/&\/g, \"&amp;\")\n        .replace(\/<\/g, \"&lt;\")\n        .replace(\/>\/g, \"&gt;\")\n        .replace(\/\"\/g, \"&quot;\")\n        .replace(\/'\/g, \"&#039;\");\n    }\n\n    function render() {\n      renderSummary();\n      renderListings();\n      renderDetail();\n    }\n\n    document.getElementById(\"agentCodeInput\").addEventListener(\"keydown\", function(event) {\n      if (event.key === \"Enter\") loginAgent();\n    });\n\n    document.getElementById(\"agentNameInput\").addEventListener(\"keydown\", function(event) {\n      if (event.key === \"Enter\") loginAgent();\n    });\n\n    const sessionAgent = loadSessionAgent();\n    if (sessionAgent) {\n      currentAgent = sessionAgent;\n      loadAgentData();\n      showApp();\n    } else {\n      showLogin();\n    }\n  <\/script>\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a035657 e-flex e-con-boxed e-con e-parent\" data-id=\"a035657\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cd65717 elementor-widget elementor-widget-shortcode\" data-id=\"cd65717\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div class=\"bbtp-login\"><p>Please log in to access Biz Brokers Tools.<\/p><a class=\"bbtp-button\" href=\"https:\/\/360bizbrokers.com\/wp-login.php?redirect_to=https%3A%2F%2F360bizbrokers.com%2Fpt%2Fbiz-brokers-transaction-dashboard%2F\">Log In<\/a><\/div><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Transactions Desk &#8211; Check List &#038; Docs Tracker Transactions Desk &#8211; Check List &#038; Docs Tracker Enter your agent name and access code. Your transactions&#8230;<\/p>","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-718","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Biz Brokers Transactions Dashboard - 360 Biz Brokers<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/360bizbrokers.com\/pt\/biz-brokers-transaction-dashboard\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Biz Brokers Transactions Dashboard\" \/>\n<meta property=\"og:description\" content=\"Transactions Desk &#8211; Check List &#038; Docs Tracker Transactions Desk &#8211; Check List &#038; Docs Tracker Enter your agent name and access code. Your transactions...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/360bizbrokers.com\/pt\/biz-brokers-transaction-dashboard\/\" \/>\n<meta property=\"og:site_name\" content=\"360 Biz Brokers\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-22T16:05:01+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/360bizbrokers.com\/biz-brokers-transaction-dashboard\/\",\"url\":\"https:\/\/360bizbrokers.com\/biz-brokers-transaction-dashboard\/\",\"name\":\"Biz Brokers Transactions Dashboard - 360 Biz Brokers\",\"isPartOf\":{\"@id\":\"https:\/\/360bizbrokers.com\/#website\"},\"datePublished\":\"2026-05-05T22:24:36+00:00\",\"dateModified\":\"2026-05-22T16:05:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/360bizbrokers.com\/biz-brokers-transaction-dashboard\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/360bizbrokers.com\/biz-brokers-transaction-dashboard\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/360bizbrokers.com\/biz-brokers-transaction-dashboard\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/360bizbrokers.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Biz Brokers Transactions Dashboard\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/360bizbrokers.com\/#website\",\"url\":\"https:\/\/360bizbrokers.com\/\",\"name\":\"Florida 360 Business Brokers\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/360bizbrokers.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/360bizbrokers.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/360bizbrokers.com\/#organization\",\"name\":\"Florida 360 Business Brokers\",\"url\":\"https:\/\/360bizbrokers.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/360bizbrokers.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/360bizbrokers.com\/wp-content\/uploads\/2025\/12\/LOGO-FLORIDA-360-BUSINESS-BROKERS.jpg\",\"contentUrl\":\"https:\/\/360bizbrokers.com\/wp-content\/uploads\/2025\/12\/LOGO-FLORIDA-360-BUSINESS-BROKERS.jpg\",\"width\":1080,\"height\":1080,\"caption\":\"Florida 360 Business Brokers\"},\"image\":{\"@id\":\"https:\/\/360bizbrokers.com\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Biz Brokers Transactions Dashboard - 360 Biz Brokers","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/360bizbrokers.com\/pt\/biz-brokers-transaction-dashboard\/","og_locale":"pt_BR","og_type":"article","og_title":"Biz Brokers Transactions Dashboard","og_description":"Transactions Desk &#8211; Check List &#038; Docs Tracker Transactions Desk &#8211; Check List &#038; Docs Tracker Enter your agent name and access code. Your transactions...","og_url":"https:\/\/360bizbrokers.com\/pt\/biz-brokers-transaction-dashboard\/","og_site_name":"360 Biz Brokers","article_modified_time":"2026-05-22T16:05:01+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. tempo de leitura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/360bizbrokers.com\/biz-brokers-transaction-dashboard\/","url":"https:\/\/360bizbrokers.com\/biz-brokers-transaction-dashboard\/","name":"Biz Brokers Transactions Dashboard - 360 Biz Brokers","isPartOf":{"@id":"https:\/\/360bizbrokers.com\/#website"},"datePublished":"2026-05-05T22:24:36+00:00","dateModified":"2026-05-22T16:05:01+00:00","breadcrumb":{"@id":"https:\/\/360bizbrokers.com\/biz-brokers-transaction-dashboard\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/360bizbrokers.com\/biz-brokers-transaction-dashboard\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/360bizbrokers.com\/biz-brokers-transaction-dashboard\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/360bizbrokers.com\/"},{"@type":"ListItem","position":2,"name":"Biz Brokers Transactions Dashboard"}]},{"@type":"WebSite","@id":"https:\/\/360bizbrokers.com\/#website","url":"https:\/\/360bizbrokers.com\/","name":"Florida 360 Business Brokers","description":"","publisher":{"@id":"https:\/\/360bizbrokers.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/360bizbrokers.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/360bizbrokers.com\/#organization","name":"Florida 360 Business Brokers","url":"https:\/\/360bizbrokers.com\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/360bizbrokers.com\/#\/schema\/logo\/image\/","url":"https:\/\/360bizbrokers.com\/wp-content\/uploads\/2025\/12\/LOGO-FLORIDA-360-BUSINESS-BROKERS.jpg","contentUrl":"https:\/\/360bizbrokers.com\/wp-content\/uploads\/2025\/12\/LOGO-FLORIDA-360-BUSINESS-BROKERS.jpg","width":1080,"height":1080,"caption":"Florida 360 Business Brokers"},"image":{"@id":"https:\/\/360bizbrokers.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/pages\/718","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/comments?post=718"}],"version-history":[{"count":0,"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/pages\/718\/revisions"}],"wp:attachment":[{"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/media?parent=718"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}