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('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.createTable('organizations', { 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('organization_invitations', { 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('customers', { 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('saved_addresses', { 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_packages', { 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_add_ons', { 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_requests', { 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_request_add_ons', { 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('request_checklist_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('request_timeline_events', { 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('request_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('chat_threads', { 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('chat_messages', { 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('payment_transactions', { 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('subscriptions', { 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('legal_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('document_acceptances', { 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('support_tickets', { 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('leads', { 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('notifications', { 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('audit_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('webhook_endpoints', { 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('webhook_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('csv_jobs', { 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('usage_events', { 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( 'users', 'app_roleId', { type: Sequelize.DataTypes.UUID, references: { model: 'roles', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'users', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { 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( 'roles', 'globalAccess', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'permissions', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'organizations', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'organization_invitations', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'organization_invitations', 'invite_email', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'organization_invitations', 'invite_role', { type: Sequelize.DataTypes.ENUM, values: ['org_admin','coordinator','partner','customer'], }, { transaction } ); await queryInterface.addColumn( 'organization_invitations', 'invite_token', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'organization_invitations', 'expires_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'organization_invitations', 'accepted_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'organization_invitations', 'status', { type: Sequelize.DataTypes.ENUM, values: ['pending','accepted','expired','revoked'], }, { transaction } ); await queryInterface.addColumn( 'customers', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'customers', 'userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'customers', 'full_name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'customers', 'email', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'customers', 'phone', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'customers', 'status', { type: Sequelize.DataTypes.ENUM, values: ['active','inactive','blocked'], }, { transaction } ); await queryInterface.addColumn( 'customers', 'preferred_contact_method', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'customers', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'customerId', { type: Sequelize.DataTypes.UUID, references: { model: 'customers', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'label', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'recipient_name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'phone', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'line1', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'line2', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'city', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'region', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'postal_code', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'country', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'latitude', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'longitude', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'is_default', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'saved_addresses', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'service_packages', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'service_packages', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'service_packages', 'code', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'service_packages', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'service_packages', 'price', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'service_packages', 'billing_type', { type: Sequelize.DataTypes.ENUM, values: ['one_time','subscription'], }, { transaction } ); await queryInterface.addColumn( 'service_packages', 'stripe_price_ref', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'service_packages', 'is_active', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'service_add_ons', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'service_add_ons', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'service_add_ons', 'code', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'service_add_ons', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'service_add_ons', 'pricing_model', { type: Sequelize.DataTypes.ENUM, values: ['flat','per_unit','starting_at'], }, { transaction } ); await queryInterface.addColumn( 'service_add_ons', 'unit_price', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'service_add_ons', 'is_active', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'customerId', { type: Sequelize.DataTypes.UUID, references: { model: 'customers', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'requester_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'assigned_coordinator_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'service_packageId', { type: Sequelize.DataTypes.UUID, references: { model: 'service_packages', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'service_type', { type: Sequelize.DataTypes.ENUM, values: ['retrieval','coordination','administrative_support','concierge_assistance','custom_request','communication_support','premium_coordination'], }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'timing_preference', { type: Sequelize.DataTypes.ENUM, values: ['asap','same_day','scheduled','flexible'], }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'scheduled_start_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'scheduled_end_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'summary', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'status', { type: Sequelize.DataTypes.ENUM, values: ['submitted','coordinator_assigned','in_progress','coordination_active','review_complete','successfully_closed','cancelled'], }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'priority', { type: Sequelize.DataTypes.ENUM, values: ['standard','rush_priority','after_hours'], }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'estimated_total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'final_total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'submitted_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'closed_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'service_requests', 'requires_no_contact_coordination', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'service_request_add_ons', 'service_requestId', { type: Sequelize.DataTypes.UUID, references: { model: 'service_requests', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'service_request_add_ons', 'service_add_onId', { type: Sequelize.DataTypes.UUID, references: { model: 'service_add_ons', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'service_request_add_ons', 'quantity', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'service_request_add_ons', 'unit_price', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'service_request_add_ons', 'line_total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'service_request_add_ons', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'service_request_add_ons', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'request_checklist_items', 'service_requestId', { type: Sequelize.DataTypes.UUID, references: { model: 'service_requests', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'request_checklist_items', 'title', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'request_checklist_items', 'details', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'request_checklist_items', 'status', { type: Sequelize.DataTypes.ENUM, values: ['todo','in_progress','done','blocked'], }, { transaction } ); await queryInterface.addColumn( 'request_checklist_items', 'assigned_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'request_checklist_items', 'due_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'request_checklist_items', 'completed_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'request_checklist_items', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'request_timeline_events', 'service_requestId', { type: Sequelize.DataTypes.UUID, references: { model: 'service_requests', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'request_timeline_events', 'actor_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'request_timeline_events', 'event_type', { type: Sequelize.DataTypes.ENUM, values: ['request_created','coordinator_assigned','status_changed','message_sent','document_uploaded','payment_completed','case_closed','note_added'], }, { transaction } ); await queryInterface.addColumn( 'request_timeline_events', 'event_title', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'request_timeline_events', 'event_detail', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'request_timeline_events', 'event_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'request_timeline_events', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'request_documents', 'service_requestId', { type: Sequelize.DataTypes.UUID, references: { model: 'service_requests', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'request_documents', 'uploaded_by_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'request_documents', 'document_type', { type: Sequelize.DataTypes.ENUM, values: ['photo','document','agreement','authorization_form','receipt','other'], }, { transaction } ); await queryInterface.addColumn( 'request_documents', 'title', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'request_documents', 'is_sensitive', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'request_documents', 'uploaded_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'request_documents', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'chat_threads', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'chat_threads', 'service_requestId', { type: Sequelize.DataTypes.UUID, references: { model: 'service_requests', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'chat_threads', 'subject', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'chat_threads', 'thread_type', { type: Sequelize.DataTypes.ENUM, values: ['customer_coordinator','internal_team','partner_customer','system'], }, { transaction } ); await queryInterface.addColumn( 'chat_threads', 'last_message_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'chat_threads', 'status', { type: Sequelize.DataTypes.ENUM, values: ['open','closed','archived'], }, { transaction } ); await queryInterface.addColumn( 'chat_messages', 'chat_threadId', { type: Sequelize.DataTypes.UUID, references: { model: 'chat_threads', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'chat_messages', 'sender_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'chat_messages', 'message_type', { type: Sequelize.DataTypes.ENUM, values: ['text','voice_note','system','status_update'], }, { transaction } ); await queryInterface.addColumn( 'chat_messages', 'body', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'chat_messages', 'sent_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'chat_messages', 'is_read', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'chat_messages', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'payment_transactions', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'payment_transactions', 'customerId', { type: Sequelize.DataTypes.UUID, references: { model: 'customers', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'payment_transactions', 'service_requestId', { type: Sequelize.DataTypes.UUID, references: { model: 'service_requests', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'payment_transactions', 'provider', { type: Sequelize.DataTypes.ENUM, values: ['stripe'], }, { transaction } ); await queryInterface.addColumn( 'payment_transactions', 'transaction_type', { type: Sequelize.DataTypes.ENUM, values: ['payment_intent','charge','refund','invoice_payment'], }, { transaction } ); await queryInterface.addColumn( 'payment_transactions', 'provider_reference', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'payment_transactions', 'amount', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'payment_transactions', 'currency', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'payment_transactions', 'status', { type: Sequelize.DataTypes.ENUM, values: ['requires_payment_method','requires_action','processing','succeeded','failed','refunded','cancelled'], }, { transaction } ); await queryInterface.addColumn( 'payment_transactions', 'processed_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'invoices', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'invoices', 'customerId', { type: Sequelize.DataTypes.UUID, references: { model: 'customers', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'invoices', 'invoice_number', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'invoices', 'provider_reference', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'invoices', 'subtotal', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'invoices', 'tax_total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'invoices', 'total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'invoices', 'currency', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'invoices', 'status', { type: Sequelize.DataTypes.ENUM, values: ['draft','open','paid','void','uncollectible'], }, { transaction } ); await queryInterface.addColumn( 'invoices', 'issued_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'invoices', 'due_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'invoices', 'paid_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'subscriptions', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'subscriptions', 'customerId', { type: Sequelize.DataTypes.UUID, references: { model: 'customers', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'subscriptions', 'service_packageId', { type: Sequelize.DataTypes.UUID, references: { model: 'service_packages', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'subscriptions', 'provider_reference', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'subscriptions', 'status', { type: Sequelize.DataTypes.ENUM, values: ['trialing','active','past_due','canceled','unpaid','paused'], }, { transaction } ); await queryInterface.addColumn( 'subscriptions', 'current_period_start_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'subscriptions', 'current_period_end_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'subscriptions', 'cancelled_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'legal_documents', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'legal_documents', 'document_kind', { type: Sequelize.DataTypes.ENUM, values: ['terms_of_service','privacy_policy','service_agreement','customer_authorization_form','refund_policy','independent_contractor_agreement','electronic_signature_consent'], }, { transaction } ); await queryInterface.addColumn( 'legal_documents', 'title', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'legal_documents', 'version', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'legal_documents', 'content', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'legal_documents', 'effective_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'legal_documents', 'is_active', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'document_acceptances', 'legal_documentId', { type: Sequelize.DataTypes.UUID, references: { model: 'legal_documents', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'document_acceptances', 'userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'document_acceptances', 'accepted_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'document_acceptances', 'ip_address', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'document_acceptances', 'user_agent', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'document_acceptances', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'support_tickets', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'support_tickets', 'customerId', { type: Sequelize.DataTypes.UUID, references: { model: 'customers', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'support_tickets', 'assigned_admin_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'support_tickets', 'subject', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'support_tickets', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'support_tickets', 'priority', { type: Sequelize.DataTypes.ENUM, values: ['low','normal','high','urgent'], }, { transaction } ); await queryInterface.addColumn( 'support_tickets', 'status', { type: Sequelize.DataTypes.ENUM, values: ['open','in_progress','waiting_on_customer','resolved','closed'], }, { transaction } ); await queryInterface.addColumn( 'support_tickets', 'opened_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'support_tickets', 'resolved_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'leads', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'leads', 'company_name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'leads', 'contact_name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'leads', 'email', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'leads', 'phone', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'leads', 'source', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'leads', 'stage', { type: Sequelize.DataTypes.ENUM, values: ['new_lead','contacted','qualified','quoted','booked','active','completed','review_requested'], }, { transaction } ); await queryInterface.addColumn( 'leads', 'estimated_value', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'leads', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'leads', 'owner_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'leads', 'next_follow_up_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'notifications', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'notifications', 'recipient_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'notifications', 'channel', { type: Sequelize.DataTypes.ENUM, values: ['in_app','email','sms','push'], }, { transaction } ); await queryInterface.addColumn( 'notifications', 'event_key', { type: Sequelize.DataTypes.ENUM, values: ['new_request','assignment','status_change','payment_success','completion','message_received','document_uploaded','review_requested'], }, { transaction } ); await queryInterface.addColumn( 'notifications', 'title', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'notifications', 'body', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'notifications', 'deep_link', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'notifications', 'sent_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'notifications', 'read_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'notifications', 'status', { type: Sequelize.DataTypes.ENUM, values: ['queued','sent','failed','read'], }, { transaction } ); await queryInterface.addColumn( 'audit_logs', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'audit_logs', 'actor_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'audit_logs', 'action', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'audit_logs', 'entity_name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'audit_logs', 'entity_reference', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'audit_logs', 'summary', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'audit_logs', 'ip_address', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'audit_logs', 'user_agent', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'audit_logs', 'occurred_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'webhook_endpoints', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'webhook_endpoints', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'webhook_endpoints', 'url', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'webhook_endpoints', 'secret', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'webhook_endpoints', 'status', { type: Sequelize.DataTypes.ENUM, values: ['active','disabled'], }, { transaction } ); await queryInterface.addColumn( 'webhook_endpoints', 'verify_signature', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'webhook_endpoints', 'last_success_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'webhook_endpoints', 'last_failure_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'webhook_deliveries', 'webhook_endpointId', { type: Sequelize.DataTypes.UUID, references: { model: 'webhook_endpoints', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'webhook_deliveries', 'event_key', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'webhook_deliveries', 'payload_json', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'webhook_deliveries', 'status', { type: Sequelize.DataTypes.ENUM, values: ['pending','delivered','failed'], }, { transaction } ); await queryInterface.addColumn( 'webhook_deliveries', 'attempt_count', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'webhook_deliveries', 'delivered_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'webhook_deliveries', 'next_retry_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'webhook_deliveries', 'last_error', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'webhook_deliveries', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'csv_jobs', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'csv_jobs', 'requested_by_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'csv_jobs', 'job_type', { type: Sequelize.DataTypes.ENUM, values: ['import','export'], }, { transaction } ); await queryInterface.addColumn( 'csv_jobs', 'resource', { type: Sequelize.DataTypes.ENUM, values: ['customers','service_requests','payments','invoices','leads','support_tickets'], }, { transaction } ); await queryInterface.addColumn( 'csv_jobs', 'status', { type: Sequelize.DataTypes.ENUM, values: ['queued','processing','completed','failed'], }, { transaction } ); await queryInterface.addColumn( 'csv_jobs', 'records_total', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'csv_jobs', 'records_succeeded', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'csv_jobs', 'records_failed', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'csv_jobs', 'error_report', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'csv_jobs', 'started_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'csv_jobs', 'finished_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'usage_events', 'organizationId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'usage_events', 'userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'usage_events', 'event_name', { type: Sequelize.DataTypes.ENUM, values: ['login','request_created','request_status_changed','message_sent','document_uploaded','payment_succeeded','invoice_paid','webhook_delivered','csv_import_completed','csv_export_completed'], }, { transaction } ); await queryInterface.addColumn( 'usage_events', 'metadata_json', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'usage_events', 'occurred_at', { type: Sequelize.DataTypes.DATE, }, { 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( 'usage_events', 'occurred_at', { transaction } ); await queryInterface.removeColumn( 'usage_events', 'metadata_json', { transaction } ); await queryInterface.removeColumn( 'usage_events', 'event_name', { transaction } ); await queryInterface.removeColumn( 'usage_events', 'userId', { transaction } ); await queryInterface.removeColumn( 'usage_events', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'csv_jobs', 'finished_at', { transaction } ); await queryInterface.removeColumn( 'csv_jobs', 'started_at', { transaction } ); await queryInterface.removeColumn( 'csv_jobs', 'error_report', { transaction } ); await queryInterface.removeColumn( 'csv_jobs', 'records_failed', { transaction } ); await queryInterface.removeColumn( 'csv_jobs', 'records_succeeded', { transaction } ); await queryInterface.removeColumn( 'csv_jobs', 'records_total', { transaction } ); await queryInterface.removeColumn( 'csv_jobs', 'status', { transaction } ); await queryInterface.removeColumn( 'csv_jobs', 'resource', { transaction } ); await queryInterface.removeColumn( 'csv_jobs', 'job_type', { transaction } ); await queryInterface.removeColumn( 'csv_jobs', 'requested_by_userId', { transaction } ); await queryInterface.removeColumn( 'csv_jobs', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'webhook_deliveries', 'organizationsId', { transaction } ); await queryInterface.removeColumn( 'webhook_deliveries', 'last_error', { transaction } ); await queryInterface.removeColumn( 'webhook_deliveries', 'next_retry_at', { transaction } ); await queryInterface.removeColumn( 'webhook_deliveries', 'delivered_at', { transaction } ); await queryInterface.removeColumn( 'webhook_deliveries', 'attempt_count', { transaction } ); await queryInterface.removeColumn( 'webhook_deliveries', 'status', { transaction } ); await queryInterface.removeColumn( 'webhook_deliveries', 'payload_json', { transaction } ); await queryInterface.removeColumn( 'webhook_deliveries', 'event_key', { transaction } ); await queryInterface.removeColumn( 'webhook_deliveries', 'webhook_endpointId', { transaction } ); await queryInterface.removeColumn( 'webhook_endpoints', 'last_failure_at', { transaction } ); await queryInterface.removeColumn( 'webhook_endpoints', 'last_success_at', { transaction } ); await queryInterface.removeColumn( 'webhook_endpoints', 'verify_signature', { transaction } ); await queryInterface.removeColumn( 'webhook_endpoints', 'status', { transaction } ); await queryInterface.removeColumn( 'webhook_endpoints', 'secret', { transaction } ); await queryInterface.removeColumn( 'webhook_endpoints', 'url', { transaction } ); await queryInterface.removeColumn( 'webhook_endpoints', 'name', { transaction } ); await queryInterface.removeColumn( 'webhook_endpoints', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'audit_logs', 'occurred_at', { transaction } ); await queryInterface.removeColumn( 'audit_logs', 'user_agent', { transaction } ); await queryInterface.removeColumn( 'audit_logs', 'ip_address', { transaction } ); await queryInterface.removeColumn( 'audit_logs', 'summary', { transaction } ); await queryInterface.removeColumn( 'audit_logs', 'entity_reference', { transaction } ); await queryInterface.removeColumn( 'audit_logs', 'entity_name', { transaction } ); await queryInterface.removeColumn( 'audit_logs', 'action', { transaction } ); await queryInterface.removeColumn( 'audit_logs', 'actor_userId', { transaction } ); await queryInterface.removeColumn( 'audit_logs', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'notifications', 'status', { transaction } ); await queryInterface.removeColumn( 'notifications', 'read_at', { transaction } ); await queryInterface.removeColumn( 'notifications', 'sent_at', { transaction } ); await queryInterface.removeColumn( 'notifications', 'deep_link', { transaction } ); await queryInterface.removeColumn( 'notifications', 'body', { transaction } ); await queryInterface.removeColumn( 'notifications', 'title', { transaction } ); await queryInterface.removeColumn( 'notifications', 'event_key', { transaction } ); await queryInterface.removeColumn( 'notifications', 'channel', { transaction } ); await queryInterface.removeColumn( 'notifications', 'recipient_userId', { transaction } ); await queryInterface.removeColumn( 'notifications', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'leads', 'next_follow_up_at', { transaction } ); await queryInterface.removeColumn( 'leads', 'owner_userId', { transaction } ); await queryInterface.removeColumn( 'leads', 'notes', { transaction } ); await queryInterface.removeColumn( 'leads', 'estimated_value', { transaction } ); await queryInterface.removeColumn( 'leads', 'stage', { transaction } ); await queryInterface.removeColumn( 'leads', 'source', { transaction } ); await queryInterface.removeColumn( 'leads', 'phone', { transaction } ); await queryInterface.removeColumn( 'leads', 'email', { transaction } ); await queryInterface.removeColumn( 'leads', 'contact_name', { transaction } ); await queryInterface.removeColumn( 'leads', 'company_name', { transaction } ); await queryInterface.removeColumn( 'leads', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'support_tickets', 'resolved_at', { transaction } ); await queryInterface.removeColumn( 'support_tickets', 'opened_at', { transaction } ); await queryInterface.removeColumn( 'support_tickets', 'status', { transaction } ); await queryInterface.removeColumn( 'support_tickets', 'priority', { transaction } ); await queryInterface.removeColumn( 'support_tickets', 'description', { transaction } ); await queryInterface.removeColumn( 'support_tickets', 'subject', { transaction } ); await queryInterface.removeColumn( 'support_tickets', 'assigned_admin_userId', { transaction } ); await queryInterface.removeColumn( 'support_tickets', 'customerId', { transaction } ); await queryInterface.removeColumn( 'support_tickets', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'document_acceptances', 'organizationsId', { transaction } ); await queryInterface.removeColumn( 'document_acceptances', 'user_agent', { transaction } ); await queryInterface.removeColumn( 'document_acceptances', 'ip_address', { transaction } ); await queryInterface.removeColumn( 'document_acceptances', 'accepted_at', { transaction } ); await queryInterface.removeColumn( 'document_acceptances', 'userId', { transaction } ); await queryInterface.removeColumn( 'document_acceptances', 'legal_documentId', { transaction } ); await queryInterface.removeColumn( 'legal_documents', 'is_active', { transaction } ); await queryInterface.removeColumn( 'legal_documents', 'effective_at', { transaction } ); await queryInterface.removeColumn( 'legal_documents', 'content', { transaction } ); await queryInterface.removeColumn( 'legal_documents', 'version', { transaction } ); await queryInterface.removeColumn( 'legal_documents', 'title', { transaction } ); await queryInterface.removeColumn( 'legal_documents', 'document_kind', { transaction } ); await queryInterface.removeColumn( 'legal_documents', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'subscriptions', 'cancelled_at', { transaction } ); await queryInterface.removeColumn( 'subscriptions', 'current_period_end_at', { transaction } ); await queryInterface.removeColumn( 'subscriptions', 'current_period_start_at', { transaction } ); await queryInterface.removeColumn( 'subscriptions', 'status', { transaction } ); await queryInterface.removeColumn( 'subscriptions', 'provider_reference', { transaction } ); await queryInterface.removeColumn( 'subscriptions', 'service_packageId', { transaction } ); await queryInterface.removeColumn( 'subscriptions', 'customerId', { transaction } ); await queryInterface.removeColumn( 'subscriptions', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'invoices', 'paid_at', { transaction } ); await queryInterface.removeColumn( 'invoices', 'due_at', { transaction } ); await queryInterface.removeColumn( 'invoices', 'issued_at', { transaction } ); await queryInterface.removeColumn( 'invoices', 'status', { transaction } ); await queryInterface.removeColumn( 'invoices', 'currency', { transaction } ); await queryInterface.removeColumn( 'invoices', 'total', { transaction } ); await queryInterface.removeColumn( 'invoices', 'tax_total', { transaction } ); await queryInterface.removeColumn( 'invoices', 'subtotal', { transaction } ); await queryInterface.removeColumn( 'invoices', 'provider_reference', { transaction } ); await queryInterface.removeColumn( 'invoices', 'invoice_number', { transaction } ); await queryInterface.removeColumn( 'invoices', 'customerId', { transaction } ); await queryInterface.removeColumn( 'invoices', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'payment_transactions', 'processed_at', { transaction } ); await queryInterface.removeColumn( 'payment_transactions', 'status', { transaction } ); await queryInterface.removeColumn( 'payment_transactions', 'currency', { transaction } ); await queryInterface.removeColumn( 'payment_transactions', 'amount', { transaction } ); await queryInterface.removeColumn( 'payment_transactions', 'provider_reference', { transaction } ); await queryInterface.removeColumn( 'payment_transactions', 'transaction_type', { transaction } ); await queryInterface.removeColumn( 'payment_transactions', 'provider', { transaction } ); await queryInterface.removeColumn( 'payment_transactions', 'service_requestId', { transaction } ); await queryInterface.removeColumn( 'payment_transactions', 'customerId', { transaction } ); await queryInterface.removeColumn( 'payment_transactions', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'chat_messages', 'organizationsId', { transaction } ); await queryInterface.removeColumn( 'chat_messages', 'is_read', { transaction } ); await queryInterface.removeColumn( 'chat_messages', 'sent_at', { transaction } ); await queryInterface.removeColumn( 'chat_messages', 'body', { transaction } ); await queryInterface.removeColumn( 'chat_messages', 'message_type', { transaction } ); await queryInterface.removeColumn( 'chat_messages', 'sender_userId', { transaction } ); await queryInterface.removeColumn( 'chat_messages', 'chat_threadId', { transaction } ); await queryInterface.removeColumn( 'chat_threads', 'status', { transaction } ); await queryInterface.removeColumn( 'chat_threads', 'last_message_at', { transaction } ); await queryInterface.removeColumn( 'chat_threads', 'thread_type', { transaction } ); await queryInterface.removeColumn( 'chat_threads', 'subject', { transaction } ); await queryInterface.removeColumn( 'chat_threads', 'service_requestId', { transaction } ); await queryInterface.removeColumn( 'chat_threads', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'request_documents', 'organizationsId', { transaction } ); await queryInterface.removeColumn( 'request_documents', 'uploaded_at', { transaction } ); await queryInterface.removeColumn( 'request_documents', 'is_sensitive', { transaction } ); await queryInterface.removeColumn( 'request_documents', 'title', { transaction } ); await queryInterface.removeColumn( 'request_documents', 'document_type', { transaction } ); await queryInterface.removeColumn( 'request_documents', 'uploaded_by_userId', { transaction } ); await queryInterface.removeColumn( 'request_documents', 'service_requestId', { transaction } ); await queryInterface.removeColumn( 'request_timeline_events', 'organizationsId', { transaction } ); await queryInterface.removeColumn( 'request_timeline_events', 'event_at', { transaction } ); await queryInterface.removeColumn( 'request_timeline_events', 'event_detail', { transaction } ); await queryInterface.removeColumn( 'request_timeline_events', 'event_title', { transaction } ); await queryInterface.removeColumn( 'request_timeline_events', 'event_type', { transaction } ); await queryInterface.removeColumn( 'request_timeline_events', 'actor_userId', { transaction } ); await queryInterface.removeColumn( 'request_timeline_events', 'service_requestId', { transaction } ); await queryInterface.removeColumn( 'request_checklist_items', 'organizationsId', { transaction } ); await queryInterface.removeColumn( 'request_checklist_items', 'completed_at', { transaction } ); await queryInterface.removeColumn( 'request_checklist_items', 'due_at', { transaction } ); await queryInterface.removeColumn( 'request_checklist_items', 'assigned_userId', { transaction } ); await queryInterface.removeColumn( 'request_checklist_items', 'status', { transaction } ); await queryInterface.removeColumn( 'request_checklist_items', 'details', { transaction } ); await queryInterface.removeColumn( 'request_checklist_items', 'title', { transaction } ); await queryInterface.removeColumn( 'request_checklist_items', 'service_requestId', { transaction } ); await queryInterface.removeColumn( 'service_request_add_ons', 'organizationsId', { transaction } ); await queryInterface.removeColumn( 'service_request_add_ons', 'notes', { transaction } ); await queryInterface.removeColumn( 'service_request_add_ons', 'line_total', { transaction } ); await queryInterface.removeColumn( 'service_request_add_ons', 'unit_price', { transaction } ); await queryInterface.removeColumn( 'service_request_add_ons', 'quantity', { transaction } ); await queryInterface.removeColumn( 'service_request_add_ons', 'service_add_onId', { transaction } ); await queryInterface.removeColumn( 'service_request_add_ons', 'service_requestId', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'requires_no_contact_coordination', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'closed_at', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'submitted_at', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'final_total', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'estimated_total', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'priority', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'status', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'description', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'summary', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'scheduled_end_at', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'scheduled_start_at', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'timing_preference', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'service_type', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'service_packageId', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'assigned_coordinator_userId', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'requester_userId', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'customerId', { transaction } ); await queryInterface.removeColumn( 'service_requests', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'service_add_ons', 'is_active', { transaction } ); await queryInterface.removeColumn( 'service_add_ons', 'unit_price', { transaction } ); await queryInterface.removeColumn( 'service_add_ons', 'pricing_model', { transaction } ); await queryInterface.removeColumn( 'service_add_ons', 'description', { transaction } ); await queryInterface.removeColumn( 'service_add_ons', 'code', { transaction } ); await queryInterface.removeColumn( 'service_add_ons', 'name', { transaction } ); await queryInterface.removeColumn( 'service_add_ons', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'service_packages', 'is_active', { transaction } ); await queryInterface.removeColumn( 'service_packages', 'stripe_price_ref', { transaction } ); await queryInterface.removeColumn( 'service_packages', 'billing_type', { transaction } ); await queryInterface.removeColumn( 'service_packages', 'price', { transaction } ); await queryInterface.removeColumn( 'service_packages', 'description', { transaction } ); await queryInterface.removeColumn( 'service_packages', 'code', { transaction } ); await queryInterface.removeColumn( 'service_packages', 'name', { transaction } ); await queryInterface.removeColumn( 'service_packages', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'organizationsId', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'is_default', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'longitude', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'latitude', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'country', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'postal_code', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'region', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'city', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'line2', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'line1', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'phone', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'recipient_name', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'label', { transaction } ); await queryInterface.removeColumn( 'saved_addresses', 'customerId', { transaction } ); await queryInterface.removeColumn( 'customers', 'notes', { transaction } ); await queryInterface.removeColumn( 'customers', 'preferred_contact_method', { transaction } ); await queryInterface.removeColumn( 'customers', 'status', { transaction } ); await queryInterface.removeColumn( 'customers', 'phone', { transaction } ); await queryInterface.removeColumn( 'customers', 'email', { transaction } ); await queryInterface.removeColumn( 'customers', 'full_name', { transaction } ); await queryInterface.removeColumn( 'customers', 'userId', { transaction } ); await queryInterface.removeColumn( 'customers', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'organization_invitations', 'status', { transaction } ); await queryInterface.removeColumn( 'organization_invitations', 'accepted_at', { transaction } ); await queryInterface.removeColumn( 'organization_invitations', 'expires_at', { transaction } ); await queryInterface.removeColumn( 'organization_invitations', 'invite_token', { transaction } ); await queryInterface.removeColumn( 'organization_invitations', 'invite_role', { transaction } ); await queryInterface.removeColumn( 'organization_invitations', 'invite_email', { transaction } ); await queryInterface.removeColumn( 'organization_invitations', 'organizationId', { transaction } ); await queryInterface.removeColumn( 'organizations', 'name', { transaction } ); await queryInterface.removeColumn( 'permissions', 'name', { transaction } ); await queryInterface.removeColumn( 'roles', 'globalAccess', { transaction } ); await queryInterface.removeColumn( 'roles', 'role_customization', { transaction } ); await queryInterface.removeColumn( 'roles', 'name', { transaction } ); await queryInterface.removeColumn( 'users', 'organizationsId', { transaction } ); await queryInterface.removeColumn( 'users', 'app_roleId', { 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('usage_events', { transaction }); await queryInterface.dropTable('csv_jobs', { transaction }); await queryInterface.dropTable('webhook_deliveries', { transaction }); await queryInterface.dropTable('webhook_endpoints', { transaction }); await queryInterface.dropTable('audit_logs', { transaction }); await queryInterface.dropTable('notifications', { transaction }); await queryInterface.dropTable('leads', { transaction }); await queryInterface.dropTable('support_tickets', { transaction }); await queryInterface.dropTable('document_acceptances', { transaction }); await queryInterface.dropTable('legal_documents', { transaction }); await queryInterface.dropTable('subscriptions', { transaction }); await queryInterface.dropTable('invoices', { transaction }); await queryInterface.dropTable('payment_transactions', { transaction }); await queryInterface.dropTable('chat_messages', { transaction }); await queryInterface.dropTable('chat_threads', { transaction }); await queryInterface.dropTable('request_documents', { transaction }); await queryInterface.dropTable('request_timeline_events', { transaction }); await queryInterface.dropTable('request_checklist_items', { transaction }); await queryInterface.dropTable('service_request_add_ons', { transaction }); await queryInterface.dropTable('service_requests', { transaction }); await queryInterface.dropTable('service_add_ons', { transaction }); await queryInterface.dropTable('service_packages', { transaction }); await queryInterface.dropTable('saved_addresses', { transaction }); await queryInterface.dropTable('customers', { transaction }); await queryInterface.dropTable('organization_invitations', { transaction }); await queryInterface.dropTable('organizations', { transaction }); await queryInterface.dropTable('permissions', { transaction }); await queryInterface.dropTable('roles', { transaction }); await queryInterface.dropTable('users', { transaction }); await transaction.commit(); } catch (err) { await transaction.rollback(); throw err; } } };