-- PostgreSQL Initial Schema for Autotask Sync -- This migration creates all entity tables with audit fields, foreign keys, and sync_history table -- Enable UUID extension if needed CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- ============================================================================ -- CORE ENTITY TABLES -- ============================================================================ -- Companies table CREATE TABLE IF NOT EXISTS companies ( id BIGINT PRIMARY KEY, company_name VARCHAR(255), company_number VARCHAR(100), phone VARCHAR(50), fax VARCHAR(50), website VARCHAR(255), address1 VARCHAR(255), address2 VARCHAR(255), city VARCHAR(100), state VARCHAR(50), postal_code VARCHAR(20), country VARCHAR(100), is_active BOOLEAN DEFAULT true, company_type INTEGER, owner_resource_id BIGINT, territory_id BIGINT, market_segment_id BIGINT, competitor_id BIGINT, billing_address1 VARCHAR(255), billing_address2 VARCHAR(255), billing_city VARCHAR(100), billing_state VARCHAR(50), billing_postal_code VARCHAR(20), billing_country VARCHAR(100), tax_id VARCHAR(50), tax_exempt BOOLEAN DEFAULT false, tax_region_id BIGINT, currency_id INTEGER, invoice_method INTEGER, invoice_template_id BIGINT, quote_template_id BIGINT, key_account_icon INTEGER, last_activity_date TIMESTAMP, last_tracked_modification_date_time TIMESTAMP, api_vendor_id INTEGER, -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP ); -- Resources (Users) table CREATE TABLE IF NOT EXISTS resources ( id BIGINT PRIMARY KEY, first_name VARCHAR(100), last_name VARCHAR(100), email VARCHAR(255), user_name VARCHAR(100), title VARCHAR(100), office_phone VARCHAR(50), mobile_phone VARCHAR(50), office_extension VARCHAR(20), is_active BOOLEAN DEFAULT true, location_id BIGINT, resource_type INTEGER, pay_roll_identifier VARCHAR(100), hire_date DATE, travel_availability_pct DECIMAL(5,2), survey_resource_rating DECIMAL(3,2), -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP ); -- Contacts table CREATE TABLE IF NOT EXISTS contacts ( id BIGINT PRIMARY KEY, company_id BIGINT NOT NULL, first_name VARCHAR(100), last_name VARCHAR(100), title VARCHAR(100), email_address VARCHAR(255), email_address2 VARCHAR(255), email_address3 VARCHAR(255), phone VARCHAR(50), extension VARCHAR(20), alternate_phone VARCHAR(50), mobile_phone VARCHAR(50), fax VARCHAR(50), address_line VARCHAR(255), address_line1 VARCHAR(255), city VARCHAR(100), state VARCHAR(50), zip_code VARCHAR(20), country VARCHAR(100), is_active BOOLEAN DEFAULT true, name_prefix VARCHAR(20), name_suffix VARCHAR(20), facebook_url VARCHAR(255), twitter_url VARCHAR(255), linked_in_url VARCHAR(255), primary_contact BOOLEAN DEFAULT false, account_physical_location_id BIGINT, solicitation_opt_out BOOLEAN DEFAULT false, room_number VARCHAR(50), last_activity_date TIMESTAMP, last_modified_date TIMESTAMP, api_vendor_id INTEGER, -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP, FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE ); -- Projects table CREATE TABLE IF NOT EXISTS projects ( id BIGINT PRIMARY KEY, company_id BIGINT NOT NULL, project_name VARCHAR(255), project_number VARCHAR(100), description TEXT, start_date_time TIMESTAMP, end_date_time TIMESTAMP, estimated_time DECIMAL(10,2), actual_hours DECIMAL(10,2), estimated_sale_cost DECIMAL(15,2), labor_estimated_costs DECIMAL(15,2), labor_estimated_revenue DECIMAL(15,2), project_cost_estimated_margin_percentage DECIMAL(5,2), status INTEGER, type INTEGER, project_lead_resource_id BIGINT, account_executive_resource_id BIGINT, owner_resource_id BIGINT, creator_resource_id BIGINT, completed_percentage DECIMAL(5,2), completed_date_time TIMESTAMP, duration INTEGER, original_estimated_revenue DECIMAL(15,2), estimated_time_cost DECIMAL(15,2), purchase_order_number VARCHAR(100), business_division_subdivision_id INTEGER, line_of_business_id BIGINT, department INTEGER, last_activity_date_time TIMESTAMP, last_activity_person_type INTEGER, last_activity_resource_id BIGINT, -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP, FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE, FOREIGN KEY (project_lead_resource_id) REFERENCES resources(id) ON DELETE SET NULL, FOREIGN KEY (owner_resource_id) REFERENCES resources(id) ON DELETE SET NULL ); -- Tickets table CREATE TABLE IF NOT EXISTS tickets ( id BIGINT PRIMARY KEY, company_id BIGINT NOT NULL, ticket_number VARCHAR(100), title VARCHAR(255), description TEXT, status INTEGER, priority INTEGER, queue_id INTEGER, issue_type INTEGER, sub_issue_type INTEGER, source INTEGER, assigned_resource_id BIGINT, assigned_resource_role_id BIGINT, contact_id BIGINT, account_physical_location_id BIGINT, due_date_time TIMESTAMP, estimated_hours DECIMAL(10,2), completed_date TIMESTAMP, create_date TIMESTAMP, created_by_contact_id BIGINT, last_activity_date TIMESTAMP, last_customer_notification_date_time TIMESTAMP, last_customer_visible_activity_date_time TIMESTAMP, first_response_date_time TIMESTAMP, resolution_plan_date_time TIMESTAMP, resolved_date_time TIMESTAMP, first_response_assigned_resource_id BIGINT, first_response_initiating_resource_id BIGINT, project_id BIGINT, opportunity_id BIGINT, change_approval_board INTEGER, change_approval_status INTEGER, change_approval_type INTEGER, change_info_field1 VARCHAR(255), change_info_field2 VARCHAR(255), change_info_field3 VARCHAR(255), change_info_field4 VARCHAR(255), change_info_field5 VARCHAR(255), contract_id BIGINT, monitor_id BIGINT, monitor_type_id INTEGER, ticket_type INTEGER, ticket_category INTEGER, service_level_agreement_id INTEGER, resolution TEXT, purchase_order_number VARCHAR(100), ticket_completion_date TIMESTAMP, last_activity_person_type INTEGER, last_activity_resource_id BIGINT, current_service_thermometer_rating INTEGER, previous_service_thermometer_rating INTEGER, service_thermometer_temperature INTEGER, api_vendor_id INTEGER, -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP, FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE, FOREIGN KEY (assigned_resource_id) REFERENCES resources(id) ON DELETE SET NULL, FOREIGN KEY (contact_id) REFERENCES contacts(id) ON DELETE SET NULL, FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE SET NULL ); -- Tasks table CREATE TABLE IF NOT EXISTS tasks ( id BIGINT PRIMARY KEY, title VARCHAR(255), description TEXT, status INTEGER, priority INTEGER, assigned_resource_id BIGINT, assigned_resource_role_id BIGINT, department_id INTEGER, estimated_hours DECIMAL(10,2), remaining_hours DECIMAL(10,2), hours_to_be_scheduled DECIMAL(10,2), start_date_time TIMESTAMP, end_date_time TIMESTAMP, completed_date_time TIMESTAMP, create_date_time TIMESTAMP, creator_resource_id BIGINT, completed_by_resource_id BIGINT, last_activity_date_time TIMESTAMP, project_id BIGINT, ticket_id BIGINT, phase_id BIGINT, allocation_code_id BIGINT, task_type INTEGER, task_is_billable BOOLEAN DEFAULT true, task_number VARCHAR(100), purchase_order_number VARCHAR(100), can_client_portal_user_complete_task BOOLEAN DEFAULT false, creator_type INTEGER, task_category_id INTEGER, -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP, FOREIGN KEY (assigned_resource_id) REFERENCES resources(id) ON DELETE SET NULL, FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE, FOREIGN KEY (ticket_id) REFERENCES tickets(id) ON DELETE CASCADE ); -- Configuration Items table CREATE TABLE IF NOT EXISTS configuration_items ( id BIGINT PRIMARY KEY, company_id BIGINT NOT NULL, product_id BIGINT, reference_title VARCHAR(255), reference_number VARCHAR(100), serial_number VARCHAR(100), install_date DATE, warranty_expiration_date DATE, is_active BOOLEAN DEFAULT true, daily_cost DECIMAL(15,2), hourly_cost DECIMAL(15,2), monthly_cost DECIMAL(15,2), per_use_cost DECIMAL(15,2), setup_fee DECIMAL(15,2), contact_id BIGINT, location_id BIGINT, vendor_id BIGINT, installed_by_id BIGINT, installed_by_contact_id BIGINT, parent_configuration_item_id BIGINT, notes TEXT, create_date TIMESTAMP, created_by_person_id BIGINT, last_modified_time TIMESTAMP, last_activity_person_type INTEGER, impersonator_creator_resource_id BIGINT, configuration_item_category_id BIGINT, configuration_item_type INTEGER, datto_availability DECIMAL(5,2), datto_device_memory_megabytes BIGINT, datto_drives_errors BOOLEAN, datto_hostname VARCHAR(255), datto_internal_ip VARCHAR(50), datto_kernel_version_id BIGINT, datto_last_check_in_date_time TIMESTAMP, datto_nic_speed_kilobits_per_second BIGINT, datto_number_of_agents INTEGER, datto_number_of_drives INTEGER, datto_number_of_logical_volumes INTEGER, datto_number_of_volumes INTEGER, datto_off_site_storage_used_bytes BIGINT, datto_os_version_id BIGINT, datto_percentage_used DECIMAL(5,2), datto_protected_kilobytes BIGINT, datto_remote_ip VARCHAR(50), datto_serial_number VARCHAR(100), datto_uptime_seconds BIGINT, datto_used_kilobytes BIGINT, datto_z_pool_percentage DECIMAL(5,2), device_networking_id BIGINT, last_backup_date TIMESTAMP, last_backup_status INTEGER, os_version_id BIGINT, service_id BIGINT, service_bundle_id BIGINT, snmp_location VARCHAR(255), snmp_name VARCHAR(255), snmp_contact VARCHAR(255), api_vendor_id INTEGER, device_type VARCHAR(100), rmm_device_uid VARCHAR(255), rmm_device_audit_architecture_id BIGINT, rmm_device_audit_display_adaptor_id BIGINT, rmm_device_audit_domain_id BIGINT, rmm_device_audit_external_ip_address VARCHAR(50), rmm_device_audit_hostname VARCHAR(255), rmm_device_audit_ip_address VARCHAR(50), rmm_device_audit_mac_address VARCHAR(50), rmm_device_audit_manufacturer_id BIGINT, rmm_device_audit_missing_patch_count INTEGER, rmm_device_audit_mobile_network_operator_id BIGINT, rmm_device_audit_mobile_number VARCHAR(50), rmm_device_audit_model_id BIGINT, rmm_device_audit_motherboard_id BIGINT, rmm_device_audit_operating_system_id BIGINT, rmm_device_audit_processor_id BIGINT, rmm_device_audit_service_pack_id BIGINT, rmm_device_audit_snmp_contact VARCHAR(255), rmm_device_audit_snmp_location VARCHAR(255), rmm_device_audit_snmp_name VARCHAR(255), rmm_device_audit_software_status_id BIGINT, rmm_device_audit_storage_bytes BIGINT, rmm_open_alert_count INTEGER, rmm_device_audit_description VARCHAR(255), rmm_device_audit_device_type_id BIGINT, rmm_device_audit_last_user VARCHAR(255), rmm_device_audit_memory_bytes BIGINT, source_cost_id BIGINT, source_cost_type INTEGER, -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP, FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE, FOREIGN KEY (contact_id) REFERENCES contacts(id) ON DELETE SET NULL ); -- Contracts table CREATE TABLE IF NOT EXISTS contracts ( id BIGINT PRIMARY KEY, company_id BIGINT NOT NULL, contract_name VARCHAR(255), contract_number VARCHAR(100), description TEXT, start_date DATE, end_date DATE, time_reporting_requires_start_and_stop_times INTEGER, service_level_agreement_id INTEGER, contract_type INTEGER, contract_category INTEGER, status INTEGER, business_division_subdivision_id INTEGER, contact_id BIGINT, contact_name VARCHAR(255), billing_preference INTEGER, purchase_order_number VARCHAR(100), setup_fee DECIMAL(15,2), setup_fee_allocation_code_id BIGINT, estimated_cost DECIMAL(15,2), estimated_hours DECIMAL(10,2), estimated_revenue DECIMAL(15,2), over_budget_dollar_amount DECIMAL(15,2), over_budget_hours DECIMAL(10,2), contract_period_type VARCHAR(50), opportunity_id BIGINT, renewed_contract_id BIGINT, is_default_contract BOOLEAN DEFAULT false, internal_currency_setup_fee DECIMAL(15,2), internal_currency_over_budget_dollar_amount DECIMAL(15,2), internal_currency_estimated_cost DECIMAL(15,2), internal_currency_estimated_revenue DECIMAL(15,2), exclusion_contract_id BIGINT, internal_currency_monthly_revenue DECIMAL(15,2), internal_currency_quarterly_revenue DECIMAL(15,2), internal_currency_semi_annual_revenue DECIMAL(15,2), internal_currency_yearly_revenue DECIMAL(15,2), internal_currency_one_time_revenue DECIMAL(15,2), compliance BOOLEAN, -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP, FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE, FOREIGN KEY (contact_id) REFERENCES contacts(id) ON DELETE SET NULL ); -- Billing Items table CREATE TABLE IF NOT EXISTS billing_items ( id BIGINT PRIMARY KEY, company_id BIGINT, product_id BIGINT, description TEXT, quantity DECIMAL(10,2), rate DECIMAL(15,2), total_amount DECIMAL(15,2), line_discount_dollars DECIMAL(15,2), line_discount_percent DECIMAL(5,2), tax_category_id INTEGER, internal_currency_line_discount_dollars DECIMAL(15,2), allocation_code_id BIGINT, invoice_id BIGINT, vendor_id BIGINT, expense_item BOOLEAN DEFAULT false, task_id BIGINT, ticket_id BIGINT, project_id BIGINT, our_cost DECIMAL(15,2), list_price DECIMAL(15,2), unit_cost DECIMAL(15,2), unit_price DECIMAL(15,2), extended_price DECIMAL(15,2), tax_dollars DECIMAL(15,2), internal_currency_unit_price DECIMAL(15,2), internal_currency_total_amount DECIMAL(15,2), -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP, FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE, FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE SET NULL, FOREIGN KEY (ticket_id) REFERENCES tickets(id) ON DELETE SET NULL, FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE SET NULL ); -- ============================================================================ -- PICKLIST TABLES -- ============================================================================ -- Statuses picklist CREATE TABLE IF NOT EXISTS statuses ( value INTEGER PRIMARY KEY, label VARCHAR(100) NOT NULL, is_active BOOLEAN DEFAULT true, is_system BOOLEAN DEFAULT false, sort_order INTEGER, parent_value INTEGER, -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP ); -- Issue Types picklist CREATE TABLE IF NOT EXISTS issue_types ( value INTEGER PRIMARY KEY, label VARCHAR(100) NOT NULL, is_active BOOLEAN DEFAULT true, is_system BOOLEAN DEFAULT false, sort_order INTEGER, parent_value INTEGER, -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP ); -- Sub-Issue Types picklist CREATE TABLE IF NOT EXISTS sub_issue_types ( value INTEGER PRIMARY KEY, label VARCHAR(100) NOT NULL, is_active BOOLEAN DEFAULT true, is_system BOOLEAN DEFAULT false, sort_order INTEGER, parent_value INTEGER, -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP ); -- Work Types picklist CREATE TABLE IF NOT EXISTS work_types ( value INTEGER PRIMARY KEY, label VARCHAR(100) NOT NULL, is_active BOOLEAN DEFAULT true, is_system BOOLEAN DEFAULT false, sort_order INTEGER, parent_value INTEGER, -- Audit fields created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_deleted BOOLEAN DEFAULT false, deleted_at TIMESTAMP ); -- ============================================================================ -- SYNC HISTORY TABLE -- ============================================================================ CREATE TABLE IF NOT EXISTS sync_history ( id SERIAL PRIMARY KEY, entity_type VARCHAR(100) NOT NULL, sync_type VARCHAR(50) NOT NULL CHECK (sync_type IN ('full', 'incremental', 'entity-specific')), status VARCHAR(50) NOT NULL CHECK (status IN ('started', 'in_progress', 'completed', 'failed')), started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, completed_at TIMESTAMP, records_added INTEGER DEFAULT 0, records_updated INTEGER DEFAULT 0, records_deleted INTEGER DEFAULT 0, error_message TEXT, triggered_by VARCHAR(255) ); -- ============================================================================ -- INDEXES -- ============================================================================ -- Companies indexes CREATE INDEX IF NOT EXISTS idx_companies_is_active ON companies(is_active); CREATE INDEX IF NOT EXISTS idx_companies_is_deleted ON companies(is_deleted); CREATE INDEX IF NOT EXISTS idx_companies_synced_at ON companies(synced_at); -- Resources indexes CREATE INDEX IF NOT EXISTS idx_resources_email ON resources(email); CREATE INDEX IF NOT EXISTS idx_resources_is_active ON resources(is_active); CREATE INDEX IF NOT EXISTS idx_resources_is_deleted ON resources(is_deleted); -- Contacts indexes CREATE INDEX IF NOT EXISTS idx_contacts_company_id ON contacts(company_id); CREATE INDEX IF NOT EXISTS idx_contacts_email_address ON contacts(email_address); CREATE INDEX IF NOT EXISTS idx_contacts_is_active ON contacts(is_active); CREATE INDEX IF NOT EXISTS idx_contacts_is_deleted ON contacts(is_deleted); -- Projects indexes CREATE INDEX IF NOT EXISTS idx_projects_company_id ON projects(company_id); CREATE INDEX IF NOT EXISTS idx_projects_status ON projects(status); CREATE INDEX IF NOT EXISTS idx_projects_is_deleted ON projects(is_deleted); -- Tickets indexes CREATE INDEX IF NOT EXISTS idx_tickets_company_id ON tickets(company_id); CREATE INDEX IF NOT EXISTS idx_tickets_assigned_resource_id ON tickets(assigned_resource_id); CREATE INDEX IF NOT EXISTS idx_tickets_status ON tickets(status); CREATE INDEX IF NOT EXISTS idx_tickets_contact_id ON tickets(contact_id); CREATE INDEX IF NOT EXISTS idx_tickets_is_deleted ON tickets(is_deleted); CREATE INDEX IF NOT EXISTS idx_tickets_create_date ON tickets(create_date); -- Tasks indexes CREATE INDEX IF NOT EXISTS idx_tasks_assigned_resource_id ON tasks(assigned_resource_id); CREATE INDEX IF NOT EXISTS idx_tasks_project_id ON tasks(project_id); CREATE INDEX IF NOT EXISTS idx_tasks_ticket_id ON tasks(ticket_id); CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status); CREATE INDEX IF NOT EXISTS idx_tasks_is_deleted ON tasks(is_deleted); -- Configuration Items indexes CREATE INDEX IF NOT EXISTS idx_config_items_company_id ON configuration_items(company_id); CREATE INDEX IF NOT EXISTS idx_config_items_contact_id ON configuration_items(contact_id); CREATE INDEX IF NOT EXISTS idx_config_items_serial_number ON configuration_items(serial_number); CREATE INDEX IF NOT EXISTS idx_config_items_is_active ON configuration_items(is_active); CREATE INDEX IF NOT EXISTS idx_config_items_is_deleted ON configuration_items(is_deleted); CREATE INDEX IF NOT EXISTS idx_config_items_rmm_device_uid ON configuration_items(rmm_device_uid); -- Contracts indexes CREATE INDEX IF NOT EXISTS idx_contracts_company_id ON contracts(company_id); CREATE INDEX IF NOT EXISTS idx_contracts_status ON contracts(status); CREATE INDEX IF NOT EXISTS idx_contracts_is_deleted ON contracts(is_deleted); -- Billing Items indexes CREATE INDEX IF NOT EXISTS idx_billing_items_company_id ON billing_items(company_id); CREATE INDEX IF NOT EXISTS idx_billing_items_task_id ON billing_items(task_id); CREATE INDEX IF NOT EXISTS idx_billing_items_ticket_id ON billing_items(ticket_id); CREATE INDEX IF NOT EXISTS idx_billing_items_project_id ON billing_items(project_id); CREATE INDEX IF NOT EXISTS idx_billing_items_is_deleted ON billing_items(is_deleted); -- Sync History indexes CREATE INDEX IF NOT EXISTS idx_sync_history_entity_type ON sync_history(entity_type); CREATE INDEX IF NOT EXISTS idx_sync_history_status ON sync_history(status); CREATE INDEX IF NOT EXISTS idx_sync_history_started_at ON sync_history(started_at DESC); -- ============================================================================ -- COMMENTS -- ============================================================================ COMMENT ON TABLE companies IS 'Autotask companies/accounts'; COMMENT ON TABLE resources IS 'Autotask resources (users/technicians)'; COMMENT ON TABLE contacts IS 'Company contacts'; COMMENT ON TABLE projects IS 'Autotask projects'; COMMENT ON TABLE tickets IS 'Autotask service tickets'; COMMENT ON TABLE tasks IS 'Autotask tasks'; COMMENT ON TABLE configuration_items IS 'Configuration items (devices/assets)'; COMMENT ON TABLE contracts IS 'Service contracts'; COMMENT ON TABLE billing_items IS 'Billing/invoice line items'; COMMENT ON TABLE sync_history IS 'Tracks all sync operations from Autotask'; COMMENT ON COLUMN companies.is_deleted IS 'Soft delete flag - true if deleted in Autotask'; COMMENT ON COLUMN companies.synced_at IS 'Last time this record was synced from Autotask'; COMMENT ON COLUMN sync_history.sync_type IS 'Type of sync: full, incremental, or entity-specific'; COMMENT ON COLUMN sync_history.status IS 'Current status: started, in_progress, completed, or failed';