Add Orders and Order Status repositories with pagination and management features

- Implemented OrdersRepository for handling order data with pagination, filtering, and sorting capabilities.
- Added methods for retrieving order status options, quick stats, and detailed order information.
- Created OrderStatusRepository for managing order status groups and statuses, including CRUD operations and sorting.
- Introduced a bootstrap file for test environment setup and autoloading.
This commit is contained in:
2026-03-03 01:32:28 +01:00
parent d1576bc4ab
commit c489891d15
106 changed files with 11669 additions and 5091 deletions

View File

@@ -0,0 +1,240 @@
-- Draft schema for generic orders domain (not auto-run by Migrator).
-- Source API fields were inspired by external marketplace/order APIs (Apilo used only as example).
CREATE TABLE IF NOT EXISTS orders (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
integration_id INT UNSIGNED NULL,
source VARCHAR(32) NOT NULL DEFAULT 'external',
source_order_id VARCHAR(64) NOT NULL,
external_order_id VARCHAR(128) NULL,
external_platform_id VARCHAR(64) NULL,
external_platform_account_id VARCHAR(64) NULL,
external_status_id VARCHAR(64) NULL,
external_payment_type_id VARCHAR(64) NULL,
payment_status TINYINT UNSIGNED NULL,
external_carrier_id VARCHAR(64) NULL,
external_carrier_account_id VARCHAR(64) NULL,
customer_login VARCHAR(128) NULL,
is_invoice TINYINT(1) NOT NULL DEFAULT 0,
is_encrypted TINYINT(1) NOT NULL DEFAULT 0,
is_canceled_by_buyer TINYINT(1) NOT NULL DEFAULT 0,
currency CHAR(3) NOT NULL,
total_without_tax DECIMAL(12,2) NULL,
total_with_tax DECIMAL(12,2) NULL,
total_paid DECIMAL(12,2) NULL,
send_date_min DATETIME NULL,
send_date_max DATETIME NULL,
ordered_at DATETIME NULL,
source_created_at DATETIME NULL,
source_updated_at DATETIME NULL,
preferences_json JSON NULL,
payload_json JSON NULL,
fetched_at DATETIME NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY orders_integration_source_order_unique (integration_id, source_order_id),
KEY orders_integration_external_idx (integration_id, external_order_id),
KEY orders_status_idx (external_status_id),
KEY orders_source_updated_idx (source_updated_at),
KEY orders_ordered_at_idx (ordered_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS order_addresses (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
order_id BIGINT UNSIGNED NOT NULL,
address_type ENUM('customer', 'delivery', 'invoice') NOT NULL,
name VARCHAR(128) NOT NULL,
phone VARCHAR(64) NULL,
email VARCHAR(128) NULL,
street_name VARCHAR(128) NULL,
street_number VARCHAR(32) NULL,
city VARCHAR(128) NULL,
zip_code VARCHAR(16) NULL,
country CHAR(2) NULL,
department VARCHAR(128) NULL,
parcel_external_id VARCHAR(64) NULL,
parcel_name VARCHAR(128) NULL,
address_class VARCHAR(32) NULL,
company_tax_number VARCHAR(64) NULL,
company_name VARCHAR(128) NULL,
payload_json JSON NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY order_addresses_order_type_unique (order_id, address_type),
KEY order_addresses_email_idx (email),
CONSTRAINT order_addresses_order_fk
FOREIGN KEY (order_id) REFERENCES orders(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS order_items (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
order_id BIGINT UNSIGNED NOT NULL,
source_item_id VARCHAR(64) NULL,
external_item_id VARCHAR(64) NULL,
ean VARCHAR(32) NULL,
sku VARCHAR(128) NULL,
original_name VARCHAR(255) NOT NULL,
original_code VARCHAR(128) NULL,
original_price_with_tax DECIMAL(12,2) NULL,
original_price_without_tax DECIMAL(12,2) NULL,
media_url VARCHAR(512) NULL,
quantity DECIMAL(12,3) NOT NULL DEFAULT 1.000,
tax_rate DECIMAL(6,2) NULL,
item_status VARCHAR(32) NULL,
unit VARCHAR(16) NULL,
item_type VARCHAR(32) NOT NULL COMMENT 'e.g. product, shipment, service',
source_product_id VARCHAR(64) NULL,
source_product_set_id VARCHAR(64) NULL,
sort_order INT UNSIGNED NOT NULL DEFAULT 0,
payload_json JSON NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY order_items_order_source_item_unique (order_id, source_item_id),
KEY order_items_order_idx (order_id),
KEY order_items_sku_idx (sku),
KEY order_items_ean_idx (ean),
CONSTRAINT order_items_order_fk
FOREIGN KEY (order_id) REFERENCES orders(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS order_payments (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
order_id BIGINT UNSIGNED NOT NULL,
source_payment_id VARCHAR(64) NULL,
external_payment_id VARCHAR(64) NULL,
payment_type_id VARCHAR(64) NOT NULL,
payment_date DATETIME NULL,
amount DECIMAL(12,2) NULL,
currency CHAR(3) NULL,
comment VARCHAR(255) NULL,
payload_json JSON NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY order_payments_order_source_payment_unique (order_id, source_payment_id),
KEY order_payments_order_idx (order_id),
KEY order_payments_date_idx (payment_date),
CONSTRAINT order_payments_order_fk
FOREIGN KEY (order_id) REFERENCES orders(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS order_shipments (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
order_id BIGINT UNSIGNED NOT NULL,
source_shipment_id VARCHAR(64) NULL,
external_shipment_id VARCHAR(64) NULL,
tracking_number VARCHAR(128) NOT NULL,
carrier_provider_id VARCHAR(64) NOT NULL,
posted_at DATETIME NULL,
media_uuid CHAR(36) NULL,
payload_json JSON NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY order_shipments_order_source_shipment_unique (order_id, source_shipment_id),
KEY order_shipments_order_idx (order_id),
KEY order_shipments_tracking_idx (tracking_number),
CONSTRAINT order_shipments_order_fk
FOREIGN KEY (order_id) REFERENCES orders(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS order_documents (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
order_id BIGINT UNSIGNED NOT NULL,
source_document_id VARCHAR(64) NULL,
external_document_id VARCHAR(64) NULL,
document_number VARCHAR(64) NULL,
price_with_tax DECIMAL(12,2) NULL,
price_without_tax DECIMAL(12,2) NULL,
currency CHAR(3) NULL,
currency_value DECIMAL(12,4) NULL,
document_type_id VARCHAR(64) NULL,
media_uuid CHAR(36) NULL,
source_created_at DATETIME NULL,
payload_json JSON NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY order_documents_order_source_document_unique (order_id, source_document_id),
KEY order_documents_order_idx (order_id),
KEY order_documents_number_idx (document_number),
CONSTRAINT order_documents_order_fk
FOREIGN KEY (order_id) REFERENCES orders(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS order_notes (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
order_id BIGINT UNSIGNED NOT NULL,
source_note_id VARCHAR(64) NULL,
note_type VARCHAR(32) NOT NULL,
created_at_external DATETIME NULL,
comment TEXT NOT NULL,
payload_json JSON NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY order_notes_order_source_note_unique (order_id, source_note_id),
KEY order_notes_order_idx (order_id),
CONSTRAINT order_notes_order_fk
FOREIGN KEY (order_id) REFERENCES orders(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS order_status_history (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
order_id BIGINT UNSIGNED NOT NULL,
from_status_id VARCHAR(64) NULL,
to_status_id VARCHAR(64) NOT NULL,
changed_at DATETIME NOT NULL,
change_source ENUM('import', 'manual', 'api', 'sync') NOT NULL DEFAULT 'import',
comment VARCHAR(255) NULL,
payload_json JSON NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY order_status_history_order_changed_idx (order_id, changed_at),
KEY order_status_history_to_status_idx (to_status_id),
CONSTRAINT order_status_history_order_fk
FOREIGN KEY (order_id) REFERENCES orders(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS order_tags_dict (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
integration_id INT UNSIGNED NULL,
source_tag_id VARCHAR(64) NOT NULL,
tag_name VARCHAR(128) NULL,
is_active TINYINT(1) NOT NULL DEFAULT 1,
updated_at_external DATETIME NULL,
payload_json JSON NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY order_tags_dict_integration_source_tag_unique (integration_id, source_tag_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS order_tag_links (
order_id BIGINT UNSIGNED NOT NULL,
tag_dict_id BIGINT UNSIGNED NOT NULL,
assigned_at DATETIME NULL,
payload_json JSON NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (order_id, tag_dict_id),
KEY order_tag_links_tag_idx (tag_dict_id),
CONSTRAINT order_tag_links_order_fk
FOREIGN KEY (order_id) REFERENCES orders(id)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT order_tag_links_tag_fk
FOREIGN KEY (tag_dict_id) REFERENCES order_tags_dict(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS integration_order_sync_state (
integration_id INT UNSIGNED NOT NULL PRIMARY KEY,
last_synced_order_updated_at DATETIME NULL,
last_synced_source_order_id VARCHAR(64) NULL,
last_synced_external_order_id VARCHAR(128) NULL,
last_run_at DATETIME NULL,
last_success_at DATETIME NULL,
last_error VARCHAR(500) NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;