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('pipelines', { 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('pipeline_stages', { 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('contacts', { 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('properties', { 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('rooms', { 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('deals', { 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('activities', { 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.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( 'roles', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'roles', 'role_customization', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'permissions', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'pipelines', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'pipelines', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'pipelines', 'is_default', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'pipelines', 'sort_order', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'pipeline_stages', 'pipelineId', { type: Sequelize.DataTypes.UUID, references: { model: 'pipelines', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'pipeline_stages', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'pipeline_stages', 'sort_order', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'pipeline_stages', 'stage_type', { type: Sequelize.DataTypes.ENUM, values: ['open','won','lost'], }, { transaction } ); await queryInterface.addColumn( 'pipeline_stages', 'is_active', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'pipeline_stages', 'default_probability', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'full_name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'email', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'phone', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'contact_type', { type: Sequelize.DataTypes.ENUM, values: ['tenant','landlord','vendor','other'], }, { transaction } ); await queryInterface.addColumn( 'contacts', 'company_name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'source', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'tags', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'address_line', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'city', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'state', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'postal_code', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'owner_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'contacts', 'do_not_contact', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'properties', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'properties', 'property_type', { type: Sequelize.DataTypes.ENUM, values: ['apartment','house','hostel','pg','co_living','other'], }, { transaction } ); await queryInterface.addColumn( 'properties', 'address_line', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'properties', 'city', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'properties', 'state', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'properties', 'postal_code', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'properties', 'latitude', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'properties', 'longitude', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'properties', 'landlord_contactId', { type: Sequelize.DataTypes.UUID, references: { model: 'contacts', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'properties', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'rooms', 'propertyId', { type: Sequelize.DataTypes.UUID, references: { model: 'properties', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'rooms', 'room_label', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'rooms', 'room_type', { type: Sequelize.DataTypes.ENUM, values: ['private','shared','studio','other'], }, { transaction } ); await queryInterface.addColumn( 'rooms', 'capacity', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'rooms', 'furnishing', { type: Sequelize.DataTypes.ENUM, values: ['unfurnished','semi_furnished','fully_furnished'], }, { transaction } ); await queryInterface.addColumn( 'rooms', 'rent_amount', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'rooms', 'deposit_amount', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'rooms', 'availability_status', { type: Sequelize.DataTypes.ENUM, values: ['available','reserved','occupied','maintenance'], }, { transaction } ); await queryInterface.addColumn( 'rooms', 'available_from', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'rooms', 'amenities', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'rooms', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'leads', 'lead_title', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'leads', 'contactId', { type: Sequelize.DataTypes.UUID, references: { model: 'contacts', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'leads', 'assigned_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'leads', 'interested_propertyId', { type: Sequelize.DataTypes.UUID, references: { model: 'properties', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'leads', 'interested_roomId', { type: Sequelize.DataTypes.UUID, references: { model: 'rooms', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'leads', 'lead_status', { type: Sequelize.DataTypes.ENUM, values: ['new','contacted','qualified','unqualified','converted','closed'], }, { transaction } ); await queryInterface.addColumn( 'leads', 'lead_source', { type: Sequelize.DataTypes.ENUM, values: ['walk_in','website','referral','phone','social','partner','other'], }, { transaction } ); await queryInterface.addColumn( 'leads', 'priority', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'leads', 'budget_min', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'leads', 'budget_max', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'leads', 'move_in_date', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'leads', 'desired_lease_months', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'leads', 'requirements', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'leads', 'last_contacted_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'leads', 'next_follow_up_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'leads', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'deals', 'deal_name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'deals', 'leadId', { type: Sequelize.DataTypes.UUID, references: { model: 'leads', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'deals', 'contactId', { type: Sequelize.DataTypes.UUID, references: { model: 'contacts', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'deals', 'owner_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'deals', 'pipelineId', { type: Sequelize.DataTypes.UUID, references: { model: 'pipelines', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'deals', 'stageId', { type: Sequelize.DataTypes.UUID, references: { model: 'pipeline_stages', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'deals', 'propertyId', { type: Sequelize.DataTypes.UUID, references: { model: 'properties', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'deals', 'roomId', { type: Sequelize.DataTypes.UUID, references: { model: 'rooms', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'deals', 'expected_rent_amount', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'deals', 'expected_deposit_amount', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'deals', 'probability', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'deals', 'expected_move_in_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'deals', 'expected_close_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'deals', 'deal_status', { type: Sequelize.DataTypes.ENUM, values: ['open','won','lost','on_hold'], }, { transaction } ); await queryInterface.addColumn( 'deals', 'loss_reason', { type: Sequelize.DataTypes.ENUM, values: ['price','location','availability','no_response','chose_competitor','not_qualified','other'], }, { transaction } ); await queryInterface.addColumn( 'deals', 'loss_notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'deals', 'next_follow_up_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'deals', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'activities', 'dealId', { type: Sequelize.DataTypes.UUID, references: { model: 'deals', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'activities', 'leadId', { type: Sequelize.DataTypes.UUID, references: { model: 'leads', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'activities', 'contactId', { type: Sequelize.DataTypes.UUID, references: { model: 'contacts', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'activities', 'assigned_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'activities', 'activity_type', { type: Sequelize.DataTypes.ENUM, values: ['call','message','email','site_visit','meeting','task','note'], }, { transaction } ); await queryInterface.addColumn( 'activities', 'direction', { type: Sequelize.DataTypes.ENUM, values: ['inbound','outbound','internal'], }, { transaction } ); await queryInterface.addColumn( 'activities', 'scheduled_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'activities', 'due_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'activities', 'completed_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'activities', 'status', { type: Sequelize.DataTypes.ENUM, values: ['planned','completed','canceled','no_show','overdue'], }, { transaction } ); await queryInterface.addColumn( 'activities', 'subject', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'activities', 'details', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'activities', 'is_reminder_set', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'activities', 'remind_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'communications', 'contactId', { type: Sequelize.DataTypes.UUID, references: { model: 'contacts', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'communications', 'leadId', { type: Sequelize.DataTypes.UUID, references: { model: 'leads', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'communications', 'dealId', { type: Sequelize.DataTypes.UUID, references: { model: 'deals', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'communications', 'userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'communications', 'channel', { type: Sequelize.DataTypes.ENUM, values: ['phone','sms','whatsapp','email','in_app','other'], }, { transaction } ); await queryInterface.addColumn( 'communications', 'direction', { type: Sequelize.DataTypes.ENUM, values: ['inbound','outbound'], }, { transaction } ); await queryInterface.addColumn( 'communications', 'occurred_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'communications', 'summary', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'communications', 'body', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'documents', 'title', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'documents', 'document_type', { type: Sequelize.DataTypes.ENUM, values: ['id_proof','income_proof','rental_application','agreement_draft','signed_agreement','receipt','other'], }, { transaction } ); await queryInterface.addColumn( 'documents', 'contactId', { type: Sequelize.DataTypes.UUID, references: { model: 'contacts', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'documents', 'dealId', { type: Sequelize.DataTypes.UUID, references: { model: 'deals', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'documents', 'propertyId', { type: Sequelize.DataTypes.UUID, references: { model: 'properties', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'documents', 'roomId', { type: Sequelize.DataTypes.UUID, references: { model: 'rooms', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'documents', 'received_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'documents', 'is_verified', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'documents', 'notes', { type: Sequelize.DataTypes.TEXT, }, { 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( 'documents', 'notes', { transaction } ); await queryInterface.removeColumn( 'documents', 'is_verified', { transaction } ); await queryInterface.removeColumn( 'documents', 'received_at', { transaction } ); await queryInterface.removeColumn( 'documents', 'roomId', { transaction } ); await queryInterface.removeColumn( 'documents', 'propertyId', { transaction } ); await queryInterface.removeColumn( 'documents', 'dealId', { transaction } ); await queryInterface.removeColumn( 'documents', 'contactId', { transaction } ); await queryInterface.removeColumn( 'documents', 'document_type', { transaction } ); await queryInterface.removeColumn( 'documents', 'title', { transaction } ); await queryInterface.removeColumn( 'communications', 'body', { transaction } ); await queryInterface.removeColumn( 'communications', 'summary', { transaction } ); await queryInterface.removeColumn( 'communications', 'occurred_at', { transaction } ); await queryInterface.removeColumn( 'communications', 'direction', { transaction } ); await queryInterface.removeColumn( 'communications', 'channel', { transaction } ); await queryInterface.removeColumn( 'communications', 'userId', { transaction } ); await queryInterface.removeColumn( 'communications', 'dealId', { transaction } ); await queryInterface.removeColumn( 'communications', 'leadId', { transaction } ); await queryInterface.removeColumn( 'communications', 'contactId', { transaction } ); await queryInterface.removeColumn( 'activities', 'remind_at', { transaction } ); await queryInterface.removeColumn( 'activities', 'is_reminder_set', { transaction } ); await queryInterface.removeColumn( 'activities', 'details', { transaction } ); await queryInterface.removeColumn( 'activities', 'subject', { transaction } ); await queryInterface.removeColumn( 'activities', 'status', { transaction } ); await queryInterface.removeColumn( 'activities', 'completed_at', { transaction } ); await queryInterface.removeColumn( 'activities', 'due_at', { transaction } ); await queryInterface.removeColumn( 'activities', 'scheduled_at', { transaction } ); await queryInterface.removeColumn( 'activities', 'direction', { transaction } ); await queryInterface.removeColumn( 'activities', 'activity_type', { transaction } ); await queryInterface.removeColumn( 'activities', 'assigned_userId', { transaction } ); await queryInterface.removeColumn( 'activities', 'contactId', { transaction } ); await queryInterface.removeColumn( 'activities', 'leadId', { transaction } ); await queryInterface.removeColumn( 'activities', 'dealId', { transaction } ); await queryInterface.removeColumn( 'deals', 'notes', { transaction } ); await queryInterface.removeColumn( 'deals', 'next_follow_up_at', { transaction } ); await queryInterface.removeColumn( 'deals', 'loss_notes', { transaction } ); await queryInterface.removeColumn( 'deals', 'loss_reason', { transaction } ); await queryInterface.removeColumn( 'deals', 'deal_status', { transaction } ); await queryInterface.removeColumn( 'deals', 'expected_close_at', { transaction } ); await queryInterface.removeColumn( 'deals', 'expected_move_in_at', { transaction } ); await queryInterface.removeColumn( 'deals', 'probability', { transaction } ); await queryInterface.removeColumn( 'deals', 'expected_deposit_amount', { transaction } ); await queryInterface.removeColumn( 'deals', 'expected_rent_amount', { transaction } ); await queryInterface.removeColumn( 'deals', 'roomId', { transaction } ); await queryInterface.removeColumn( 'deals', 'propertyId', { transaction } ); await queryInterface.removeColumn( 'deals', 'stageId', { transaction } ); await queryInterface.removeColumn( 'deals', 'pipelineId', { transaction } ); await queryInterface.removeColumn( 'deals', 'owner_userId', { transaction } ); await queryInterface.removeColumn( 'deals', 'contactId', { transaction } ); await queryInterface.removeColumn( 'deals', 'leadId', { transaction } ); await queryInterface.removeColumn( 'deals', 'deal_name', { transaction } ); await queryInterface.removeColumn( 'leads', 'notes', { transaction } ); await queryInterface.removeColumn( 'leads', 'next_follow_up_at', { transaction } ); await queryInterface.removeColumn( 'leads', 'last_contacted_at', { transaction } ); await queryInterface.removeColumn( 'leads', 'requirements', { transaction } ); await queryInterface.removeColumn( 'leads', 'desired_lease_months', { transaction } ); await queryInterface.removeColumn( 'leads', 'move_in_date', { transaction } ); await queryInterface.removeColumn( 'leads', 'budget_max', { transaction } ); await queryInterface.removeColumn( 'leads', 'budget_min', { transaction } ); await queryInterface.removeColumn( 'leads', 'priority', { transaction } ); await queryInterface.removeColumn( 'leads', 'lead_source', { transaction } ); await queryInterface.removeColumn( 'leads', 'lead_status', { transaction } ); await queryInterface.removeColumn( 'leads', 'interested_roomId', { transaction } ); await queryInterface.removeColumn( 'leads', 'interested_propertyId', { transaction } ); await queryInterface.removeColumn( 'leads', 'assigned_userId', { transaction } ); await queryInterface.removeColumn( 'leads', 'contactId', { transaction } ); await queryInterface.removeColumn( 'leads', 'lead_title', { transaction } ); await queryInterface.removeColumn( 'rooms', 'notes', { transaction } ); await queryInterface.removeColumn( 'rooms', 'amenities', { transaction } ); await queryInterface.removeColumn( 'rooms', 'available_from', { transaction } ); await queryInterface.removeColumn( 'rooms', 'availability_status', { transaction } ); await queryInterface.removeColumn( 'rooms', 'deposit_amount', { transaction } ); await queryInterface.removeColumn( 'rooms', 'rent_amount', { transaction } ); await queryInterface.removeColumn( 'rooms', 'furnishing', { transaction } ); await queryInterface.removeColumn( 'rooms', 'capacity', { transaction } ); await queryInterface.removeColumn( 'rooms', 'room_type', { transaction } ); await queryInterface.removeColumn( 'rooms', 'room_label', { transaction } ); await queryInterface.removeColumn( 'rooms', 'propertyId', { transaction } ); await queryInterface.removeColumn( 'properties', 'notes', { transaction } ); await queryInterface.removeColumn( 'properties', 'landlord_contactId', { transaction } ); await queryInterface.removeColumn( 'properties', 'longitude', { transaction } ); await queryInterface.removeColumn( 'properties', 'latitude', { transaction } ); await queryInterface.removeColumn( 'properties', 'postal_code', { transaction } ); await queryInterface.removeColumn( 'properties', 'state', { transaction } ); await queryInterface.removeColumn( 'properties', 'city', { transaction } ); await queryInterface.removeColumn( 'properties', 'address_line', { transaction } ); await queryInterface.removeColumn( 'properties', 'property_type', { transaction } ); await queryInterface.removeColumn( 'properties', 'name', { transaction } ); await queryInterface.removeColumn( 'contacts', 'do_not_contact', { transaction } ); await queryInterface.removeColumn( 'contacts', 'owner_userId', { transaction } ); await queryInterface.removeColumn( 'contacts', 'notes', { transaction } ); await queryInterface.removeColumn( 'contacts', 'postal_code', { transaction } ); await queryInterface.removeColumn( 'contacts', 'state', { transaction } ); await queryInterface.removeColumn( 'contacts', 'city', { transaction } ); await queryInterface.removeColumn( 'contacts', 'address_line', { transaction } ); await queryInterface.removeColumn( 'contacts', 'tags', { transaction } ); await queryInterface.removeColumn( 'contacts', 'source', { transaction } ); await queryInterface.removeColumn( 'contacts', 'company_name', { transaction } ); await queryInterface.removeColumn( 'contacts', 'contact_type', { transaction } ); await queryInterface.removeColumn( 'contacts', 'phone', { transaction } ); await queryInterface.removeColumn( 'contacts', 'email', { transaction } ); await queryInterface.removeColumn( 'contacts', 'full_name', { transaction } ); await queryInterface.removeColumn( 'pipeline_stages', 'default_probability', { transaction } ); await queryInterface.removeColumn( 'pipeline_stages', 'is_active', { transaction } ); await queryInterface.removeColumn( 'pipeline_stages', 'stage_type', { transaction } ); await queryInterface.removeColumn( 'pipeline_stages', 'sort_order', { transaction } ); await queryInterface.removeColumn( 'pipeline_stages', 'name', { transaction } ); await queryInterface.removeColumn( 'pipeline_stages', 'pipelineId', { transaction } ); await queryInterface.removeColumn( 'pipelines', 'sort_order', { transaction } ); await queryInterface.removeColumn( 'pipelines', 'is_default', { transaction } ); await queryInterface.removeColumn( 'pipelines', 'description', { transaction } ); await queryInterface.removeColumn( 'pipelines', 'name', { transaction } ); await queryInterface.removeColumn( 'permissions', 'name', { transaction } ); await queryInterface.removeColumn( 'roles', 'role_customization', { transaction } ); await queryInterface.removeColumn( 'roles', 'name', { 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('documents', { transaction }); await queryInterface.dropTable('communications', { transaction }); await queryInterface.dropTable('activities', { transaction }); await queryInterface.dropTable('deals', { transaction }); await queryInterface.dropTable('leads', { transaction }); await queryInterface.dropTable('rooms', { transaction }); await queryInterface.dropTable('properties', { transaction }); await queryInterface.dropTable('contacts', { transaction }); await queryInterface.dropTable('pipeline_stages', { transaction }); await queryInterface.dropTable('pipelines', { 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; } } };