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( 'bills', { 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( 'certifications', { 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( 'clients', { 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( 'contracts', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'documents', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'employees', { 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( 'equipment', { 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( 'incident_reports', { 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( 'inventory', { 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( 'milestones', { 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( 'payments', { 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( 'projects', { 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( 'safety_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( 'tasks', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'vendors', { 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( 'divisions', { 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( 'bills', 'bill_number', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'bills', 'vendorId', { type: Sequelize.DataTypes.UUID, references: { model: 'vendors', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'bills', 'amount', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'bills', 'status', { type: Sequelize.DataTypes.ENUM, values: ['Paid', 'Pending', 'Overdue'], }, { transaction }, ); await queryInterface.addColumn( 'bills', 'due_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'certifications', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'certifications', 'expiry_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'certifications', 'employeeId', { type: Sequelize.DataTypes.UUID, references: { model: 'employees', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'clients', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'clients', 'primary_contact', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'clients', 'email', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'clients', 'phone', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'clients', 'billing_address', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'clients', 'industry_type', { type: Sequelize.DataTypes.ENUM, values: ['Commercial', 'Residential', 'Infrastructure'], }, { transaction }, ); await queryInterface.addColumn( 'contracts', 'contract_no', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'contracts', 'clientId', { type: Sequelize.DataTypes.UUID, references: { model: 'clients', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'contracts', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'contracts', 'value', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'contracts', 'start_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'contracts', 'end_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'contracts', 'status', { type: Sequelize.DataTypes.ENUM, values: ['Draft', 'Active', 'Closed'], }, { transaction }, ); await queryInterface.addColumn( 'documents', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'documents', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'employees', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'employees', 'role', { type: Sequelize.DataTypes.ENUM, values: ['Staff', 'Subcontractor'], }, { transaction }, ); await queryInterface.addColumn( 'equipment', 'asset_tag', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'equipment', 'type', { type: Sequelize.DataTypes.ENUM, values: ['Excavator', 'Forklift', 'Generator'], }, { transaction }, ); await queryInterface.addColumn( 'equipment', 'last_service_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'equipment', 'next_service_due', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'equipment', 'assigned_projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'incident_reports', 'incident_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'incident_reports', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'incident_reports', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'inventory', 'sku', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'inventory', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'inventory', 'category', { type: Sequelize.DataTypes.ENUM, values: ['Lumber', 'Steel', 'Concrete', 'Fasteners', 'Electrical'], }, { transaction }, ); await queryInterface.addColumn( 'inventory', 'unit', { type: Sequelize.DataTypes.INTEGER, }, { transaction }, ); await queryInterface.addColumn( 'inventory', 'min_stock_threshold', { type: Sequelize.DataTypes.INTEGER, }, { transaction }, ); await queryInterface.addColumn( 'inventory', 'current_stock', { type: Sequelize.DataTypes.INTEGER, }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'invoice_number', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'clientId', { type: Sequelize.DataTypes.UUID, references: { model: 'clients', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'amount', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'status', { type: Sequelize.DataTypes.ENUM, values: ['Paid', 'PartiallyPaid', 'Overdue'], }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'due_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'milestones', 'title', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'milestones', 'due_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'milestones', 'status', { type: Sequelize.DataTypes.ENUM, values: ['OnTrack', 'AtRisk', 'Delayed'], }, { transaction }, ); await queryInterface.addColumn( 'milestones', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'payments', 'invoiceId', { type: Sequelize.DataTypes.UUID, references: { model: 'invoices', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'payments', 'amount', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'payments', 'payment_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'project_code', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'clientId', { type: Sequelize.DataTypes.UUID, references: { model: 'clients', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'budget', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'start_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'end_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'status', { type: Sequelize.DataTypes.ENUM, values: ['Planned', 'Active', 'OnHold', 'Completed'], }, { transaction }, ); await queryInterface.addColumn( 'projects', 'location', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'safety_logs', 'log_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'safety_logs', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'safety_logs', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'title', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'assigneeId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'priority', { type: Sequelize.DataTypes.ENUM, values: ['Low', 'Medium', 'High'], }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'due_date', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'status', { type: Sequelize.DataTypes.ENUM, values: ['Todo', 'Doing', 'Blocked', 'Done'], }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'vendors', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'vendors', 'contact_person', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'vendors', 'email', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'vendors', 'phone', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'permissions', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'roles', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'roles', 'role_customization', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'users', 'app_roleId', { type: Sequelize.DataTypes.UUID, references: { model: 'roles', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'divisions', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'roles', 'globalAccess', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction }, ); await queryInterface.addColumn( 'users', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'bills', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'certifications', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'clients', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'contracts', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'documents', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'employees', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'equipment', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'incident_reports', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'inventory', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'invoices', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'milestones', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'payments', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'safety_logs', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'tasks', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'vendors', 'divisionsId', { type: Sequelize.DataTypes.UUID, references: { model: 'divisions', key: 'id', }, }, { transaction }, ); await transaction.commit(); } catch (err) { await transaction.rollback(); throw err; } }, /** * @param {QueryInterface} queryInterface * @param {Sequelize} Sequelize * @returns {Promise} */ async down(queryInterface, Sequelize) { /** * @type {Transaction} */ const transaction = await queryInterface.sequelize.transaction(); try { await queryInterface.removeColumn('vendors', 'divisionsId', { transaction, }); await queryInterface.removeColumn('tasks', 'divisionsId', { transaction, }); await queryInterface.removeColumn('safety_logs', 'divisionsId', { transaction, }); await queryInterface.removeColumn('projects', 'divisionsId', { transaction, }); await queryInterface.removeColumn('payments', 'divisionsId', { transaction, }); await queryInterface.removeColumn('milestones', 'divisionsId', { transaction, }); await queryInterface.removeColumn('invoices', 'divisionsId', { transaction, }); await queryInterface.removeColumn('inventory', 'divisionsId', { transaction, }); await queryInterface.removeColumn('incident_reports', 'divisionsId', { transaction, }); await queryInterface.removeColumn('equipment', 'divisionsId', { transaction, }); await queryInterface.removeColumn('employees', 'divisionsId', { transaction, }); await queryInterface.removeColumn('documents', 'divisionsId', { transaction, }); await queryInterface.removeColumn('contracts', 'divisionsId', { transaction, }); await queryInterface.removeColumn('clients', 'divisionsId', { transaction, }); await queryInterface.removeColumn('certifications', 'divisionsId', { transaction, }); await queryInterface.removeColumn('bills', 'divisionsId', { transaction, }); await queryInterface.removeColumn('users', 'divisionsId', { transaction, }); await queryInterface.removeColumn('roles', 'globalAccess', { transaction, }); await queryInterface.removeColumn('divisions', 'name', { transaction }); await queryInterface.removeColumn('users', 'app_roleId', { transaction }); await queryInterface.removeColumn('roles', 'role_customization', { transaction, }); await queryInterface.removeColumn('roles', 'name', { transaction }); await queryInterface.removeColumn('permissions', 'name', { transaction }); await queryInterface.removeColumn('vendors', 'phone', { transaction }); await queryInterface.removeColumn('vendors', 'email', { transaction }); await queryInterface.removeColumn('vendors', 'contact_person', { transaction, }); await queryInterface.removeColumn('vendors', 'name', { transaction }); await queryInterface.removeColumn('tasks', 'projectId', { transaction }); await queryInterface.removeColumn('tasks', 'status', { transaction }); await queryInterface.removeColumn('tasks', 'due_date', { transaction }); await queryInterface.removeColumn('tasks', 'priority', { transaction }); await queryInterface.removeColumn('tasks', 'assigneeId', { transaction }); await queryInterface.removeColumn('tasks', 'description', { transaction, }); await queryInterface.removeColumn('tasks', 'title', { transaction }); await queryInterface.removeColumn('safety_logs', 'description', { transaction, }); await queryInterface.removeColumn('safety_logs', 'projectId', { transaction, }); await queryInterface.removeColumn('safety_logs', 'log_date', { transaction, }); await queryInterface.removeColumn('projects', 'location', { transaction, }); await queryInterface.removeColumn('projects', 'status', { transaction }); await queryInterface.removeColumn('projects', 'end_date', { transaction, }); await queryInterface.removeColumn('projects', 'start_date', { transaction, }); await queryInterface.removeColumn('projects', 'budget', { transaction }); await queryInterface.removeColumn('projects', 'clientId', { transaction, }); await queryInterface.removeColumn('projects', 'name', { transaction }); await queryInterface.removeColumn('projects', 'project_code', { transaction, }); await queryInterface.removeColumn('payments', 'payment_date', { transaction, }); await queryInterface.removeColumn('payments', 'amount', { transaction }); await queryInterface.removeColumn('payments', 'invoiceId', { transaction, }); await queryInterface.removeColumn('milestones', 'projectId', { transaction, }); await queryInterface.removeColumn('milestones', 'status', { transaction, }); await queryInterface.removeColumn('milestones', 'due_date', { transaction, }); await queryInterface.removeColumn('milestones', 'title', { transaction }); await queryInterface.removeColumn('invoices', 'due_date', { transaction, }); await queryInterface.removeColumn('invoices', 'status', { transaction }); await queryInterface.removeColumn('invoices', 'amount', { transaction }); await queryInterface.removeColumn('invoices', 'clientId', { transaction, }); await queryInterface.removeColumn('invoices', 'invoice_number', { transaction, }); await queryInterface.removeColumn('inventory', 'current_stock', { transaction, }); await queryInterface.removeColumn('inventory', 'min_stock_threshold', { transaction, }); await queryInterface.removeColumn('inventory', 'unit', { transaction }); await queryInterface.removeColumn('inventory', 'category', { transaction, }); await queryInterface.removeColumn('inventory', 'name', { transaction }); await queryInterface.removeColumn('inventory', 'sku', { transaction }); await queryInterface.removeColumn('incident_reports', 'description', { transaction, }); await queryInterface.removeColumn('incident_reports', 'projectId', { transaction, }); await queryInterface.removeColumn('incident_reports', 'incident_date', { transaction, }); await queryInterface.removeColumn('equipment', 'assigned_projectId', { transaction, }); await queryInterface.removeColumn('equipment', 'next_service_due', { transaction, }); await queryInterface.removeColumn('equipment', 'last_service_date', { transaction, }); await queryInterface.removeColumn('equipment', 'type', { transaction }); await queryInterface.removeColumn('equipment', 'asset_tag', { transaction, }); await queryInterface.removeColumn('employees', 'role', { transaction }); await queryInterface.removeColumn('employees', 'name', { transaction }); await queryInterface.removeColumn('documents', 'projectId', { transaction, }); await queryInterface.removeColumn('documents', 'name', { transaction }); await queryInterface.removeColumn('contracts', 'status', { transaction }); await queryInterface.removeColumn('contracts', 'end_date', { transaction, }); await queryInterface.removeColumn('contracts', 'start_date', { transaction, }); await queryInterface.removeColumn('contracts', 'value', { transaction }); await queryInterface.removeColumn('contracts', 'projectId', { transaction, }); await queryInterface.removeColumn('contracts', 'clientId', { transaction, }); await queryInterface.removeColumn('contracts', 'contract_no', { transaction, }); await queryInterface.removeColumn('clients', 'industry_type', { transaction, }); await queryInterface.removeColumn('clients', 'billing_address', { transaction, }); await queryInterface.removeColumn('clients', 'phone', { transaction }); await queryInterface.removeColumn('clients', 'email', { transaction }); await queryInterface.removeColumn('clients', 'primary_contact', { transaction, }); await queryInterface.removeColumn('clients', 'name', { transaction }); await queryInterface.removeColumn('certifications', 'employeeId', { transaction, }); await queryInterface.removeColumn('certifications', 'expiry_date', { transaction, }); await queryInterface.removeColumn('certifications', 'name', { transaction, }); await queryInterface.removeColumn('bills', 'due_date', { transaction }); await queryInterface.removeColumn('bills', 'status', { transaction }); await queryInterface.removeColumn('bills', 'amount', { transaction }); await queryInterface.removeColumn('bills', 'vendorId', { transaction }); await queryInterface.removeColumn('bills', 'bill_number', { 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('divisions', { transaction }); await queryInterface.dropTable('permissions', { transaction }); await queryInterface.dropTable('roles', { transaction }); await queryInterface.dropTable('vendors', { transaction }); await queryInterface.dropTable('tasks', { transaction }); await queryInterface.dropTable('safety_logs', { transaction }); await queryInterface.dropTable('projects', { transaction }); await queryInterface.dropTable('payments', { transaction }); await queryInterface.dropTable('milestones', { transaction }); await queryInterface.dropTable('invoices', { transaction }); await queryInterface.dropTable('inventory', { transaction }); await queryInterface.dropTable('incident_reports', { transaction }); await queryInterface.dropTable('equipment', { transaction }); await queryInterface.dropTable('employees', { transaction }); await queryInterface.dropTable('documents', { transaction }); await queryInterface.dropTable('contracts', { transaction }); await queryInterface.dropTable('clients', { transaction }); await queryInterface.dropTable('certifications', { transaction }); await queryInterface.dropTable('bills', { transaction }); await queryInterface.dropTable('users', { transaction }); await transaction.commit(); } catch (err) { await transaction.rollback(); throw err; } }, };