-- 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;