System

Activity Log

Unified timeline of data changes (saves, imports, deletes) and backend errors. Filter by type, area, severity, or search.

Data changes (total)1,217
Errors (total)304,222
Today · changes0
Today · errors1,882
Reset

305,439 results · Page 6108 of 6109

documents · upload
2026-04-07 15:06:24 · anonymous · /backend/documents.php?backend_document_id=8
change
backend_document #10
Context
{"file_name":"SESSION_LOG_2026-04-07.md","mime_type":"application/octet-stream"}
Before
[]
After
{"backend_document_id":"10","document_type":"upload","title":"Claude 04-07-2026","slug":"claude-04-07-2026","summary_text":"Claude 04-07-2026 fixing backend Document areas","content_markdown":null,"content_html":null,"file_name":"SESSION_LOG_2026-04-07.md","stored_name":"20260407-190624-56f0e818.md","mime_type":"application/octet-stream","file_size_bytes":"21112","storage_path":"/mnt/drive1/customerdb/backend/documents_storage/20260407-190624-56f0e818.md","is_deleted":"0","created_at":"2026-04-07 15:06:24","updated_at":"2026-04-07 15:06:24","editor_content":"# Session Log — 2026-04-07\n\nAll work completed in this session on the CustomerDB backend application.\n\n---\n\n## Summary of New Modules and Changes\n\n| Area | File(s) | Status |\n|------|---------|--------|\n| Bills Manager | `backend/bills_service.php`, `backend/bills.php` | New |\n| Next-Day Email Job | `backend/jobs/send_nextday_customer_emails.php` | New |\n| Cron Manager UI | `backend/cron_manager.php` | New |\n| Error Log UI | `backend/error_log.php` | New |\n| Change Log UI | `backend/change_log.php` | New |\n| Stocks & Crypto | `backend/stocks_crypto_service.php`, `backend/stocks_crypto.php` | New |\n| Backend Home | `backend/index.php` | Modified |\n| Documents Editor | `backend/documents.php` | Full rewrite |\n| Documents Service | `backend/document_service.php` | Bug fix |\n\n---\n\n## 1. Bills Manager\n\n### Files\n- `backend/bills_service.php` — 356 lines, service layer\n- `backend/bills.php` — 972 lines, UI page\n\n### Purpose\nReplaces a spreadsheet (`newbills2026.xlsx`) with a web-based bill payment tracker.\nTracks bank account opening balances, monthly bill payments, and computes running bank\nbalances in the same layout as the Excel spreadsheet.\n\n### Database Tables (auto-created on first load)\n\n**`bills_account`**\n| Column | Type | Notes |\n|--------|------|-------|\n| `bills_account_id` | INT PK AUTO | |\n| `name` | VARCHAR(120) | Bank name |\n| `sort_order` | INT | Display order |\n\n**`bills_item`**\n| Column | Type | Notes |\n|--------|------|-------|\n| `bills_item_id` | INT PK AUTO | |\n| `label` | VARCHAR(200) | Bill name |\n| `default_amount` | DECIMAL(12,2) | Pre-fills the Due column |\n| `default_account_id` | INT | Default bank to debit |\n| `notes` | TEXT | Instructions / URLs |\n| `sort_order` | INT | Row order |\n| `is_deleted` | TINYINT | Soft delete |\n\n**`bills_entry`**\nMonthly bill payment rows.\n\n| Column | Type | Notes |\n|--------|------|-------|\n| `bills_entry_id` | INT PK AUTO | |\n| `bills_item_id` | INT | FK to `bills_item` |\n| `year`, `month` | INT | Billing period |\n| `amount_due` | DECIMAL(12,2) | Amount billed |\n| `amount_paid` | DECIMAL(12,2) | Amount actually paid |\n| `account_id` | INT | Bank used to pay |\n\n**`bills_balance`**\nOpening bank balances per month.\n\n| Column | Type | Notes |\n|--------|------|-------|\n| `bills_balance_id` | INT PK AUTO | |\n| `account_id` | INT | FK to `bills_account` |\n| `year`, `month` | INT | Period |\n| `opening_balance` | DECIMAL(14,2) | Balance at start of month |\n\n### Seed Data\nOn first load (empty table), the following are auto-seeded from the original Excel file:\n\n**Accounts:** USAA, MIDFLORIDA, Centenial, CapitalOne\n\n**Bills (11 items):** MidFlorida Mortgage, MidFlorida Credit Card, USAA Credit Card,\nCentenial Bank, Electricity, Waste Management, Comcast/Xfinity, Insurance, Water,\nCapitalOne #1, CapitalOne #2\n\n### Service Functions\n\n```php\napp_install_bills_schema(mysqli $conn): void\napp_bills_seed_defaults(mysqli $conn): void\napp_bills_accounts(mysqli $conn): array\napp_bills_all_accounts(mysqli $conn): array\napp_bills_items(mysqli $conn): array\napp_bills_balances(mysqli $conn, int $year, int $month): array       // map: account_id → float\napp_bills_entries(mysqli $conn, int $year, int $month): array        // map: item_id → [due, paid, account_id]\napp_bills_active_months(mysqli $conn, int $year): array\napp_bills_save_balance(mysqli $conn, int $year, int $month, int $accountId, float $balance): void\napp_bills_save_entry(mysqli $conn, int $year, int $month, int $itemId, ?float $due, ?float $paid, ?int $accountId): void\napp_bills_save_account(mysqli $conn, array $data): int\napp_bills_delete_account(mysqli $conn, int $id): void\napp_bills_save_item(mysqli $conn, array $data): int\napp_bills_delete_item(mysqli $conn, int $id): void\napp_bills_reorder_item(mysqli $conn, int $id, string $dir): void\napp_bills_copy_month(mysqli $conn, int $fromYear, int $fromMonth, int $toYear, int $toMonth): int\n```\n\n### UI Features (`bills.php`)\n- Month/year navigation with ◀ / ▶ buttons and active-month pills\n- **Bank Balances section** — editable opening balance per account, inline Save button\n- **Bills table** — spreadsheet-style rows with:\n  - Amount Due (editable, pre-filled from default)\n  - Amount Paid (editable, AJAX auto-save after 600 ms debounce)\n  - Account selector (which bank pays this bill)\n  - Balance After column (computed client-side in real time)\n  - Up/Down sort buttons\n  - Edit and Delete per row\n- **Sticky running totals sidebar** — shows each bank's current balance as bills are entered\n- **Copy from previous month** — modal to copy all entries from a prior month to the current one\n- **Add Bill / Edit Bill modals**\n- **Add Account / Edit Account modals**\n- All saves use POST/Redirect/GET; bill entry changes auto-save via `fetch()` AJAX\n\n### Running Total Calculation\nJavaScript function `recalcTotals()` walks bills in DOM order, maintains a\n`bal[accountId]` map starting from opening balances, subtracts `amount_paid` from the\nselected account for each bill, and updates the \"Balance After\" column and sidebar panel\nin real time — matching the Excel spreadsheet formula logic.\n\n---\n\n## 2. Next-Day Customer Email Job\n\n### File\n- `backend/jobs/send_nextday_customer_emails.php` — 158 lines\n\n### Purpose\nPHP CLI translation of the VBA macro `RunNextDayCustomerEmails()`.\nQueries `setmore_appointments` for appointments scheduled for tomorrow\n(status ≠ Cancelled) and sends a reminder email to each customer.\n\n### Usage\n```bash\n# Normal run (sends real emails)\nphp backend/jobs/send_nextday_customer_emails.php\n\n# Dry run — prints what would be sent, no emails sent\nphp backend/jobs/send_nextday_customer_emails.php --dry-run\n\n# Override date (for testing a specific date)\nphp backend/jobs/send_nextday_customer_emails.php --date=2026-04-09\n```\n\n### Recommended Cron Schedule\n```\n0 20 * * *  php /path/to/backend/jobs/send_nextday_customer_emails.php\n```\nRuns at 8:00 PM every evening, sends reminders for the following day's appointments.\n\n### Email Content\n- Subject: `Reminder: Your appointment at Ella's Alterations tomorrow`\n- Body matches the original VBA email with full address, phone, 5-line award\n  signature block, and a plain-text fallback\n- Uses `app_send_mail()` / PHPMailer\n\n---\n\n## 3. Cron Manager UI\n\n### File\n- `backend/cron_manager.php` — 482 lines\n\n### Purpose\nWeb UI for managing scheduled background jobs. Stores job definitions in the database,\nallows toggling on/off, running immediately, editing schedules, and exporting to\n`/etc/cron.d/` format.\n\n### Database Table (auto-created)\n\n**`cron_job`**\n| Column | Type | Notes |\n|--------|------|-------|\n| `cron_job_id` | INT PK AUTO | |\n| `label` | VARCHAR(120) | Human name |\n| `description` | TEXT | What the job does |\n| `schedule` | VARCHAR(100) | Cron expression e.g. `0 20 * * *` |\n| `command` | VARCHAR(500) | Shell command to run |\n| `enabled` | TINYINT | 0 = disabled, 1 = enabled |\n| `last_run_at` | DATETIME | Updated on \"Run Now\" |\n| `last_output` | TEXT | Captured stdout/stderr |\n| `sort_order` | INT | Display order |\n\n### Seeded Jobs (on first install)\n1. **Next-Day Customer Emails** — `0 20 * * *` — `php backend/jobs/send_nextday_customer_emails.php`\n2. **Morning Jobs** — `0 7 * * *` — `php backend/jobs/morning_jobs.php`\n3. **Nightly Reports** — `0 23 * * *` — `php backend/jobs/nightly_reports.php`\n4. **DB Backup** — `0 2 * * *` — `bash backend/bin/db_backup.sh`\n5. **Daily Cleanup** — `30 3 * * *` — `php backend/jobs/daily_cleanup.php`\n6. **Add Name Records Auto Delete** — `0 4 * * *` — `php backend/jobs/cleanup_name_records.php`\n\nNew jobs are added idempotently (checked by label before inserting) so existing\ninstallations are not re-seeded.\n\n### UI Features\n- Table listing all jobs with schedule, enabled toggle, last run time\n- **Toggle** — flip enabled/disabled immediately (POST/redirect)\n- **▶ Run Now** — executes the command via `exec()`, captures output, stores to DB, shows in modal\n- **Add / Edit** — form with label, description, command, schedule, enabled flag\n- **Schedule presets** — quick-select buttons (hourly, daily at common times, weekly, monthly)\n- `cron_describe(string $expr): string` — converts `0 20 * * *` → \"Daily at 20:00\"\n- **Export Crontab** — writes `/tmp/customerdb_crontab_export.txt` in `/etc/cron.d/` format\n\n---\n\n## 4. Error Log UI\n\n### File\n- `backend/error_log.php` — 262 lines\n\n### Purpose\nDedicated UI for browsing `backend_error_log` records with filtering, pagination,\nand per-entry management.\n\n### Features\n- **Stats bar** — Total errors, Today's errors, Latest error timestamp\n- **Filter bar** — Search (message/context), Source dropdown, Severity dropdown\n- **Pagination** — 50 per page with smart ellipsis navigator\n- **Per-row delete** — removes individual log entries\n- **Clear All button** — truncates the entire log (with confirmation)\n- JSON context blocks displayed in `<details>` collapsibles with dark monospace styling\n- URL: `/backend/error_log.php`\n\n---\n\n## 5. Change Log UI\n\n### File\n- `backend/change_log.php` — 248 lines\n\n### Purpose\nDedicated UI for browsing `backend_change_log` records — audit trail of all\ndata changes across the application.\n\n### Features\n- **Filter bar** — Search, Area, Action type, Entity type dropdowns\n- **Pagination** — smart ellipsis navigator\n- **Per-row detail panels:**\n  - Before / After / Context — collapsed JSON blocks\n  - Changed Data — open by default, shows the changed fields summary\n- Action badges color-coded by type (create, update, delete)\n- URL: `/backend/change_log.php`\n\n---\n\n## 6. Stocks & Crypto Module\n\n### Files\n- `backend/stocks_crypto_service.php` — 269 lines, service layer\n- `backend/stocks_crypto.php` — 667 lines, UI page\n\n### Purpose\nTrack a personal investment portfolio — individual stocks, ETFs, precious metals,\nand crypto. Supports live price fetching, manual daily price entry, monthly crypto\nbuy tracking, and portfolio gain/loss analysis.\n\n### Database Tables (auto-created)\n\n**`stocks_asset`**\n| Column | Type | Notes |\n|--------|------|-------|\n| `stocks_asset_id` | INT PK AUTO | |\n| `ticker` | VARCHAR(20) | e.g. `AAPL`, `BTC`, `GLD` |\n| `name` | VARCHAR(120) | Display name |\n| `asset_type` | ENUM | `stock`, `etf`, `crypto`, `metal`, `other` |\n| `shares` | DECIMAL(18,8) | Quantity owned |\n| `cost_basis_total` | DECIMAL(14,6) | Total purchase cost |\n| `is_active` | TINYINT | Soft hide |\n\n**`stocks_price`**\nDaily price records.\n\n| Column | Type | Notes |\n|--------|------|-------|\n| `stocks_price_id` | INT PK AUTO | |\n| `ticker` | VARCHAR(20) | |\n| `price_date` | DATE | |\n| `price` | DECIMAL(14,6) | |\n| `source` | VARCHAR(40) | `manual` or `yahoo` |\n\nUnique constraint on `(ticker, price_date)` — upserts with `ON DUPLICATE KEY UPDATE`.\n\n**`crypto_monthly_buy`**\n| Column | Type | Notes |\n|--------|------|-------|\n| `crypto_monthly_buy_id` | INT PK AUTO | |\n| `ticker` | VARCHAR(20) | |\n| `year`, `month` | INT | |\n| `quantity` | DECIMAL(18,8) | Crypto units purchased |\n| `amount_usd` | DECIMAL(14,2) | USD spent |\n| `notes` | VARCHAR(255) | |\n\n### Service Functions\n\n```php\napp_install_stocks_schema(mysqli $conn): void\napp_stocks_assets(mysqli $conn, string $type = ''): array\napp_stocks_save_asset(mysqli $conn, array $data): int\napp_stocks_delete_asset(mysqli $conn, int $id): void\napp_stocks_save_price(mysqli $conn, string $ticker, string $date, float $price, string $source = 'manual'): void\napp_stocks_save_prices_bulk(mysqli $conn, string $date, array $prices): int\napp_stocks_latest_prices(mysqli $conn): array                          // map: ticker → [price, date]\napp_stocks_price_history(mysqli $conn, string $ticker, int $limit = 90): array\napp_stocks_fetch_live_price(string $ticker): ?float                    // Yahoo Finance API, 8s timeout\napp_stocks_fetch_all_live(mysqli $conn): array                         // fetches all active tickers\napp_crypto_monthly_buys(mysqli $conn, int $year, int $month = 0): array\napp_crypto_save_monthly_buy(mysqli $conn, array $data): void\napp_crypto_delete_monthly_buy(mysqli $conn, int $id): void\napp_stocks_dashboard(mysqli $conn): array                              // cost_basis, current_value, gain_loss, gain_pct per asset\napp_stocks_stats(mysqli $conn): array                                  // total portfolio stats\n```\n\n### Live Price Source\nYahoo Finance unofficial API:\n```\nhttps://query1.finance.yahoo.com/v8/finance/chart/{TICKER}?interval=1d&range=1d\n```\n8-second timeout, reads `.chart.result[0].meta.regularMarketPrice`.\n\n### UI Tabs (`stocks_crypto.php`)\n\n1. **Portfolio** — dashboard table with ticker, shares, cost basis, current value,\n   gain/loss, gain %, latest price date. Stats bar shows total value, total cost,\n   total gain/loss. \"Fetch Live Prices\" button calls Yahoo Finance for all tickers.\n\n2. **Enter Prices** — manual daily price entry grid for all active assets,\n   date picker (defaults to today), bulk save.\n\n3. **Crypto Buys** — monthly crypto purchase log. Month/year selector, table of\n   ticker/quantity/USD/notes rows, add and delete per entry.\n\n4. **Add Asset** — form to add a new stock, ETF, crypto, metal, or other asset.\n\n### Auto-Refresh\nA checkbox above the stats bar auto-refreshes the Portfolio tab every 10 seconds.\nState persists in `localStorage` key `sc_auto_refresh`. On reload, strips `?ok=`\nand `?warn=` query params to prevent the notice from repeating every 10 seconds.\n\n---\n\n## 7. Backend Home — New Cards (`index.php`)\n\nSix new cards added to the backend home dashboard:\n\n| Card | Link | Secondary Action |\n|------|------|-----------------|\n| Customer Totals | `/backend/customer_totals.php` | — |\n| Ambient Weather | `/backend/ambient_weather.php` | — |\n| Bills Manager | `/backend/bills.php` | — |\n| Stocks & Crypto | `/backend/stocks_crypto.php` | — |\n| Cron Manager | `/backend/cron_manager.php` | — |\n| Error Log | `/backend/error_log.php` | Change Log |\n\n---\n\n## 8. Documents Editor — Full Rewrite (`documents.php`)\n\n### Problem\nGitHub Copilot introduced several bugs into the previous version:\n- `docLoad()` had mismatched closing braces, breaking the entire function\n- The document library was constrained to ~40% page width inside a grid column\n- The editor was a plain `<textarea>` with no formatting support\n\n### Solution\nComplete rewrite of all HTML, CSS, and JavaScript. PHP POST handlers were kept\nidentical — only the front-end was replaced.\n\n### Editor: EasyMDE\nReplaced the plain textarea with **EasyMDE** (Easy Markdown Editor) via CDN:\n```html\n<link rel=\"stylesheet\" href=\"https://unpkg.com/easymde/dist/easymde.min.css\">\n<script src=\"https://unpkg.com/easymde/dist/easymde.min.js\"></script>\n```\n\nEasyMDE wraps the `<textarea id=\"content_markdown\">` and syncs content on form submit.\n`ta.value = easyMDE.value()` is called explicitly in `submitDoc()` before `form.submit()`.\n\n### Toolbar Buttons\nSave (custom gradient btn) | Bold · Italic · Strikethrough | H1 · H2 · H3 |\nUnordered List · Ordered List · Checklist (custom) | Quote · Code · Table |\nHR · Link · Image URL (custom) | Undo · Redo | Fullscreen | Guide\n\n- **Save** button in toolbar calls `submitDoc()`, same as the Save Document button below\n- **Ctrl+S / Cmd+S** keyboard shortcut via CodeMirror `extraKeys`\n- **Checklist** inserts `- [ ] ` prefix on selected text\n- **Image URL** prompts for URL and alt text, inserts `![alt](url)` syntax\n\n### Preview Toggle\nEasyMDE's built-in `preview` and `side-by-side` buttons were **removed** to prevent\nboth raw markdown and rendered HTML showing simultaneously.\n\nA custom **Preview** button in the panel header replaces them:\n- Uses `marked.js` (CDN) to render the markdown client-side\n- **Preview on**: hides `EasyMDEContainer` and highlight strip; shows `#doc-preview-pane`\n- **Edit on**: hides preview pane; shows EasyMDE and highlight strip; calls `codemirror.refresh()`\n- Loading a document via `docLoad()` automatically returns to edit mode\n- Button state: pill shape, switches between \"👁 Preview\" and \"✏ Edit\" labels\n\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/marked/marked.min.js\"></script>\n```\n\n### `docLoad()` — Clean Rewrite\nOld function had mismatched braces and redundant `editor.value` assignments.\nNew function:\n1. Returns to edit mode if preview is on\n2. Sets heading to \"Loading…\"\n3. Highlights active `<tr>` and `<a>` in library immediately\n4. `fetch('/backend/api/documents.php?backend_document_id=' + id)`\n5. Populates all meta fields (type, title, slug, summary)\n6. Sets `easyMDE.value(content)` from `editor_content` or `content_markdown`\n7. Shows/hides file notice\n8. Calls `renderVersionList(data.versions)`\n9. Updates URL via `history.replaceState()`\n10. Flashes panel border with accent color for 800 ms\n\n### Library Panel — Full Width\nOld layout: library was inside a 2-column grid alongside the editor.\nNew layout:\n```\n[Editor Panel          — full width]\n[Library Panel         — full width, max-height: 460px scrollable]\n[Upload | Versions     — 2-column row]\n```\n\nLive client-side search filters table rows by `textContent` without a page reload.\n\n### Word Count & Highlights\n- Word count and char count update on every keystroke via `codemirror.on('change', ...)`\n- 6 highlight color swatches + a clear option wrap selected text in\n  `<span class=\"hl\" style=\"background:COLOR\">...</span>`\n- Clear highlight strips existing `<span class=\"hl\">` wrappers from selected text\n\n### CSS Theme Conformity (visit.html standard)\nAll custom CSS was updated to match the application theme:\n\n| Property | Before | After |\n|----------|--------|-------|\n| Form input border-radius | `10px` | `12px` (matches `--radius-sm`) |\n| Form input padding | `8px 10px` | `11px 14px` |\n| Field label font-size | `0.73rem` + uppercase | `0.82rem`, no forced uppercase |\n| Field label letter-spacing | `0.07em` | `0.04em` |\n| Focus ring | `outline: 2px solid var(--accent)` | `outline: 2px solid rgba(175,77,49,0.3)` |\n| Panel header background | `rgba(244,239,231,0.6)` hardcoded | `var(--panel)` |\n| Toolbar background | `rgba(244,239,231,0.7)` hardcoded | `rgba(255,255,255,0.55)` |\n| Action bar background | `rgba(244,239,231,0.4)` hardcoded | `rgba(255,255,255,0.25)` |\n| Save button | `background: var(--accent)` | `linear-gradient(135deg, var(--accent), var(--accent-deep))` |\n| Action buttons | `border-radius: 7px` | `border-radius: 999px` pill shape |\n| Active library row tint | `rgba(26,122,154,0.06)` teal | `rgba(175,77,49,0.07)` accent |\n| Type badge (markdown) | `rgba(26,122,154,0.1)` teal | `rgba(175,77,49,0.1)` accent |\n| File notice tint | `rgba(26,122,154,0.06)` teal | `rgba(175,77,49,0.05)` accent |\n\n---\n\n## 9. `document_service.php` — Parse Error Fix\n\n### Problem\nThe function `app_backend_documents_dir()` had its closing `return $path; }` accidentally\ndisplaced to after `app_document_can_edit_inline()` (lines 147–148), with the rest of the\nfile's functions (`app_libreoffice_convert_to_html`, etc.) nested inside the unclosed\nfunction body. This caused a PHP parse error on every request to any page that\n`require_once`'s `document_service.php`, making `app_document_can_edit_inline()`\nappear undefined.\n\n### Fix\nTwo edits to `document_service.php`:\n\n1. Closed `app_backend_documents_dir()` properly after the `mkdir` block:\n```php\nfunction app_backend_documents_dir(): string\n{\n    $path = __DIR__ . '/documents_storage';\n    if (!is_dir($path)) {\n        mkdir($path, 0775, true);\n    }\n    return $path;   // ← added\n}                   // ← added\n```\n\n2. Removed the orphaned `return $path; }` that had been displaced to after\n`app_document_can_edit_inline()` at lines 147–148.\n\n---\n\n## Access URLs\n\n| Module | URL |\n|--------|-----|\n| Backend Home | `/backend/` |\n| Bills Manager | `/backend/bills.php` |\n| Stocks & Crypto | `/backend/stocks_crypto.php` |\n| Cron Manager | `/backend/cron_manager.php` |\n| Error Log | `/backend/error_log.php` |\n| Change Log | `/backend/change_log.php` |\n| Documents | `/backend/documents.php` |\n| Documents API | `/backend/api/documents.php` |\n\n---\n\n## Technology Used\n\n| Library | Version | Purpose |\n|---------|---------|---------|\n| EasyMDE | latest (unpkg CDN) | Rich markdown editor |\n| marked.js | latest (jsdelivr CDN) | Client-side markdown → HTML rendering |\n| Yahoo Finance API | v8 (unofficial) | Live stock/ETF price fetching |\n| PHPMailer | (existing) | Email sending via `app_send_mail()` |\n\n---\n\n## Coding Conventions (consistent with existing codebase)\n\n- `declare(strict_types=1)` in all PHP files\n- `app_db()` for database connections, `mysqli` throughout\n- `app_query_all()`, `app_query_one()`, `app_h()`, `app_send_json()` helpers\n- `app_log_backend_exception()` for error logging\n- POST/Redirect/GET for all form submissions\n- `ON DUPLICATE KEY UPDATE` for safe upserts\n- `app_backend_render_header()` / `app_backend_render_footer()` for page chrome\n- CSS custom properties: `--accent`, `--panel`, `--line`, `--text`, `--muted`, `--shadow`\n- All new tables use `CREATE TABLE IF NOT EXISTS` (idempotent, no separate migration needed)\n","is_text_editable":1,"can_edit_inline":1}
bootstrap.php
2026-04-07 14:06:51 · anonymous · /backend/documents.php
php_error
Cannot modify header information - headers already sent by (output started at /mnt/drive1/customerdb/backend/page_helpers.php:24)
Script: /mnt/drive1/customerdb/webui/backend/documents.php
IP: 192.168.7.128
Context
{"file":"/mnt/drive1/customerdb/backend/bootstrap.php","line":570,"severity_code":2}
bootstrap.php
2026-04-07 14:06:51 · anonymous · /backend/documents.php
php_error
http_response_code(): Cannot set response code - headers already sent (output started at /mnt/drive1/customerdb/backend/page_helpers.php:24)
Script: /mnt/drive1/customerdb/webui/backend/documents.php
IP: 192.168.7.128
Context
{"file":"/mnt/drive1/customerdb/backend/bootstrap.php","line":562,"severity_code":2}
documents.php
2026-04-07 14:06:51 · anonymous · /backend/documents.php
error
Call to undefined function app_document_can_edit_inline()
Script: /mnt/drive1/customerdb/webui/backend/documents.php
IP: 192.168.7.128
Context
{"type":"Error","file":"/mnt/drive1/customerdb/backend/documents.php","line":461,"trace":"#0 {main}"}
square_terminal · refresh_code
2026-04-07 12:44:59 · anonymous · /backend/square_terminal.php?created=1&code=DTMM1Q9V2N4DE
change
backend_square_terminal_code #DTMM1Q9V2N4DE
Context
[]
Before
{"backend_square_terminal_code_id":"43","square_device_code_id":"DTMM1Q9V2N4DE","code_value":"YPAMEA","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:49:34","paired_at":"2026-04-07 16:44:34","raw_json":"{\"id\":\"DTMM1Q9V2N4DE\",\"name\":\"Front Desk Terminal\",\"code\":\"YPAMEA\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:49:34.000Z\",\"created_at\":\"2026-04-07T16:44:34.226Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:44:34.000Z\"}","created_at":"2026-04-07 12:44:34","updated_at":"2026-04-07 12:44:34"}
After
{"backend_square_terminal_code_id":"43","square_device_code_id":"DTMM1Q9V2N4DE","code_value":"YPAMEA","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"PAIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"2026-04-07 16:44:53","raw_json":"{\"id\":\"DTMM1Q9V2N4DE\",\"name\":\"Front Desk Terminal\",\"code\":\"YPAMEA\",\"device_id\":\"343CS149B6001234\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:44:34.000Z\",\"status\":\"PAIRED\",\"status_changed_at\":\"2026-04-07T16:44:53.000Z\",\"paired_at\":\"2026-04-07T16:44:53.000Z\"}","created_at":"2026-04-07 12:44:34","updated_at":"2026-04-07 12:44:59"}
square_terminal · create_code
2026-04-07 12:44:34 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #DTMM1Q9V2N4DE
Context
[]
Before
[]
After
{"backend_square_terminal_code_id":"43","square_device_code_id":"DTMM1Q9V2N4DE","code_value":"YPAMEA","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:49:34","paired_at":"2026-04-07 16:44:34","raw_json":"{\"id\":\"DTMM1Q9V2N4DE\",\"name\":\"Front Desk Terminal\",\"code\":\"YPAMEA\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:49:34.000Z\",\"created_at\":\"2026-04-07T16:44:34.226Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:44:34.000Z\"}","created_at":"2026-04-07 12:44:34","updated_at":"2026-04-07 12:44:34"}
square_terminal · refresh_code
2026-04-07 12:32:47 · anonymous · /backend/square_terminal.php?refreshed_codes=4
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:32:39"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:32:47"}
square_terminal · refresh_code
2026-04-07 12:32:40 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #5JVYM58J39RMV
Context
[]
Before
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:09:16"}
After
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:32:40"}
square_terminal · refresh_code
2026-04-07 12:32:40 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #7M14JAR5FMGAR
Context
[]
Before
{"backend_square_terminal_code_id":"9","square_device_code_id":"7M14JAR5FMGAR","code_value":"HCWMAB","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"7M14JAR5FMGAR\",\"name\":\"Front Desk Terminal\",\"code\":\"HCWMAB\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:10:16.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:10:16","updated_at":"2026-04-07 12:22:56"}
After
{"backend_square_terminal_code_id":"9","square_device_code_id":"7M14JAR5FMGAR","code_value":"HCWMAB","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"7M14JAR5FMGAR\",\"name\":\"Front Desk Terminal\",\"code\":\"HCWMAB\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:10:16.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:10:16","updated_at":"2026-04-07 12:32:40"}
square_terminal · refresh_code
2026-04-07 12:32:39 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #J2DTPYA05PXJ8
Context
[]
Before
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:28:57"}
After
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:32:39"}
square_terminal · refresh_code
2026-04-07 12:32:39 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:32:31"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:32:39"}
square_terminal · refresh_code
2026-04-07 12:32:31 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:32:27"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:32:31"}
square_terminal · refresh_code
2026-04-07 12:32:27 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:32:22"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:32:27"}
square_terminal · refresh_code
2026-04-07 12:32:22 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:56"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:32:22"}
square_terminal · refresh_code
2026-04-07 12:30:56 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:53"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:56"}
square_terminal · refresh_code
2026-04-07 12:30:53 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:50"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:53"}
square_terminal · refresh_code
2026-04-07 12:30:50 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:46"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:50"}
square_terminal · refresh_code
2026-04-07 12:30:46 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:37"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:46"}
square_terminal · refresh_code
2026-04-07 12:30:37 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:34"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:37"}
square_terminal · refresh_code
2026-04-07 12:30:34 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:30"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:34"}
square_terminal · refresh_code
2026-04-07 12:30:30 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:19"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:30"}
square_terminal · refresh_code
2026-04-07 12:30:19 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:14"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:19"}
square_terminal · refresh_code
2026-04-07 12:30:14 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:11"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:14"}
square_terminal · refresh_code
2026-04-07 12:30:11 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:06"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:11"}
square_terminal · refresh_code
2026-04-07 12:30:06 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:29:58"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:30:06"}
square_terminal · refresh_code
2026-04-07 12:29:58 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:29:26"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:29:58"}
square_terminal · refresh_code
2026-04-07 12:29:26 · anonymous · /backend/square_terminal.php?created=1&code=PMCKQJJ4CRN5W
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:01.854Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:29:02"}
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:02.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:29:26"}
square_terminal · create_code
2026-04-07 12:29:02 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #PMCKQJJ4CRN5W
Context
[]
Before
[]
After
{"backend_square_terminal_code_id":"21","square_device_code_id":"PMCKQJJ4CRN5W","code_value":"FTRVTD","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:34:01","paired_at":"2026-04-07 16:29:01","raw_json":"{\"id\":\"PMCKQJJ4CRN5W\",\"name\":\"Front Desk Terminal\",\"code\":\"FTRVTD\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:34:01.000Z\",\"created_at\":\"2026-04-07T16:29:01.854Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:29:01.000Z\"}","created_at":"2026-04-07 12:29:02","updated_at":"2026-04-07 12:29:02"}
square_terminal · refresh_code
2026-04-07 12:28:57 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #J2DTPYA05PXJ8
Context
[]
Before
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:28:35"}
After
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:28:57"}
square_terminal · refresh_code
2026-04-07 12:28:35 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #J2DTPYA05PXJ8
Context
[]
Before
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:28:06","paired_at":"2026-04-07 16:23:06","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:28:06.000Z\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:23:06.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:27:47"}
After
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:28:35"}
square_terminal · refresh_code
2026-04-07 12:27:47 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #J2DTPYA05PXJ8
Context
[]
Before
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:28:06","paired_at":"2026-04-07 16:23:06","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:28:06.000Z\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:23:06.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:27:43"}
After
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:28:06","paired_at":"2026-04-07 16:23:06","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:28:06.000Z\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:23:06.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:27:47"}
square_terminal · refresh_code
2026-04-07 12:27:43 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #J2DTPYA05PXJ8
Context
[]
Before
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:28:06","paired_at":"2026-04-07 16:23:06","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:28:06.000Z\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:23:06.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:27:38"}
After
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:28:06","paired_at":"2026-04-07 16:23:06","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:28:06.000Z\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:23:06.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:27:43"}
square_terminal · refresh_code
2026-04-07 12:27:38 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #J2DTPYA05PXJ8
Context
[]
Before
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:28:06","paired_at":"2026-04-07 16:23:06","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:28:06.000Z\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:23:06.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:27:22"}
After
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:28:06","paired_at":"2026-04-07 16:23:06","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:28:06.000Z\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:23:06.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:27:38"}
square_terminal · refresh_code
2026-04-07 12:27:22 · anonymous · /backend/square_terminal.php?created=1&code=J2DTPYA05PXJ8
change
backend_square_terminal_code #J2DTPYA05PXJ8
Context
[]
Before
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:28:06","paired_at":"2026-04-07 16:23:06","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:28:06.000Z\",\"created_at\":\"2026-04-07T16:23:06.476Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:23:06.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:23:06"}
After
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:28:06","paired_at":"2026-04-07 16:23:06","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:28:06.000Z\",\"created_at\":\"2026-04-07T16:23:06.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:23:06.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:27:22"}
square_terminal · create_code
2026-04-07 12:23:06 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #J2DTPYA05PXJ8
Context
[]
Before
[]
After
{"backend_square_terminal_code_id":"14","square_device_code_id":"J2DTPYA05PXJ8","code_value":"SVDRSM","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:28:06","paired_at":"2026-04-07 16:23:06","raw_json":"{\"id\":\"J2DTPYA05PXJ8\",\"name\":\"Front Desk Terminal\",\"code\":\"SVDRSM\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:28:06.000Z\",\"created_at\":\"2026-04-07T16:23:06.476Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:23:06.000Z\"}","created_at":"2026-04-07 12:23:06","updated_at":"2026-04-07 12:23:06"}
square_terminal · refresh_code
2026-04-07 12:22:56 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #7M14JAR5FMGAR
Context
[]
Before
{"backend_square_terminal_code_id":"9","square_device_code_id":"7M14JAR5FMGAR","code_value":"HCWMAB","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:15:16","paired_at":"2026-04-07 16:10:16","raw_json":"{\"id\":\"7M14JAR5FMGAR\",\"name\":\"Front Desk Terminal\",\"code\":\"HCWMAB\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:15:16.000Z\",\"created_at\":\"2026-04-07T16:10:16.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:10:16.000Z\"}","created_at":"2026-04-07 12:10:16","updated_at":"2026-04-07 12:10:25"}
After
{"backend_square_terminal_code_id":"9","square_device_code_id":"7M14JAR5FMGAR","code_value":"HCWMAB","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"7M14JAR5FMGAR\",\"name\":\"Front Desk Terminal\",\"code\":\"HCWMAB\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:10:16.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:10:16","updated_at":"2026-04-07 12:22:56"}
square_terminal · refresh_code
2026-04-07 12:10:25 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #7M14JAR5FMGAR
Context
[]
Before
{"backend_square_terminal_code_id":"9","square_device_code_id":"7M14JAR5FMGAR","code_value":"HCWMAB","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:15:16","paired_at":"2026-04-07 16:10:16","raw_json":"{\"id\":\"7M14JAR5FMGAR\",\"name\":\"Front Desk Terminal\",\"code\":\"HCWMAB\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:15:16.000Z\",\"created_at\":\"2026-04-07T16:10:16.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:10:16.000Z\"}","created_at":"2026-04-07 12:10:16","updated_at":"2026-04-07 12:10:22"}
After
{"backend_square_terminal_code_id":"9","square_device_code_id":"7M14JAR5FMGAR","code_value":"HCWMAB","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:15:16","paired_at":"2026-04-07 16:10:16","raw_json":"{\"id\":\"7M14JAR5FMGAR\",\"name\":\"Front Desk Terminal\",\"code\":\"HCWMAB\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:15:16.000Z\",\"created_at\":\"2026-04-07T16:10:16.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:10:16.000Z\"}","created_at":"2026-04-07 12:10:16","updated_at":"2026-04-07 12:10:25"}
square_terminal · refresh_code
2026-04-07 12:10:22 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #7M14JAR5FMGAR
Context
[]
Before
{"backend_square_terminal_code_id":"9","square_device_code_id":"7M14JAR5FMGAR","code_value":"HCWMAB","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:15:16","paired_at":"2026-04-07 16:10:16","raw_json":"{\"id\":\"7M14JAR5FMGAR\",\"name\":\"Front Desk Terminal\",\"code\":\"HCWMAB\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:15:16.000Z\",\"created_at\":\"2026-04-07T16:10:16.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:10:16.000Z\"}","created_at":"2026-04-07 12:10:16","updated_at":"2026-04-07 12:10:19"}
After
{"backend_square_terminal_code_id":"9","square_device_code_id":"7M14JAR5FMGAR","code_value":"HCWMAB","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:15:16","paired_at":"2026-04-07 16:10:16","raw_json":"{\"id\":\"7M14JAR5FMGAR\",\"name\":\"Front Desk Terminal\",\"code\":\"HCWMAB\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:15:16.000Z\",\"created_at\":\"2026-04-07T16:10:16.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:10:16.000Z\"}","created_at":"2026-04-07 12:10:16","updated_at":"2026-04-07 12:10:22"}
square_terminal · refresh_code
2026-04-07 12:10:19 · anonymous · /backend/square_terminal.php?created=1&code=7M14JAR5FMGAR
change
backend_square_terminal_code #7M14JAR5FMGAR
Context
[]
Before
{"backend_square_terminal_code_id":"9","square_device_code_id":"7M14JAR5FMGAR","code_value":"HCWMAB","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:15:16","paired_at":"2026-04-07 16:10:16","raw_json":"{\"id\":\"7M14JAR5FMGAR\",\"name\":\"Front Desk Terminal\",\"code\":\"HCWMAB\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:15:16.000Z\",\"created_at\":\"2026-04-07T16:10:16.419Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:10:16.000Z\"}","created_at":"2026-04-07 12:10:16","updated_at":"2026-04-07 12:10:16"}
After
{"backend_square_terminal_code_id":"9","square_device_code_id":"7M14JAR5FMGAR","code_value":"HCWMAB","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:15:16","paired_at":"2026-04-07 16:10:16","raw_json":"{\"id\":\"7M14JAR5FMGAR\",\"name\":\"Front Desk Terminal\",\"code\":\"HCWMAB\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:15:16.000Z\",\"created_at\":\"2026-04-07T16:10:16.000Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:10:16.000Z\"}","created_at":"2026-04-07 12:10:16","updated_at":"2026-04-07 12:10:19"}
square_terminal · create_code
2026-04-07 12:10:16 · anonymous · /backend/square_terminal.php?synced=0
change
backend_square_terminal_code #7M14JAR5FMGAR
Context
[]
Before
[]
After
{"backend_square_terminal_code_id":"9","square_device_code_id":"7M14JAR5FMGAR","code_value":"HCWMAB","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:15:16","paired_at":"2026-04-07 16:10:16","raw_json":"{\"id\":\"7M14JAR5FMGAR\",\"name\":\"Front Desk Terminal\",\"code\":\"HCWMAB\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:15:16.000Z\",\"created_at\":\"2026-04-07T16:10:16.419Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:10:16.000Z\"}","created_at":"2026-04-07 12:10:16","updated_at":"2026-04-07 12:10:16"}
square_terminal · refresh_code
2026-04-07 12:09:16 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #5JVYM58J39RMV
Context
[]
Before
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:09:12"}
After
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:09:16"}
square_terminal · refresh_code
2026-04-07 12:09:12 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #5JVYM58J39RMV
Context
[]
Before
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:09:07"}
After
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:09:12"}
square_terminal · refresh_code
2026-04-07 12:09:07 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #5JVYM58J39RMV
Context
[]
Before
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:09:01"}
After
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:09:07"}
square_terminal · refresh_code
2026-04-07 12:09:01 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #5JVYM58J39RMV
Context
[]
Before
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:08:58"}
After
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:09:01"}
square_terminal · refresh_code
2026-04-07 12:08:58 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #5JVYM58J39RMV
Context
[]
Before
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:08:54"}
After
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:08:58"}
square_terminal · refresh_code
2026-04-07 12:08:54 · anonymous · /backend/square_terminal.php?refreshed=1
change
backend_square_terminal_code #5JVYM58J39RMV
Context
[]
Before
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:08:37"}
After
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:08:54"}
square_terminal · refresh_code
2026-04-07 12:08:37 · anonymous · /backend/square_terminal.php?created=1&code=5JVYM58J39RMV
change
backend_square_terminal_code #5JVYM58J39RMV
Context
[]
Before
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:05:24","paired_at":"2026-04-07 16:00:24","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:05:24.000Z\",\"created_at\":\"2026-04-07T16:00:24.731Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:00:24.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:00:24"}
After
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"EXPIRED","location_id":"5W9V4C95PWDVQ","pair_by":null,"paired_at":"1970-01-01 00:00:00","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"created_at\":\"2026-04-07T16:00:25.000Z\",\"status\":\"EXPIRED\",\"status_changed_at\":\"1970-01-01T00:00:00.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:08:37"}
square_terminal · create_code
2026-04-07 12:00:24 · anonymous · /backend/square_terminal.php
change
backend_square_terminal_code #5JVYM58J39RMV
Context
[]
Before
[]
After
{"backend_square_terminal_code_id":"1","square_device_code_id":"5JVYM58J39RMV","code_value":"NJQDJK","device_name":"Front Desk Terminal","product_type":"TERMINAL_API","code_status":"UNPAIRED","location_id":"5W9V4C95PWDVQ","pair_by":"2026-04-07 16:05:24","paired_at":"2026-04-07 16:00:24","raw_json":"{\"id\":\"5JVYM58J39RMV\",\"name\":\"Front Desk Terminal\",\"code\":\"NJQDJK\",\"product_type\":\"TERMINAL_API\",\"location_id\":\"5W9V4C95PWDVQ\",\"pair_by\":\"2026-04-07T16:05:24.000Z\",\"created_at\":\"2026-04-07T16:00:24.731Z\",\"status\":\"UNPAIRED\",\"status_changed_at\":\"2026-04-07T16:00:24.000Z\"}","created_at":"2026-04-07 12:00:24","updated_at":"2026-04-07 12:00:24"}
documents · upload
2026-04-07 11:53:37 · anonymous · /backend/documents.php
change
backend_document #9
Context
{"file_name":"README-libreoffice-conversion.md","mime_type":"application/octet-stream"}
Before
[]
After
{"backend_document_id":"9","document_type":"upload","title":"Copilot - document changes","slug":"copilot-document-changes","summary_text":"Copilot - document changes to this module","content_markdown":null,"content_html":null,"file_name":"README-libreoffice-conversion.md","stored_name":"20260407-155337-5741b116.md","mime_type":"application/octet-stream","file_size_bytes":"10541","storage_path":"/mnt/drive1/customerdb/backend/documents_storage/20260407-155337-5741b116.md","is_deleted":"0","created_at":"2026-04-07 11:53:37","updated_at":"2026-04-07 11:53:37","editor_content":"# LibreOffice Conversion & Editor Integration\r\n\r\nThis document describes the features added to support server-side LibreOffice conversions, the asynchronous conversion queue and worker, frontend changes, and deployment/run instructions.\r\n\r\nIMPORTANT: This document assumes the project root is the repo root (e.g. `C:\\code\\customerdb`) and paths below are relative to it.\r\n\r\n---\r\n\r\n## Overview\r\n\r\nSummary of what was added or changed:\r\n\r\n- Frontend/editor\r\n  - `backend/documents.php`\r\n    - Replaced simple markdown renderer with `marked.js` and added Prism highlighting.\r\n    - Toolbar: Save button, view toggles, fullscreen, color highlight swatches that wrap selected text in a `<span class=\"hl\" style=\"background:...\">`.\r\n    - Files that can be edited inline show an **Edit** button and load into the editor; non-inline files show **Open** (open stored file in new tab).\r\n    - When a file is non-inline and conversion is pending, the preview shows a conversion status block and polls the API until `content_html` becomes available.\r\n\r\n- Document extraction & conversion helpers\r\n  - `backend/document_service.php`\r\n    - Added `app_document_can_edit_inline()` to detect files editable directly in the textarea.\r\n    - Implemented lightweight extraction for `docx`, `odt`, `rtf`, `pptx`, `xlsx` where possible (Zip-based parsing for Office formats).\r\n    - Added LibreOffice helpers: `app_libreoffice_find_command()`, `app_libreoffice_convert_to_html()`, `app_libreoffice_convert_to_text()`.\r\n    - Added queuing hook `app_conversion_enqueue()` to create file-based jobs and insert DB job rows.\r\n\r\n- Asynchronous conversion queue and worker\r\n  - Job queue storage: `backend/documents_storage/convert_queue/job-*.json`.\r\n  - DB tracking: table `backend_conversion_job` to track job lifecycle (`queued`, `processing`, `done`, `error`, `cancelled`).\r\n  - Worker script: `backend/bin/convert_worker.php` ? processes job files, runs LibreOffice conversions, saves results to `backend_document.content_html` and updates job status in DB.\r\n  - Example systemd unit: `backend/systemd/convert-worker.service` (adjust paths/user before enabling).\r\n\r\n- API to manage jobs\r\n  - `backend/api/conversion_jobs.php` ? list jobs and `POST` actions: `retry`, `cancel`.\r\n\r\n- Migration and helper tooling\r\n  - Migration SQL: `migrations/20260407_add_conversion_job.sql` ? creates job table and ensures `content_html` on `backend_document`.\r\n  - Migration runner: `backend/bin/run_migration.php` ? executes the migration SQL using the app DB connection.\r\n\r\n---\r\n\r\n## File map (key files)\r\n\r\n- `backend/documents.php` ? Editor UI, preview handling, polling, highlight UI.\r\n- `backend/document_service.php` ? Extraction/queue helpers and LibreOffice integration.\r\n- `backend/api/documents.php` ? Document detail API used by frontend.\r\n- `backend/api/conversion_jobs.php` ? New API to list/manage conversion jobs.\r\n- `backend/bin/convert_worker.php` ? Worker that runs LibreOffice and updates DB.\r\n- `backend/bin/run_migration.php` ? Helper to run SQL migration with application DB config.\r\n- `migrations/20260407_add_conversion_job.sql` ? SQL migration file to apply.\r\n- `backend/systemd/convert-worker.service` ? example systemd unit to run worker as daemon.\r\n\r\n---\r\n\r\n## Database changes\r\n\r\nThe migration will:\r\n\r\n1. Create table `backend_conversion_job` with columns:\r\n   - `conversion_job_id` (PK)\r\n   - `backend_document_id` (FK-ish)\r\n   - `status` (VARCHAR) values: `queued`, `processing`, `done`, `error`, `cancelled`\r\n   - `storage_path`, `output_path`, `error_text`, `created_at`, `updated_at`\r\n\r\n2. Ensure `backend_document.content_html` LONGTEXT column exists (used for serving converted HTML previews).\r\n\r\nMigration file: `migrations/20260407_add_conversion_job.sql`\r\n\r\n### Apply migration\r\n\r\nTwo options:\r\n\r\n- Run via the application DB connection (uses `app_db()` settings in `bootstrap.php`):\r\n\r\n  - From repository root:\r\n\r\n    ```bash\r\n    php backend/bin/run_migration.php\r\n    ```\r\n\r\n  - This script reads `migrations/20260407_add_conversion_job.sql` and executes the statements.\r\n\r\n- Run directly with MariaDB client (replace placeholders):\r\n\r\n  ```bash\r\n  mysql -u <db_user> -p ellas_alterations < migrations/20260407_add_conversion_job.sql\r\n  ```\r\n\r\nNote: The app expects the `ellas_alterations` database (the DB name you mentioned). Ensure the DB user has `CREATE/ALTER` privileges.\r\n\r\n---\r\n\r\n## Server prerequisites\r\n\r\n- LibreOffice must be installed and available on PATH as `libreoffice` or `soffice`.\r\n  - Debian/Ubuntu example: `sudo apt update && sudo apt install -y libreoffice`\r\n- PHP must have `exec()` available for the worker process (worker uses `exec()` to invoke LibreOffice).\r\n- PHP `ZipArchive` extension (`php-zip`) is recommended for better extraction of docx/odt/pptx/xlsx.\r\n- The web/worker user must have read access to the stored files and write access to:\r\n  - `backend/documents_storage/convert_queue` (job files)\r\n- Prevent running conversions as `root` in production ? configure a dedicated unprivileged user.\r\n\r\nSecurity note: Converting user-uploaded files can be risky. Run the worker as a dedicated, restricted user, and consider sandboxing or containerization.\r\n\r\n---\r\n\r\n## Worker (how it runs)\r\n\r\n- Manual run (process queued jobs once):\r\n\r\n  ```bash\r\n  php backend/bin/convert_worker.php\r\n  ```\r\n\r\n- Run continuously for development/testing:\r\n\r\n  ```bash\r\n  while true; do php backend/bin/convert_worker.php; sleep 3; done\r\n  ```\r\n\r\n- Systemd service (example):\r\n  - Copy `backend/systemd/convert-worker.service` to `/etc/systemd/system/convert-worker.service` and update `WorkingDirectory` and `ExecStart` to match your deployment path.\r\n  - Enable and start:\r\n\r\n    ```bash\r\n    sudo systemctl daemon-reload\r\n    sudo systemctl enable --now convert-worker.service\r\n    sudo systemctl status convert-worker.service\r\n    ```\r\n\r\nThe worker behavior:\r\n- Scans `backend/documents_storage/convert_queue/` for `job-*.json` files.\r\n- Marks DB job `status = processing` and updates the JSON job file with a timestamp.\r\n- Runs LibreOffice to convert the source file to HTML. If that fails, it attempts to convert to plain text.\r\n- On success, writes converted HTML (or text wrapped as HTML) into `backend_document.content_html` and updates job row `status = done` and `output_path`.\r\n- On failure, updates job row `status = error` and stores `error_text`.\r\n- Removes the job file when finished.\r\n\r\nNote: The worker updates DB rows using the same DB configuration as the app.\r\n\r\n---\r\n\r\n## API: managing conversion jobs\r\n\r\n- List jobs\r\n  - `GET /backend/api/conversion_jobs.php`\r\n  - Returns recent job rows (limited to 200)\r\n\r\n- Retry a job\r\n  - `POST /backend/api/conversion_jobs.php` with JSON body `{ \"action\": \"retry\", \"conversion_job_id\": <id> }`\r\n  - Re-enqueues a job and marks DB row `status = 'queued'`.\r\n\r\n- Cancel a job\r\n  - `POST /backend/api/conversion_jobs.php` with JSON body `{ \"action\": \"cancel\", \"conversion_job_id\": <id> }`\r\n\r\nThe endpoint returns JSON success or error messages.\r\n\r\n---\r\n\r\n## Frontend behavior & UX\r\n\r\n- When selecting a document in the backend Documents UI:\r\n  - If `document.can_edit_inline` is true, the **Edit** button loads the document into the textarea editor.\r\n  - If not editable inline:\r\n    - If `document.content_html` exists, the preview renders the converted HTML (Prism highlighting applied).\r\n    - If `content_html` is missing, the preview shows a **Conversion pending...** panel with a placeholder progress bar and `convertStatus` text ? the page polls the documents API until `content_html` becomes available.\r\n\r\n- Save / highlights\r\n  - Toolbar Save button submits the same form as the Save Document button.\r\n  - Highlight swatches wrap selected text with `<span class=\"hl\" style=\"background:...\">` which renders in the preview. Highlights will be saved inside `content_markdown` (persisted as HTML markup in the markdown content).\r\n\r\n---\r\n\r\n## How to test end-to-end\r\n\r\n1. Ensure migration applied and DB reachable.\r\n2. Ensure LibreOffice is installed and the worker can run `exec()`.\r\n3. Upload a `.docx` / `.pptx` / `.odt` file using the Upload form in the backend.\r\n4. Check that a JSON job file appears in `backend/documents_storage/convert_queue/` and a row is created in `backend_conversion_job` with `status = queued`.\r\n5. Run the worker manually: `php backend/bin/convert_worker.php`.\r\n6. Worker should convert and update `backend_document.content_html` and set job `status = done`.\r\n7. In the Documents page, select the document: the preview should update to show converted HTML (or show Conversion pending until conversion completes).\r\n\r\n---\r\n\r\n## Troubleshooting\r\n\r\n- No jobs processed:\r\n  - Ensure worker runs under an account that can read job files and run `libreoffice`.\r\n  - Confirm `libreoffice` is on PATH and `php -r \"echo shell_exec('command -v libreoffice');\"` returns a path.\r\n  - Check permissions of `backend/documents_storage/convert_queue/`.\r\n\r\n- Conversion fails / `status = error`:\r\n  - Inspect `backend_conversion_job.error_text` for details.\r\n  - Try running `php backend/bin/convert_worker.php` manually and capture output.\r\n  - Confirm LibreOffice works on the file from the worker user: `libreoffice --headless --convert-to html --outdir /tmp /path/to/file.docx`.\r\n\r\n- HTML content looks malformed or contains unsafe markup:\r\n  - Sanitize HTML before serving (recommended). Consider `HTMLPurifier` or a whitelist approach.\r\n\r\n---\r\n\r\n## Recommended next improvements (future work)\r\n\r\n- Migrate the queue to a DB-backed atomic queue (use `backend_conversion_job` rows as the primary queue source) so workers select and lock rows (avoid file races).\r\n- Sanitize `content_html` before storing/serving.\r\n- Add a small admin page to list conversion jobs and perform retry/cancel from the UI (calls `backend/api/conversion_jobs.php`).\r\n- Add metrics & logging for conversion durations and failure counts.\r\n- Implement a retention policy / cleanup job for old job records and temp files.\r\n\r\n---\r\n\r\n## Contact / follow-up\r\n\r\nTell me which of the following you want next and I will implement it:\r\n\r\n- Convert the file-based queue to a DB-atomic queue (worker picks rows with `status='queued'` using an atomic update), and remove JSON job files.\r\n- Add the admin UI to manage conversion jobs inside the backend.\r\n- Implement HTML sanitization of `content_html` prior to storage.\r\n- Update the systemd unit to match the exact server paths & user if you give me that information.\r\n\r\n\r\n\r\n---\r\n\r\n*Document generated by GitHub Copilot.*\r\n","is_text_editable":1,"can_edit_inline":1}
document_service.php
2026-04-07 11:53:37 · anonymous · /backend/documents.php?backend_document_id=9&uploaded=1
error
Call to undefined function app_document_can_edit_inline()
Script: /mnt/drive1/customerdb/webui/backend/documents.php
IP: 192.168.7.128
Context
{"type":"Error","file":"/mnt/drive1/customerdb/backend/document_service.php","line":199,"trace":"#0 /mnt/drive1/customerdb/backend/documents.php(54): app_document_detail()\n#1 {main}"}
← Prev 1 6106 6107 6108 6109 Next →