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('categories', { 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('brands', { 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('units', { 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('suppliers', { 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('products', { 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('supplier_products', { 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('purchase_orders', { 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('purchase_order_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('receivings', { 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('receiving_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('stock_adjustments', { 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('stock_adjustment_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('inventory_movements', { 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('sales_orders', { 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('sales_order_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('alerts', { 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( 'categories', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'categories', 'code', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'categories', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'categories', 'is_active', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'categories', 'parent_categoryId', { type: Sequelize.DataTypes.UUID, references: { model: 'categories', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'brands', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'brands', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'brands', 'is_active', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'units', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'units', 'symbol', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'units', 'base_multiplier', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'units', 'is_active', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'suppliers', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'suppliers', 'contact_name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'suppliers', 'email', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'suppliers', 'phone', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'suppliers', 'address', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'suppliers', 'tax_number', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'suppliers', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'suppliers', 'is_active', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'products', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'products', 'sku', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'products', 'barcode', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'products', 'description', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'products', 'categoryId', { type: Sequelize.DataTypes.UUID, references: { model: 'categories', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'products', 'brandId', { type: Sequelize.DataTypes.UUID, references: { model: 'brands', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'products', 'unitId', { type: Sequelize.DataTypes.UUID, references: { model: 'units', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'products', 'is_active', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'products', 'is_taxable', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'products', 'tax_rate', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'products', 'cost_price', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'products', 'sale_price', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'products', 'reorder_point', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'products', 'reorder_quantity', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'products', 'current_stock', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'products', 'last_received_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'supplier_products', 'supplierId', { type: Sequelize.DataTypes.UUID, references: { model: 'suppliers', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'supplier_products', 'productId', { type: Sequelize.DataTypes.UUID, references: { model: 'products', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'supplier_products', 'supplier_sku', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'supplier_products', 'supplier_cost', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'supplier_products', 'lead_time_days', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'supplier_products', 'is_preferred', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'supplier_products', 'is_active', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'purchase_orders', 'po_number', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'purchase_orders', 'supplierId', { type: Sequelize.DataTypes.UUID, references: { model: 'suppliers', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'purchase_orders', 'status', { type: Sequelize.DataTypes.ENUM, values: ['draft','sent','partially_received','received','cancelled'], }, { transaction } ); await queryInterface.addColumn( 'purchase_orders', 'order_date', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'purchase_orders', 'expected_date', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'purchase_orders', 'received_date', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'purchase_orders', 'subtotal', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'purchase_orders', 'tax_total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'purchase_orders', 'total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'purchase_orders', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'purchase_orders', 'created_by_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'purchase_order_items', 'purchase_orderId', { type: Sequelize.DataTypes.UUID, references: { model: 'purchase_orders', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'purchase_order_items', 'productId', { type: Sequelize.DataTypes.UUID, references: { model: 'products', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'purchase_order_items', 'quantity_ordered', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'purchase_order_items', 'quantity_received', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'purchase_order_items', 'unit_cost', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'purchase_order_items', 'tax_rate', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'purchase_order_items', 'line_total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'purchase_order_items', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'receivings', 'receiving_number', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'receivings', 'purchase_orderId', { type: Sequelize.DataTypes.UUID, references: { model: 'purchase_orders', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'receivings', 'supplierId', { type: Sequelize.DataTypes.UUID, references: { model: 'suppliers', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'receivings', 'received_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'receivings', 'status', { type: Sequelize.DataTypes.ENUM, values: ['draft','posted','voided'], }, { transaction } ); await queryInterface.addColumn( 'receivings', 'subtotal', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'receivings', 'tax_total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'receivings', 'total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'receivings', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'receivings', 'received_by_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'receiving_items', 'receivingId', { type: Sequelize.DataTypes.UUID, references: { model: 'receivings', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'receiving_items', 'productId', { type: Sequelize.DataTypes.UUID, references: { model: 'products', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'receiving_items', 'quantity_received', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'receiving_items', 'unit_cost', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'receiving_items', 'tax_rate', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'receiving_items', 'line_total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'receiving_items', 'lot_number', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'receiving_items', 'expiry_date', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'receiving_items', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'stock_adjustments', 'adjustment_number', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'stock_adjustments', 'adjusted_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'stock_adjustments', 'reason', { type: Sequelize.DataTypes.ENUM, values: ['count_correction','damage','spoilage','theft','return_to_supplier','other'], }, { transaction } ); await queryInterface.addColumn( 'stock_adjustments', 'status', { type: Sequelize.DataTypes.ENUM, values: ['draft','posted','voided'], }, { transaction } ); await queryInterface.addColumn( 'stock_adjustments', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'stock_adjustments', 'adjusted_by_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'stock_adjustment_items', 'stock_adjustmentId', { type: Sequelize.DataTypes.UUID, references: { model: 'stock_adjustments', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'stock_adjustment_items', 'productId', { type: Sequelize.DataTypes.UUID, references: { model: 'products', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'stock_adjustment_items', 'quantity_delta', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'stock_adjustment_items', 'unit_cost', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'stock_adjustment_items', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'inventory_movements', 'moved_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'inventory_movements', 'productId', { type: Sequelize.DataTypes.UUID, references: { model: 'products', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'inventory_movements', 'movement_type', { type: Sequelize.DataTypes.ENUM, values: ['receiving','sale','adjustment','return','transfer'], }, { transaction } ); await queryInterface.addColumn( 'inventory_movements', 'quantity_delta', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'inventory_movements', 'unit_cost', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'inventory_movements', 'unit_price', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'inventory_movements', 'reference_number', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'inventory_movements', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'inventory_movements', 'performed_by_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'customers', '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', 'address', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'customers', 'is_active', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'customers', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'sales_orders', 'order_number', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'sales_orders', 'sold_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'sales_orders', 'status', { type: Sequelize.DataTypes.ENUM, values: ['open','paid','voided','refunded'], }, { transaction } ); await queryInterface.addColumn( 'sales_orders', 'customerId', { type: Sequelize.DataTypes.UUID, references: { model: 'customers', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'sales_orders', 'subtotal', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'sales_orders', 'discount_total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'sales_orders', 'tax_total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'sales_orders', 'total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'sales_orders', 'payment_method', { type: Sequelize.DataTypes.ENUM, values: ['cash','card','mixed','other'], }, { transaction } ); await queryInterface.addColumn( 'sales_orders', 'notes', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'sales_orders', 'sold_by_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'sales_order_items', 'sales_orderId', { type: Sequelize.DataTypes.UUID, references: { model: 'sales_orders', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'sales_order_items', 'productId', { type: Sequelize.DataTypes.UUID, references: { model: 'products', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'sales_order_items', 'quantity', { type: Sequelize.DataTypes.INTEGER, }, { transaction } ); await queryInterface.addColumn( 'sales_order_items', 'unit_price', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'sales_order_items', 'discount_amount', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'sales_order_items', 'tax_rate', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'sales_order_items', 'line_total', { type: Sequelize.DataTypes.DECIMAL, }, { transaction } ); await queryInterface.addColumn( 'alerts', 'type', { type: Sequelize.DataTypes.ENUM, values: ['low_stock','expiry_soon','system'], }, { transaction } ); await queryInterface.addColumn( 'alerts', 'severity', { type: Sequelize.DataTypes.ENUM, values: ['info','warning','critical'], }, { transaction } ); await queryInterface.addColumn( 'alerts', 'title_text', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'alerts', 'message', { type: Sequelize.DataTypes.TEXT, }, { transaction } ); await queryInterface.addColumn( 'alerts', 'productId', { type: Sequelize.DataTypes.UUID, references: { model: 'products', key: 'id', }, }, { transaction } ); await queryInterface.addColumn( 'alerts', 'is_resolved', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction } ); await queryInterface.addColumn( 'alerts', 'triggered_at', { type: Sequelize.DataTypes.DATE, }, { transaction } ); await queryInterface.addColumn( 'alerts', 'resolved_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( 'alerts', 'resolved_at', { transaction } ); await queryInterface.removeColumn( 'alerts', 'triggered_at', { transaction } ); await queryInterface.removeColumn( 'alerts', 'is_resolved', { transaction } ); await queryInterface.removeColumn( 'alerts', 'productId', { transaction } ); await queryInterface.removeColumn( 'alerts', 'message', { transaction } ); await queryInterface.removeColumn( 'alerts', 'title_text', { transaction } ); await queryInterface.removeColumn( 'alerts', 'severity', { transaction } ); await queryInterface.removeColumn( 'alerts', 'type', { transaction } ); await queryInterface.removeColumn( 'sales_order_items', 'line_total', { transaction } ); await queryInterface.removeColumn( 'sales_order_items', 'tax_rate', { transaction } ); await queryInterface.removeColumn( 'sales_order_items', 'discount_amount', { transaction } ); await queryInterface.removeColumn( 'sales_order_items', 'unit_price', { transaction } ); await queryInterface.removeColumn( 'sales_order_items', 'quantity', { transaction } ); await queryInterface.removeColumn( 'sales_order_items', 'productId', { transaction } ); await queryInterface.removeColumn( 'sales_order_items', 'sales_orderId', { transaction } ); await queryInterface.removeColumn( 'sales_orders', 'sold_by_userId', { transaction } ); await queryInterface.removeColumn( 'sales_orders', 'notes', { transaction } ); await queryInterface.removeColumn( 'sales_orders', 'payment_method', { transaction } ); await queryInterface.removeColumn( 'sales_orders', 'total', { transaction } ); await queryInterface.removeColumn( 'sales_orders', 'tax_total', { transaction } ); await queryInterface.removeColumn( 'sales_orders', 'discount_total', { transaction } ); await queryInterface.removeColumn( 'sales_orders', 'subtotal', { transaction } ); await queryInterface.removeColumn( 'sales_orders', 'customerId', { transaction } ); await queryInterface.removeColumn( 'sales_orders', 'status', { transaction } ); await queryInterface.removeColumn( 'sales_orders', 'sold_at', { transaction } ); await queryInterface.removeColumn( 'sales_orders', 'order_number', { transaction } ); await queryInterface.removeColumn( 'customers', 'notes', { transaction } ); await queryInterface.removeColumn( 'customers', 'is_active', { transaction } ); await queryInterface.removeColumn( 'customers', 'address', { transaction } ); await queryInterface.removeColumn( 'customers', 'phone', { transaction } ); await queryInterface.removeColumn( 'customers', 'email', { transaction } ); await queryInterface.removeColumn( 'customers', 'name', { transaction } ); await queryInterface.removeColumn( 'inventory_movements', 'performed_by_userId', { transaction } ); await queryInterface.removeColumn( 'inventory_movements', 'notes', { transaction } ); await queryInterface.removeColumn( 'inventory_movements', 'reference_number', { transaction } ); await queryInterface.removeColumn( 'inventory_movements', 'unit_price', { transaction } ); await queryInterface.removeColumn( 'inventory_movements', 'unit_cost', { transaction } ); await queryInterface.removeColumn( 'inventory_movements', 'quantity_delta', { transaction } ); await queryInterface.removeColumn( 'inventory_movements', 'movement_type', { transaction } ); await queryInterface.removeColumn( 'inventory_movements', 'productId', { transaction } ); await queryInterface.removeColumn( 'inventory_movements', 'moved_at', { transaction } ); await queryInterface.removeColumn( 'stock_adjustment_items', 'notes', { transaction } ); await queryInterface.removeColumn( 'stock_adjustment_items', 'unit_cost', { transaction } ); await queryInterface.removeColumn( 'stock_adjustment_items', 'quantity_delta', { transaction } ); await queryInterface.removeColumn( 'stock_adjustment_items', 'productId', { transaction } ); await queryInterface.removeColumn( 'stock_adjustment_items', 'stock_adjustmentId', { transaction } ); await queryInterface.removeColumn( 'stock_adjustments', 'adjusted_by_userId', { transaction } ); await queryInterface.removeColumn( 'stock_adjustments', 'notes', { transaction } ); await queryInterface.removeColumn( 'stock_adjustments', 'status', { transaction } ); await queryInterface.removeColumn( 'stock_adjustments', 'reason', { transaction } ); await queryInterface.removeColumn( 'stock_adjustments', 'adjusted_at', { transaction } ); await queryInterface.removeColumn( 'stock_adjustments', 'adjustment_number', { transaction } ); await queryInterface.removeColumn( 'receiving_items', 'notes', { transaction } ); await queryInterface.removeColumn( 'receiving_items', 'expiry_date', { transaction } ); await queryInterface.removeColumn( 'receiving_items', 'lot_number', { transaction } ); await queryInterface.removeColumn( 'receiving_items', 'line_total', { transaction } ); await queryInterface.removeColumn( 'receiving_items', 'tax_rate', { transaction } ); await queryInterface.removeColumn( 'receiving_items', 'unit_cost', { transaction } ); await queryInterface.removeColumn( 'receiving_items', 'quantity_received', { transaction } ); await queryInterface.removeColumn( 'receiving_items', 'productId', { transaction } ); await queryInterface.removeColumn( 'receiving_items', 'receivingId', { transaction } ); await queryInterface.removeColumn( 'receivings', 'received_by_userId', { transaction } ); await queryInterface.removeColumn( 'receivings', 'notes', { transaction } ); await queryInterface.removeColumn( 'receivings', 'total', { transaction } ); await queryInterface.removeColumn( 'receivings', 'tax_total', { transaction } ); await queryInterface.removeColumn( 'receivings', 'subtotal', { transaction } ); await queryInterface.removeColumn( 'receivings', 'status', { transaction } ); await queryInterface.removeColumn( 'receivings', 'received_at', { transaction } ); await queryInterface.removeColumn( 'receivings', 'supplierId', { transaction } ); await queryInterface.removeColumn( 'receivings', 'purchase_orderId', { transaction } ); await queryInterface.removeColumn( 'receivings', 'receiving_number', { transaction } ); await queryInterface.removeColumn( 'purchase_order_items', 'notes', { transaction } ); await queryInterface.removeColumn( 'purchase_order_items', 'line_total', { transaction } ); await queryInterface.removeColumn( 'purchase_order_items', 'tax_rate', { transaction } ); await queryInterface.removeColumn( 'purchase_order_items', 'unit_cost', { transaction } ); await queryInterface.removeColumn( 'purchase_order_items', 'quantity_received', { transaction } ); await queryInterface.removeColumn( 'purchase_order_items', 'quantity_ordered', { transaction } ); await queryInterface.removeColumn( 'purchase_order_items', 'productId', { transaction } ); await queryInterface.removeColumn( 'purchase_order_items', 'purchase_orderId', { transaction } ); await queryInterface.removeColumn( 'purchase_orders', 'created_by_userId', { transaction } ); await queryInterface.removeColumn( 'purchase_orders', 'notes', { transaction } ); await queryInterface.removeColumn( 'purchase_orders', 'total', { transaction } ); await queryInterface.removeColumn( 'purchase_orders', 'tax_total', { transaction } ); await queryInterface.removeColumn( 'purchase_orders', 'subtotal', { transaction } ); await queryInterface.removeColumn( 'purchase_orders', 'received_date', { transaction } ); await queryInterface.removeColumn( 'purchase_orders', 'expected_date', { transaction } ); await queryInterface.removeColumn( 'purchase_orders', 'order_date', { transaction } ); await queryInterface.removeColumn( 'purchase_orders', 'status', { transaction } ); await queryInterface.removeColumn( 'purchase_orders', 'supplierId', { transaction } ); await queryInterface.removeColumn( 'purchase_orders', 'po_number', { transaction } ); await queryInterface.removeColumn( 'supplier_products', 'is_active', { transaction } ); await queryInterface.removeColumn( 'supplier_products', 'is_preferred', { transaction } ); await queryInterface.removeColumn( 'supplier_products', 'lead_time_days', { transaction } ); await queryInterface.removeColumn( 'supplier_products', 'supplier_cost', { transaction } ); await queryInterface.removeColumn( 'supplier_products', 'supplier_sku', { transaction } ); await queryInterface.removeColumn( 'supplier_products', 'productId', { transaction } ); await queryInterface.removeColumn( 'supplier_products', 'supplierId', { transaction } ); await queryInterface.removeColumn( 'products', 'last_received_at', { transaction } ); await queryInterface.removeColumn( 'products', 'current_stock', { transaction } ); await queryInterface.removeColumn( 'products', 'reorder_quantity', { transaction } ); await queryInterface.removeColumn( 'products', 'reorder_point', { transaction } ); await queryInterface.removeColumn( 'products', 'sale_price', { transaction } ); await queryInterface.removeColumn( 'products', 'cost_price', { transaction } ); await queryInterface.removeColumn( 'products', 'tax_rate', { transaction } ); await queryInterface.removeColumn( 'products', 'is_taxable', { transaction } ); await queryInterface.removeColumn( 'products', 'is_active', { transaction } ); await queryInterface.removeColumn( 'products', 'unitId', { transaction } ); await queryInterface.removeColumn( 'products', 'brandId', { transaction } ); await queryInterface.removeColumn( 'products', 'categoryId', { transaction } ); await queryInterface.removeColumn( 'products', 'description', { transaction } ); await queryInterface.removeColumn( 'products', 'barcode', { transaction } ); await queryInterface.removeColumn( 'products', 'sku', { transaction } ); await queryInterface.removeColumn( 'products', 'name', { transaction } ); await queryInterface.removeColumn( 'suppliers', 'is_active', { transaction } ); await queryInterface.removeColumn( 'suppliers', 'notes', { transaction } ); await queryInterface.removeColumn( 'suppliers', 'tax_number', { transaction } ); await queryInterface.removeColumn( 'suppliers', 'address', { transaction } ); await queryInterface.removeColumn( 'suppliers', 'phone', { transaction } ); await queryInterface.removeColumn( 'suppliers', 'email', { transaction } ); await queryInterface.removeColumn( 'suppliers', 'contact_name', { transaction } ); await queryInterface.removeColumn( 'suppliers', 'name', { transaction } ); await queryInterface.removeColumn( 'units', 'is_active', { transaction } ); await queryInterface.removeColumn( 'units', 'base_multiplier', { transaction } ); await queryInterface.removeColumn( 'units', 'symbol', { transaction } ); await queryInterface.removeColumn( 'units', 'name', { transaction } ); await queryInterface.removeColumn( 'brands', 'is_active', { transaction } ); await queryInterface.removeColumn( 'brands', 'description', { transaction } ); await queryInterface.removeColumn( 'brands', 'name', { transaction } ); await queryInterface.removeColumn( 'categories', 'parent_categoryId', { transaction } ); await queryInterface.removeColumn( 'categories', 'is_active', { transaction } ); await queryInterface.removeColumn( 'categories', 'description', { transaction } ); await queryInterface.removeColumn( 'categories', 'code', { transaction } ); await queryInterface.removeColumn( 'categories', '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('alerts', { transaction }); await queryInterface.dropTable('sales_order_items', { transaction }); await queryInterface.dropTable('sales_orders', { transaction }); await queryInterface.dropTable('customers', { transaction }); await queryInterface.dropTable('inventory_movements', { transaction }); await queryInterface.dropTable('stock_adjustment_items', { transaction }); await queryInterface.dropTable('stock_adjustments', { transaction }); await queryInterface.dropTable('receiving_items', { transaction }); await queryInterface.dropTable('receivings', { transaction }); await queryInterface.dropTable('purchase_order_items', { transaction }); await queryInterface.dropTable('purchase_orders', { transaction }); await queryInterface.dropTable('supplier_products', { transaction }); await queryInterface.dropTable('products', { transaction }); await queryInterface.dropTable('suppliers', { transaction }); await queryInterface.dropTable('units', { transaction }); await queryInterface.dropTable('brands', { transaction }); await queryInterface.dropTable('categories', { 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; } } };