diff --git a/app/models/concerns/prefixed_id_model.rb b/app/models/concerns/prefixed_id_model.rb index 7488f1255..244b38933 100644 --- a/app/models/concerns/prefixed_id_model.rb +++ b/app/models/concerns/prefixed_id_model.rb @@ -23,6 +23,10 @@ module PrefixedIdModel self::PREFIXED_ID_SQL = "('#{self::ID_PREFIX}' || #{table_name}.id)".freeze + def self.code(id) + "#{self::ID_PREFIX}#{id}" + end + def code "#{self.class::ID_PREFIX}#{id}" end diff --git a/app/models/my_module_repository_row.rb b/app/models/my_module_repository_row.rb index 41018b240..6ce75e18b 100644 --- a/app/models/my_module_repository_row.rb +++ b/app/models/my_module_repository_row.rb @@ -63,7 +63,13 @@ class MyModuleRepositoryRow < ApplicationRecord amount: delta, balance: stock_value.amount, comment: comment, - unit: stock_value.repository_stock_unit_item&.data + unit: stock_value.repository_stock_unit_item&.data, + my_module_references: { + my_module_id: my_module.id, + experiment_id: my_module.experiment.id, + project_id: my_module.experiment.project.id, + team_id: my_module.experiment.project.team.id + } ) stock_value.save! save! diff --git a/app/models/repository_ledger_record.rb b/app/models/repository_ledger_record.rb index 4ec13f498..3f8708472 100644 --- a/app/models/repository_ledger_record.rb +++ b/app/models/repository_ledger_record.rb @@ -17,4 +17,18 @@ class RepositoryLedgerRecord < ApplicationRecord end), optional: true, foreign_key: :reference_id, inverse_of: :repository_ledger_records has_one :repository_row, through: :repository_stock_value + + validate :my_module_references_present?, if: -> { reference.is_a?(MyModuleRepositoryRow) } + + private + + def my_module_references_present? + return if my_module_references.present? && + my_module_references['my_module_id'].is_a?(Integer) && + my_module_references['experiment_id'].is_a?(Integer) && + my_module_references['project_id'].is_a?(Integer) && + my_module_references['team_id'].is_a?(Integer) + + errors.add(:base, I18n.t('repository_ledger_records.errors.my_module_references_missing')) + end end diff --git a/app/services/repository_stock_ledger_zip_export.rb b/app/services/repository_stock_ledger_zip_export.rb index 12fa9b817..2e1ab204e 100644 --- a/app/services/repository_stock_ledger_zip_export.rb +++ b/app/services/repository_stock_ledger_zip_export.rb @@ -17,6 +17,8 @@ module RepositoryStockLedgerZipExport project experiment task + project_id + experiment_id task_id stock_amount_balance stock_balance_unit @@ -58,8 +60,6 @@ module RepositoryStockLedgerZipExport added_amount_unit = record.unit end - breadcrumbs_data = Array.new(4, '') - row_data = [ consumption_type, record.repository_row.name, @@ -73,20 +73,42 @@ module RepositoryStockLedgerZipExport record.balance.to_d, record.unit ] - breadcrumbs_data = Array.new(5) - if consumption_type == 'Task' - my_module = record.my_module_repository_row&.my_module - breadcrumbs_data = [ - my_module&.experiment&.project&.team&.name, - my_module&.experiment&.project&.name, - my_module&.experiment&.name, - my_module&.name, - my_module&.code - ] - end + breadcrumbs_data = + if consumption_type == 'Task' + build_breadcrumbs(record) + else + Array.new(7) + end row_data.insert(9, *breadcrumbs_data) row_data end + + def build_breadcrumbs(record) + if record.my_module_repository_row.present? + my_module = record.my_module_repository_row.my_module + [ + my_module.experiment.project.team.name, + my_module.experiment.project.name, + my_module.experiment.name, + my_module.name, + my_module.experiment.project.code, + my_module.experiment.code, + my_module.code + ] + elsif record.my_module_references.present? + [ + Team.find_by(id: record.my_module_references['team_id'])&.name, + nil, + nil, + nil, + Project.code(record.my_module_references['project_id']), + Experiment.code(record.my_module_references['experiment_id']), + MyModule.code(record.my_module_references['my_module_id']) + ] + else + Array.new(7) + end + end end end diff --git a/config/locales/en.yml b/config/locales/en.yml index 3fcef4ce8..112881890 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2353,13 +2353,18 @@ en: consumed_on: 'Consumed on' team: 'Team' project: 'Project' + project_id: 'Project ID' experiment: 'Experiment' + experiment_id: 'Experiment ID' task: 'Task' task_id: 'Task ID' stock_amount_balance: 'Stock amount after update (balance)' stock_balance_unit: 'Stock unit after update' repository_rows: invalid_params: "Invalid params" + repository_ledger_records: + errors: + my_module_references_missing: 'Task references are not set' libraries: manange_modal_column_index: title: "Manage columns" diff --git a/db/migrate/20231023091358_add_my_module_references_to_repository_ledger_records.rb b/db/migrate/20231023091358_add_my_module_references_to_repository_ledger_records.rb new file mode 100644 index 000000000..0c1ffdffc --- /dev/null +++ b/db/migrate/20231023091358_add_my_module_references_to_repository_ledger_records.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +class AddMyModuleReferencesToRepositoryLedgerRecords < ActiveRecord::Migration[7.0] + def up + add_column :repository_ledger_records, :my_module_references, :jsonb + + RepositoryLedgerRecord + .joins( + "INNER JOIN my_module_repository_rows + ON my_module_repository_rows.id = repository_ledger_records.reference_id + AND repository_ledger_records.reference_type = 'MyModuleRepositoryRow' + INNER JOIN my_modules ON my_modules.id = my_module_repository_rows.my_module_id + INNER JOIN experiments ON experiments.id = my_modules.experiment_id + INNER JOIN projects ON projects.id = experiments.project_id + INNER JOIN teams ON teams.id = projects.team_id" + ).select( + 'repository_ledger_records.*, my_modules.id AS my_module_id, experiments.id AS experiment_id,' \ + 'projects.id AS project_id, teams.id AS team_id ' + ).find_each do |ledger_record| + ledger_record.update!( + my_module_references: { + my_module_id: ledger_record.my_module_id, + experiment_id: ledger_record.experiment_id, + project_id: ledger_record.project_id, + team_id: ledger_record.team_id + } + ) + end + end + + def down + remove_column :repository_ledger_records, :my_module_references + end +end diff --git a/db/schema.rb b/db/schema.rb index 184a209eb..145cb0a8a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_10_03_114337) do +ActiveRecord::Schema[7.0].define(version: 2023_10_23_091358) do # These are extensions that must be enabled in order to support this database enable_extension "btree_gist" enable_extension "pg_trgm" @@ -737,6 +737,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_10_03_114337) do t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "unit" + t.jsonb "my_module_references" t.index ["reference_type", "reference_id"], name: "index_repository_ledger_records_on_reference" t.index ["repository_stock_value_id"], name: "index_repository_ledger_records_on_repository_stock_value_id" t.index ["user_id"], name: "index_repository_ledger_records_on_user_id"