module.exports = { /** * @param {QueryInterface} queryInterface * @param {Sequelize} Sequelize * @returns {Promise} */ async up(queryInterface, Sequelize) { /** * @type {Transaction} */ const transaction = await queryInterface.sequelize.transaction(); try { await queryInterface.createTable( 'users', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'activity_logs', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'appointments', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'communications', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'documents', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'goals', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'invoice_items', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'invoices', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'ndis_plans', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'notes', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'participants', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'service_deliveries', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'services', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'tasks', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'roles', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'permissions', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.addColumn( 'users', 'firstName', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'users', 'lastName', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'users', 'phoneNumber', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'users', 'email', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'users', 'disabled', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction }, ); await queryInterface.addColumn( 'users', 'password', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'users', 'emailVerified', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction }, ); await queryInterface.addColumn( 'users', 'emailVerificationToken', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'users', 'emailVerificationTokenExpiresAt', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'users', 'passwordResetToken', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'users', 'passwordResetTokenExpiresAt', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'users', 'provider', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'activity_logs', 'userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'activity_logs', 'action', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'activity_logs', 'entity_type', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'activity_logs', 'entity_id', { type: Sequelize.DataTypes.INTEGER, }, { transaction }, ); await queryInterface.addColumn( 'activity_logs', 'details', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'activity_logs', 'ip_address', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'appointments', 'participantId', { type: Sequelize.DataTypes.UUID, references: { model: 'participants', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'appointments', 'userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'appointments', 'title', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'appointments', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'appointments', 'start_time', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'appointments', 'end_time', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'appointments', 'location', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'appointments', 'status', { type: Sequelize.DataTypes.ENUM, values: ['scheduled', 'completed', 'cancelled'], }, { transaction }, ); await queryInterface.addColumn( 'appointments', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'appointments', 'billable', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction }, ); await queryInterface.addColumn( 'communications', 'participantId', { type: Sequelize.DataTypes.UUID, references: { model: 'participants', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'communications', 'userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'communications', 'direction', { type: Sequelize.DataTypes.ENUM, values: ['inbound', 'outbound'], }, { transaction }, ); await queryInterface.addColumn( 'communications', 'communication_type', { type: Sequelize.DataTypes.ENUM, values: ['email', 'phone', 'sms', 'in-person'], }, { transaction }, ); await queryInterface.addColumn( 'communications', 'subject', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'communications', 'content', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'communications', 'date_time', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'communications', 'follow_up_required', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction }, ); await queryInterface.addColumn( 'communications', 'follow_up_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'documents', 'participantId', { type: Sequelize.DataTypes.UUID, references: { model: 'participants', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'documents', 'userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'documents', 'title', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'documents', 'document_type', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'documents', 'category', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'documents', 'status', { type: Sequelize.DataTypes.ENUM, values: ['active', 'expired', 'archived'], }, { transaction }, ); await queryInterface.addColumn( 'documents', 'expiry_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'documents', 'is_signed', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction }, ); await queryInterface.addColumn( 'goals', 'participantId', { type: Sequelize.DataTypes.UUID, references: { model: 'participants', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'goals', 'title', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'goals', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'goals', 'status', { type: Sequelize.DataTypes.ENUM, values: ['not_started', 'in_progress', 'completed'], }, { transaction }, ); await queryInterface.addColumn( 'goals', 'category', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'goals', 'target_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'goals', 'start_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'goals', 'progress', { type: Sequelize.DataTypes.INTEGER, }, { transaction }, ); await queryInterface.addColumn( 'goals', 'key_strategies', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'goals', 'evidence_required', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction }, ); await queryInterface.addColumn( 'goals', 'outcomes_measures', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'invoice_items', 'invoiceId', { type: Sequelize.DataTypes.UUID, references: { model: 'invoices', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'invoice_items', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'invoice_items', 'amount', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'invoice_items', 'quantity', { type: Sequelize.DataTypes.INTEGER, }, { transaction }, ); await queryInterface.addColumn( 'invoice_items', 'support_category', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'invoice_items', 'ndis_line_item', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'invoice_items', 'gst_amount', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'participantId', { type: Sequelize.DataTypes.UUID, references: { model: 'participants', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'invoice_number', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'issue_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'due_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'total_amount', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'status', { type: Sequelize.DataTypes.ENUM, values: ['draft', 'sent', 'paid', 'overdue'], }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'payment_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'xero_invoice_id', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'ndis_plans', 'participantId', { type: Sequelize.DataTypes.UUID, references: { model: 'participants', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'ndis_plans', 'plan_start_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'ndis_plans', 'plan_end_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'ndis_plans', 'plan_status', { type: Sequelize.DataTypes.ENUM, values: ['active', 'inactive', 'completed'], }, { transaction }, ); await queryInterface.addColumn( 'ndis_plans', 'total_budget', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'ndis_plans', 'core_budget', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'ndis_plans', 'capacity_building_budget', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'ndis_plans', 'capital_budget', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'ndis_plans', 'managed_by', { type: Sequelize.DataTypes.ENUM, values: ['agency', 'plan', 'self'], }, { transaction }, ); await queryInterface.addColumn( 'ndis_plans', 'review_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'ndis_plans', 'goals', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'ndis_plans', 'special_requirements', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'notes', 'participantId', { type: Sequelize.DataTypes.UUID, references: { model: 'participants', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'notes', 'userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'notes', 'title', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'notes', 'content', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'notes', 'category', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'notes', 'tags', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'notes', 'ai_summary', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'notes', 'ai_insights', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'notes', 'ai_generated', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'first_name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'last_name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'ndis_number', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'date_of_birth', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'gender', { type: Sequelize.DataTypes.ENUM, values: ['male', 'female', 'other'], }, { transaction }, ); await queryInterface.addColumn( 'participants', 'address', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'phone', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'email', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'status', { type: Sequelize.DataTypes.ENUM, values: ['active', 'inactive', 'pending'], }, { transaction }, ); await queryInterface.addColumn( 'participants', 'primary_disability', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'support_coordinatorId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'emergency_contact_name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'emergency_contact_phone', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'preferred_contact_method', { type: Sequelize.DataTypes.ENUM, values: ['email', 'phone', 'sms'], }, { transaction }, ); await queryInterface.addColumn( 'participants', 'communication_needs', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'cultural_considerations', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'participants', 'risk_assessment', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'service_deliveries', 'participantId', { type: Sequelize.DataTypes.UUID, references: { model: 'participants', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'service_deliveries', 'serviceId', { type: Sequelize.DataTypes.UUID, references: { model: 'services', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'service_deliveries', 'userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'service_deliveries', 'date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'service_deliveries', 'duration_minutes', { type: Sequelize.DataTypes.INTEGER, }, { transaction }, ); await queryInterface.addColumn( 'service_deliveries', 'status', { type: Sequelize.DataTypes.ENUM, values: ['scheduled', 'delivered', 'cancelled'], }, { transaction }, ); await queryInterface.addColumn( 'service_deliveries', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'service_deliveries', 'invoiced', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction }, ); await queryInterface.addColumn( 'service_deliveries', 'invoiceId', { type: Sequelize.DataTypes.UUID, references: { model: 'invoices', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'services', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'services', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'services', 'category', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'services', 'price', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'services', 'ndis_registration_group', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'services', 'ndis_support_category', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'title', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'status', { type: Sequelize.DataTypes.ENUM, values: ['backlog', 'todo', 'in_progress', 'review', 'completed'], }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'priority', { type: Sequelize.DataTypes.ENUM, values: ['low', 'medium', 'high', 'urgent'], }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'due_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'time_estimate', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'participantId', { type: Sequelize.DataTypes.UUID, references: { model: 'participants', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'assigneeId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'creatorId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'related_goalId', { type: Sequelize.DataTypes.UUID, references: { model: 'goals', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'parent_taskId', { type: Sequelize.DataTypes.UUID, references: { model: 'tasks', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'tags', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'permissions', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'roles', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'roles', 'role_customization', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'users', 'app_roleId', { type: Sequelize.DataTypes.UUID, references: { model: 'roles', key: 'id', }, }, { transaction }, ); await transaction.commit(); } catch (err) { await transaction.rollback(); throw err; } }, /** * @param {QueryInterface} queryInterface * @param {Sequelize} Sequelize * @returns {Promise} */ async down(queryInterface, Sequelize) { /** * @type {Transaction} */ const transaction = await queryInterface.sequelize.transaction(); try { await queryInterface.removeColumn('users', 'app_roleId', { transaction }); await queryInterface.removeColumn('roles', 'role_customization', { transaction, }); await queryInterface.removeColumn('roles', 'name', { transaction }); await queryInterface.removeColumn('permissions', 'name', { transaction }); await queryInterface.removeColumn('tasks', 'tags', { transaction }); await queryInterface.removeColumn('tasks', 'parent_taskId', { transaction, }); await queryInterface.removeColumn('tasks', 'related_goalId', { transaction, }); await queryInterface.removeColumn('tasks', 'creatorId', { transaction }); await queryInterface.removeColumn('tasks', 'assigneeId', { transaction }); await queryInterface.removeColumn('tasks', 'participantId', { transaction, }); await queryInterface.removeColumn('tasks', 'time_estimate', { transaction, }); await queryInterface.removeColumn('tasks', 'due_date', { transaction }); await queryInterface.removeColumn('tasks', 'priority', { transaction }); await queryInterface.removeColumn('tasks', 'status', { transaction }); await queryInterface.removeColumn('tasks', 'description', { transaction, }); await queryInterface.removeColumn('tasks', 'title', { transaction }); await queryInterface.removeColumn('services', 'ndis_support_category', { transaction, }); await queryInterface.removeColumn('services', 'ndis_registration_group', { transaction, }); await queryInterface.removeColumn('services', 'price', { transaction }); await queryInterface.removeColumn('services', 'category', { transaction, }); await queryInterface.removeColumn('services', 'description', { transaction, }); await queryInterface.removeColumn('services', 'name', { transaction }); await queryInterface.removeColumn('service_deliveries', 'invoiceId', { transaction, }); await queryInterface.removeColumn('service_deliveries', 'invoiced', { transaction, }); await queryInterface.removeColumn('service_deliveries', 'notes', { transaction, }); await queryInterface.removeColumn('service_deliveries', 'status', { transaction, }); await queryInterface.removeColumn( 'service_deliveries', 'duration_minutes', { transaction }, ); await queryInterface.removeColumn('service_deliveries', 'date', { transaction, }); await queryInterface.removeColumn('service_deliveries', 'userId', { transaction, }); await queryInterface.removeColumn('service_deliveries', 'serviceId', { transaction, }); await queryInterface.removeColumn('service_deliveries', 'participantId', { transaction, }); await queryInterface.removeColumn('participants', 'risk_assessment', { transaction, }); await queryInterface.removeColumn( 'participants', 'cultural_considerations', { transaction }, ); await queryInterface.removeColumn('participants', 'communication_needs', { transaction, }); await queryInterface.removeColumn( 'participants', 'preferred_contact_method', { transaction }, ); await queryInterface.removeColumn( 'participants', 'emergency_contact_phone', { transaction }, ); await queryInterface.removeColumn( 'participants', 'emergency_contact_name', { transaction }, ); await queryInterface.removeColumn( 'participants', 'support_coordinatorId', { transaction }, ); await queryInterface.removeColumn('participants', 'primary_disability', { transaction, }); await queryInterface.removeColumn('participants', 'status', { transaction, }); await queryInterface.removeColumn('participants', 'email', { transaction, }); await queryInterface.removeColumn('participants', 'phone', { transaction, }); await queryInterface.removeColumn('participants', 'address', { transaction, }); await queryInterface.removeColumn('participants', 'gender', { transaction, }); await queryInterface.removeColumn('participants', 'date_of_birth', { transaction, }); await queryInterface.removeColumn('participants', 'ndis_number', { transaction, }); await queryInterface.removeColumn('participants', 'last_name', { transaction, }); await queryInterface.removeColumn('participants', 'first_name', { transaction, }); await queryInterface.removeColumn('notes', 'ai_generated', { transaction, }); await queryInterface.removeColumn('notes', 'ai_insights', { transaction, }); await queryInterface.removeColumn('notes', 'ai_summary', { transaction }); await queryInterface.removeColumn('notes', 'tags', { transaction }); await queryInterface.removeColumn('notes', 'category', { transaction }); await queryInterface.removeColumn('notes', 'content', { transaction }); await queryInterface.removeColumn('notes', 'title', { transaction }); await queryInterface.removeColumn('notes', 'userId', { transaction }); await queryInterface.removeColumn('notes', 'participantId', { transaction, }); await queryInterface.removeColumn('ndis_plans', 'special_requirements', { transaction, }); await queryInterface.removeColumn('ndis_plans', 'goals', { transaction }); await queryInterface.removeColumn('ndis_plans', 'review_date', { transaction, }); await queryInterface.removeColumn('ndis_plans', 'managed_by', { transaction, }); await queryInterface.removeColumn('ndis_plans', 'capital_budget', { transaction, }); await queryInterface.removeColumn( 'ndis_plans', 'capacity_building_budget', { transaction }, ); await queryInterface.removeColumn('ndis_plans', 'core_budget', { transaction, }); await queryInterface.removeColumn('ndis_plans', 'total_budget', { transaction, }); await queryInterface.removeColumn('ndis_plans', 'plan_status', { transaction, }); await queryInterface.removeColumn('ndis_plans', 'plan_end_date', { transaction, }); await queryInterface.removeColumn('ndis_plans', 'plan_start_date', { transaction, }); await queryInterface.removeColumn('ndis_plans', 'participantId', { transaction, }); await queryInterface.removeColumn('invoices', 'xero_invoice_id', { transaction, }); await queryInterface.removeColumn('invoices', 'payment_date', { transaction, }); await queryInterface.removeColumn('invoices', 'status', { transaction }); await queryInterface.removeColumn('invoices', 'total_amount', { transaction, }); await queryInterface.removeColumn('invoices', 'due_date', { transaction, }); await queryInterface.removeColumn('invoices', 'issue_date', { transaction, }); await queryInterface.removeColumn('invoices', 'invoice_number', { transaction, }); await queryInterface.removeColumn('invoices', 'participantId', { transaction, }); await queryInterface.removeColumn('invoice_items', 'gst_amount', { transaction, }); await queryInterface.removeColumn('invoice_items', 'ndis_line_item', { transaction, }); await queryInterface.removeColumn('invoice_items', 'support_category', { transaction, }); await queryInterface.removeColumn('invoice_items', 'quantity', { transaction, }); await queryInterface.removeColumn('invoice_items', 'amount', { transaction, }); await queryInterface.removeColumn('invoice_items', 'description', { transaction, }); await queryInterface.removeColumn('invoice_items', 'invoiceId', { transaction, }); await queryInterface.removeColumn('goals', 'outcomes_measures', { transaction, }); await queryInterface.removeColumn('goals', 'evidence_required', { transaction, }); await queryInterface.removeColumn('goals', 'key_strategies', { transaction, }); await queryInterface.removeColumn('goals', 'progress', { transaction }); await queryInterface.removeColumn('goals', 'start_date', { transaction }); await queryInterface.removeColumn('goals', 'target_date', { transaction, }); await queryInterface.removeColumn('goals', 'category', { transaction }); await queryInterface.removeColumn('goals', 'status', { transaction }); await queryInterface.removeColumn('goals', 'description', { transaction, }); await queryInterface.removeColumn('goals', 'title', { transaction }); await queryInterface.removeColumn('goals', 'participantId', { transaction, }); await queryInterface.removeColumn('documents', 'is_signed', { transaction, }); await queryInterface.removeColumn('documents', 'expiry_date', { transaction, }); await queryInterface.removeColumn('documents', 'status', { transaction }); await queryInterface.removeColumn('documents', 'category', { transaction, }); await queryInterface.removeColumn('documents', 'document_type', { transaction, }); await queryInterface.removeColumn('documents', 'title', { transaction }); await queryInterface.removeColumn('documents', 'userId', { transaction }); await queryInterface.removeColumn('documents', 'participantId', { transaction, }); await queryInterface.removeColumn('communications', 'follow_up_date', { transaction, }); await queryInterface.removeColumn( 'communications', 'follow_up_required', { transaction }, ); await queryInterface.removeColumn('communications', 'date_time', { transaction, }); await queryInterface.removeColumn('communications', 'content', { transaction, }); await queryInterface.removeColumn('communications', 'subject', { transaction, }); await queryInterface.removeColumn( 'communications', 'communication_type', { transaction }, ); await queryInterface.removeColumn('communications', 'direction', { transaction, }); await queryInterface.removeColumn('communications', 'userId', { transaction, }); await queryInterface.removeColumn('communications', 'participantId', { transaction, }); await queryInterface.removeColumn('appointments', 'billable', { transaction, }); await queryInterface.removeColumn('appointments', 'notes', { transaction, }); await queryInterface.removeColumn('appointments', 'status', { transaction, }); await queryInterface.removeColumn('appointments', 'location', { transaction, }); await queryInterface.removeColumn('appointments', 'end_time', { transaction, }); await queryInterface.removeColumn('appointments', 'start_time', { transaction, }); await queryInterface.removeColumn('appointments', 'description', { transaction, }); await queryInterface.removeColumn('appointments', 'title', { transaction, }); await queryInterface.removeColumn('appointments', 'userId', { transaction, }); await queryInterface.removeColumn('appointments', 'participantId', { transaction, }); await queryInterface.removeColumn('activity_logs', 'ip_address', { transaction, }); await queryInterface.removeColumn('activity_logs', 'details', { transaction, }); await queryInterface.removeColumn('activity_logs', 'entity_id', { transaction, }); await queryInterface.removeColumn('activity_logs', 'entity_type', { transaction, }); await queryInterface.removeColumn('activity_logs', 'action', { transaction, }); await queryInterface.removeColumn('activity_logs', 'userId', { transaction, }); await queryInterface.removeColumn('users', 'provider', { transaction }); await queryInterface.removeColumn( 'users', 'passwordResetTokenExpiresAt', { transaction }, ); await queryInterface.removeColumn('users', 'passwordResetToken', { transaction, }); await queryInterface.removeColumn( 'users', 'emailVerificationTokenExpiresAt', { transaction }, ); await queryInterface.removeColumn('users', 'emailVerificationToken', { transaction, }); await queryInterface.removeColumn('users', 'emailVerified', { transaction, }); await queryInterface.removeColumn('users', 'password', { transaction }); await queryInterface.removeColumn('users', 'disabled', { transaction }); await queryInterface.removeColumn('users', 'email', { transaction }); await queryInterface.removeColumn('users', 'phoneNumber', { transaction, }); await queryInterface.removeColumn('users', 'lastName', { transaction }); await queryInterface.removeColumn('users', 'firstName', { transaction }); await queryInterface.dropTable('permissions', { transaction }); await queryInterface.dropTable('roles', { transaction }); await queryInterface.dropTable('tasks', { transaction }); await queryInterface.dropTable('services', { transaction }); await queryInterface.dropTable('service_deliveries', { transaction }); await queryInterface.dropTable('participants', { transaction }); await queryInterface.dropTable('notes', { transaction }); await queryInterface.dropTable('ndis_plans', { transaction }); await queryInterface.dropTable('invoices', { transaction }); await queryInterface.dropTable('invoice_items', { transaction }); await queryInterface.dropTable('goals', { transaction }); await queryInterface.dropTable('documents', { transaction }); await queryInterface.dropTable('communications', { transaction }); await queryInterface.dropTable('appointments', { transaction }); await queryInterface.dropTable('activity_logs', { transaction }); await queryInterface.dropTable('users', { transaction }); await transaction.commit(); } catch (err) { await transaction.rollback(); throw err; } }, };