# frozen_string_literal: true require "jobshop/helpers/migration.rb" class CreateRFQs < ActiveRecord::Migration[5.2] include Jobshop::Helpers::Migration def change create_rfqs_table create_rfq_lines_table create_rfq_line_quantities_table create_rfq_line_assignments_table end private def create_rfqs_table create_table_with_auditing :jobshop_rfqs, primary_key: %i[ organization_id id ] do |t| t.references :customer, type: :uuid, null: true, foreign_key: { to_table: :jobshop_customers } t.references :requested_by, type: :uuid, null: true, foreign_key: { to_table: :jobshop_customer_contacts } t.string :from t.string :subject, null: false t.text :content, null: false t.timestamps end fk_organization :jobshop_rfqs # Index for RFQs from known customer add_index :jobshop_rfqs, %i[ organization_id customer_id ], where: "customer_id IS NOT NULL" # Index for RFQs from unknown party add_index :jobshop_rfqs, %i[ organization_id customer_id ], where: "customer_id IS NULL", name: :idx_jobshop_rfqs_customer_id_is_null foreign_key :jobshop_rfqs, :jobshop_customers, { organization_id: :organization_id, customer_id: :id } foreign_key :jobshop_rfqs, :jobshop_customer_contacts, { organization_id: :organization_id, customer_id: :customer_id, requested_by_id: :id } end private def create_rfq_lines_table create_table_with_auditing :jobshop_rfq_lines, primary_key: %i[ organization_id rfq_id id ] do |t| t.string :identifier, default: "" t.string :description, default: "" t.timestamps end fk_organization :jobshop_rfq_lines foreign_key :jobshop_rfq_lines, :jobshop_rfqs, { organization_id: :organization_id, rfq_id: :id } end private def create_rfq_line_quantities_table create_table_with_auditing :jobshop_rfq_line_quantities, primary_key: %i[ organization_id rfq_id line_id id ] do |t| t.integer :quantity, null: false t.timestamps end fk_organization :jobshop_rfq_line_quantities foreign_key :jobshop_rfq_line_quantities, :jobshop_rfqs, { organization_id: :organization_id, rfq_id: :id } foreign_key :jobshop_rfq_line_quantities, :jobshop_rfq_lines, { organization_id: :organization_id, rfq_id: :rfq_id, line_id: :id } end private def create_rfq_line_assignments_table create_table_with_auditing :jobshop_rfq_line_assignments, primary_key: %i[ organization_id rfq_id line_id id ] do |t| t.references :assigned_by, type: :uuid, null: false, foreign_key: { to_table: :jobshop_employees } t.references :assigned_to, type: :uuid, null: false, foreign_key: { to_table: :jobshop_employees } t.timestamps end fk_organization :jobshop_rfq_line_assignments foreign_key :jobshop_rfq_line_assignments, :jobshop_rfqs, { organization_id: :organization_id, rfq_id: :id } foreign_key :jobshop_rfq_line_assignments, :jobshop_rfq_lines, { organization_id: :organization_id, rfq_id: :rfq_id, line_id: :id } end end