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,654
Errors (total)860,436
Today · changes0
Today · errors293
Reset

862,090 results · Page 17240 of 17242

live_table_manager · delete
2026-04-11 18:58:02 · anonymous · /backend/live_table_manager.php?table=item_types&q=&ok=deleted
change
item_types #276
Context
[]
Before
{"item_type_id":"276","type_name":"Satin"}
After
{"deleted":true}
live_table_manager · delete
2026-04-11 18:58:02 · anonymous · /backend/live_table_manager.php?table=item_types&q=&ok=deleted
change
item_types #279
Context
[]
Before
{"item_type_id":"279","type_name":"lace tulle 5 to layers"}
After
{"deleted":true}
live_table_manager · delete
2026-04-11 18:58:02 · anonymous · /backend/live_table_manager.php?table=item_types&q=&ok=deleted
change
item_types #282
Context
[]
Before
{"item_type_id":"282","type_name":"tulle and beaded"}
After
{"deleted":true}
live_table_manager · delete
2026-04-11 18:57:29 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted
change
item_types #408
Context
[]
Before
{"item_type_id":"408","type_name":"Fix"}
After
{"deleted":true}
live_table_manager.php
2026-04-11 18:55:35 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted
error
Cannot delete this record because other rows still reference it via a foreign key. Remove or re-link the dependent rows first, then try deleting again.
Script: /mnt/drive1/customerdb/webui/backend/live_table_manager.php
IP: 192.168.7.132
Context
{"table":"item_types","type":"RuntimeException","file":"/mnt/drive1/customerdb/backend/live_table_manager_service.php","line":191,"trace":"#0 /mnt/drive1/customerdb/backend/live_table_manager.php(31): app_live_table_delete()\n#1 /mnt/drive1/customerdb/webui/backend/live_table_manager.php(5): require('...')\n#2 {main}"}
live_table_manager.php
2026-04-11 18:55:23 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted
error
Cannot delete this record because other rows still reference it via a foreign key. Remove or re-link the dependent rows first, then try deleting again.
Script: /mnt/drive1/customerdb/webui/backend/live_table_manager.php
IP: 192.168.7.132
Context
{"table":"item_types","type":"RuntimeException","file":"/mnt/drive1/customerdb/backend/live_table_manager_service.php","line":191,"trace":"#0 /mnt/drive1/customerdb/backend/live_table_manager_service.php(210): app_live_table_delete()\n#1 /mnt/drive1/customerdb/backend/live_table_manager.php(36): app_live_table_delete_many()\n#2 /mnt/drive1/customerdb/webui/backend/live_table_manager.php(5): require('...')\n#3 {main}"}
live_table_manager.php
2026-04-11 18:55:13 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted
error
Cannot delete this record because other rows still reference it via a foreign key. Remove or re-link the dependent rows first, then try deleting again.
Script: /mnt/drive1/customerdb/webui/backend/live_table_manager.php
IP: 192.168.7.132
Context
{"table":"item_types","type":"RuntimeException","file":"/mnt/drive1/customerdb/backend/live_table_manager_service.php","line":191,"trace":"#0 /mnt/drive1/customerdb/backend/live_table_manager_service.php(210): app_live_table_delete()\n#1 /mnt/drive1/customerdb/backend/live_table_manager.php(36): app_live_table_delete_many()\n#2 /mnt/drive1/customerdb/webui/backend/live_table_manager.php(5): require('...')\n#3 {main}"}
live_table_manager.php
2026-04-11 18:54:56 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted
error
Cannot delete this record because other rows still reference it via a foreign key. Remove or re-link the dependent rows first, then try deleting again.
Script: /mnt/drive1/customerdb/webui/backend/live_table_manager.php
IP: 192.168.7.132
Context
{"table":"item_types","type":"RuntimeException","file":"/mnt/drive1/customerdb/backend/live_table_manager_service.php","line":191,"trace":"#0 /mnt/drive1/customerdb/backend/live_table_manager_service.php(210): app_live_table_delete()\n#1 /mnt/drive1/customerdb/backend/live_table_manager.php(36): app_live_table_delete_many()\n#2 /mnt/drive1/customerdb/webui/backend/live_table_manager.php(5): require('...')\n#3 {main}"}
live_table_manager.php
2026-04-11 18:47:22 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted
error
Cannot delete this item type because it is used by 1 alteration item(s) in order_items. Reassign those items to another type (or clear item_type_id) first, then delete this row.
Script: /mnt/drive1/customerdb/webui/backend/live_table_manager.php
IP: 192.168.7.132
Context
{"table":"item_types","type":"RuntimeException","file":"/mnt/drive1/customerdb/backend/live_table_manager_service.php","line":186,"trace":"#0 /mnt/drive1/customerdb/backend/live_table_manager_service.php(219): app_live_table_delete()\n#1 /mnt/drive1/customerdb/backend/live_table_manager.php(36): app_live_table_delete_many()\n#2 /mnt/drive1/customerdb/webui/backend/live_table_manager.php(5): require('...')\n#3 {main}"}
live_table_manager.php
2026-04-11 18:47:07 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted
error
Cannot delete this item type because it is used by 1 alteration item(s) in order_items. Reassign those items to another type (or clear item_type_id) first, then delete this row.
Script: /mnt/drive1/customerdb/webui/backend/live_table_manager.php
IP: 192.168.7.132
Context
{"table":"item_types","type":"RuntimeException","file":"/mnt/drive1/customerdb/backend/live_table_manager_service.php","line":186,"trace":"#0 /mnt/drive1/customerdb/backend/live_table_manager_service.php(219): app_live_table_delete()\n#1 /mnt/drive1/customerdb/backend/live_table_manager.php(36): app_live_table_delete_many()\n#2 /mnt/drive1/customerdb/webui/backend/live_table_manager.php(5): require('...')\n#3 {main}"}
live_table_manager.php
2026-04-11 18:44:59 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted
error
Cannot delete or update a parent row: a foreign key constraint fails (`ellas_alterations`.`order_items`, CONSTRAINT `fk_order_items_item_type` FOREIGN KEY (`item_type_id`) REFERENCES `item_types` (`item_type_id`))
Script: /mnt/drive1/customerdb/webui/backend/live_table_manager.php
IP: 192.168.7.132
Context
{"table":"item_types","type":"mysqli_sql_exception","file":"/mnt/drive1/customerdb/backend/live_table_manager_service.php","line":182,"trace":"#0 /mnt/drive1/customerdb/backend/live_table_manager_service.php(182): mysqli->query()\n#1 /mnt/drive1/customerdb/backend/live_table_manager_service.php(196): app_live_table_delete()\n#2 /mnt/drive1/customerdb/backend/live_table_manager.php(36): app_live_table_delete_many()\n#3 /mnt/drive1/customerdb/webui/backend/live_table_manager.php(5): require('...')\n#4 {main}"}
live_table_manager · delete
2026-04-11 18:38:43 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted
change
item_types #277
Context
[]
Before
{"item_type_id":"277","type_name":"Polyester"}
After
{"deleted":true}
live_table_manager · delete
2026-04-11 18:38:38 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted
change
item_types #280
Context
[]
Before
{"item_type_id":"280","type_name":"stretchy with beads and pearls"}
After
{"deleted":true}
live_table_manager · delete
2026-04-11 18:38:33 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted&_ts=1775947096631
change
item_types #278
Context
[]
Before
{"item_type_id":"278","type_name":"tulle with flower applique"}
After
{"deleted":true}
live_table_manager.php
2026-04-11 18:38:26 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted&_ts=1775947096631
error
Cannot delete or update a parent row: a foreign key constraint fails (`ellas_alterations`.`order_items`, CONSTRAINT `fk_order_items_item_type` FOREIGN KEY (`item_type_id`) REFERENCES `item_types` (`item_type_id`))
Script: /mnt/drive1/customerdb/webui/backend/live_table_manager.php
IP: 192.168.7.132
Context
{"table":"item_types","type":"mysqli_sql_exception","file":"/mnt/drive1/customerdb/backend/live_table_manager_service.php","line":182,"trace":"#0 /mnt/drive1/customerdb/backend/live_table_manager_service.php(182): mysqli->query()\n#1 /mnt/drive1/customerdb/backend/live_table_manager.php(31): app_live_table_delete()\n#2 /mnt/drive1/customerdb/webui/backend/live_table_manager.php(5): require('...')\n#3 {main}"}
live_table_manager · delete
2026-04-11 18:38:16 · anonymous · /backend/live_table_manager.php?table=item_types&ok=deleted
change
item_types #281
Context
[]
Before
{"item_type_id":"281","type_name":"2 dress shirts"}
After
{"deleted":true}
live_table_manager · delete
2026-04-11 18:38:11 · anonymous · /backend/live_table_manager.php?table=item_types
change
item_types #283
Context
[]
Before
{"item_type_id":"283","type_name":"Cottton  Silk"}
After
{"deleted":true}
live_table_manager.php
2026-04-11 18:38:06 · anonymous · /backend/live_table_manager.php?table=item_types
error
Cannot delete or update a parent row: a foreign key constraint fails (`ellas_alterations`.`order_items`, CONSTRAINT `fk_order_items_item_type` FOREIGN KEY (`item_type_id`) REFERENCES `item_types` (`item_type_id`))
Script: /mnt/drive1/customerdb/webui/backend/live_table_manager.php
IP: 192.168.7.132
Context
{"table":"item_types","type":"mysqli_sql_exception","file":"/mnt/drive1/customerdb/backend/live_table_manager_service.php","line":182,"trace":"#0 /mnt/drive1/customerdb/backend/live_table_manager_service.php(182): mysqli->query()\n#1 /mnt/drive1/customerdb/backend/live_table_manager.php(31): app_live_table_delete()\n#2 /mnt/drive1/customerdb/webui/backend/live_table_manager.php(5): require('...')\n#3 {main}"}
live_table_manager.php
2026-04-11 18:38:01 · anonymous · /backend/live_table_manager.php?table=item_types
error
Cannot delete or update a parent row: a foreign key constraint fails (`ellas_alterations`.`order_items`, CONSTRAINT `fk_order_items_item_type` FOREIGN KEY (`item_type_id`) REFERENCES `item_types` (`item_type_id`))
Script: /mnt/drive1/customerdb/webui/backend/live_table_manager.php
IP: 192.168.7.132
Context
{"table":"item_types","type":"mysqli_sql_exception","file":"/mnt/drive1/customerdb/backend/live_table_manager_service.php","line":182,"trace":"#0 /mnt/drive1/customerdb/backend/live_table_manager_service.php(182): mysqli->query()\n#1 /mnt/drive1/customerdb/backend/live_table_manager.php(31): app_live_table_delete()\n#2 /mnt/drive1/customerdb/webui/backend/live_table_manager.php(5): require('...')\n#3 {main}"}
customer_totals · create
2026-04-11 15:30:38 · anonymous · /backend/customer_totals.php?q=Edwards
change
customer_totals #8202
Context
[]
Before
[]
After
{"customer_date":"2026-04-09T19:29","customer_name":"Edwards","dopu_can":"Edwards","edwards":150,"edwards_type":"mileage","update_flag":"43 Miles"}
customer_totals · create
2026-04-11 15:18:35 · anonymous · /backend/customer_totals.php
change
customer_totals #8201
Context
[]
Before
[]
After
{"customer_date":"2026-04-09T19:17","customer_name":"Edwards","dopu_can":"Edwards","edwards":150,"edwards_type":"mileage","update_flag":"Milage 43"}
backup_database · create
2026-04-11 11:20:18 · anonymous · /backend/backup_database.php
change
backup_snapshot #snapshot_20260411_151957_before_final_input
Context
[]
Before
[]
After
{"target_database":"ellas_alterations_backup","tables":[{"source_table":"customers","backup_table":"customers__snapshot_20260411_151957_before_final_input","row_count":3177},{"source_table":"visits","backup_table":"visits__snapshot_20260411_151957_before_final_input","row_count":992},{"source_table":"orders","backup_table":"orders__snapshot_20260411_151957_before_final_input","row_count":992},{"source_table":"order_items","backup_table":"order_items__snapshot_20260411_151957_before_final_input","row_count":108},{"source_table":"payments","backup_table":"payments__snapshot_20260411_151957_before_final_input","row_count":1275}]}
live_table_manager · update
2026-04-11 09:00:37 · anonymous · /backend/live_table_manager.php?table=visits&edit=129057&q=
change
visits #129057
Context
[]
Before
{"visit_id":"129057","legacy_visit_id":null,"customer_id":"302528","visit_date":"2026-04-11 09:00:00","pickup_date":"2026-04-11 09:00:00","notes":"Wedding dress Deposit 50\nRange 180 ro 220","customer_name_snapshot":"Barbara Toledo Ramos","phone_snapshot":"8134033849","email_snapshot":"barbieb84@gmail.com","color":null,"alterations_needed":null,"alterations_notes":"{\"Project Details\":\"Wedding dress buttons \",\"When Needed?\":\"April 19th \"}","alterations_price":"0.00","total_alteration_price":"0.00","expedited_fee":"0.00","paid_date":null,"signature_text":null,"signature_date":null,"paid_flag":"0","source_key_value":"d93819b1-53f5-4f38-82f6-e2ba18e89b58","visit_type":"No label","deposit_amount":"0.00","setmore_customer_key":null}
After
{"visit_id":"129057","legacy_visit_id":null,"customer_id":"302528","visit_date":"2026-04-11 09:00:00","pickup_date":"2026-04-06 09:00:00","notes":"Wedding dress Deposit 50\r\nRange 180 ro 220","customer_name_snapshot":"Barbara Toledo Ramos","phone_snapshot":"8134033849","email_snapshot":"barbieb84@gmail.com","color":null,"alterations_needed":null,"alterations_notes":"{\"Project Details\":\"Wedding dress buttons \",\"When Needed?\":\"April 19th \"}","alterations_price":"0.00","total_alteration_price":"0.00","expedited_fee":"0.00","paid_date":null,"signature_text":null,"signature_date":null,"paid_flag":"0","source_key_value":"d93819b1-53f5-4f38-82f6-e2ba18e89b58","visit_type":"No label","deposit_amount":"0.00","setmore_customer_key":null}
report_service.php
2026-04-11 06:47:24 · cli · /dev/stdin
error
app_reports_daily(): Argument #1 ($conn) must be of type mysqli, string given, called in /proc/857993/fd/pipe:[23583145] on line 6
Script: /dev/stdin
IP: cli
Context
{"type":"TypeError","file":"/mnt/drive1/customerdb/backend/report_service.php","line":45,"trace":"#0 /proc/857993/fd/pipe:[23583145](6): app_reports_daily()\n#1 {main}"}
pipe:[23581519]
2026-04-11 06:47:24 · cli · /dev/stdin
error
Unknown column 'customer_report_id' in 'SELECT'
Script: /dev/stdin
IP: cli
Context
{"type":"mysqli_sql_exception","file":"/proc/857991/fd/pipe:[23581519]","line":10,"trace":"#0 /proc/857991/fd/pipe:[23581519](10): mysqli->query()\n#1 {main}"}
pipe:[23581937]
2026-04-11 06:46:50 · cli · /dev/stdin
error
Unknown column 'id' in 'SELECT'
Script: /dev/stdin
IP: cli
Context
{"type":"mysqli_sql_exception","file":"/proc/857570/fd/pipe:[23581937]","line":4,"trace":"#0 /proc/857570/fd/pipe:[23581937](4): mysqli->query()\n#1 {main}"}
documents · upload
2026-04-10 16:08:55 · anonymous · /backend/documents.php
change
backend_document #13
Context
{"file_name":"SESSION_LOG_2026-04-10.md","mime_type":"application/octet-stream"}
Before
[]
After
{"backend_document_id":"13","document_type":"upload","title":"Codex - Updates 04-10-2026","slug":"codex-updates-04-10-2026","summary_text":"All updates and documentation for Codex - Updates 04-10-2026","content_markdown":null,"content_html":null,"file_name":"SESSION_LOG_2026-04-10.md","stored_name":"20260410-200855-4b6f846d.md","mime_type":"application/octet-stream","file_size_bytes":"9223","storage_path":"/mnt/drive1/customerdb/backend/documents_storage/20260410-200855-4b6f846d.md","is_deleted":"0","created_at":"2026-04-10 16:08:55","updated_at":"2026-04-10 16:08:55","editor_content":"# Session Log - 2026-04-10\n\nThis document captures the main fixes and modules completed during the live-data/go-live support session.\n\n## Customer Go-Live Data\n\n- Reviewed the live load path for `customers`, `visits`, `orders`, `order_items`, and skipped `payments` because the bridge source only had summary-style `CustomerTotals`, not reliable one-row-per-payment detail.\n- Confirmed the remaining unmatched Setmore/import rows were considered junk and safe to ignore.\n- Identified the only manual staging fixes needed before the production load:\n  - fix `Priscilla`\n  - fix `Rae Sanders`\n  - ignore `Maria Martinez`\n- Prepared the go-live sequence:\n  - backup current live tables\n  - refresh staging\n  - apply manual staging fixes\n  - run preview script\n  - run production load\n  - run post-load audits\n  - spot-check real customers in the app\n- Provided a backup-table SQL pattern for pre-go-live snapshots and later cleanup.\n\n## Visit Page\n\n- Added a safe staff override path so staff can leave `visit.html` without forcing a customer signature when the customer is not present.\n- Kept signature requirements for print/email/report actions, so the override only affects navigation.\n- Added a Bridge Compare popup/grid to `visit.html`.\n- Added backend endpoint for bridge comparison:\n  - `frontend/api/bridge_customer_compare.php`\n- Updated the bridge comparison query to match by current customer name only:\n  - `CustomerTable` joined to `CustomerVisits1` on `CustomerName`\n  - `CustomerTable` joined to `AlterationItems` on `CustomerName`\n- Fixed bridge popup JSON failures caused by missing helper/bootstrap loading.\n- Fixed visit type persistence so saved `Pick Up` visits do not revert back to `Drop Off` unless a user changes it.\n- Fixed visit save/payment handling so the frontend payment array is respected instead of collapsing into a single payment row.\n- Fixed order totals so deposits plus payments reduce the due balance correctly.\n\n## Reports And Customer Totals\n\n- Fixed `reports.html` ready/customer results so paid totals calculate from live `orders` and `payments` by `visit_id`.\n- Fixed `customer.html` so paid totals are recomputed from live `payments`.\n- Fixed top totals snapshots to prefer live `visits`, `orders`, and `payments`, falling back to `customer_totals` only when no live data exists.\n- Updated `webui/api/totals_snapshot_live.php` so `webui.html` totals are also live-data based.\n- Added stronger visual separation between Today totals and Month-to-Date totals.\n- Added a `Completed` report filter.\n- Added per-record `Completed` badge logic.\n- Deduplicated report cards by `customer_id` to avoid duplicate customer cards such as Tabitha Torres.\n- Linked reports to new import paths:\n  - Morning Import\n  - Imported Today\n  - End Of Day Review\n\n## End Of Day Review\n\n- Added the End Of Day Review module:\n  - `backend/end_of_day_review.php`\n  - `webui/backend/end_of_day_review.php`\n- The module summarizes:\n  - daily closeout totals\n  - appointments needing review\n  - imported rows for the selected day\n  - recent cron/job runs\n  - no-shows\n  - final status mix\n- Linked it from Backend Home and Reports.\n\n## Customer Emails And Reviews\n\n- Expanded the Customer Emails & Reviews workflow:\n  - Send Email\n  - Mark Sent\n  - Ignore\n  - outreach status tracking\n  - delivery/result tracking\n  - change-log entries\n- Updated files:\n  - `backend/cust_email.php`\n  - `backend/cust_email_service.php`\n  - `webui/backend/cust_email.php`\n  - `webui/backend/cust_email_service.php`\n- Updated the history view into an Outreach Log.\n\n## Email Hub Date And Time\n\n- Improved loaded appointment context handling in Email Hub.\n- Added editable appointment fields:\n  - combined appointment date/time\n  - appointment date\n  - appointment time\n- Confirmation drafts and Setmore note updates now merge in the edited appointment fields.\n- Updated files:\n  - `backend/email.php`\n  - `webui/backend/email.php`\n\n## Cron Logging And Notifications\n\n- Added cron run logging through a shared runner.\n- Added recent run history to Cron Manager.\n- Added wrapper-based cron execution:\n  - `backend/jobs/run_cron_job.php`\n  - `webui/backend/jobs/run_cron_job.php`\n- Added shared runtime service:\n  - `backend/jobs/cron_runtime_service.php`\n  - `webui/backend/jobs/cron_runtime_service.php`\n- Updated cron export so scheduled jobs call the wrapper rather than raw commands.\n- Added notification plumbing for:\n  - Telegram\n  - email\n  - SMS/Twilio\n- Added settings support for cron notification email.\n\n## Database Backup Module\n\n- Added a real Database Backup backend module.\n- It snapshots the major five production workflow tables:\n  - `customers`\n  - `visits`\n  - `orders`\n  - `order_items`\n  - `payments`\n- Snapshots go into a separate database, default:\n  - `ellas_alterations_backup`\n- Snapshot table names use suffixes like:\n  - `customers__snapshot_YYYYMMDD_HHMMSS`\n- Snapshot history is logged in:\n  - `backup_database_snapshot_log`\n- Added delete support for backup sets so backup tables do not grow without control.\n- Delete Set drops all backup tables for that snapshot and removes the matching log rows.\n- Updated files:\n  - `backend/backup_database.php`\n  - `backend/backup_database_service.php`\n  - `webui/backend/backup_database.php`\n  - `webui/backend/backup_database_service.php`\n\n## Live Table Manager\n\n- Added a guarded live table manager for direct maintenance of the five workflow tables:\n  - `customers`\n  - `visits`\n  - `orders`\n  - `order_items`\n  - `payments`\n- Supports:\n  - search\n  - add\n  - edit\n  - delete\n- Every save/delete writes to the change log.\n- Added backup warning and quick link to Database Backup.\n- New files:\n  - `backend/live_table_manager.php`\n  - `backend/live_table_manager_service.php`\n  - `webui/backend/live_table_manager.php`\n  - `webui/backend/live_table_manager_service.php`\n- Linked from Backend Home.\n\n## Change Logging\n\n- Expanded visit-save logging so related entities are logged more clearly:\n  - customer\n  - visit\n  - order\n  - alterations/order items\n  - payments\n- Added change logging for backup snapshot create/delete.\n- Added change logging for live table manager save/delete.\n\n## Edwards Mileage Split\n\n- Added an `Edwards Type` field for customer totals:\n  - mileage\n  - maintenance\n  - other\n- Added separate Edwards totals in the drill view.\n- Updated schema installer to include `edwards_type`.\n- Updated:\n  - `backend/customer_totals.php`\n  - `backend/customer_totals_service.php`\n  - `webui/backend/customer_totals.php`\n  - `webui/backend/customer_totals_service.php`\n  - `backend/install_schema.php`\n  - `webui/backend/install_schema.php`\n\n## Setmore And Bridge Freshness\n\n- Added Setmore/bridge freshness module:\n  - `backend/setmore_import_status.php`\n  - `webui/backend/setmore_import_status.php`\n- Shows local import status and bridge table freshness for:\n  - `ellas_access_bridge.CustomerTable`\n  - `ellas_access_bridge.CustomerVisits1`\n  - `ellas_access_bridge.AlterationItems`\n  - `ellas_access_bridge.CustomerTotals`\n- Updated Setmore service so it prefers `app_settings` values before older config-file values.\n\n## Umami\n\n- Diagnosed iframe failure:\n  - Umami sends restrictive frame/CSP headers.\n  - HTTP iframe inside HTTPS backend is blocked as mixed content.\n- Built Ella-specific Umami source from `C:\\code\\umami`.\n- Initially tested a split setup:\n  - app on `192.168.7.202`\n  - database on `192.168.7.206`\n- Found repeated database connection failures on the split app:\n  - `Connection terminated unexpectedly`\n- Moved the Ella Umami app to `192.168.7.206` so app and database run together.\n- Current direct login:\n  - `http://192.168.7.206:3006/login`\n- Shut down the unstable `202` mirror app.\n- Updated backend Umami launcher pages:\n  - `backend/umami.php`\n  - `webui/backend/umami.php`\n- The iframe now targets the planned proxied path:\n  - `/backend/umami-embed/login`\n- Nginx still needs the reverse proxy block for true HTTPS embedding.\n\n## WebUI Dashboard\n\n- Added `Current Speed Dial` to `webui.html` above the Finance card.\n- Changed Speed Dial on `webui.html` into a compact spreadsheet-style table so it uses less vertical space.\n- The section loads live data from:\n  - `/backend/api/speed_dial.php`\n- Updated:\n  - `webui/webui.html`\n\n## Medication Module\n\n- Fixed black/dark button styling in the Medication module by adding explicit theme-safe button styling.\n- Updated:\n  - `backend/medication.php`\n  - `webui/backend/medication.php`\n\n## Backend Navigation\n\n- Renamed Bills Manager to Pay Bills in visible backend UI.\n- Added links/cards for:\n  - Database Backup\n  - Live Table Manager\n  - End Of Day Review\n  - Setmore/Bridge Freshness\n\n## Remaining Follow-Up\n\n- Deploy/sync changed files to the live server.\n- Run the schema installer before using Edwards type live.\n- Test the Backup Delete Set button with a disposable snapshot.\n- Test Live Table Manager carefully after taking a backup snapshot.\n- Add the Nginx `/backend/umami-embed/` reverse proxy block before expecting Umami iframe embedding to work.\n- Verify Twilio credentials end-to-end.\n- Verify Email Hub date/time behavior on real imported emails.\n- Continue improving printable Daily Detail and Daily Appointment Operations layouts if needed.\n","is_text_editable":1,"can_edit_inline":1}
schedule · create
2026-04-10 15:57:31 · admin@ellasalterations.com · /api/appointment_workflow.php
change
appointment_workflow #visit:129050
Context
{"workflow_status":"no_show","visit_id":129050,"order_id":103803}
Before
[]
After
{"workflow_id":"5","source":"visit","source_key":"129050","appointment_date":"2026-04-10","customer_id":"488994","visit_id":"129050","order_id":null,"workflow_status":"no_show","payment_state":null,"payment_method":null,"payment_amount":"0.00","paid_in_advance":"0","report_required":"0","report_attached":"0","report_checked_at":"2026-04-10 15:57:31","provider_notes_text":null,"operator_notes":"{\"Project Details\":\"Wedding dress\",\"When Needed?\":\"ASAP!! Will pay extra\"}","no_show_email_key":"none","created_at":"2026-04-10 15:57:31","updated_at":"2026-04-10 15:57:31"}
documents · save
2026-04-10 13:20:34 · anonymous · /backend/documents.php
change
backend_document #12
Context
{"document_type":"markdown"}
Before
{"backend_document_id":"12","document_type":"upload","title":"Square - Telegram IDS","slug":"square-telegram-ids","summary_text":"Square - Telegram IDS tokens and chat information","content_markdown":null,"content_html":null,"file_name":"SquareTelegramInfo.txt","stored_name":"20260408-160751-b757b5ec.txt","mime_type":"text/plain","file_size_bytes":"1716","storage_path":"/mnt/drive1/customerdb/backend/documents_storage/20260408-160751-b757b5ec.txt","is_deleted":"0","created_at":"2026-04-08 12:07:51","updated_at":"2026-04-08 12:07:51","editor_content":"The good news: everything is already built. No coding needed. Here's what you actually have to do:\r\n\r\nThe 6 steps:\r\nCreate a Square Developer Application at developer.squareup.com (free, ~2 min)\r\n\r\nCollect 3 credentials from the Square Developer dashboard:\r\n\r\nProduction Application ID (sq0idp-...)\r\nProduction Access Token (EAAAl...)\r\nLocation ID (L...)\r\nEnter in Settings page — the app's Settings screen has a Square Payments section. Put in the Access Token and Location ID there.\r\n\r\nFill in /frontend/api/config.php on the server — add all 3 credentials and change 'environment' => 'sandbox' to 'production'\r\n\r\nPair the Terminal device to your Square account/location via the device's own settings screen (if not already done)\r\n\r\nTest — open a visit, click \"Send to Terminal\", select the device, watch the Terminal screen light up\r\n\r\nThe document also includes the complete troubleshooting section for common issues (empty device list, auth failures, sandbox vs production mix-ups) and a quick-reference table showing which credentials go where.\r\n\r\n\r\nSandbox\r\nApplication ID\r\nsandbox-sq0idb-RADNkYqnTwtu2oXD-mJrHw\r\n\r\nAccess Token\r\nEAAAl7SwvhAwj63SPJuFnP0Bb2bbZQYwr_oLdiiXPprm3Yhf59YWfS6sQcTy7EVe\r\n\r\n\r\n\r\nLive\r\nApplication ID\r\nsq0idp-Ug5yEttIeIxgVk_FbfUXHw\r\n\r\nProduction Access Token\r\nEAAAlx3Bg1jm3Xa-qXGcy4BmucPfqmYTRqy1mISS5YeETWonr_4d8xSgnMU1_aQv\r\n\r\n\r\ndefault test account\r\nEAAAl7SwvhAwj63SPJuFnP0Bb2bbZQYwr_oLdiiXPprm3Yhf59YWfS6sQcTy7EVe\r\n\r\nSandbox\r\ntest Locations\r\nDefault Test Account (Main)\r\n1600 Pennsylvania Ave NW\r\nLQ9JH35T5GAYS\r\n7299\r\n\r\nProduction\r\nElla’s Alterations (Main)\r\n6986 Fort King Road\r\n5W9V4C95PWDVQ\r\n7230\r\n\r\n\r\ntelegram\r\n7700366760:AAEeLLs1XvbapLFx7biDSTC2quO8NzjfBac\r\n7990799442\r\n\r\n","is_text_editable":1,"can_edit_inline":1}
After
{"backend_document_id":"12","document_type":"markdown","title":"Change Of Business Hours","slug":"change-of-business-hours","summary_text":"This is all the areas to change for hour change","content_markdown":"# **Hours**\r\nSetmore\r\nNew Customerdb\r\nWebsite\r\nFacebook\r\nNextdoor\r\nYelp","content_html":"<h1>**Hours**</h1>\n<p>Setmore</p>\n<p>New Customerdb</p>\n<p>Website</p>\n<p>Facebook</p>\n<p>Nextdoor</p>\n<p>Yelp</p>","file_name":"SquareTelegramInfo.txt","stored_name":"20260408-160751-b757b5ec.txt","mime_type":"text/plain","file_size_bytes":"1716","storage_path":"/mnt/drive1/customerdb/backend/documents_storage/20260408-160751-b757b5ec.txt","is_deleted":"0","created_at":"2026-04-08 12:07:51","updated_at":"2026-04-10 13:20:34","editor_content":"# **Hours**\r\nSetmore\r\nNew Customerdb\r\nWebsite\r\nFacebook\r\nNextdoor\r\nYelp","is_text_editable":1,"can_edit_inline":1}
backup_database · create
2026-04-10 13:15:27 · anonymous · /backend/backup_database.php
change
backup_snapshot #snapshot_20260410_171516
Context
[]
Before
[]
After
{"target_database":"ellas_alterations_backup","tables":[{"source_table":"customers","backup_table":"customers__snapshot_20260410_171516","row_count":3174},{"source_table":"visits","backup_table":"visits__snapshot_20260410_171516","row_count":979},{"source_table":"orders","backup_table":"orders__snapshot_20260410_171516","row_count":979},{"source_table":"order_items","backup_table":"order_items__snapshot_20260410_171516","row_count":90},{"source_table":"payments","backup_table":"payments__snapshot_20260410_171516","row_count":1260}]}
speed_dial · create
2026-04-10 13:06:33 · anonymous · /backend/speed_dial.php
change
backend_speed_dial #7
Context
[]
Before
[]
After
{"backend_speed_dial_id":"7","link_name":"New Umami","link_url":"http://192.168.7.206:3006/websites/6c928ae4-b073-4202-8b7d-35670995223f","sort_order":"0","is_active":"1","created_at":"2026-04-10 13:06:33","updated_at":"2026-04-10 13:06:33"}
speed_dial · create
2026-04-09 09:48:34 · anonymous · /backend/speed_dial.php?ok=1
change
backend_speed_dial #6
Context
[]
Before
[]
After
{"backend_speed_dial_id":"6","link_name":"Technitium 143","link_url":"http://192.168.7.143:5380/","sort_order":"0","is_active":"1","created_at":"2026-04-09 09:48:34","updated_at":"2026-04-09 09:48:34"}
speed_dial · create
2026-04-09 09:48:17 · anonymous · /backend/speed_dial.php
change
backend_speed_dial #5
Context
[]
Before
[]
After
{"backend_speed_dial_id":"5","link_name":"Technitium 206","link_url":"http://192.168.7.206:5380/","sort_order":"0","is_active":"1","created_at":"2026-04-09 09:48:17","updated_at":"2026-04-09 09:48:17"}
speed_dial · create
2026-04-09 09:47:35 · anonymous · /backend/speed_dial.php
change
backend_speed_dial #4
Context
[]
Before
[]
After
{"backend_speed_dial_id":"4","link_name":"N8N 143","link_url":"http://192.168.7.143:5678/home/workflows","sort_order":"0","is_active":"1","created_at":"2026-04-09 09:47:35","updated_at":"2026-04-09 09:47:35"}
documents · upload
2026-04-08 12:07:51 · anonymous · /backend/documents.php
change
backend_document #12
Context
{"file_name":"SquareTelegramInfo.txt","mime_type":"text/plain"}
Before
[]
After
{"backend_document_id":"12","document_type":"upload","title":"Square - Telegram IDS","slug":"square-telegram-ids","summary_text":"Square - Telegram IDS tokens and chat information","content_markdown":null,"content_html":null,"file_name":"SquareTelegramInfo.txt","stored_name":"20260408-160751-b757b5ec.txt","mime_type":"text/plain","file_size_bytes":"1716","storage_path":"/mnt/drive1/customerdb/backend/documents_storage/20260408-160751-b757b5ec.txt","is_deleted":"0","created_at":"2026-04-08 12:07:51","updated_at":"2026-04-08 12:07:51","editor_content":"The good news: everything is already built. No coding needed. Here's what you actually have to do:\r\n\r\nThe 6 steps:\r\nCreate a Square Developer Application at developer.squareup.com (free, ~2 min)\r\n\r\nCollect 3 credentials from the Square Developer dashboard:\r\n\r\nProduction Application ID (sq0idp-...)\r\nProduction Access Token (EAAAl...)\r\nLocation ID (L...)\r\nEnter in Settings page — the app's Settings screen has a Square Payments section. Put in the Access Token and Location ID there.\r\n\r\nFill in /frontend/api/config.php on the server — add all 3 credentials and change 'environment' => 'sandbox' to 'production'\r\n\r\nPair the Terminal device to your Square account/location via the device's own settings screen (if not already done)\r\n\r\nTest — open a visit, click \"Send to Terminal\", select the device, watch the Terminal screen light up\r\n\r\nThe document also includes the complete troubleshooting section for common issues (empty device list, auth failures, sandbox vs production mix-ups) and a quick-reference table showing which credentials go where.\r\n\r\n\r\nSandbox\r\nApplication ID\r\nsandbox-sq0idb-RADNkYqnTwtu2oXD-mJrHw\r\n\r\nAccess Token\r\nEAAAl7SwvhAwj63SPJuFnP0Bb2bbZQYwr_oLdiiXPprm3Yhf59YWfS6sQcTy7EVe\r\n\r\n\r\n\r\nLive\r\nApplication ID\r\nsq0idp-Ug5yEttIeIxgVk_FbfUXHw\r\n\r\nProduction Access Token\r\nEAAAlx3Bg1jm3Xa-qXGcy4BmucPfqmYTRqy1mISS5YeETWonr_4d8xSgnMU1_aQv\r\n\r\n\r\ndefault test account\r\nEAAAl7SwvhAwj63SPJuFnP0Bb2bbZQYwr_oLdiiXPprm3Yhf59YWfS6sQcTy7EVe\r\n\r\nSandbox\r\ntest Locations\r\nDefault Test Account (Main)\r\n1600 Pennsylvania Ave NW\r\nLQ9JH35T5GAYS\r\n7299\r\n\r\nProduction\r\nElla’s Alterations (Main)\r\n6986 Fort King Road\r\n5W9V4C95PWDVQ\r\n7230\r\n\r\n\r\ntelegram\r\n7700366760:AAEeLLs1XvbapLFx7biDSTC2quO8NzjfBac\r\n7990799442\r\n\r\n","is_text_editable":1,"can_edit_inline":1}
customers.php
2026-04-08 10:16:38 · anonymous · /backend/customers.php
error
Failed opening required '/mnt/drive1/customerdb/backend/page_helpers.php' (include_path='.:/usr/share/php')
Script: /mnt/drive1/customerdb/webui/backend/customers.php
IP: 192.168.7.29
Context
{"type":"Error","file":"/mnt/drive1/customerdb/backend/customers.php","line":7,"trace":"#0 {main}"}
email.php
2026-04-08 10:16:38 · anonymous · /backend/email.php
error
Failed opening required '/mnt/drive1/customerdb/backend/page_helpers.php' (include_path='.:/usr/share/php')
Script: /mnt/drive1/customerdb/webui/backend/email.php
IP: 192.168.7.29
Context
{"type":"Error","file":"/mnt/drive1/customerdb/backend/email.php","line":6,"trace":"#0 {main}"}
customers.php
2026-04-08 10:16:38 · anonymous · /backend/customers.php
php_error
require_once(/mnt/drive1/customerdb/backend/page_helpers.php): Failed to open stream: No such file or directory
Script: /mnt/drive1/customerdb/webui/backend/customers.php
IP: 192.168.7.29
Context
{"file":"/mnt/drive1/customerdb/backend/customers.php","line":7,"severity_code":2}
email.php
2026-04-08 10:16:38 · anonymous · /backend/email.php
php_error
require_once(/mnt/drive1/customerdb/backend/page_helpers.php): Failed to open stream: No such file or directory
Script: /mnt/drive1/customerdb/webui/backend/email.php
IP: 192.168.7.29
Context
{"file":"/mnt/drive1/customerdb/backend/email.php","line":6,"severity_code":2}
customers.php
2026-04-08 10:16:25 · anonymous · /backend/customers.php
error
Failed opening required '/mnt/drive1/customerdb/backend/page_helpers.php' (include_path='.:/usr/share/php')
Script: /mnt/drive1/customerdb/webui/backend/customers.php
IP: 192.168.7.29
Context
{"type":"Error","file":"/mnt/drive1/customerdb/backend/customers.php","line":7,"trace":"#0 {main}"}
customers.php
2026-04-08 10:16:25 · anonymous · /backend/customers.php
php_error
require_once(/mnt/drive1/customerdb/backend/page_helpers.php): Failed to open stream: No such file or directory
Script: /mnt/drive1/customerdb/webui/backend/customers.php
IP: 192.168.7.29
Context
{"file":"/mnt/drive1/customerdb/backend/customers.php","line":7,"severity_code":2}
email.php
2026-04-08 10:16:25 · anonymous · /backend/email.php
error
Failed opening required '/mnt/drive1/customerdb/backend/page_helpers.php' (include_path='.:/usr/share/php')
Script: /mnt/drive1/customerdb/webui/backend/email.php
IP: 192.168.7.29
Context
{"type":"Error","file":"/mnt/drive1/customerdb/backend/email.php","line":6,"trace":"#0 {main}"}
email.php
2026-04-08 10:16:25 · anonymous · /backend/email.php
php_error
require_once(/mnt/drive1/customerdb/backend/page_helpers.php): Failed to open stream: No such file or directory
Script: /mnt/drive1/customerdb/webui/backend/email.php
IP: 192.168.7.29
Context
{"file":"/mnt/drive1/customerdb/backend/email.php","line":6,"severity_code":2}
logs.php
2026-04-08 10:15:26 · anonymous · /backend/logs.php
error
Failed opening required '/mnt/drive1/customerdb/backend/page_helpers.php' (include_path='.:/usr/share/php')
Script: /mnt/drive1/customerdb/webui/backend/logs.php
IP: 192.168.7.29
Context
{"type":"Error","file":"/mnt/drive1/customerdb/backend/logs.php","line":6,"trace":"#0 {main}"}
logs.php
2026-04-08 10:15:26 · anonymous · /backend/logs.php
php_error
require_once(/mnt/drive1/customerdb/backend/page_helpers.php): Failed to open stream: No such file or directory
Script: /mnt/drive1/customerdb/webui/backend/logs.php
IP: 192.168.7.29
Context
{"file":"/mnt/drive1/customerdb/backend/logs.php","line":6,"severity_code":2}
email.php
2026-04-08 10:15:25 · anonymous · /backend/email.php
error
Failed opening required '/mnt/drive1/customerdb/backend/page_helpers.php' (include_path='.:/usr/share/php')
Script: /mnt/drive1/customerdb/webui/backend/email.php
IP: 192.168.7.29
Context
{"type":"Error","file":"/mnt/drive1/customerdb/backend/email.php","line":6,"trace":"#0 {main}"}
email.php
2026-04-08 10:15:25 · anonymous · /backend/email.php
php_error
require_once(/mnt/drive1/customerdb/backend/page_helpers.php): Failed to open stream: No such file or directory
Script: /mnt/drive1/customerdb/webui/backend/email.php
IP: 192.168.7.29
Context
{"file":"/mnt/drive1/customerdb/backend/email.php","line":6,"severity_code":2}
customers.php
2026-04-08 10:15:25 · anonymous · /backend/customers.php
error
Failed opening required '/mnt/drive1/customerdb/backend/page_helpers.php' (include_path='.:/usr/share/php')
Script: /mnt/drive1/customerdb/webui/backend/customers.php
IP: 192.168.7.29
Context
{"type":"Error","file":"/mnt/drive1/customerdb/backend/customers.php","line":7,"trace":"#0 {main}"}
customers.php
2026-04-08 10:15:25 · anonymous · /backend/customers.php
php_error
require_once(/mnt/drive1/customerdb/backend/page_helpers.php): Failed to open stream: No such file or directory
Script: /mnt/drive1/customerdb/webui/backend/customers.php
IP: 192.168.7.29
Context
{"file":"/mnt/drive1/customerdb/backend/customers.php","line":7,"severity_code":2}
documents · upload
2026-04-07 15:13:40 · anonymous · /backend/documents.php?backend_document_id=2
change
backend_document #11
Context
{"file_name":"SESSION_LOG_2026-04-07.md","mime_type":"application/octet-stream"}
Before
[]
After
{"backend_document_id":"11","document_type":"upload","title":"Codex 04-07-2026 Documentation","slug":"codex-04-07-2026-documentation","summary_text":"Codex 04-07-2026 Documentation everything that has been completed today","content_markdown":null,"content_html":null,"file_name":"SESSION_LOG_2026-04-07.md","stored_name":"20260407-191340-bcefed15.md","mime_type":"application/octet-stream","file_size_bytes":"12740","storage_path":"/mnt/drive1/customerdb/backend/documents_storage/20260407-191340-bcefed15.md","is_deleted":"0","created_at":"2026-04-07 15:13:40","updated_at":"2026-04-07 15:13:40","editor_content":"# Session Log - 2026-04-07\n\n## Summary\n\nThis document records the work completed on `2026-04-07` for the `customerdb` system across:\n\n- frontend / front desk\n- webui / management\n- backend modules\n- reporting\n- signatures / Topaz\n- Square Terminal\n- documents editor / theming\n\nIt is meant to be the end-of-day handoff and operator reference used before quitting for the day.\n\n---\n\n## Main Outcomes\n\nThe main work completed today focused on:\n\n1. stabilizing visit save, payment, and signature behavior\n2. improving printed reports and work orders\n3. improving visit activity logging and history\n4. fixing queue/report visibility by visit instead of collapsing by customer\n5. building and pairing the Square Terminal API flow\n6. continuing backend theme conformity, especially the Documents module\n\n---\n\n## Completed Work\n\n## 1. Front Desk Visit Workflow\n\nFiles touched:\n\n- [visit.html](/C:/code/customerdb/frontend/visit.html)\n- [visit_save.php](/C:/code/customerdb/frontend/api/visit_save.php)\n- [visit_get.php](/C:/code/customerdb/frontend/api/visit_get.php)\n\n### 1.1 Topaz Signature Flow\n\nCompleted:\n\n- Topaz signature capture now auto-saves the visit immediately after a successful capture.\n- Receipt/work order/report actions require a signature for normal visit types.\n- Leaving the visit page prompts/blocks when a required signature is missing.\n- Report generation first saves the visit if the form is dirty, helping ensure the current signature is included.\n\nWhat this fixes:\n\n- signature captured on screen but not yet saved to the visit\n- report opened too quickly before signature save completed\n- missing signature on receipt/PDF after successful Topaz signing\n\n### 1.2 Visit Activity Log\n\nCompleted:\n\n- Added per-visit activity logging to the visit save pipeline.\n- Added display of activity history at the bottom of the visit form.\n- Log now records:\n  - timestamp\n  - actor\n  - activity type\n  - changed field names\n  - before values\n  - after values\n- Friendly field labels were added for log display.\n\nExamples of friendly labels:\n\n- Pickup Date\n- Deposit Amount\n- Amount Paid\n- Payment Method\n- Tip Amount\n- Total Before Tax\n- Total After Tax\n\n### 1.3 Square Metadata on Visit\n\nCompleted:\n\n- Added Square metadata capture on the visit form and save pipeline:\n  - Square payment ID\n  - Square receipt / confirmation number\n  - card brand\n  - last 4\n  - checkout ID\n  - Square tip amount\n  - Square total amount\n- Added a visible `Square Reference` area on the visit page.\n- Added Square payment activity log entries.\n\n### 1.4 Payment and Save Logic\n\nCompleted:\n\n- Removed the redundant `No Tax (order)` checkbox from `Payment & Status`.\n- `Picked Up` logic was previously tightened so visit type should drive status rather than auto-forcing pickup.\n- Added a payment line log under `Payment & Status`.\n- Visit save now logs changes and payment events more clearly.\n\nKnown caution:\n\n- Continue live testing around edge-case payment edits involving deposits, split payments, and later pickups.\n\n---\n\n## 2. Printed Reports and Customer-Facing Reports\n\nFiles touched:\n\n- [receipt.html](/C:/code/customerdb/frontend/receipt.html)\n- [work_order.html](/C:/code/customerdb/frontend/work_order.html)\n- [customer_display.html](/C:/code/customerdb/frontend/customer_display.html)\n\n### 2.1 Receipt\n\nCompleted:\n\n- Added `Pickup Time`.\n- Added `Status`.\n- Receipt now uses normalized visit status, such as:\n  - Drop Off\n  - Pick Up\n  - Canceled\n  - No Show\n- Receipt shows pickup date/time more clearly.\n\n### 2.2 Customer Display\n\nCompleted:\n\n- Added `Pickup Time` to the customer-facing display.\n\n### 2.3 Work Order\n\nCompleted:\n\n- Added:\n  - Pickup Time\n  - Status\n  - Total Before Tax\n  - Tax\n  - Total After Tax\n  - Deposit\n  - Balance\n- Explicit placeholders such as `$0.00` are shown when values are absent so staff can tell the difference between blank and zero.\n- Added `Visit History` to the work order.\n- Then refined `Visit History` to be concise and single-line only so the work order stays print-friendly.\n\nCurrent work-order history behavior:\n\n- only shows status changes and payment-type events\n- examples:\n  - `Status Changed: Drop Off to Pick Up`\n  - `Payment: Deposit · Cash · 40.00`\n  - `Square Payment 85.00 · Confirmation # 123456`\n\nReason for this change:\n\n- the earlier detailed before/after layout was too large for the print page\n\n---\n\n## 3. Queue / Reports Fixes\n\nFiles touched:\n\n- [customer_data.php](/C:/code/customerdb/frontend/api/customer_data.php)\n- [customer_data.php](/C:/code/customerdb/webui/api/customer_data.php)\n\n### 3.1 Today / Ready Queue Logic\n\nCompleted:\n\n- Fixed queue grouping so operational lists now behave per visit rather than collapsing multiple same-customer visits into one row.\n- Fixed display names so queue views use `visits.customer_name_snapshot` when appropriate.\n\nThis fixed real cases where these visits were being merged or displayed incorrectly:\n\n- Peter Dixon\n- Kefa Dixon\n- Angela Dixon\n- Me Myexperttailor\n\n### 3.2 Dashboard and Ella Side Consistency\n\nCompleted:\n\n- `dashboard.floridaalterations.com/reports.html?type=ready` now shows separate visits correctly.\n- `ella.floridaalterations.com/reports.html?type=today` now mirrors the same corrected behavior.\n\n---\n\n## 4. Square Terminal Integration\n\nFiles touched:\n\n- [square_terminal.php](/C:/code/customerdb/frontend/api/square_terminal.php)\n- [square_terminal.php](/C:/code/customerdb/backend/square_terminal.php)\n- [square_terminal_service.php](/C:/code/customerdb/backend/square_terminal_service.php)\n- [settings.html](/C:/code/customerdb/webui/settings.html)\n- [settings_get.php](/C:/code/customerdb/webui/api/settings_get.php)\n- [settings_save.php](/C:/code/customerdb/webui/api/settings_save.php)\n\n### 4.1 What Was Built\n\nCompleted:\n\n- built a backend Square Terminal pairing page/module\n- added support for:\n  - create device code\n  - refresh code status\n  - sync devices\n  - store paired devices in MariaDB\n- added manual terminal device ID / label support in settings\n\nTables added earlier in this work:\n\n- `backend_square_terminal_code`\n- `backend_square_terminal_device`\n\n### 4.2 Pairing Result\n\nCompleted:\n\n- real terminal pairing succeeded\n- paired device returned by Square:\n  - `device:343CS149B6001234`\n- terminal name:\n  - `Ella`\n- device status:\n  - `AVAILABLE`\n\n### 4.3 Visit Integration\n\nCompleted:\n\n- visit page can now talk to Square Terminal API using the configured device\n- checkout completion returns:\n  - payment ID\n  - base amount\n  - total amount\n  - tip amount\n  - card brand\n  - last 4\n  - receipt number / confirmation number\n\nKnown caution:\n\n- continue live validation that tip handling exactly matches Square on every real terminal transaction\n\n---\n\n## 5. Backend Documents Module\n\nFiles touched:\n\n- [documents.php](/C:/code/customerdb/backend/documents.php)\n\n### 5.1 Functional State\n\nThe Documents backend already supported:\n\n- markdown editing\n- upload\n- document library\n- history / versions\n- restore version\n\n### 5.2 Theme / Color Work Completed Today\n\nCompleted:\n\n- extensive theme cleanup for Documents page\n- fixed dark/black areas in:\n  - editor panel\n  - library panel\n  - upload panel\n  - history panel\n  - version list area\n  - toolbar save button\n  - save document button\n- aligned notices, buttons, inputs, editor chrome, headings, and versions to the backend theme\n\nFinal problem areas specifically addressed today:\n\n- `.doc-panel-head`\n- `.doc-panel-head-left`\n- `.doc-bottom-panel`\n- `.doc-lib-body`\n- `#versionList`\n- toolbar `Save`\n- form `Save Document`\n\nStatus at end of day:\n\n- user confirmed it is much better after the final passes\n\n---\n\n## 6. Work Order / Activity History Printing\n\nFiles touched:\n\n- [work_order.html](/C:/code/customerdb/frontend/work_order.html)\n\nCompleted:\n\n- condensed the history so it fits better on one page\n- removed verbose multi-row history in favor of concise operational lines\n\nUse case:\n\n- person working the garment can see what happened on the ticket without the sheet becoming too large to print\n\n---\n\n## How To Use - Daily Workflow\n\n## Morning\n\n1. Run Setmore import.\n2. Open today’s clients / ready queues and review all current visits.\n3. Open visits as needed and verify:\n   - visit type\n   - payment/deposit values\n   - signature status\n   - report status\n4. If using Square Terminal:\n   - ensure the paired device is still available in backend Square Terminal page\n   - run one small test only if needed\n\n## During the Day\n\n1. Open visit.\n2. Update alteration items, visit type, payment, or deposit as needed.\n3. Capture signature with Topaz.\n4. The visit should auto-save immediately after Topaz capture.\n5. Print/open:\n   - receipt\n   - customer display\n   - work order\n6. Review activity log at bottom of visit if something looks off.\n\n## End of Day\n\n1. Review reports and operational queues.\n2. Check printed work orders / receipts for correct status and payment details.\n3. Review Documents page theme/behavior only if that module was used.\n4. If Square was used, confirm confirmation numbers and payment activity are present in the visit log.\n\n---\n\n## How To Test\n\n## A. Topaz / Report Test\n\nUse a real visit:\n\n1. Open visit.\n2. Capture signature with Topaz.\n3. Confirm the page auto-saves.\n4. Open receipt.\n5. Confirm signature is already present.\n\nExpected:\n\n- no extra manual save needed after successful Topaz signature\n\n## B. Visit Activity Log Test\n\n1. Open visit.\n2. Change:\n   - pickup date\n   - payment amount\n   - visit type\n3. Save.\n4. Review bottom `Visit Activity Log`.\n\nExpected:\n\n- friendlier field labels\n- before/after values visible\n\n## C. Work Order Test\n\n1. Open work order.\n2. Verify it shows:\n   - pickup date and time\n   - status\n   - total before tax\n   - tax\n   - total after tax\n   - deposit\n   - balance\n3. Check `Visit History`.\n\nExpected:\n\n- only concise status/payment entries\n- should be more likely to fit on one page\n\n## D. Queue Test\n\n1. Open dashboard ready page.\n2. Open Ella today page.\n3. Confirm each visit is shown separately.\n\nExpected:\n\n- no merging of same-customer visits\n\n## E. Square Terminal Test\n\n1. Open backend Square Terminal page.\n2. Confirm device status is available.\n3. Open a visit.\n4. Send amount to terminal.\n5. Complete payment.\n6. Verify visit page shows:\n   - Square confirmation number\n   - card info\n   - payment metadata\n\nExpected:\n\n- payment returns to visit with matching Square identifiers\n\n## F. Documents Theme Test\n\n1. Open Documents page.\n2. Check:\n   - editor header\n   - library panel\n   - upload panel\n   - history panel\n   - version list\n   - save buttons\n\nExpected:\n\n- no black panels/buttons\n- same backend color family as other backend pages\n\n---\n\n## What Was Verified\n\nVerified during implementation:\n\n- local PHP lint on changed PHP files\n- remote PHP lint on deployed files\n- multiple live pages returning 200 during deployment\n- real Square Terminal pairing status reached `PAIRED`\n- Square device became available to the app\n\nUser-confirmed / observed improvements:\n\n- Documents page looked much better after later theme passes\n\n---\n\n## Open Items / Follow-Up\n\nThese are the main items still worth continued live testing, not necessarily known broken items:\n\n1. Square tip logic in real-world transactions\n2. payment edge cases involving deposit, later balance payment, and visit type changes\n3. printed report fit on one page for very large work orders\n4. any remaining Documents CSS drift if another black element appears\n\n---\n\n## Recommended First Tests Tomorrow\n\n1. Test one real visit from start to finish:\n   - edit visit\n   - Topaz sign\n   - auto-save\n   - receipt\n   - work order\n2. Test one real Square Terminal payment.\n3. Check today/ready queue counts on both dashboard and Ella sides.\n4. Open Documents and verify the final themed state in normal browser and incognito.\n\n---\n\n## Key Pages\n\nFrontend:\n\n- `https://dashboard.floridaalterations.com/visit.html?visit_id=...&customer_id=...`\n- `https://dashboard.floridaalterations.com/receipt.html?visit_id=...`\n- `https://dashboard.floridaalterations.com/work_order.html?visit_id=...`\n- `https://dashboard.floridaalterations.com/reports.html?type=ready`\n\nManagement / Ella:\n\n- `https://ella.floridaalterations.com/reports.html?type=today`\n- `https://ella.floridaalterations.com/backend/documents.php`\n- `https://ella.floridaalterations.com/backend/square_terminal.php`\n\n---\n\n## Final Note\n\nToday’s work pushed the system closer to dependable daily operations in three major areas:\n\n- the visit/signature/report flow\n- the per-visit operational queue/report logic\n- the Square Terminal integration path\n\nThe biggest operational win of the day is that Topaz signature capture now writes back immediately, which should reduce missed signatures on receipts and reports.\n","is_text_editable":1,"can_edit_inline":1}
← Prev 1 17238 17239 17240 17241 17242 Next →