some new updates
This commit is contained in:
parent
a2cefc7b7a
commit
bf43c58e3a
172
db/migrations/2026-04-26_production_sales_orders_sync.sql
Normal file
172
db/migrations/2026-04-26_production_sales_orders_sync.sql
Normal file
@ -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;
|
||||
@ -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`
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user