equipment stuff
This commit is contained in:
@@ -41,29 +41,107 @@ CREATE TABLE lawn_sections (
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Equipment categories master table
|
||||
CREATE TABLE equipment_categories (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL UNIQUE,
|
||||
description TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Equipment types master table (shared across all users)
|
||||
CREATE TABLE equipment_types (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL UNIQUE,
|
||||
category VARCHAR(100) NOT NULL, -- mower, trimmer, spreader, sprayer, aerator, dethatcher
|
||||
category_id INTEGER REFERENCES equipment_categories(id),
|
||||
manufacturer VARCHAR(100),
|
||||
model VARCHAR(100),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- User equipment table
|
||||
-- User equipment table - comprehensive equipment management
|
||||
CREATE TABLE user_equipment (
|
||||
id SERIAL PRIMARY KEY,
|
||||
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||
equipment_type_id INTEGER REFERENCES equipment_types(id),
|
||||
category_id INTEGER REFERENCES equipment_categories(id),
|
||||
custom_name VARCHAR(255),
|
||||
tank_size DECIMAL(8, 2), -- gallons (for sprayers)
|
||||
pump_gpm DECIMAL(8, 2), -- gallons per minute (for sprayers)
|
||||
nozzle_gpm DECIMAL(8, 2), -- gallons per minute per nozzle
|
||||
nozzle_count INTEGER, -- number of nozzles
|
||||
spreader_width DECIMAL(8, 2), -- width in feet (for spreaders)
|
||||
manufacturer VARCHAR(100),
|
||||
model VARCHAR(100),
|
||||
-- Spreader specific fields
|
||||
capacity_lbs DECIMAL(8, 2),
|
||||
spreader_type VARCHAR(50) CHECK (spreader_type IN ('walk_behind', 'pull_behind', 'handheld')),
|
||||
spread_width DECIMAL(8, 2),
|
||||
-- Sprayer specific fields
|
||||
tank_size_gallons DECIMAL(8, 2),
|
||||
sprayer_type VARCHAR(50) CHECK (sprayer_type IN ('tow_behind', 'mower_mounted', 'ride_on', 'walk_behind', 'hand_pump')),
|
||||
spray_width_feet DECIMAL(8, 2),
|
||||
pump_gpm DECIMAL(8, 2),
|
||||
pump_psi DECIMAL(8, 2),
|
||||
boom_sections INTEGER,
|
||||
-- Mower specific fields
|
||||
mower_style VARCHAR(50) CHECK (mower_style IN ('push', 'self_propelled', 'zero_turn', 'lawn_tractor', 'riding')),
|
||||
cutting_width_inches DECIMAL(6, 2),
|
||||
engine_hp DECIMAL(6, 2),
|
||||
fuel_type VARCHAR(30),
|
||||
-- Tool specific fields (aerator, dethatcher, scarifier)
|
||||
tool_type VARCHAR(50) CHECK (tool_type IN ('walk_behind', 'tow_behind', 'handheld')),
|
||||
working_width_inches DECIMAL(6, 2),
|
||||
-- Pump specific fields
|
||||
pump_type VARCHAR(50),
|
||||
max_gpm DECIMAL(8, 2),
|
||||
max_psi DECIMAL(8, 2),
|
||||
power_source VARCHAR(50), -- electric, gas, pto, etc.
|
||||
-- General fields
|
||||
purchase_date DATE,
|
||||
purchase_price DECIMAL(10, 2),
|
||||
notes TEXT,
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Nozzle types master table
|
||||
CREATE TABLE nozzle_types (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
manufacturer VARCHAR(100),
|
||||
model VARCHAR(100),
|
||||
orifice_size VARCHAR(20),
|
||||
spray_angle INTEGER,
|
||||
flow_rate_gpm DECIMAL(6, 3),
|
||||
droplet_size VARCHAR(50), -- fine, medium, coarse, very_coarse, extremely_coarse
|
||||
spray_pattern VARCHAR(50), -- flat_fan, hollow_cone, full_cone, flooding
|
||||
pressure_range_psi VARCHAR(50),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- User's nozzle inventory
|
||||
CREATE TABLE user_nozzles (
|
||||
id SERIAL PRIMARY KEY,
|
||||
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||
nozzle_type_id INTEGER REFERENCES nozzle_types(id),
|
||||
custom_name VARCHAR(255),
|
||||
quantity INTEGER DEFAULT 1,
|
||||
condition VARCHAR(50) DEFAULT 'good', -- excellent, good, fair, poor, needs_replacement
|
||||
purchase_date DATE,
|
||||
notes TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Equipment nozzle assignments (which nozzles are on which sprayers)
|
||||
CREATE TABLE equipment_nozzle_assignments (
|
||||
id SERIAL PRIMARY KEY,
|
||||
user_equipment_id INTEGER REFERENCES user_equipment(id) ON DELETE CASCADE,
|
||||
user_nozzle_id INTEGER REFERENCES user_nozzles(id) ON DELETE CASCADE,
|
||||
position VARCHAR(50), -- left, right, center, boom_1, boom_2, etc.
|
||||
quantity_assigned INTEGER DEFAULT 1,
|
||||
assigned_date DATE DEFAULT CURRENT_DATE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE(user_equipment_id, user_nozzle_id, position)
|
||||
);
|
||||
|
||||
-- Product categories
|
||||
CREATE TABLE product_categories (
|
||||
id SERIAL PRIMARY KEY,
|
||||
@@ -181,22 +259,72 @@ CREATE TABLE weather_data (
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Insert equipment categories
|
||||
INSERT INTO equipment_categories (name, description) VALUES
|
||||
('Mower', 'Lawn mowing equipment'),
|
||||
('Spreader', 'Granular product application equipment'),
|
||||
('Sprayer', 'Liquid product application equipment'),
|
||||
('Nozzle', 'Spray nozzles and tips'),
|
||||
('Pump', 'Water and chemical pumps'),
|
||||
('Aerator', 'Soil aeration equipment'),
|
||||
('Dethatcher', 'Thatch removal equipment'),
|
||||
('Scarifier', 'Soil scarification equipment'),
|
||||
('Trimmer', 'Edge and trim equipment'),
|
||||
('Other', 'Miscellaneous lawn care equipment');
|
||||
|
||||
-- Insert default equipment types
|
||||
INSERT INTO equipment_types (name, category) VALUES
|
||||
('Walk-behind Mower', 'mower'),
|
||||
('Riding Mower', 'mower'),
|
||||
('Zero-turn Mower', 'mower'),
|
||||
('String Trimmer', 'trimmer'),
|
||||
('Backpack Sprayer', 'sprayer'),
|
||||
('Pull-behind Sprayer', 'sprayer'),
|
||||
('Boom Sprayer', 'sprayer'),
|
||||
('Broadcast Spreader', 'spreader'),
|
||||
('Drop Spreader', 'spreader'),
|
||||
('Hand Spreader', 'spreader'),
|
||||
('Core Aerator', 'aerator'),
|
||||
('Spike Aerator', 'aerator'),
|
||||
('Dethatcher', 'dethatcher'),
|
||||
('Power Rake', 'dethatcher');
|
||||
INSERT INTO equipment_types (name, category_id) VALUES
|
||||
-- Mowers
|
||||
('Walk-behind Mower', 1),
|
||||
('Self-Propelled Mower', 1),
|
||||
('Zero-turn Mower', 1),
|
||||
('Lawn Tractor', 1),
|
||||
('Riding Mower', 1),
|
||||
-- Spreaders
|
||||
('Broadcast Spreader', 2),
|
||||
('Drop Spreader', 2),
|
||||
('Hand Spreader', 2),
|
||||
('Pull-behind Spreader', 2),
|
||||
-- Sprayers
|
||||
('Backpack Sprayer', 3),
|
||||
('Pull-behind Sprayer', 3),
|
||||
('Boom Sprayer', 3),
|
||||
('Hand Pump Sprayer', 3),
|
||||
('Ride-on Sprayer', 3),
|
||||
('Mower-mounted Sprayer', 3),
|
||||
-- Pumps
|
||||
('Centrifugal Pump', 5),
|
||||
('Diaphragm Pump', 5),
|
||||
('Roller Pump', 5),
|
||||
('Gear Pump', 5),
|
||||
-- Aerators
|
||||
('Core Aerator', 6),
|
||||
('Spike Aerator', 6),
|
||||
('Plug Aerator', 6),
|
||||
-- Dethatchers
|
||||
('Power Rake', 7),
|
||||
('Vertical Mower', 7),
|
||||
('Dethatcher', 7),
|
||||
-- Scarifiers
|
||||
('Walk-behind Scarifier', 8),
|
||||
('Tow-behind Scarifier', 8),
|
||||
-- Trimmers
|
||||
('String Trimmer', 9),
|
||||
('Brush Cutter', 9),
|
||||
('Edger', 9);
|
||||
|
||||
-- Insert common nozzle types
|
||||
INSERT INTO nozzle_types (name, manufacturer, orifice_size, spray_angle, flow_rate_gpm, droplet_size, spray_pattern, pressure_range_psi) VALUES
|
||||
('XR8002', 'TeeJet', '02', 80, 0.20, 'fine', 'flat_fan', '15-60'),
|
||||
('XR8003', 'TeeJet', '03', 80, 0.30, 'fine', 'flat_fan', '15-60'),
|
||||
('XR8004', 'TeeJet', '04', 80, 0.40, 'fine', 'flat_fan', '15-60'),
|
||||
('XR8005', 'TeeJet', '05', 80, 0.50, 'fine', 'flat_fan', '15-60'),
|
||||
('AIXR11002', 'TeeJet', '02', 110, 0.20, 'medium', 'flat_fan', '15-60'),
|
||||
('AIXR11003', 'TeeJet', '03', 110, 0.30, 'medium', 'flat_fan', '15-60'),
|
||||
('AIXR11004', 'TeeJet', '04', 110, 0.40, 'medium', 'flat_fan', '15-60'),
|
||||
('TTI11002', 'TeeJet', '02', 110, 0.20, 'very_coarse', 'flat_fan', '15-60'),
|
||||
('TTI11003', 'TeeJet', '03', 110, 0.30, 'very_coarse', 'flat_fan', '15-60'),
|
||||
('TTI11004', 'TeeJet', '04', 110, 0.40, 'very_coarse', 'flat_fan', '15-60');
|
||||
|
||||
-- Insert product categories
|
||||
INSERT INTO product_categories (name, description) VALUES
|
||||
@@ -248,5 +376,6 @@ CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users FOR EACH ROW EXECU
|
||||
CREATE TRIGGER update_properties_updated_at BEFORE UPDATE ON properties FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
CREATE TRIGGER update_lawn_sections_updated_at BEFORE UPDATE ON lawn_sections FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
CREATE TRIGGER update_user_equipment_updated_at BEFORE UPDATE ON user_equipment FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
CREATE TRIGGER update_user_nozzles_updated_at BEFORE UPDATE ON user_nozzles FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
CREATE TRIGGER update_user_products_updated_at BEFORE UPDATE ON user_products FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
CREATE TRIGGER update_application_plans_updated_at BEFORE UPDATE ON application_plans FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||||
200
database/migrations/comprehensive_equipment_upgrade.sql
Normal file
200
database/migrations/comprehensive_equipment_upgrade.sql
Normal file
@@ -0,0 +1,200 @@
|
||||
-- Comprehensive Equipment System Migration
|
||||
-- This migration transforms the basic equipment system into a comprehensive one
|
||||
-- supporting spreaders, sprayers, nozzles, pumps, mowers, and lawn tools
|
||||
|
||||
-- Step 1: Create new equipment categories table
|
||||
CREATE TABLE IF NOT EXISTS equipment_categories (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL UNIQUE,
|
||||
description TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Step 2: Insert equipment categories
|
||||
INSERT INTO equipment_categories (name, description) VALUES
|
||||
('Mower', 'Lawn mowing equipment'),
|
||||
('Spreader', 'Granular product application equipment'),
|
||||
('Sprayer', 'Liquid product application equipment'),
|
||||
('Nozzle', 'Spray nozzles and tips'),
|
||||
('Pump', 'Water and chemical pumps'),
|
||||
('Aerator', 'Soil aeration equipment'),
|
||||
('Dethatcher', 'Thatch removal equipment'),
|
||||
('Scarifier', 'Soil scarification equipment'),
|
||||
('Trimmer', 'Edge and trim equipment'),
|
||||
('Other', 'Miscellaneous lawn care equipment')
|
||||
ON CONFLICT (name) DO NOTHING;
|
||||
|
||||
-- Step 3: Add category_id to equipment_types if it doesn't exist
|
||||
ALTER TABLE equipment_types
|
||||
ADD COLUMN IF NOT EXISTS category_id INTEGER REFERENCES equipment_categories(id),
|
||||
ADD COLUMN IF NOT EXISTS manufacturer VARCHAR(100),
|
||||
ADD COLUMN IF NOT EXISTS model VARCHAR(100);
|
||||
|
||||
-- Step 4: Update existing equipment_types with category_id based on legacy category field
|
||||
UPDATE equipment_types SET category_id = (
|
||||
SELECT id FROM equipment_categories
|
||||
WHERE LOWER(equipment_categories.name) = LOWER(equipment_types.category)
|
||||
) WHERE category_id IS NULL;
|
||||
|
||||
-- Step 5: Add comprehensive fields to user_equipment table
|
||||
ALTER TABLE user_equipment
|
||||
ADD COLUMN IF NOT EXISTS category_id INTEGER REFERENCES equipment_categories(id),
|
||||
ADD COLUMN IF NOT EXISTS manufacturer VARCHAR(100),
|
||||
ADD COLUMN IF NOT EXISTS model VARCHAR(100),
|
||||
-- Spreader specific fields
|
||||
ADD COLUMN IF NOT EXISTS capacity_lbs DECIMAL(8, 2),
|
||||
ADD COLUMN IF NOT EXISTS spreader_type VARCHAR(50) CHECK (spreader_type IN ('walk_behind', 'pull_behind', 'handheld')),
|
||||
ADD COLUMN IF NOT EXISTS spread_width DECIMAL(8, 2),
|
||||
-- Sprayer specific fields (rename existing fields)
|
||||
ADD COLUMN IF NOT EXISTS tank_size_gallons DECIMAL(8, 2),
|
||||
ADD COLUMN IF NOT EXISTS sprayer_type VARCHAR(50) CHECK (sprayer_type IN ('tow_behind', 'mower_mounted', 'ride_on', 'walk_behind', 'hand_pump')),
|
||||
ADD COLUMN IF NOT EXISTS spray_width_feet DECIMAL(8, 2),
|
||||
ADD COLUMN IF NOT EXISTS pump_psi DECIMAL(8, 2),
|
||||
ADD COLUMN IF NOT EXISTS boom_sections INTEGER,
|
||||
-- Mower specific fields
|
||||
ADD COLUMN IF NOT EXISTS mower_style VARCHAR(50) CHECK (mower_style IN ('push', 'self_propelled', 'zero_turn', 'lawn_tractor', 'riding')),
|
||||
ADD COLUMN IF NOT EXISTS cutting_width_inches DECIMAL(6, 2),
|
||||
ADD COLUMN IF NOT EXISTS engine_hp DECIMAL(6, 2),
|
||||
ADD COLUMN IF NOT EXISTS fuel_type VARCHAR(30),
|
||||
-- Tool specific fields (aerator, dethatcher, scarifier)
|
||||
ADD COLUMN IF NOT EXISTS tool_type VARCHAR(50) CHECK (tool_type IN ('walk_behind', 'tow_behind', 'handheld')),
|
||||
ADD COLUMN IF NOT EXISTS working_width_inches DECIMAL(6, 2),
|
||||
-- Pump specific fields
|
||||
ADD COLUMN IF NOT EXISTS pump_type VARCHAR(50),
|
||||
ADD COLUMN IF NOT EXISTS max_gpm DECIMAL(8, 2),
|
||||
ADD COLUMN IF NOT EXISTS max_psi DECIMAL(8, 2),
|
||||
ADD COLUMN IF NOT EXISTS power_source VARCHAR(50),
|
||||
-- General fields
|
||||
ADD COLUMN IF NOT EXISTS purchase_date DATE,
|
||||
ADD COLUMN IF NOT EXISTS purchase_price DECIMAL(10, 2),
|
||||
ADD COLUMN IF NOT EXISTS is_active BOOLEAN DEFAULT true;
|
||||
|
||||
-- Step 6: Migrate existing data to new fields
|
||||
UPDATE user_equipment
|
||||
SET
|
||||
tank_size_gallons = tank_size,
|
||||
spread_width = spreader_width
|
||||
WHERE tank_size_gallons IS NULL AND tank_size IS NOT NULL
|
||||
OR spread_width IS NULL AND spreader_width IS NOT NULL;
|
||||
|
||||
-- Set category_id based on equipment_type
|
||||
UPDATE user_equipment SET category_id = (
|
||||
SELECT et.category_id FROM equipment_types et
|
||||
WHERE et.id = user_equipment.equipment_type_id
|
||||
) WHERE category_id IS NULL;
|
||||
|
||||
-- Step 7: Create nozzle types master table
|
||||
CREATE TABLE IF NOT EXISTS nozzle_types (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
manufacturer VARCHAR(100),
|
||||
model VARCHAR(100),
|
||||
orifice_size VARCHAR(20),
|
||||
spray_angle INTEGER,
|
||||
flow_rate_gpm DECIMAL(6, 3),
|
||||
droplet_size VARCHAR(50), -- fine, medium, coarse, very_coarse, extremely_coarse
|
||||
spray_pattern VARCHAR(50), -- flat_fan, hollow_cone, full_cone, flooding
|
||||
pressure_range_psi VARCHAR(50),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Step 8: Insert common nozzle types
|
||||
INSERT INTO nozzle_types (name, manufacturer, orifice_size, spray_angle, flow_rate_gpm, droplet_size, spray_pattern, pressure_range_psi) VALUES
|
||||
('XR8002', 'TeeJet', '02', 80, 0.20, 'fine', 'flat_fan', '15-60'),
|
||||
('XR8003', 'TeeJet', '03', 80, 0.30, 'fine', 'flat_fan', '15-60'),
|
||||
('XR8004', 'TeeJet', '04', 80, 0.40, 'fine', 'flat_fan', '15-60'),
|
||||
('XR8005', 'TeeJet', '05', 80, 0.50, 'fine', 'flat_fan', '15-60'),
|
||||
('AIXR11002', 'TeeJet', '02', 110, 0.20, 'medium', 'flat_fan', '15-60'),
|
||||
('AIXR11003', 'TeeJet', '03', 110, 0.30, 'medium', 'flat_fan', '15-60'),
|
||||
('AIXR11004', 'TeeJet', '04', 110, 0.40, 'medium', 'flat_fan', '15-60'),
|
||||
('TTI11002', 'TeeJet', '02', 110, 0.20, 'very_coarse', 'flat_fan', '15-60'),
|
||||
('TTI11003', 'TeeJet', '03', 110, 0.30, 'very_coarse', 'flat_fan', '15-60'),
|
||||
('TTI11004', 'TeeJet', '04', 110, 0.40, 'very_coarse', 'flat_fan', '15-60')
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
-- Step 9: Create user nozzles table
|
||||
CREATE TABLE IF NOT EXISTS user_nozzles (
|
||||
id SERIAL PRIMARY KEY,
|
||||
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||
nozzle_type_id INTEGER REFERENCES nozzle_types(id),
|
||||
custom_name VARCHAR(255),
|
||||
quantity INTEGER DEFAULT 1,
|
||||
condition VARCHAR(50) DEFAULT 'good', -- excellent, good, fair, poor, needs_replacement
|
||||
purchase_date DATE,
|
||||
notes TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Step 10: Create equipment nozzle assignments table
|
||||
CREATE TABLE IF NOT EXISTS equipment_nozzle_assignments (
|
||||
id SERIAL PRIMARY KEY,
|
||||
user_equipment_id INTEGER REFERENCES user_equipment(id) ON DELETE CASCADE,
|
||||
user_nozzle_id INTEGER REFERENCES user_nozzles(id) ON DELETE CASCADE,
|
||||
position VARCHAR(50), -- left, right, center, boom_1, boom_2, etc.
|
||||
quantity_assigned INTEGER DEFAULT 1,
|
||||
assigned_date DATE DEFAULT CURRENT_DATE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE(user_equipment_id, user_nozzle_id, position)
|
||||
);
|
||||
|
||||
-- Step 11: Add new equipment types that weren't in the original seed
|
||||
INSERT INTO equipment_types (name, category_id) VALUES
|
||||
-- Additional Mowers
|
||||
('Self-Propelled Mower', (SELECT id FROM equipment_categories WHERE name = 'Mower')),
|
||||
('Lawn Tractor', (SELECT id FROM equipment_categories WHERE name = 'Mower')),
|
||||
-- Additional Spreaders
|
||||
('Pull-behind Spreader', (SELECT id FROM equipment_categories WHERE name = 'Spreader')),
|
||||
-- Additional Sprayers
|
||||
('Hand Pump Sprayer', (SELECT id FROM equipment_categories WHERE name = 'Sprayer')),
|
||||
('Ride-on Sprayer', (SELECT id FROM equipment_categories WHERE name = 'Sprayer')),
|
||||
('Mower-mounted Sprayer', (SELECT id FROM equipment_categories WHERE name = 'Sprayer')),
|
||||
-- Pumps
|
||||
('Centrifugal Pump', (SELECT id FROM equipment_categories WHERE name = 'Pump')),
|
||||
('Diaphragm Pump', (SELECT id FROM equipment_categories WHERE name = 'Pump')),
|
||||
('Roller Pump', (SELECT id FROM equipment_categories WHERE name = 'Pump')),
|
||||
('Gear Pump', (SELECT id FROM equipment_categories WHERE name = 'Pump')),
|
||||
-- Additional Aerators
|
||||
('Plug Aerator', (SELECT id FROM equipment_categories WHERE name = 'Aerator')),
|
||||
-- Dethatchers
|
||||
('Vertical Mower', (SELECT id FROM equipment_categories WHERE name = 'Dethatcher')),
|
||||
-- Scarifiers
|
||||
('Walk-behind Scarifier', (SELECT id FROM equipment_categories WHERE name = 'Scarifier')),
|
||||
('Tow-behind Scarifier', (SELECT id FROM equipment_categories WHERE name = 'Scarifier')),
|
||||
-- Additional Trimmers
|
||||
('Brush Cutter', (SELECT id FROM equipment_categories WHERE name = 'Trimmer')),
|
||||
('Edger', (SELECT id FROM equipment_categories WHERE name = 'Trimmer'))
|
||||
ON CONFLICT (name) DO NOTHING;
|
||||
|
||||
-- Step 12: Create triggers for updated_at fields
|
||||
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = CURRENT_TIMESTAMP;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ language 'plpgsql';
|
||||
|
||||
-- Add trigger for user_nozzles if it doesn't exist
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'update_user_nozzles_updated_at') THEN
|
||||
CREATE TRIGGER update_user_nozzles_updated_at
|
||||
BEFORE UPDATE ON user_nozzles
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_updated_at_column();
|
||||
END IF;
|
||||
END
|
||||
$$;
|
||||
|
||||
-- Step 13: Create indexes for better performance
|
||||
CREATE INDEX IF NOT EXISTS idx_user_equipment_category_id ON user_equipment(category_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_equipment_user_category ON user_equipment(user_id, category_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_equipment_types_category_id ON equipment_types(category_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_nozzles_user_id ON user_nozzles(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_nozzles_type_id ON user_nozzles(nozzle_type_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_equipment_nozzle_assignments_equipment ON equipment_nozzle_assignments(user_equipment_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_equipment_nozzle_assignments_nozzle ON equipment_nozzle_assignments(user_nozzle_id);
|
||||
|
||||
-- Migration completed successfully
|
||||
SELECT 'Equipment system migration completed successfully!' as migration_status;
|
||||
Reference in New Issue
Block a user