module.exports = {
  /**
   * @param {QueryInterface} queryInterface
   * @param {Sequelize} Sequelize
   * @returns {Promise<void>}
   */
  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(
        'cameras_ptz',
        {
          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(
        'epcs',
        {
          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(
        'epis',
        {
          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(
        'equipes_trabalho',
        {
          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(
        'estrutura_projeto',
        {
          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(
        'etapas_ou_trechos',
        {
          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(
        'frames_imagem',
        {
          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(
        'gemeos_digitais',
        {
          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(
        'historico_alteracoes_projeto',
        {
          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(
        'inspecao_aerea',
        {
          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(
        'maquinas_atividade',
        {
          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(
        'materiais_atividade',
        {
          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(
        'membros_equipe',
        {
          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(
        'memoriais_descritivos_asbuilt',
        {
          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(
        'modelos_bim_asbuilt',
        {
          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(
        'obras',
        {
          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(
        'permissoes_modulo',
        {
          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(
        'pessoas_atividade',
        {
          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(
        'pessoas_frame',
        {
          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(
        'plantas_asbuilt_2d',
        {
          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(
        'relatorio_andamento_atual',
        {
          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(
        'relatorios_analiticos_video',
        {
          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(
        'relatorios_diarios',
        {
          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(
        'relatorios_mensais',
        {
          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(
        'relatorios_semanais',
        {
          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(
        'subcontratadas',
        {
          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(
        'usuarios',
        {
          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(
        'clientes',
        {
          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(
        'cameras_ptz',
        'modelo',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'cameras_ptz',
        'fabricante',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'cameras_ptz',
        'local_instalacao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'cameras_ptz',
        'coordenada_lat',
        {
          type: Sequelize.DataTypes.DECIMAL,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'cameras_ptz',
        'coordenada_lon',
        {
          type: Sequelize.DataTypes.DECIMAL,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'cameras_ptz',
        'altura_instalacao_m',
        {
          type: Sequelize.DataTypes.DECIMAL,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'cameras_ptz',
        'angulo_focal',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'cameras_ptz',
        'ip_acesso',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'cameras_ptz',
        'status_operacional',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'cameras_ptz',
        'data_instalacao',
        {
          type: Sequelize.DataTypes.DATEONLY,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'cameras_ptz',
        'observacoes',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'cameras_ptz',
        'obraId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'obras',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'epcs',
        'nome_epc',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'epcs',
        'descricao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'epis',
        'nome_epi',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'epis',
        'descricao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'equipes_trabalho',
        'nome_equipe',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'equipes_trabalho',
        'tipo',
        {
          type: Sequelize.DataTypes.ENUM,

          values: ['Copasa', 'Subcontratada'],
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'equipes_trabalho',
        'obraId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'obras',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'estrutura_projeto',
        'etapa',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'estrutura_projeto',
        'atividade',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'estrutura_projeto',
        'descricao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'estrutura_projeto',
        'prazo_estimado_dias',
        {
          type: Sequelize.DataTypes.INTEGER,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'estrutura_projeto',
        'obraId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'obras',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'etapas_ou_trechos',
        'tipo',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'etapas_ou_trechos',
        'nome',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'etapas_ou_trechos',
        'descricao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'etapas_ou_trechos',
        'obraId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'obras',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'frames_imagem',
        'origem',
        {
          type: Sequelize.DataTypes.ENUM,

          values: ['drone', 'ptz'],
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'frames_imagem',
        'imagem_url',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'frames_imagem',
        'timestamp_frame',
        {
          type: Sequelize.DataTypes.DATE,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'frames_imagem',
        'observacoes',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'frames_imagem',
        'inspecaoId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'inspecao_aerea',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'gemeos_digitais',
        'tipo',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'gemeos_digitais',
        'arquivo_url',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'gemeos_digitais',
        'descricao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'gemeos_digitais',
        'inspecaoId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'inspecao_aerea',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'historico_alteracoes_projeto',
        'data_alteracao',
        {
          type: Sequelize.DataTypes.DATE,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'historico_alteracoes_projeto',
        'tipo_alteracao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'historico_alteracoes_projeto',
        'descricao_anterior',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'historico_alteracoes_projeto',
        'descricao_nova',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'historico_alteracoes_projeto',
        'motivo_alteracao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'historico_alteracoes_projeto',
        'responsavel_alteracao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'historico_alteracoes_projeto',
        'comentarios',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'historico_alteracoes_projeto',
        'estruturaId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'estrutura_projeto',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'inspecao_aerea',
        'data_inspecao',
        {
          type: Sequelize.DataTypes.DATE,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'inspecao_aerea',
        'tipo_inspecao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'inspecao_aerea',
        'observacoes',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'inspecao_aerea',
        'obraId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'obras',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'maquinas_atividade',
        'quantidade_prevista',
        {
          type: Sequelize.DataTypes.INTEGER,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'maquinas_atividade',
        'horas_utilizacao_previstas',
        {
          type: Sequelize.DataTypes.DECIMAL,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'maquinas_atividade',
        'comentarios',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'maquinas_atividade',
        'estruturaId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'estrutura_projeto',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'materiais_atividade',
        'quantidade_prevista',
        {
          type: Sequelize.DataTypes.DECIMAL,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'materiais_atividade',
        'unidade_medida',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'materiais_atividade',
        'tolerancia_estoque',
        {
          type: Sequelize.DataTypes.DECIMAL,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'materiais_atividade',
        'comentarios',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'materiais_atividade',
        'estruturaId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'estrutura_projeto',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'membros_equipe',
        'nome',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'membros_equipe',
        'funcao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'membros_equipe',
        'equipeId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'equipes_trabalho',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'memoriais_descritivos_asbuilt',
        'titulo',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'memoriais_descritivos_asbuilt',
        'descricao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'memoriais_descritivos_asbuilt',
        'arquivo_digital',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'memoriais_descritivos_asbuilt',
        'data_entrega',
        {
          type: Sequelize.DataTypes.DATEONLY,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'memoriais_descritivos_asbuilt',
        'responsavel_tecnico',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'memoriais_descritivos_asbuilt',
        'validado_por_copasa',
        {
          type: Sequelize.DataTypes.BOOLEAN,

          defaultValue: false,
          allowNull: false,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'memoriais_descritivos_asbuilt',
        'comentarios_validacao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'memoriais_descritivos_asbuilt',
        'obraId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'obras',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'modelos_bim_asbuilt',
        'nome_modelo',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'modelos_bim_asbuilt',
        'descricao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'modelos_bim_asbuilt',
        'arquivo_modelo',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'modelos_bim_asbuilt',
        'formato',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'modelos_bim_asbuilt',
        'plataforma_origem',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'modelos_bim_asbuilt',
        'data_modelagem',
        {
          type: Sequelize.DataTypes.DATEONLY,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'modelos_bim_asbuilt',
        'responsavel_modelagem',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'modelos_bim_asbuilt',
        'nivel_detalhamento',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'modelos_bim_asbuilt',
        'coordenacao_com_outros_modelos',
        {
          type: Sequelize.DataTypes.BOOLEAN,

          defaultValue: false,
          allowNull: false,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'modelos_bim_asbuilt',
        'comentarios',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'modelos_bim_asbuilt',
        'obraId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'obras',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'obras',
        'nome_obra',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'obras',
        'cidade',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'obras',
        'estado',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'obras',
        'descricao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'obras',
        'data_inicio',
        {
          type: Sequelize.DataTypes.DATEONLY,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'obras',
        'data_previsao_termino',
        {
          type: Sequelize.DataTypes.DATEONLY,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'obras',
        'plantas_2d_georreferenciadas',
        {
          type: Sequelize.DataTypes.BOOLEAN,

          defaultValue: false,
          allowNull: false,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'obras',
        'clienteId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'permissoes_modulo',
        'modulo',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'permissoes_modulo',
        'leitura',
        {
          type: Sequelize.DataTypes.BOOLEAN,

          defaultValue: false,
          allowNull: false,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'permissoes_modulo',
        'escrita',
        {
          type: Sequelize.DataTypes.BOOLEAN,

          defaultValue: false,
          allowNull: false,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'permissoes_modulo',
        'aprovacao',
        {
          type: Sequelize.DataTypes.BOOLEAN,

          defaultValue: false,
          allowNull: false,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'permissoes_modulo',
        'roleId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'roles',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_atividade',
        'funcao_na_atividade',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_atividade',
        'horas_previstas',
        {
          type: Sequelize.DataTypes.DECIMAL,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_atividade',
        'comentarios',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_atividade',
        'estruturaId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'estrutura_projeto',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_atividade',
        'membroId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'membros_equipe',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_frame',
        'atividade',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_frame',
        'posicao_aproximada',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_frame',
        'epi_visiveis',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_frame',
        'foco_no_trabalho',
        {
          type: Sequelize.DataTypes.BOOLEAN,

          defaultValue: false,
          allowNull: false,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_frame',
        'operando_maquina',
        {
          type: Sequelize.DataTypes.BOOLEAN,

          defaultValue: false,
          allowNull: false,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_frame',
        'frameId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'frames_imagem',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'plantas_asbuilt_2d',
        'nome_planta',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'plantas_asbuilt_2d',
        'descricao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'plantas_asbuilt_2d',
        'arquivo_digital',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'plantas_asbuilt_2d',
        'formato',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'plantas_asbuilt_2d',
        'data_criacao',
        {
          type: Sequelize.DataTypes.DATEONLY,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'plantas_asbuilt_2d',
        'responsavel_tecnico',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'plantas_asbuilt_2d',
        'georreferenciada',
        {
          type: Sequelize.DataTypes.BOOLEAN,

          defaultValue: false,
          allowNull: false,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'plantas_asbuilt_2d',
        'sistema_referencia',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'plantas_asbuilt_2d',
        'comentarios',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'plantas_asbuilt_2d',
        'obraId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'obras',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorio_andamento_atual',
        'data_ultima_atualizacao',
        {
          type: Sequelize.DataTypes.DATE,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorio_andamento_atual',
        'status_obra',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorio_andamento_atual',
        'percentual_execucao_total',
        {
          type: Sequelize.DataTypes.DECIMAL,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorio_andamento_atual',
        'atividade_atual_predominante',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorio_andamento_atual',
        'riscos_em_aberto',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorio_andamento_atual',
        'tempo_estimado_para_conclusao',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorio_andamento_atual',
        'grau_conformidade_geral',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorio_andamento_atual',
        'observacoes_finais',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorio_andamento_atual',
        'obraId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'obras',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorio_andamento_atual',
        'ultimo_relatorio_videoId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'relatorios_analiticos_video',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_analiticos_video',
        'json_analise',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_analiticos_video',
        'data_geracao',
        {
          type: Sequelize.DataTypes.DATE,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_analiticos_video',
        'inspecaoId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'inspecao_aerea',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_diarios',
        'data',
        {
          type: Sequelize.DataTypes.DATEONLY,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_diarios',
        'resumo',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_diarios',
        'obraId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'obras',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_mensais',
        'mes_referencia',
        {
          type: Sequelize.DataTypes.DATEONLY,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_mensais',
        'resumo',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_mensais',
        'obraId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'obras',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_semanais',
        'semana_referencia',
        {
          type: Sequelize.DataTypes.DATEONLY,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_semanais',
        'resumo',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_semanais',
        'obraId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'obras',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'subcontratadas',
        'nome',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'subcontratadas',
        'cnpj',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'subcontratadas',
        'endereco',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'subcontratadas',
        'responsavel_tecnico',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'usuarios',
        'nome',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'usuarios',
        'email',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'usuarios',
        'senha_hash',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'usuarios',
        'ativo',
        {
          type: Sequelize.DataTypes.BOOLEAN,

          defaultValue: false,
          allowNull: false,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'usuarios',
        'data_criacao',
        {
          type: Sequelize.DataTypes.DATE,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'usuarios',
        'roleId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'roles',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'usuarios',
        'clienteId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { 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(
        'clientes',
        'name',
        {
          type: Sequelize.DataTypes.TEXT,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'roles',
        'globalAccess',
        {
          type: Sequelize.DataTypes.BOOLEAN,

          defaultValue: false,
          allowNull: false,
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'users',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'cameras_ptz',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'epcs',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'epis',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'equipes_trabalho',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'estrutura_projeto',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'etapas_ou_trechos',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'frames_imagem',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'gemeos_digitais',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'historico_alteracoes_projeto',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'inspecao_aerea',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'maquinas_atividade',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'materiais_atividade',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'membros_equipe',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'memoriais_descritivos_asbuilt',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'modelos_bim_asbuilt',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'obras',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'permissoes_modulo',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_atividade',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'pessoas_frame',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'plantas_asbuilt_2d',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorio_andamento_atual',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_analiticos_video',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_diarios',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_mensais',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'relatorios_semanais',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'subcontratadas',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await queryInterface.addColumn(
        'usuarios',
        'clientesId',
        {
          type: Sequelize.DataTypes.UUID,

          references: {
            model: 'clientes',
            key: 'id',
          },
        },
        { transaction },
      );

      await transaction.commit();
    } catch (err) {
      await transaction.rollback();
      throw err;
    }
  },
  /**
   * @param {QueryInterface} queryInterface
   * @param {Sequelize} Sequelize
   * @returns {Promise<void>}
   */
  async down(queryInterface, Sequelize) {
    /**
     * @type {Transaction}
     */
    const transaction = await queryInterface.sequelize.transaction();
    try {
      await queryInterface.removeColumn('usuarios', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('subcontratadas', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('relatorios_semanais', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('relatorios_mensais', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('relatorios_diarios', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn(
        'relatorios_analiticos_video',
        'clientesId',
        { transaction },
      );

      await queryInterface.removeColumn(
        'relatorio_andamento_atual',
        'clientesId',
        { transaction },
      );

      await queryInterface.removeColumn('plantas_asbuilt_2d', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('pessoas_frame', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('pessoas_atividade', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('permissoes_modulo', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('obras', 'clientesId', { transaction });

      await queryInterface.removeColumn('modelos_bim_asbuilt', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn(
        'memoriais_descritivos_asbuilt',
        'clientesId',
        { transaction },
      );

      await queryInterface.removeColumn('membros_equipe', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('materiais_atividade', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('maquinas_atividade', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('inspecao_aerea', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn(
        'historico_alteracoes_projeto',
        'clientesId',
        { transaction },
      );

      await queryInterface.removeColumn('gemeos_digitais', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('frames_imagem', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('etapas_ou_trechos', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('estrutura_projeto', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('equipes_trabalho', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('epis', 'clientesId', { transaction });

      await queryInterface.removeColumn('epcs', 'clientesId', { transaction });

      await queryInterface.removeColumn('cameras_ptz', 'clientesId', {
        transaction,
      });

      await queryInterface.removeColumn('users', 'clientesId', { transaction });

      await queryInterface.removeColumn('roles', 'globalAccess', {
        transaction,
      });

      await queryInterface.removeColumn('clientes', '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('usuarios', 'clienteId', {
        transaction,
      });

      await queryInterface.removeColumn('usuarios', 'roleId', { transaction });

      await queryInterface.removeColumn('usuarios', 'data_criacao', {
        transaction,
      });

      await queryInterface.removeColumn('usuarios', 'ativo', { transaction });

      await queryInterface.removeColumn('usuarios', 'senha_hash', {
        transaction,
      });

      await queryInterface.removeColumn('usuarios', 'email', { transaction });

      await queryInterface.removeColumn('usuarios', 'nome', { transaction });

      await queryInterface.removeColumn(
        'subcontratadas',
        'responsavel_tecnico',
        { transaction },
      );

      await queryInterface.removeColumn('subcontratadas', 'endereco', {
        transaction,
      });

      await queryInterface.removeColumn('subcontratadas', 'cnpj', {
        transaction,
      });

      await queryInterface.removeColumn('subcontratadas', 'nome', {
        transaction,
      });

      await queryInterface.removeColumn('relatorios_semanais', 'obraId', {
        transaction,
      });

      await queryInterface.removeColumn('relatorios_semanais', 'resumo', {
        transaction,
      });

      await queryInterface.removeColumn(
        'relatorios_semanais',
        'semana_referencia',
        { transaction },
      );

      await queryInterface.removeColumn('relatorios_mensais', 'obraId', {
        transaction,
      });

      await queryInterface.removeColumn('relatorios_mensais', 'resumo', {
        transaction,
      });

      await queryInterface.removeColumn(
        'relatorios_mensais',
        'mes_referencia',
        { transaction },
      );

      await queryInterface.removeColumn('relatorios_diarios', 'obraId', {
        transaction,
      });

      await queryInterface.removeColumn('relatorios_diarios', 'resumo', {
        transaction,
      });

      await queryInterface.removeColumn('relatorios_diarios', 'data', {
        transaction,
      });

      await queryInterface.removeColumn(
        'relatorios_analiticos_video',
        'inspecaoId',
        { transaction },
      );

      await queryInterface.removeColumn(
        'relatorios_analiticos_video',
        'data_geracao',
        { transaction },
      );

      await queryInterface.removeColumn(
        'relatorios_analiticos_video',
        'json_analise',
        { transaction },
      );

      await queryInterface.removeColumn(
        'relatorio_andamento_atual',
        'ultimo_relatorio_videoId',
        { transaction },
      );

      await queryInterface.removeColumn('relatorio_andamento_atual', 'obraId', {
        transaction,
      });

      await queryInterface.removeColumn(
        'relatorio_andamento_atual',
        'observacoes_finais',
        { transaction },
      );

      await queryInterface.removeColumn(
        'relatorio_andamento_atual',
        'grau_conformidade_geral',
        { transaction },
      );

      await queryInterface.removeColumn(
        'relatorio_andamento_atual',
        'tempo_estimado_para_conclusao',
        { transaction },
      );

      await queryInterface.removeColumn(
        'relatorio_andamento_atual',
        'riscos_em_aberto',
        { transaction },
      );

      await queryInterface.removeColumn(
        'relatorio_andamento_atual',
        'atividade_atual_predominante',
        { transaction },
      );

      await queryInterface.removeColumn(
        'relatorio_andamento_atual',
        'percentual_execucao_total',
        { transaction },
      );

      await queryInterface.removeColumn(
        'relatorio_andamento_atual',
        'status_obra',
        { transaction },
      );

      await queryInterface.removeColumn(
        'relatorio_andamento_atual',
        'data_ultima_atualizacao',
        { transaction },
      );

      await queryInterface.removeColumn('plantas_asbuilt_2d', 'obraId', {
        transaction,
      });

      await queryInterface.removeColumn('plantas_asbuilt_2d', 'comentarios', {
        transaction,
      });

      await queryInterface.removeColumn(
        'plantas_asbuilt_2d',
        'sistema_referencia',
        { transaction },
      );

      await queryInterface.removeColumn(
        'plantas_asbuilt_2d',
        'georreferenciada',
        { transaction },
      );

      await queryInterface.removeColumn(
        'plantas_asbuilt_2d',
        'responsavel_tecnico',
        { transaction },
      );

      await queryInterface.removeColumn('plantas_asbuilt_2d', 'data_criacao', {
        transaction,
      });

      await queryInterface.removeColumn('plantas_asbuilt_2d', 'formato', {
        transaction,
      });

      await queryInterface.removeColumn(
        'plantas_asbuilt_2d',
        'arquivo_digital',
        { transaction },
      );

      await queryInterface.removeColumn('plantas_asbuilt_2d', 'descricao', {
        transaction,
      });

      await queryInterface.removeColumn('plantas_asbuilt_2d', 'nome_planta', {
        transaction,
      });

      await queryInterface.removeColumn('pessoas_frame', 'frameId', {
        transaction,
      });

      await queryInterface.removeColumn('pessoas_frame', 'operando_maquina', {
        transaction,
      });

      await queryInterface.removeColumn('pessoas_frame', 'foco_no_trabalho', {
        transaction,
      });

      await queryInterface.removeColumn('pessoas_frame', 'epi_visiveis', {
        transaction,
      });

      await queryInterface.removeColumn('pessoas_frame', 'posicao_aproximada', {
        transaction,
      });

      await queryInterface.removeColumn('pessoas_frame', 'atividade', {
        transaction,
      });

      await queryInterface.removeColumn('pessoas_atividade', 'membroId', {
        transaction,
      });

      await queryInterface.removeColumn('pessoas_atividade', 'estruturaId', {
        transaction,
      });

      await queryInterface.removeColumn('pessoas_atividade', 'comentarios', {
        transaction,
      });

      await queryInterface.removeColumn(
        'pessoas_atividade',
        'horas_previstas',
        { transaction },
      );

      await queryInterface.removeColumn(
        'pessoas_atividade',
        'funcao_na_atividade',
        { transaction },
      );

      await queryInterface.removeColumn('permissoes_modulo', 'roleId', {
        transaction,
      });

      await queryInterface.removeColumn('permissoes_modulo', 'aprovacao', {
        transaction,
      });

      await queryInterface.removeColumn('permissoes_modulo', 'escrita', {
        transaction,
      });

      await queryInterface.removeColumn('permissoes_modulo', 'leitura', {
        transaction,
      });

      await queryInterface.removeColumn('permissoes_modulo', 'modulo', {
        transaction,
      });

      await queryInterface.removeColumn('obras', 'clienteId', { transaction });

      await queryInterface.removeColumn(
        'obras',
        'plantas_2d_georreferenciadas',
        { transaction },
      );

      await queryInterface.removeColumn('obras', 'data_previsao_termino', {
        transaction,
      });

      await queryInterface.removeColumn('obras', 'data_inicio', {
        transaction,
      });

      await queryInterface.removeColumn('obras', 'descricao', { transaction });

      await queryInterface.removeColumn('obras', 'estado', { transaction });

      await queryInterface.removeColumn('obras', 'cidade', { transaction });

      await queryInterface.removeColumn('obras', 'nome_obra', { transaction });

      await queryInterface.removeColumn('modelos_bim_asbuilt', 'obraId', {
        transaction,
      });

      await queryInterface.removeColumn('modelos_bim_asbuilt', 'comentarios', {
        transaction,
      });

      await queryInterface.removeColumn(
        'modelos_bim_asbuilt',
        'coordenacao_com_outros_modelos',
        { transaction },
      );

      await queryInterface.removeColumn(
        'modelos_bim_asbuilt',
        'nivel_detalhamento',
        { transaction },
      );

      await queryInterface.removeColumn(
        'modelos_bim_asbuilt',
        'responsavel_modelagem',
        { transaction },
      );

      await queryInterface.removeColumn(
        'modelos_bim_asbuilt',
        'data_modelagem',
        { transaction },
      );

      await queryInterface.removeColumn(
        'modelos_bim_asbuilt',
        'plataforma_origem',
        { transaction },
      );

      await queryInterface.removeColumn('modelos_bim_asbuilt', 'formato', {
        transaction,
      });

      await queryInterface.removeColumn(
        'modelos_bim_asbuilt',
        'arquivo_modelo',
        { transaction },
      );

      await queryInterface.removeColumn('modelos_bim_asbuilt', 'descricao', {
        transaction,
      });

      await queryInterface.removeColumn('modelos_bim_asbuilt', 'nome_modelo', {
        transaction,
      });

      await queryInterface.removeColumn(
        'memoriais_descritivos_asbuilt',
        'obraId',
        { transaction },
      );

      await queryInterface.removeColumn(
        'memoriais_descritivos_asbuilt',
        'comentarios_validacao',
        { transaction },
      );

      await queryInterface.removeColumn(
        'memoriais_descritivos_asbuilt',
        'validado_por_copasa',
        { transaction },
      );

      await queryInterface.removeColumn(
        'memoriais_descritivos_asbuilt',
        'responsavel_tecnico',
        { transaction },
      );

      await queryInterface.removeColumn(
        'memoriais_descritivos_asbuilt',
        'data_entrega',
        { transaction },
      );

      await queryInterface.removeColumn(
        'memoriais_descritivos_asbuilt',
        'arquivo_digital',
        { transaction },
      );

      await queryInterface.removeColumn(
        'memoriais_descritivos_asbuilt',
        'descricao',
        { transaction },
      );

      await queryInterface.removeColumn(
        'memoriais_descritivos_asbuilt',
        'titulo',
        { transaction },
      );

      await queryInterface.removeColumn('membros_equipe', 'equipeId', {
        transaction,
      });

      await queryInterface.removeColumn('membros_equipe', 'funcao', {
        transaction,
      });

      await queryInterface.removeColumn('membros_equipe', 'nome', {
        transaction,
      });

      await queryInterface.removeColumn('materiais_atividade', 'estruturaId', {
        transaction,
      });

      await queryInterface.removeColumn('materiais_atividade', 'comentarios', {
        transaction,
      });

      await queryInterface.removeColumn(
        'materiais_atividade',
        'tolerancia_estoque',
        { transaction },
      );

      await queryInterface.removeColumn(
        'materiais_atividade',
        'unidade_medida',
        { transaction },
      );

      await queryInterface.removeColumn(
        'materiais_atividade',
        'quantidade_prevista',
        { transaction },
      );

      await queryInterface.removeColumn('maquinas_atividade', 'estruturaId', {
        transaction,
      });

      await queryInterface.removeColumn('maquinas_atividade', 'comentarios', {
        transaction,
      });

      await queryInterface.removeColumn(
        'maquinas_atividade',
        'horas_utilizacao_previstas',
        { transaction },
      );

      await queryInterface.removeColumn(
        'maquinas_atividade',
        'quantidade_prevista',
        { transaction },
      );

      await queryInterface.removeColumn('inspecao_aerea', 'obraId', {
        transaction,
      });

      await queryInterface.removeColumn('inspecao_aerea', 'observacoes', {
        transaction,
      });

      await queryInterface.removeColumn('inspecao_aerea', 'tipo_inspecao', {
        transaction,
      });

      await queryInterface.removeColumn('inspecao_aerea', 'data_inspecao', {
        transaction,
      });

      await queryInterface.removeColumn(
        'historico_alteracoes_projeto',
        'estruturaId',
        { transaction },
      );

      await queryInterface.removeColumn(
        'historico_alteracoes_projeto',
        'comentarios',
        { transaction },
      );

      await queryInterface.removeColumn(
        'historico_alteracoes_projeto',
        'responsavel_alteracao',
        { transaction },
      );

      await queryInterface.removeColumn(
        'historico_alteracoes_projeto',
        'motivo_alteracao',
        { transaction },
      );

      await queryInterface.removeColumn(
        'historico_alteracoes_projeto',
        'descricao_nova',
        { transaction },
      );

      await queryInterface.removeColumn(
        'historico_alteracoes_projeto',
        'descricao_anterior',
        { transaction },
      );

      await queryInterface.removeColumn(
        'historico_alteracoes_projeto',
        'tipo_alteracao',
        { transaction },
      );

      await queryInterface.removeColumn(
        'historico_alteracoes_projeto',
        'data_alteracao',
        { transaction },
      );

      await queryInterface.removeColumn('gemeos_digitais', 'inspecaoId', {
        transaction,
      });

      await queryInterface.removeColumn('gemeos_digitais', 'descricao', {
        transaction,
      });

      await queryInterface.removeColumn('gemeos_digitais', 'arquivo_url', {
        transaction,
      });

      await queryInterface.removeColumn('gemeos_digitais', 'tipo', {
        transaction,
      });

      await queryInterface.removeColumn('frames_imagem', 'inspecaoId', {
        transaction,
      });

      await queryInterface.removeColumn('frames_imagem', 'observacoes', {
        transaction,
      });

      await queryInterface.removeColumn('frames_imagem', 'timestamp_frame', {
        transaction,
      });

      await queryInterface.removeColumn('frames_imagem', 'imagem_url', {
        transaction,
      });

      await queryInterface.removeColumn('frames_imagem', 'origem', {
        transaction,
      });

      await queryInterface.removeColumn('etapas_ou_trechos', 'obraId', {
        transaction,
      });

      await queryInterface.removeColumn('etapas_ou_trechos', 'descricao', {
        transaction,
      });

      await queryInterface.removeColumn('etapas_ou_trechos', 'nome', {
        transaction,
      });

      await queryInterface.removeColumn('etapas_ou_trechos', 'tipo', {
        transaction,
      });

      await queryInterface.removeColumn('estrutura_projeto', 'obraId', {
        transaction,
      });

      await queryInterface.removeColumn(
        'estrutura_projeto',
        'prazo_estimado_dias',
        { transaction },
      );

      await queryInterface.removeColumn('estrutura_projeto', 'descricao', {
        transaction,
      });

      await queryInterface.removeColumn('estrutura_projeto', 'atividade', {
        transaction,
      });

      await queryInterface.removeColumn('estrutura_projeto', 'etapa', {
        transaction,
      });

      await queryInterface.removeColumn('equipes_trabalho', 'obraId', {
        transaction,
      });

      await queryInterface.removeColumn('equipes_trabalho', 'tipo', {
        transaction,
      });

      await queryInterface.removeColumn('equipes_trabalho', 'nome_equipe', {
        transaction,
      });

      await queryInterface.removeColumn('epis', 'descricao', { transaction });

      await queryInterface.removeColumn('epis', 'nome_epi', { transaction });

      await queryInterface.removeColumn('epcs', 'descricao', { transaction });

      await queryInterface.removeColumn('epcs', 'nome_epc', { transaction });

      await queryInterface.removeColumn('cameras_ptz', 'obraId', {
        transaction,
      });

      await queryInterface.removeColumn('cameras_ptz', 'observacoes', {
        transaction,
      });

      await queryInterface.removeColumn('cameras_ptz', 'data_instalacao', {
        transaction,
      });

      await queryInterface.removeColumn('cameras_ptz', 'status_operacional', {
        transaction,
      });

      await queryInterface.removeColumn('cameras_ptz', 'ip_acesso', {
        transaction,
      });

      await queryInterface.removeColumn('cameras_ptz', 'angulo_focal', {
        transaction,
      });

      await queryInterface.removeColumn('cameras_ptz', 'altura_instalacao_m', {
        transaction,
      });

      await queryInterface.removeColumn('cameras_ptz', 'coordenada_lon', {
        transaction,
      });

      await queryInterface.removeColumn('cameras_ptz', 'coordenada_lat', {
        transaction,
      });

      await queryInterface.removeColumn('cameras_ptz', 'local_instalacao', {
        transaction,
      });

      await queryInterface.removeColumn('cameras_ptz', 'fabricante', {
        transaction,
      });

      await queryInterface.removeColumn('cameras_ptz', 'modelo', {
        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('clientes', { transaction });

      await queryInterface.dropTable('permissions', { transaction });

      await queryInterface.dropTable('roles', { transaction });

      await queryInterface.dropTable('usuarios', { transaction });

      await queryInterface.dropTable('subcontratadas', { transaction });

      await queryInterface.dropTable('relatorios_semanais', { transaction });

      await queryInterface.dropTable('relatorios_mensais', { transaction });

      await queryInterface.dropTable('relatorios_diarios', { transaction });

      await queryInterface.dropTable('relatorios_analiticos_video', {
        transaction,
      });

      await queryInterface.dropTable('relatorio_andamento_atual', {
        transaction,
      });

      await queryInterface.dropTable('plantas_asbuilt_2d', { transaction });

      await queryInterface.dropTable('pessoas_frame', { transaction });

      await queryInterface.dropTable('pessoas_atividade', { transaction });

      await queryInterface.dropTable('permissoes_modulo', { transaction });

      await queryInterface.dropTable('obras', { transaction });

      await queryInterface.dropTable('modelos_bim_asbuilt', { transaction });

      await queryInterface.dropTable('memoriais_descritivos_asbuilt', {
        transaction,
      });

      await queryInterface.dropTable('membros_equipe', { transaction });

      await queryInterface.dropTable('materiais_atividade', { transaction });

      await queryInterface.dropTable('maquinas_atividade', { transaction });

      await queryInterface.dropTable('inspecao_aerea', { transaction });

      await queryInterface.dropTable('historico_alteracoes_projeto', {
        transaction,
      });

      await queryInterface.dropTable('gemeos_digitais', { transaction });

      await queryInterface.dropTable('frames_imagem', { transaction });

      await queryInterface.dropTable('etapas_ou_trechos', { transaction });

      await queryInterface.dropTable('estrutura_projeto', { transaction });

      await queryInterface.dropTable('equipes_trabalho', { transaction });

      await queryInterface.dropTable('epis', { transaction });

      await queryInterface.dropTable('epcs', { transaction });

      await queryInterface.dropTable('cameras_ptz', { transaction });

      await queryInterface.dropTable('users', { transaction });

      await transaction.commit();
    } catch (err) {
      await transaction.rollback();
      throw err;
    }
  },
};
