System

Change Log

Audit trail of every save, delete, import, and workflow update across the backend.

Total Changes1,029
Today0
Latest 2026-05-09 20:12
Reset

1,029 results · Page 14 of 21

bank · create
2026-04-29 13:34:08 · anonymous
bank_report_category_node #12
Context
[]
Before
[]
Changed Data
{"bank_report_category_node_id":"12","parent_id":"6","name":"Pharmacy","sort_order":"0","is_active":"1","created_at":"2026-04-29 13:34:08","updated_at":"2026-04-29 13:34:08"}
bank · create
2026-04-29 13:33:57 · anonymous
bank_report_category_node #11
Context
[]
Before
[]
Changed Data
{"bank_report_category_node_id":"11","parent_id":"6","name":"Doctors","sort_order":"0","is_active":"1","created_at":"2026-04-29 13:33:57","updated_at":"2026-04-29 13:33:57"}
bank · create
2026-04-29 13:33:39 · anonymous
bank_report_category_node #10
Context
[]
Before
[]
Changed Data
{"bank_report_category_node_id":"10","parent_id":"2","name":"Needs Review","sort_order":"0","is_active":"1","created_at":"2026-04-29 13:33:39","updated_at":"2026-04-29 13:33:39"}
bank · create
2026-04-29 13:33:33 · anonymous
bank_report_category_node #9
Context
[]
Before
[]
Changed Data
{"bank_report_category_node_id":"9","parent_id":"1","name":"Needs Review","sort_order":"0","is_active":"1","created_at":"2026-04-29 13:33:33","updated_at":"2026-04-29 13:33:33"}
bank · create
2026-04-29 13:33:16 · anonymous
bank_report_category_node #8
Context
[]
Before
[]
Changed Data
{"bank_report_category_node_id":"8","parent_id":"2","name":"Transfer","sort_order":"0","is_active":"1","created_at":"2026-04-29 13:33:16","updated_at":"2026-04-29 13:33:16"}
bank · create
2026-04-29 13:33:11 · anonymous
bank_report_category_node #7
Context
[]
Before
[]
Changed Data
{"bank_report_category_node_id":"7","parent_id":"1","name":"Transfer","sort_order":"0","is_active":"1","created_at":"2026-04-29 13:33:11","updated_at":"2026-04-29 13:33:11"}
bank · create
2026-04-29 13:31:01 · anonymous
bank_report_category_node #6
Context
[]
Before
[]
Changed Data
{"bank_report_category_node_id":"6","parent_id":"2","name":"Expenses","sort_order":"0","is_active":"1","created_at":"2026-04-29 13:31:01","updated_at":"2026-04-29 13:31:01"}
bank · create
2026-04-29 13:30:56 · anonymous
bank_report_category_node #5
Context
[]
Before
[]
Changed Data
{"bank_report_category_node_id":"5","parent_id":"2","name":"Income","sort_order":"0","is_active":"1","created_at":"2026-04-29 13:30:56","updated_at":"2026-04-29 13:30:56"}
bank · create
2026-04-29 13:30:44 · anonymous
bank_report_category_node #4
Context
[]
Before
[]
Changed Data
{"bank_report_category_node_id":"4","parent_id":"1","name":"Expenses","sort_order":"0","is_active":"1","created_at":"2026-04-29 13:30:44","updated_at":"2026-04-29 13:30:44"}
bank · create
2026-04-29 13:28:57 · anonymous
bank_report_category_node #3
Context
[]
Before
[]
Changed Data
{"bank_report_category_node_id":"3","parent_id":"1","name":"Income","sort_order":"0","is_active":"1","created_at":"2026-04-29 13:28:57","updated_at":"2026-04-29 13:28:57"}
bank · create
2026-04-29 13:28:27 · anonymous
bank_report_category_node #2
Context
[]
Before
[]
Changed Data
{"bank_report_category_node_id":"2","parent_id":null,"name":"Personal","sort_order":"0","is_active":"1","created_at":"2026-04-29 13:28:27","updated_at":"2026-04-29 13:28:27"}
bank · create
2026-04-29 13:28:19 · anonymous
bank_report_category_node #1
Context
[]
Before
[]
Changed Data
{"bank_report_category_node_id":"1","parent_id":null,"name":"Business","sort_order":"0","is_active":"1","created_at":"2026-04-29 13:28:19","updated_at":"2026-04-29 13:28:19"}
bank · import
2026-04-28 19:02:09 · anonymous
bank_import_batch #18
Context
{"rows_seen":7,"rows_imported":7,"rows_updated":0,"rows_skipped":0,"source_filename":"lowes3.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"18","bank_account_id":"16","import_date":"2026-04-28","start_date":"2026-01-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"lowes3.csv","import_status":"imported","rows_seen":"7","rows_imported":"7","rows_updated":"0","rows_skipped":"0","created_at":"2026-04-28 19:02:09","updated_at":"2026-04-28 19:02:09"}
bank · import
2026-04-28 19:01:50 · anonymous
bank_import_batch #17
Context
{"rows_seen":5,"rows_imported":5,"rows_updated":0,"rows_skipped":0,"source_filename":"lowes2.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"17","bank_account_id":"16","import_date":"2026-04-28","start_date":"2026-01-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"lowes2.csv","import_status":"imported","rows_seen":"5","rows_imported":"5","rows_updated":"0","rows_skipped":"0","created_at":"2026-04-28 19:01:50","updated_at":"2026-04-28 19:01:50"}
bank · import
2026-04-28 19:01:29 · anonymous
bank_import_batch #16
Context
{"rows_seen":4,"rows_imported":4,"rows_updated":0,"rows_skipped":0,"source_filename":"lowes1.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"16","bank_account_id":"16","import_date":"2026-04-28","start_date":"2026-02-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"lowes1.csv","import_status":"imported","rows_seen":"4","rows_imported":"4","rows_updated":"0","rows_skipped":"0","created_at":"2026-04-28 19:01:29","updated_at":"2026-04-28 19:01:29"}
bank · import
2026-04-28 19:01:07 · anonymous
bank_import_batch #15
Context
{"rows_seen":12,"rows_imported":12,"rows_updated":0,"rows_skipped":0,"source_filename":"amazon5.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"15","bank_account_id":"15","import_date":"2026-04-28","start_date":"2026-02-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"amazon5.csv","import_status":"imported","rows_seen":"12","rows_imported":"12","rows_updated":"0","rows_skipped":"0","created_at":"2026-04-28 19:01:07","updated_at":"2026-04-28 19:01:07"}
bank · import
2026-04-28 19:00:50 · anonymous
bank_import_batch #14
Context
{"rows_seen":29,"rows_imported":28,"rows_updated":1,"rows_skipped":0,"source_filename":"amazon4.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"14","bank_account_id":"15","import_date":"2026-04-28","start_date":"2026-02-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"amazon4.csv","import_status":"imported","rows_seen":"29","rows_imported":"28","rows_updated":"1","rows_skipped":"0","created_at":"2026-04-28 19:00:49","updated_at":"2026-04-28 19:00:50"}
bank · import
2026-04-28 19:00:34 · anonymous
bank_import_batch #13
Context
{"rows_seen":48,"rows_imported":48,"rows_updated":0,"rows_skipped":0,"source_filename":"amazon3.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"13","bank_account_id":"15","import_date":"2026-04-28","start_date":"2026-02-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"amazon3.csv","import_status":"imported","rows_seen":"48","rows_imported":"48","rows_updated":"0","rows_skipped":"0","created_at":"2026-04-28 19:00:34","updated_at":"2026-04-28 19:00:34"}
bank · import
2026-04-28 19:00:15 · anonymous
bank_import_batch #12
Context
{"rows_seen":28,"rows_imported":27,"rows_updated":1,"rows_skipped":0,"source_filename":"amazon2.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"12","bank_account_id":"15","import_date":"2026-04-28","start_date":"2026-01-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"amazon2.csv","import_status":"imported","rows_seen":"28","rows_imported":"27","rows_updated":"1","rows_skipped":"0","created_at":"2026-04-28 19:00:15","updated_at":"2026-04-28 19:00:15"}
bank · import
2026-04-28 18:59:49 · anonymous
bank_import_batch #11
Context
{"rows_seen":45,"rows_imported":45,"rows_updated":0,"rows_skipped":0,"source_filename":"amazon1.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"11","bank_account_id":"15","import_date":"2026-04-28","start_date":"2026-01-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"amazon1.csv","import_status":"imported","rows_seen":"45","rows_imported":"45","rows_updated":"0","rows_skipped":"0","created_at":"2026-04-28 18:59:49","updated_at":"2026-04-28 18:59:49"}
bank · import
2026-04-28 18:56:38 · anonymous
bank_import_batch #10
Context
{"rows_seen":77,"rows_imported":0,"rows_updated":77,"rows_skipped":0,"source_filename":"usaacreditcard.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"10","bank_account_id":"1","import_date":"2026-04-28","start_date":"2026-01-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"usaacreditcard.csv","import_status":"imported","rows_seen":"77","rows_imported":"0","rows_updated":"77","rows_skipped":"0","created_at":"2026-04-28 18:56:38","updated_at":"2026-04-28 18:56:38"}
bank · import
2026-04-28 18:56:17 · anonymous
bank_import_batch #9
Context
{"rows_seen":77,"rows_imported":77,"rows_updated":0,"rows_skipped":0,"source_filename":"usaacreditcard.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"9","bank_account_id":"1","import_date":"2026-04-28","start_date":"2026-01-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"usaacreditcard.csv","import_status":"imported","rows_seen":"77","rows_imported":"77","rows_updated":"0","rows_skipped":"0","created_at":"2026-04-28 18:56:17","updated_at":"2026-04-28 18:56:17"}
bank · import
2026-04-28 18:55:57 · anonymous
bank_import_batch #8
Context
{"rows_seen":3,"rows_imported":3,"rows_updated":0,"rows_skipped":0,"source_filename":"usaasavings.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"8","bank_account_id":"3","import_date":"2026-04-28","start_date":"2026-01-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"usaasavings.csv","import_status":"imported","rows_seen":"3","rows_imported":"3","rows_updated":"0","rows_skipped":"0","created_at":"2026-04-28 18:55:57","updated_at":"2026-04-28 18:55:57"}
bank · import
2026-04-28 18:55:22 · anonymous
bank_import_batch #7
Context
{"rows_seen":1,"rows_imported":1,"rows_updated":0,"rows_skipped":0,"source_filename":"usamain.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"7","bank_account_id":"4","import_date":"2026-04-28","start_date":"2026-01-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"usamain.csv","import_status":"imported","rows_seen":"1","rows_imported":"1","rows_updated":"0","rows_skipped":"0","created_at":"2026-04-28 18:55:22","updated_at":"2026-04-28 18:55:22"}
bank · import
2026-04-28 18:51:40 · anonymous
bank_import_batch #6
Context
{"rows_seen":7,"rows_imported":3,"rows_updated":4,"rows_skipped":0,"source_filename":"captialonemysavings.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"6","bank_account_id":"21","import_date":"2026-04-28","start_date":"2026-01-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"captialonemysavings.csv","import_status":"imported","rows_seen":"7","rows_imported":"3","rows_updated":"4","rows_skipped":"0","created_at":"2026-04-28 18:51:40","updated_at":"2026-04-28 18:51:40"}
bank · import
2026-04-28 18:42:33 · anonymous
bank_import_batch #5
Context
{"rows_seen":107,"rows_imported":107,"rows_updated":0,"rows_skipped":0,"source_filename":"2026-04-28_transaction_download.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"5","bank_account_id":"11","import_date":"2026-04-28","start_date":"2026-01-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"2026-04-28_transaction_download.csv","import_status":"imported","rows_seen":"107","rows_imported":"107","rows_updated":"0","rows_skipped":"0","created_at":"2026-04-28 18:42:33","updated_at":"2026-04-28 18:42:33"}
bank · import
2026-04-28 18:41:21 · anonymous
bank_import_batch #4
Context
{"rows_seen":56,"rows_imported":56,"rows_updated":0,"rows_skipped":0,"source_filename":"2026-04-28_360capitaloneChecking...6488.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"4","bank_account_id":"12","import_date":"2026-04-28","start_date":"2026-01-01","end_date":"2026-04-28","sort_name":null,"import_notes":null,"source_filename":"2026-04-28_360capitaloneChecking...6488.csv","import_status":"imported","rows_seen":"56","rows_imported":"56","rows_updated":"0","rows_skipped":"0","created_at":"2026-04-28 18:41:21","updated_at":"2026-04-28 18:41:21"}
bank · import
2026-04-28 18:22:03 · anonymous
bank_import_batch #3
Context
{"rows_seen":103,"rows_imported":100,"rows_updated":3,"rows_skipped":0,"source_filename":"_transactions_454c4c4120414c5445522020000f_trans_504655269_01012026_04282026.csv"}
Before
[]
Changed Data
{"bank_import_batch_id":"3","bank_account_id":"10","import_date":"2026-04-28","start_date":"2026-04-01","end_date":"2026-04-30","sort_name":null,"import_notes":null,"source_filename":"_transactions_454c4c4120414c5445522020000f_trans_504655269_01012026_04282026.csv","import_status":"imported","rows_seen":"103","rows_imported":"100","rows_updated":"3","rows_skipped":"0","created_at":"2026-04-28 18:22:03","updated_at":"2026-04-28 18:22:03"}
live_table_manager · update
2026-04-26 12:39:28 · anonymous
customer_payment_transactions #4324
Context
[]
Before
{"customer_payment_transaction_id":"4324","payment_id":null,"order_id":null,"visit_id":null,"customer_id":null,"customer_name":"Pamela Tripp","transaction_date":"2026-03-23 12:00:00","payment_method":"credit","payment_type":"Drop Off","bucket":"credit","amount":"40.00","tip_amount":"0.00","is_new_customer":"1","source":"legacy_customer_totals","created_at":"2026-04-12 11:52:48","updated_at":"2026-04-12 11:52:48"}
Changed Data
{"customer_payment_transaction_id":"4324","payment_id":null,"order_id":null,"visit_id":null,"customer_id":null,"customer_name":"Pamela Tripp","transaction_date":"2026-03-23 12:00:00","payment_method":"credit","payment_type":"Drop Off","bucket":"credit","amount":"0.00","tip_amount":"0.00","is_new_customer":"1","source":"legacy_customer_totals","created_at":"2026-04-12 11:52:00","updated_at":"2026-04-12 11:52:00"}
schedule · create
2026-04-25 21:06:27 · admin@ellasalterations.com
appointment_workflow #0
Context
{"workflow_status":"no_show","visit_id":129432,"order_id":106568}
Before
[]
Changed Data
{"workflow_id":"11","source":"visit","source_key":"129432","appointment_date":"2026-04-25","customer_id":"495253","visit_id":"129432","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-25 21:06:27","provider_notes_text":null,"operator_notes":"{\"Project Details\":\"Formal wear dress hem and tighten bust \",\"When Needed?\":\"May 7th\"}","no_show_email_key":"none","created_at":"2026-04-25 21:06:27","updated_at":"2026-04-25 21:06:27"}
schedule · create
2026-04-25 20:33:39 · admin@ellasalterations.com
appointment_workflow #0
Context
{"workflow_status":"no_show","visit_id":129431,"order_id":106567}
Before
[]
Changed Data
{"workflow_id":"10","source":"visit","source_key":"129431","appointment_date":"2026-04-25","customer_id":"495252","visit_id":"129431","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-25 20:33:39","provider_notes_text":null,"operator_notes":"{\"Project Details\":\"Replace or fix zipper on dress\",\"When Needed?\":\"1 week?\"}","no_show_email_key":"none","created_at":"2026-04-25 20:33:39","updated_at":"2026-04-25 20:33:39"}
documents · upload
2026-04-25 18:29:57 · anonymous
backend_document #25
Context
{"file_name":"2026-04-25-codex-changes.md","mime_type":"application/octet-stream"}
Before
[]
Changed Data
{"backend_document_id":"25","document_type":"upload","title":"Codex - Documentation 04-25-2026","slug":"codex-documentation-04-25-2026","summary_text":"2026-04-25-codex-changes.md\r\nIt includes:\r\n\r\neverything created/updated/removed\r\ndatabase schema objects added\r\nDB data changes performed\r\nAPI endpoints/actions touched\r\nprocedures/functions and scripts added/changed\r\ncron/notification behavior\r\nvalidation performed today","content_markdown":null,"content_html":null,"file_name":"2026-04-25-codex-changes.md","stored_name":"20260425-182957-0b251cd7.md","mime_type":"application/octet-stream","file_size_bytes":"6092","storage_path":"/mnt/drive3/customerdb/backend/documents_storage/20260425-182957-0b251cd7.md","is_deleted":"0","created_at":"2026-04-25 18:29:57","updated_at":"2026-04-25 18:29:57","editor_content":"# CustomerDB Changes Log\nDate: 2026-04-25\nAuthor: Codex\n\n## Scope\nThis document summarizes all work completed today in this session, including created/updated/removed files, database schema objects introduced by code, API behaviors touched, and operational procedures/scripts added.\n\n## 1) Files Created\n- `backend/search_data_service.php`\n- `backend/search_data.php`\n- `webui/backend/search_data.php` (compatibility loader)\n- `webui/backend/search_data_service.php` (compatibility loader)\n- `/mnt/drive1/scripts/cleanup_customerdb_branches.sh` (runtime ops script; outside repo tree)\n\n## 2) Files Updated\n- `backend/module_service.php`\n- `backend/index.php`\n- `backend/page_helpers.php`\n- `webui/settings.html`\n- `backend/api/sysadmin.php`\n- `backend/sysadmin.php`\n- `backend/jobs/cron_runtime_service.php`\n- `backend/cron_manager.php`\n- `backend/search_data.php` (restyling updates for spreadsheet-like sections)\n- `backend/search_data_service.php` (provider detection/compat fixes)\n\n## 3) Files Removed\n- None.\n\n## 4) Database Schema Objects Added (by code)\nImplemented in `backend/search_data_service.php` via `app_install_search_data_schema(...)`:\n\n### Tables\n1. `backend_search_dataset`\n2. `backend_search_import_batch`\n3. `backend_search_dataset_field`\n4. `backend_search_data_row`\n\n### Indexes / Constraints (high level)\n- Unique dataset key by provider (`provider_name`, `dataset_key`)\n- Import batch indexes by dataset/status\n- Unique field key per dataset\n- Unique row identity hash per dataset\n- Analytical indexes on date/clicks/impressions\n\n## 5) Database Data Changes Performed Today\n- A cron job row was inserted in `cron_job`:\n  - Label: `Cleanup Repo Branch Folders`\n  - Schedule: `20 3 * * *`\n  - Command: `bash /mnt/drive1/scripts/cleanup_customerdb_branches.sh`\n  - Enabled: `1`\n- Search data smoke import was executed once in this environment for validation, which inserted dataset/import/data rows in the new search tables.\n\n## 6) New/Updated Backend Module\n### Module: Search Data Imports (`Bing / Google CSV + AI`)\n- New page: `backend/search_data.php`\n- New service: `backend/search_data_service.php`\n- Registered in backend module overview and dashboard card.\n- Added to module jump links and settings module visibility list.\n\n### Functional capabilities added\n- Adaptive CSV import for Google/Bing (and unknown/future providers).\n- Header evolution tracking (new columns are cataloged without code changes).\n- Batch import auditing (rows seen/inserted/updated/skipped).\n- Query context construction from imported tables.\n- Ollama-based AI question answering over imported data using existing settings:\n  - `ollama_url`\n  - `ollama_default_model`\n\n## 7) API Surface and Call Behavior Changes\n## Updated endpoint\n- `backend/api/sysadmin.php`\n\n### Updated actions\n1. `action=backups_list`\n   - Added new `dir` key support:\n     - `repo-branches` => `/mnt/drive3/customerdb_repo/branches`\n2. `action=backups_delete`\n   - Previously file-only delete.\n   - Now supports both file and folder delete.\n   - Added safe recursive folder deletion with path-boundary checks.\n   - Response now includes:\n     - `deleted_type` (`file` or `folder`)\n\n### Existing actions used by UI (not newly created today, but part of touched API flow)\n- `logs_list`, `logs_read`, `logs_clear`\n- `scripts_list`, `scripts_read`, `scripts_save`, `scripts_run`, `scripts_notify_save`\n- `backups_list`, `backups_delete`\n\n## 8) Sysadmin UI Changes\nUpdated `backend/sysadmin.php`:\n- Backups tab now includes:\n  - `customerdb_repo/branches/` source (`data-backupdir=\"repo-branches\"`)\n- Directory rows now include a `Delete Folder` button.\n- Delete handler updated to support file vs folder confirmation text.\n\n## 9) Cron / Ops Procedure Changes\n## Updated cron runtime service\nUpdated `backend/jobs/cron_runtime_service.php`:\n- Added constants:\n  - `APP_BRANCH_CLEANUP_SCRIPT_PATH`\n  - `APP_BRANCH_CLEANUP_TARGET_PATH`\n- Added helper:\n  - `app_cron_ensure_branch_cleanup_script()`\n- `app_cron_migrate_command_paths(...)` now:\n  - Ensures command normalization for `Cleanup Repo Branch Folders`\n  - Ensures cleanup script exists on disk\n\n## Updated cron manager seeding\nUpdated `backend/cron_manager.php`:\n- Added seeded/ensured job:\n  - `Cleanup Repo Branch Folders`\n  - `20 3 * * *`\n  - `bash /mnt/drive1/scripts/cleanup_customerdb_branches.sh`\n\n## Script created\n`/mnt/drive1/scripts/cleanup_customerdb_branches.sh`\n- Deletes first-level folders older than 5 days under:\n  - `/mnt/drive3/customerdb_repo/branches`\n- Emits clear stdout status suitable for cron logs/notifications.\n\n## Notifications\nNo new notification channels were added.\nThe new cron job uses existing cron execution + notification flow:\n- Telegram (depending on settings)\n- Email (depending on settings)\n\n## 10) Jump-To-Module Improvements\nUpdated `backend/page_helpers.php`:\n- Jump dropdown list now sorted A-Z by label.\n- List expanded to include missing backend destinations.\n- Corrected invalid links for queue pages to existing routes:\n  - `/upcoming.html`\n  - `/workload.html`\n\n## 11) Styling/UI Updates Requested\nUpdated `backend/search_data.php`:\n- For sections:\n  - `CSV Files`\n  - `Dataset Totals`\n  - `Recent Imports`\n- Removed rounded corners and applied spreadsheet-like flat table style (Excel-like grid presentation).\n\n## 12) Compatibility / Robustness Fixes Applied\nIn `backend/search_data_service.php`:\n- Added CSV parsing compatibility for `fgetcsv` escape parameter.\n- Replaced `mb_substr` with `substr` in one path to avoid missing extension errors in this environment.\n- Improved provider detection rules for Google export naming patterns:\n  - `KeywordReport`\n  - `PageTrafficReport`\n  - `SearchPerformanceOverview`\n\n## 13) Validation Performed\n- PHP syntax checks (`php -l`) passed for all modified PHP files.\n- Search data smoke import executed successfully in this environment.\n- Verified script path existence after direct creation:\n  - `/mnt/drive1/scripts/cleanup_customerdb_branches.sh`\n\n## 14) Notes\n- Existing unrelated local repo changes were not reverted.\n- No destructive git operations were used.\n","is_text_editable":1,"can_edit_inline":1}
documents · upload
2026-04-25 18:24:48 · anonymous
backend_document #24
Context
{"file_name":"CHANGE_LOG_2026-04-25.md","mime_type":"application/octet-stream"}
Before
[]
Changed Data
{"backend_document_id":"24","document_type":"upload","title":"Cursor documentation 04-25-2026","slug":"cursor-documentation-04-25-2026","summary_text":"t includes:\r\n\r\nSummary table — created/updated/removed, DDL vs DML, API impact.\r\nScoped file diff — full detail for uncommitted changes in:\r\nbackend/jobs/cron_runtime_service.php (backup bash migration, branch cleanup constants, app_cron_ensure_branch_cleanup_script(), related UPDATEs)\r\nbackend/cron_manager.php (Database Backup seed + Cleanup Repo Branch Folders seed/ensure)\r\nDatabase — cron_job / cron_job_run column list (from CREATE TABLE IF NOT EXISTS), all runtime UPDATE/INSERT behavior, optional manual SQL for backup.\r\nProcedures — new/changed PHP functions (no MySQL stored procedures).\r\nAPI — cron_manager POST actions and that no HTTP API files changed in this diff; run_cron_job.php is CLI.\r\nWider repo — pointer to git status for other changed/untracked files (not enumerated line-by-line).\r\nOps notes — bash vs execute bit, MAILTO / Hostinger from the earlier support thread.\r\nNote: There were no commits on 2026-04-25, so the document is based on the current working tree (including the branch-cleanup work in the same two files as the backup bash fix). If you want the doc to only cover the backup line and exclude branch cleanup, say so and it can be trimmed.","content_markdown":null,"content_html":null,"file_name":"CHANGE_LOG_2026-04-25.md","stored_name":"20260425-182448-2570d279.md","mime_type":"application/octet-stream","file_size_bytes":"7947","storage_path":"/mnt/drive3/customerdb/backend/documents_storage/20260425-182448-2570d279.md","is_deleted":"0","created_at":"2026-04-25 18:24:48","updated_at":"2026-04-25 18:24:48","editor_content":"# Change log — 2026-04-25\n\nThis document records **uncommitted work in the local workspace** as of generation time. There were **no git commits** on 2026-04-25; content is based on `git diff` and `git status` for this repository.\n\n---\n\n## 1. Summary\n\n| Category | What changed |\n|----------|---------------|\n| **Files created** | This document: `docs/CHANGE_LOG_2026-04-25.md` |\n| **Files removed** | None in the scoped diffs below |\n| **Database DDL** | **None** — no new `CREATE TABLE` / `ALTER` in these changes. Existing `cron_job` / `cron_job_run` definitions unchanged (see §4). |\n| **Database DML (runtime)** | `UPDATE` statements inside `app_cron_migrate_command_paths()` to normalize `cron_job.command` values (see §4). |\n| **HTTP API routes** | **None** added or changed by the `backend/jobs/cron_runtime_service.php` and `backend/cron_manager.php` diffs. |\n| **CLI / entry points** | `php backend/jobs/run_cron_job.php <cron_job_id>` (unchanged contract). |\n\n---\n\n## 2. Files updated (detailed) — cron / backup / branch cleanup\n\nThe following are the **only files** with local modifications captured in a full-file diff at documentation time: `backend/jobs/cron_runtime_service.php` and `backend/cron_manager.php`.\n\n### 2.1 `backend/jobs/cron_runtime_service.php`\n\n| Change | Description |\n|--------|-------------|\n| **New constants** | `APP_BRANCH_CLEANUP_SCRIPT_PATH` → `/mnt/drive1/scripts/cleanup_customerdb_branches.sh` |\n| | `APP_BRANCH_CLEANUP_TARGET_PATH` → `/mnt/drive3/customerdb_repo/branches` |\n| **`app_cron_migrate_command_paths()`** | After the existing `REPLACE` of `drive1` → `drive3` customerdb paths, **new `UPDATE`**: if `command` is exactly `/mnt/drive3/customerdb/backup.sh`, set it to `bash /mnt/drive3/customerdb/backup.sh` (avoids `Permission denied` when the script is not executable or the filesystem is `noexec`). |\n| | **New `UPDATE`**: rows with `label = 'Cleanup Repo Branch Folders'` get `command = 'bash /mnt/drive1/scripts/cleanup_customerdb_branches.sh'`. |\n| | Calls new helper **`app_cron_ensure_branch_cleanup_script()`** at end of migration. |\n| **New function** | **`app_cron_ensure_branch_cleanup_script()`** — if `/mnt/drive1/scripts` exists and is writable, writes an embedded **bash** script to `cleanup_customerdb_branches.sh` (deletes first-level subdirectories under the target older than 5 days), `chmod` `0755` if possible. If script content differs, file is updated. |\n\n**Notable behavior:** `app_cron_migrate_command_paths()` is invoked from `run_cron_job.php`, `cron_manager.php`, and any code path that loads this service before running jobs, so the `UPDATE` statements run idempotently when those paths execute.\n\n**Compatibility loader:** `webui/backend/jobs/cron_runtime_service.php` only `require`s the canonical `backend` file; no separate logic.\n\n### 2.2 `backend/cron_manager.php`\n\n| Change | Description |\n|--------|-------------|\n| **Seed job (empty `cron_job` table only)** | **Database Backup** command changed from `/mnt/drive3/customerdb/backup.sh` to **`bash /mnt/drive3/customerdb/backup.sh`**. |\n| | New seed job: **Cleanup Repo Branch Folders** — schedule `20 3 * * *`, command **`bash /mnt/drive1/scripts/cleanup_customerdb_branches.sh`**, `sort_order` 55. |\n| **`$ensureJobs` (insert if missing by label)** | Same **Cleanup Repo Branch Folders** block added so the job appears when the table already had data (seeds not run). |\n\n**Web entry:** `GET/POST` to `/backend/cron_manager.php` — manages rows in `cron_job`, can run jobs manually, regenerates export file for system crontab install (unchained URL; still the same page).\n\n---\n\n## 3. New or changed PHP “procedures” (functions)\n\nNo database **stored procedures** are introduced; the project uses **PHP functions** in `cron_runtime_service.php`.\n\n| Name | Action |\n|------|--------|\n| `app_cron_migrate_command_paths` | Extended with `backup.sh` `bash` migration, branch-folder command `UPDATE`, and `app_cron_ensure_branch_cleanup_script()` call. |\n| `app_cron_ensure_branch_cleanup_script` | **New** — materializes/updates the branch cleanup shell script and permissions when possible. |\n\nAll other existing functions in this file (`app_cron_execute_job`, `app_cron_send_notifications`, etc.) are **unchanged in signature**; execution still uses `exec($cmd . ' 2>&1', ...)` in `app_cron_execute_job`.\n\n---\n\n## 4. Database schema and data touchpoints\n\n### 4.1 Tables (no DDL change in this work)\n\nThese are **ensured** by `cron_manager.php` on load (`CREATE TABLE IF NOT EXISTS`):\n\n- **`cron_job`**: `cron_job_id`, `label`, `description`, `schedule`, `command`, `enabled`, `last_run_at`, `last_run_ok`, `last_run_out`, `sort_order`, `created_at`\n- **`cron_job_run`**: `cron_job_run_id`, `cron_job_id`, `job_label`, `run_source`, `started_at`, `finished_at`, `exit_code`, `ran_ok`, `output_text`\n\nNo new columns or indexes in the recorded diff.\n\n### 4.2 Data migrations (`UPDATE` only / idempotent)\n\nExecuted inside **`app_cron_migrate_command_paths($conn)`**:\n\n1. `UPDATE cron_job SET command = REPLACE(command, '/mnt/drive1/customerdb', '/mnt/drive3/customerdb')` where the substring appears.\n2. `UPDATE cron_job SET command = 'bash /mnt/drive3/customerdb/backup.sh' WHERE command = '/mnt/drive3/customerdb/backup.sh'`\n3. Daily Cleanup: existing logic rewriting old shell/PHP daily cleanup commands to `php8.3 .../daily_cleanup.php` (unchanged in intent).\n4. `UPDATE cron_job SET command = 'bash /mnt/drive1/scripts/cleanup_customerdb_branches.sh' WHERE label = 'Cleanup Repo Branch Folders'`\n5. Branch cleanup: `app_cron_ensure_branch_cleanup_script()` (filesystem, not SQL).\n\n**Manual SQL** (if migration has not run yet) for backup only:\n\n```sql\nUPDATE cron_job\nSET command = 'bash /mnt/drive3/customerdb/backup.sh'\nWHERE command = '/mnt/drive3/customerdb/backup.sh';\n```\n\n### 4.3 Inserts (new default job)\n\nIf **`cron_job` was empty** on first run after deploy, the seed includes the new **Cleanup Repo Branch Folders** row. If the table was **not** empty, **`$ensureJobs`** may insert that job when no row with the same label exists.\n\n---\n\n## 5. API surface\n\n| Type | Endpoints / scripts | Notes |\n|------|----------------------|--------|\n| **Changed in this diff** | None | |\n| **Related backend page** | `GET/POST /backend/cron_manager.php` | Form actions: `save_job`, `toggle`, `delete_job`, `run_now` (unchained pattern). |\n| **CLI** | `php8.3 /mnt/drive3/customerdb/backend/jobs/run_cron_job.php <id> [--verbose]` | Invoked by system cron per generated `/etc/cron.d/customerdb` lines. |\n\n**Other HTTP APIs** in the repository (e.g. under `webui/api/`, `frontend/api/`) are **not** modified by the two files above; the working tree still contains many other modified and untracked files—see §6.\n\n---\n\n## 6. Other modified / new paths in the working tree (not individually documented here)\n\nA snapshot of the repository showed **numerous** other modified and untracked files (e.g. `backend/api/*.php`, `frontend/api/*.php`, `webui/api/*.php`, `backup.sh`, logs, etc.). Those are **outside** the scoped `cron_runtime_service.php` / `cron_manager.php` diffs in §2. For a full list, run from the repo root:\n\n```text\ngit status\ngit diff --name-only\n```\n\n---\n\n## 7. Related operational notes (from 2026-04-25 support context)\n\n- **Shell `Permission denied` on `*.sh`:** prefer `bash /path/to/script.sh` (as implemented for `backup.sh`) and/or `chmod +x` on the script; check for **`noexec`** mounts.\n- **Email bounces to `*smtpout*.hostinger.io`:** that hostname is for **sending** mail, not a mailbox. Set **`MAILTO`** in crontab and app **notification** addresses to a real user address. Application logic in `app_cron_notification_email()` already discards some invalid Hostinger `smtpout` targets for cron emails.\n\n---\n\n## 8. Document history\n\n| Date | Note |\n|------|------|\n| 2026-04-25 | Initial version: cron file diffs, schema touchpoints, no API change in scope. |\n","is_text_editable":1,"can_edit_inline":1}
webui · create
2026-04-24 19:38:35 · admin@ellasalterations.com
customer #495263
Context
{"source":"customer_save.php"}
Changed Data
{"customer_id":"495263","full_name":"Admin Kefa","phone":"8134451474","email":"admin@kefadixon.com","notes":"","is_new_customer":"1","pickup_due_at":null}
webui · create
2026-04-24 19:34:49 · admin@ellasalterations.com
customer #495262
Context
{"source":"customer_save.php"}
Changed Data
{"customer_id":"495262","full_name":"Kefa Test","phone":"8134451474","email":"admin@kefadixon.com","notes":"","is_new_customer":"1","pickup_due_at":null}
webui · create
2026-04-24 19:34:05 · admin@ellasalterations.com
customer #495261
Context
{"source":"customer_save.php"}
Changed Data
{"customer_id":"495261","full_name":"Test","phone":"000000000","email":"test","notes":"","is_new_customer":"1","pickup_due_at":null}
webui · create
2026-04-24 19:33:07 · admin@ellasalterations.com
customer #495260
Context
{"source":"customer_save.php"}
Changed Data
{"customer_id":"495260","full_name":"Peter Test","phone":"8134451474","email":"admin@kefadixon.com","notes":"","is_new_customer":"1","pickup_due_at":null}
webui · create
2026-04-24 19:25:17 · admin@ellasalterations.com
customer #495259
Context
{"source":"customer_save.php"}
Changed Data
{"customer_id":"495259","full_name":"Jan Murch","phone":"8138387552","email":"janmurch6@gmail.com","notes":"","is_new_customer":"1","pickup_due_at":null}
webui · create
2026-04-24 19:23:14 · admin@ellasalterations.com
customer #495258
Context
{"source":"customer_save.php"}
Changed Data
{"customer_id":"495258","full_name":"Jan Murch","phone":"8138387552","email":"janmurch6@gmail.com","notes":"","is_new_customer":"1","pickup_due_at":null}
cust_email · send_email
2026-04-21 13:24:50 · anonymous
review_request #65
Context
[]
Before
[]
Changed Data
{"customer_id":489063,"visit_id":129337,"email":"roxanne_ad@hotmail.com","status":"sent","delivery_result":"Sent via SMTP (PHPMailer)"}
cust_email · send_email
2026-04-21 13:24:35 · anonymous
review_request #64
Context
[]
Before
[]
Changed Data
{"customer_id":488996,"visit_id":129397,"email":"smirfette1967@yahoo.com","status":"sent","delivery_result":"Sent via SMTP (PHPMailer)"}
cust_email · send_email
2026-04-21 13:24:26 · anonymous
review_request #63
Context
[]
Before
[]
Changed Data
{"customer_id":3473,"visit_id":129037,"email":"reneeray67@gmail.com","status":"sent","delivery_result":"Sent via SMTP (PHPMailer)"}
cust_email · send_email
2026-04-21 13:24:12 · anonymous
review_request #62
Context
[]
Before
[]
Changed Data
{"customer_id":3278,"visit_id":129336,"email":"cisnerosreaghan7@gmail.com","status":"sent","delivery_result":"Sent via SMTP (PHPMailer)"}
cust_email · send_email
2026-04-21 13:24:01 · anonymous
review_request #61
Context
[]
Before
[]
Changed Data
{"customer_id":429497,"visit_id":129367,"email":"ranaecarl@yahoo.com","status":"sent","delivery_result":"Sent via SMTP (PHPMailer)"}
cust_email · send_email
2026-04-21 13:23:53 · anonymous
review_request #60
Context
[]
Before
[]
Changed Data
{"customer_id":148004,"visit_id":129348,"email":"sheylla@tigerconcreteandscreed.com","status":"sent","delivery_result":"Sent via SMTP (PHPMailer)"}
cust_email · send_email
2026-04-21 13:23:41 · anonymous
review_request #59
Context
[]
Before
[]
Changed Data
{"customer_id":3527,"visit_id":128971,"email":"lisaaferrick@gmail.com","status":"sent","delivery_result":"Sent via SMTP (PHPMailer)"}
cust_email · send_email
2026-04-21 13:23:31 · anonymous
review_request #58
Context
[]
Before
[]
Changed Data
{"customer_id":488984,"visit_id":129063,"email":"meaganogallagher@gmail.com","status":"sent","delivery_result":"Sent via SMTP (PHPMailer)"}
cust_email · mark_sent
2026-04-21 13:23:21 · anonymous
review_request #57
Context
[]
Before
[]
Changed Data
{"customer_id":200488,"visit_id":34964,"email":"torresgladys622@yahoo.com","status":"sent"}
cust_email · send_email
2026-04-21 13:23:17 · anonymous
review_request #56
Context
[]
Before
[]
Changed Data
{"customer_id":3468,"visit_id":129356,"email":"mspiro831@gmail.com","status":"sent","delivery_result":"Sent via SMTP (PHPMailer)"}
cust_email · send_email
2026-04-21 13:23:11 · anonymous
review_request #55
Context
[]
Before
[]
Changed Data
{"customer_id":489007,"visit_id":129349,"email":"msw027@hotmail.com","status":"sent","delivery_result":"Sent via SMTP (PHPMailer)"}
← Prev 1 12 13 14 15 16 21 Next →