From bf43c58e3a5da8d8d4859afe982626ee202eeeea Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 26 Apr 2026 02:28:28 +0000 Subject: [PATCH] some new updates --- ...026-04-26_production_sales_orders_sync.sql | 172 ++++++++++++++++++ db/schema.sql | 7 +- 2 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 db/migrations/2026-04-26_production_sales_orders_sync.sql diff --git a/db/migrations/2026-04-26_production_sales_orders_sync.sql b/db/migrations/2026-04-26_production_sales_orders_sync.sql new file mode 100644 index 0000000..2de8711 --- /dev/null +++ b/db/migrations/2026-04-26_production_sales_orders_sync.sql @@ -0,0 +1,172 @@ +-- Production sync for current sales/POS/Eid release. +-- Safe to import on an existing production database. +-- This consolidates the sales_orders columns/indexes now required by the app. + +SET @OLD_FOREIGN_KEY_CHECKS = @@FOREIGN_KEY_CHECKS; +SET FOREIGN_KEY_CHECKS = 0; + +DROP PROCEDURE IF EXISTS apply_production_sales_orders_sync; +DELIMITER $$ +CREATE PROCEDURE apply_production_sales_orders_sync() +BEGIN + -- sales_orders.customer_id + IF NOT EXISTS ( + SELECT 1 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sales_orders' + AND COLUMN_NAME = 'customer_id' + ) THEN + ALTER TABLE sales_orders + ADD COLUMN customer_id INT(10) UNSIGNED DEFAULT NULL AFTER role_name; + END IF; + + -- sales_orders.payment_status + IF NOT EXISTS ( + SELECT 1 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sales_orders' + AND COLUMN_NAME = 'payment_status' + ) THEN + ALTER TABLE sales_orders + ADD COLUMN payment_status VARCHAR(20) NOT NULL DEFAULT 'paid' AFTER payment_method; + END IF; + + -- sales_orders.vat_amount + IF NOT EXISTS ( + SELECT 1 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sales_orders' + AND COLUMN_NAME = 'vat_amount' + ) THEN + ALTER TABLE sales_orders + ADD COLUMN vat_amount DECIMAL(10,3) NOT NULL DEFAULT 0.000 AFTER subtotal; + END IF; + + -- sales_orders.paid_amount + IF NOT EXISTS ( + SELECT 1 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sales_orders' + AND COLUMN_NAME = 'paid_amount' + ) THEN + ALTER TABLE sales_orders + ADD COLUMN paid_amount DECIMAL(10,3) NOT NULL DEFAULT 0.000 AFTER total_amount; + END IF; + + -- sales_orders.due_amount + IF NOT EXISTS ( + SELECT 1 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sales_orders' + AND COLUMN_NAME = 'due_amount' + ) THEN + ALTER TABLE sales_orders + ADD COLUMN due_amount DECIMAL(10,3) NOT NULL DEFAULT 0.000 AFTER paid_amount; + END IF; + + -- sales_orders.order_type + IF NOT EXISTS ( + SELECT 1 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sales_orders' + AND COLUMN_NAME = 'order_type' + ) THEN + ALTER TABLE sales_orders + ADD COLUMN order_type VARCHAR(30) NOT NULL DEFAULT 'standard' AFTER status; + END IF; + + -- sales_orders.delivery_status + IF NOT EXISTS ( + SELECT 1 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sales_orders' + AND COLUMN_NAME = 'delivery_status' + ) THEN + ALTER TABLE sales_orders + ADD COLUMN delivery_status VARCHAR(30) NOT NULL DEFAULT 'pending' AFTER order_type; + END IF; + + -- sales_orders.delivery_date + IF NOT EXISTS ( + SELECT 1 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sales_orders' + AND COLUMN_NAME = 'delivery_date' + ) THEN + ALTER TABLE sales_orders + ADD COLUMN delivery_date DATE DEFAULT NULL AFTER delivery_status; + END IF; + + -- sales_orders indexes used by the current Eid Orders queries. + IF NOT EXISTS ( + SELECT 1 + FROM INFORMATION_SCHEMA.STATISTICS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sales_orders' + AND INDEX_NAME = 'idx_order_type' + ) THEN + ALTER TABLE sales_orders + ADD INDEX idx_order_type (order_type); + END IF; + + IF NOT EXISTS ( + SELECT 1 + FROM INFORMATION_SCHEMA.STATISTICS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sales_orders' + AND INDEX_NAME = 'idx_delivery_date' + ) THEN + ALTER TABLE sales_orders + ADD INDEX idx_delivery_date (delivery_date); + END IF; + + -- Backfill / normalize values for existing rows. + UPDATE sales_orders + SET paid_amount = CASE + WHEN COALESCE(payment_status, 'paid') = 'unpaid' THEN 0 + WHEN COALESCE(paid_amount, 0) = 0 THEN total_amount + ELSE paid_amount + END + WHERE paid_amount IS NULL OR paid_amount = 0; + + UPDATE sales_orders + SET due_amount = GREATEST(total_amount - COALESCE(paid_amount, 0), 0) + WHERE due_amount IS NULL OR ABS(due_amount - GREATEST(total_amount - COALESCE(paid_amount, 0), 0)) > 0.0005; + + UPDATE sales_orders + SET payment_status = CASE + WHEN COALESCE(due_amount, 0) <= 0.0005 THEN 'paid' + WHEN COALESCE(paid_amount, 0) > 0 THEN 'partial' + ELSE 'unpaid' + END + WHERE payment_status IS NULL OR TRIM(payment_status) = '' OR payment_status NOT IN ('paid', 'partial', 'unpaid'); + + UPDATE sales_orders + SET order_type = 'standard' + WHERE order_type IS NULL OR TRIM(order_type) = ''; + + UPDATE sales_orders + SET delivery_status = CASE + WHEN COALESCE(status, 'completed') = 'completed' THEN 'delivered' + ELSE 'pending' + END + WHERE delivery_status IS NULL OR TRIM(delivery_status) = ''; +END $$ +DELIMITER ; + +CALL apply_production_sales_orders_sync(); +DROP PROCEDURE IF EXISTS apply_production_sales_orders_sync; + +SET FOREIGN_KEY_CHECKS = @OLD_FOREIGN_KEY_CHECKS; + +-- Optional verification after import: +-- SHOW COLUMNS FROM sales_orders; +-- SHOW INDEX FROM sales_orders; diff --git a/db/schema.sql b/db/schema.sql index 8b955c4..ccfb4a6 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -145,11 +145,16 @@ CREATE TABLE IF NOT EXISTS `sales_orders` ( `sale_date` datetime NOT NULL DEFAULT current_timestamp(), `created_at` datetime NOT NULL DEFAULT current_timestamp(), `status` varchar(20) NOT NULL DEFAULT 'completed', + `order_type` varchar(30) NOT NULL DEFAULT 'standard', + `delivery_status` varchar(30) NOT NULL DEFAULT 'pending', + `delivery_date` date DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `receipt_no` (`receipt_no`), KEY `idx_sale_mode` (`sale_mode`), KEY `idx_branch_code` (`branch_code`), - KEY `idx_sale_date` (`sale_date`) + KEY `idx_sale_date` (`sale_date`), + KEY `idx_order_type` (`order_type`), + KEY `idx_delivery_date` (`delivery_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- Table structure for `settings`