- Add admin dashboard with sync controls and data browser - Implement RMM, Auvik, and Addigy organization mappings - Add chunked ticket sync with progress tracking - Implement entity sync service with rate limiting - Add analytics engine and performance optimizer - Create data browser for all PSA entities - Add navigation components and UI improvements - Implement background processing and sync services - Add comprehensive documentation and migration scripts - Update configuration items with multi-system support - Enhance contact management and purchase history - Add issue type assignment and LLM analyzer - Improve error handling and logging utilities
639 lines
24 KiB
SQL
639 lines
24 KiB
SQL
-- 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';
|