feat(129): erli status mapping sync

Phase 129 complete:
- Add Erli pull/push status mapping tables, seeds and repositories
- Wire Erli status sync cron for inbox pull and manual-only push
- Add tabbed Erli settings UI, tests and documentation

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-05-16 00:27:08 +02:00
parent c127ebf04d
commit 7972bb9fa4
28 changed files with 2021 additions and 57 deletions

View File

@@ -0,0 +1,71 @@
CREATE TABLE IF NOT EXISTS erli_order_status_mappings (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
erli_status_code VARCHAR(64) NOT NULL,
erli_status_name VARCHAR(120) NULL,
orderpro_status_code VARCHAR(64) NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY erli_order_status_mappings_code_unique (erli_status_code),
KEY erli_order_status_mappings_orderpro_code_idx (orderpro_status_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS erli_order_status_pull_mappings (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
erli_status_code VARCHAR(64) NOT NULL,
erli_status_name VARCHAR(120) NULL,
orderpro_status_code VARCHAR(64) NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY erli_order_status_pull_mappings_code_unique (erli_status_code),
KEY erli_order_status_pull_mappings_orderpro_code_idx (orderpro_status_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE integration_order_sync_state
ADD COLUMN IF NOT EXISTS last_status_pushed_at DATETIME NULL AFTER last_success_at;
INSERT INTO erli_order_status_pull_mappings (
erli_status_code, erli_status_name, orderpro_status_code, created_at, updated_at
) VALUES
('pending', 'Oczekuje', 'nieoplacone', NOW(), NOW()),
('purchased', 'Kupione', 'nowe', NOW(), NOW()),
('cancelled', 'Anulowane', 'anulowane', NOW(), NOW())
ON DUPLICATE KEY UPDATE
erli_status_name = VALUES(erli_status_name),
orderpro_status_code = COALESCE(erli_order_status_pull_mappings.orderpro_status_code, VALUES(orderpro_status_code)),
updated_at = NOW();
INSERT INTO erli_order_status_mappings (
erli_status_code, erli_status_name, orderpro_status_code, created_at, updated_at
) VALUES
('created', 'Utworzone', NULL, NOW(), NOW()),
('canceled', 'Anulowane', 'anulowane', NOW(), NOW()),
('readyToProcess', 'Gotowe do realizacji', 'nowe', NOW(), NOW()),
('inProgress', 'W realizacji', 'w_realizacji', NOW(), NOW()),
('sent', 'Wyslane', 'wyslane', NOW(), NOW()),
('readyToPickup', 'Gotowe do odbioru', NULL, NOW(), NOW()),
('received', 'Odebrane', NULL, NOW(), NOW()),
('returned', 'Zwrocone', 'anulowane', NOW(), NOW()),
('returningToSender', 'Wraca do nadawcy', NULL, NOW(), NOW()),
('unknown', 'Nieznane', NULL, NOW(), NOW())
ON DUPLICATE KEY UPDATE
erli_status_name = VALUES(erli_status_name),
orderpro_status_code = COALESCE(erli_order_status_mappings.orderpro_status_code, VALUES(orderpro_status_code)),
updated_at = NOW();
INSERT INTO app_settings (setting_key, setting_value, created_at, updated_at)
VALUES
('erli_status_sync_direction', 'erli_to_orderpro', NOW(), NOW()),
('erli_status_sync_interval_minutes', '15', NOW(), NOW())
ON DUPLICATE KEY UPDATE
setting_value = setting_value,
updated_at = updated_at;
INSERT INTO cron_schedules (
job_type, interval_seconds, priority, max_attempts, payload, enabled, last_run_at, next_run_at, created_at, updated_at
) VALUES (
'erli_status_sync', 900, 45, 3, NULL, 0, NULL, NOW(), NOW(), NOW()
) ON DUPLICATE KEY UPDATE
interval_seconds = VALUES(interval_seconds),
priority = VALUES(priority),
max_attempts = VALUES(max_attempts),
updated_at = NOW();