Skip to content

Commit e0276ba

Browse files
committed
feat(integration): Add billing_entity_id to integration mapping collection
1 parent a195ff1 commit e0276ba

File tree

17 files changed

+367
-92
lines changed

17 files changed

+367
-92
lines changed

app/graphql/types/integration_collection_mappings/create_input.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module IntegrationCollectionMappings
55
class CreateInput < Types::BaseInputObject
66
graphql_name "CreateIntegrationCollectionMappingInput"
77

8+
argument :billing_entity_id, ID, required: false
89
argument :external_account_code, String, required: false
910
argument :external_id, String, required: true
1011
argument :external_name, String, required: false

app/graphql/types/integration_collection_mappings/object.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module IntegrationCollectionMappings
55
class Object < Types::BaseObject
66
graphql_name "CollectionMapping"
77

8+
field :billing_entity_id, ID, null: true
89
field :external_account_code, String, null: true
910
field :external_id, String, null: false
1011
field :external_name, String, null: true

app/models/integration_collection_mappings/anrok_collection_mapping.rb

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,27 @@ class AnrokCollectionMapping < BaseCollectionMapping
99
#
1010
# Table name: integration_collection_mappings
1111
#
12-
# id :uuid not null, primary key
13-
# mapping_type :integer not null
14-
# settings :jsonb not null
15-
# type :string not null
16-
# created_at :datetime not null
17-
# updated_at :datetime not null
18-
# integration_id :uuid not null
19-
# organization_id :uuid not null
12+
# id :uuid not null, primary key
13+
# mapping_type :integer not null
14+
# settings :jsonb not null
15+
# type :string not null
16+
# created_at :datetime not null
17+
# updated_at :datetime not null
18+
# billing_entity_id :uuid
19+
# integration_id :uuid not null
20+
# organization_id :uuid not null
2021
#
2122
# Indexes
2223
#
23-
# index_int_collection_mappings_on_mapping_type_and_int_id (mapping_type,integration_id) UNIQUE
24-
# index_integration_collection_mappings_on_integration_id (integration_id)
25-
# index_integration_collection_mappings_on_organization_id (organization_id)
24+
# index_int_collection_mappings_unique_billing_entity_is_not_null (mapping_type,integration_id,billing_entity_id) UNIQUE WHERE (billing_entity_id IS NOT NULL)
25+
# index_int_collection_mappings_unique_billing_entity_is_null (mapping_type,integration_id,organization_id) UNIQUE WHERE (billing_entity_id IS NULL)
26+
# index_integration_collection_mappings_on_billing_entity_id (billing_entity_id)
27+
# index_integration_collection_mappings_on_integration_id (integration_id)
28+
# index_integration_collection_mappings_on_organization_id (organization_id)
2629
#
2730
# Foreign Keys
2831
#
32+
# fk_rails_... (billing_entity_id => billing_entities.id) ON DELETE => cascade
2933
# fk_rails_... (integration_id => integrations.id)
3034
# fk_rails_... (organization_id => organizations.id)
3135
#

app/models/integration_collection_mappings/avalara_collection_mapping.rb

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,27 @@ class AvalaraCollectionMapping < BaseCollectionMapping
99
#
1010
# Table name: integration_collection_mappings
1111
#
12-
# id :uuid not null, primary key
13-
# mapping_type :integer not null
14-
# settings :jsonb not null
15-
# type :string not null
16-
# created_at :datetime not null
17-
# updated_at :datetime not null
18-
# integration_id :uuid not null
19-
# organization_id :uuid not null
12+
# id :uuid not null, primary key
13+
# mapping_type :integer not null
14+
# settings :jsonb not null
15+
# type :string not null
16+
# created_at :datetime not null
17+
# updated_at :datetime not null
18+
# billing_entity_id :uuid
19+
# integration_id :uuid not null
20+
# organization_id :uuid not null
2021
#
2122
# Indexes
2223
#
23-
# index_int_collection_mappings_on_mapping_type_and_int_id (mapping_type,integration_id) UNIQUE
24-
# index_integration_collection_mappings_on_integration_id (integration_id)
25-
# index_integration_collection_mappings_on_organization_id (organization_id)
24+
# index_int_collection_mappings_unique_billing_entity_is_not_null (mapping_type,integration_id,billing_entity_id) UNIQUE WHERE (billing_entity_id IS NOT NULL)
25+
# index_int_collection_mappings_unique_billing_entity_is_null (mapping_type,integration_id,organization_id) UNIQUE WHERE (billing_entity_id IS NULL)
26+
# index_integration_collection_mappings_on_billing_entity_id (billing_entity_id)
27+
# index_integration_collection_mappings_on_integration_id (integration_id)
28+
# index_integration_collection_mappings_on_organization_id (organization_id)
2629
#
2730
# Foreign Keys
2831
#
32+
# fk_rails_... (billing_entity_id => billing_entities.id) ON DELETE => cascade
2933
# fk_rails_... (integration_id => integrations.id)
3034
# fk_rails_... (organization_id => organizations.id)
3135
#

app/models/integration_collection_mappings/base_collection_mapping.rb

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,69 @@ class BaseCollectionMapping < ApplicationRecord
99

1010
belongs_to :integration, class_name: "Integrations::BaseIntegration"
1111
belongs_to :organization
12+
belongs_to :billing_entity, optional: true
1213

1314
MAPPING_TYPES = %i[
14-
fallback_item coupon subscription_fee minimum_commitment tax prepaid_credit credit_note account
15+
fallback_item
16+
coupon
17+
subscription_fee
18+
minimum_commitment
19+
tax
20+
prepaid_credit
21+
credit_note account
1522
].freeze
1623

17-
enum :mapping_type, MAPPING_TYPES
24+
enum :mapping_type, MAPPING_TYPES, validate: true
1825

19-
validates :mapping_type, uniqueness: {scope: :integration_id}
26+
validates :mapping_type, presence: true
27+
validates :mapping_type,
28+
uniqueness: {scope: [:integration_id, :billing_entity_id]},
29+
if: :billing_entity_id
30+
validates :mapping_type,
31+
uniqueness: {scope: [:integration_id, :organization_id]},
32+
unless: :billing_entity_id
33+
34+
validate :validate_billing_entity_organization
2035

2136
settings_accessors :external_id, :external_account_code, :external_name
37+
38+
private
39+
40+
def validate_billing_entity_organization
41+
return unless billing_entity
42+
43+
if billing_entity.organization != organization
44+
errors.add(:billing_entity, "must belong to the same organization")
45+
end
46+
end
2247
end
2348
end
2449

2550
# == Schema Information
2651
#
2752
# Table name: integration_collection_mappings
2853
#
29-
# id :uuid not null, primary key
30-
# mapping_type :integer not null
31-
# settings :jsonb not null
32-
# type :string not null
33-
# created_at :datetime not null
34-
# updated_at :datetime not null
35-
# integration_id :uuid not null
36-
# organization_id :uuid not null
54+
# id :uuid not null, primary key
55+
# mapping_type :integer not null
56+
# settings :jsonb not null
57+
# type :string not null
58+
# created_at :datetime not null
59+
# updated_at :datetime not null
60+
# billing_entity_id :uuid
61+
# integration_id :uuid not null
62+
# organization_id :uuid not null
3763
#
3864
# Indexes
3965
#
40-
# index_int_collection_mappings_on_mapping_type_and_int_id (mapping_type,integration_id) UNIQUE
41-
# index_integration_collection_mappings_on_integration_id (integration_id)
42-
# index_integration_collection_mappings_on_organization_id (organization_id)
66+
# index_int_collection_mappings_unique_billing_entity_is_not_null (mapping_type,integration_id,billing_entity_id) UNIQUE WHERE (billing_entity_id IS NOT NULL)
67+
# index_int_collection_mappings_unique_billing_entity_is_null (mapping_type,integration_id,organization_id) UNIQUE WHERE (billing_entity_id IS NULL)
68+
# index_integration_collection_mappings_on_billing_entity_id (billing_entity_id)
69+
# index_integration_collection_mappings_on_integration_id (integration_id)
70+
# index_integration_collection_mappings_on_organization_id (organization_id)
4371
#
4472
# Foreign Keys
4573
#
74+
# fk_rails_... (billing_entity_id => billing_entities.id) ON DELETE => cascade
4675
# fk_rails_... (integration_id => integrations.id)
4776
# fk_rails_... (organization_id => organizations.id)
4877
#

app/models/integration_collection_mappings/netsuite_collection_mapping.rb

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,27 @@ class NetsuiteCollectionMapping < BaseCollectionMapping
1010
#
1111
# Table name: integration_collection_mappings
1212
#
13-
# id :uuid not null, primary key
14-
# mapping_type :integer not null
15-
# settings :jsonb not null
16-
# type :string not null
17-
# created_at :datetime not null
18-
# updated_at :datetime not null
19-
# integration_id :uuid not null
20-
# organization_id :uuid not null
13+
# id :uuid not null, primary key
14+
# mapping_type :integer not null
15+
# settings :jsonb not null
16+
# type :string not null
17+
# created_at :datetime not null
18+
# updated_at :datetime not null
19+
# billing_entity_id :uuid
20+
# integration_id :uuid not null
21+
# organization_id :uuid not null
2122
#
2223
# Indexes
2324
#
24-
# index_int_collection_mappings_on_mapping_type_and_int_id (mapping_type,integration_id) UNIQUE
25-
# index_integration_collection_mappings_on_integration_id (integration_id)
26-
# index_integration_collection_mappings_on_organization_id (organization_id)
25+
# index_int_collection_mappings_unique_billing_entity_is_not_null (mapping_type,integration_id,billing_entity_id) UNIQUE WHERE (billing_entity_id IS NOT NULL)
26+
# index_int_collection_mappings_unique_billing_entity_is_null (mapping_type,integration_id,organization_id) UNIQUE WHERE (billing_entity_id IS NULL)
27+
# index_integration_collection_mappings_on_billing_entity_id (billing_entity_id)
28+
# index_integration_collection_mappings_on_integration_id (integration_id)
29+
# index_integration_collection_mappings_on_organization_id (organization_id)
2730
#
2831
# Foreign Keys
2932
#
33+
# fk_rails_... (billing_entity_id => billing_entities.id) ON DELETE => cascade
3034
# fk_rails_... (integration_id => integrations.id)
3135
# fk_rails_... (organization_id => organizations.id)
3236
#

app/models/integration_collection_mappings/xero_collection_mapping.rb

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,27 @@ class XeroCollectionMapping < BaseCollectionMapping
99
#
1010
# Table name: integration_collection_mappings
1111
#
12-
# id :uuid not null, primary key
13-
# mapping_type :integer not null
14-
# settings :jsonb not null
15-
# type :string not null
16-
# created_at :datetime not null
17-
# updated_at :datetime not null
18-
# integration_id :uuid not null
19-
# organization_id :uuid not null
12+
# id :uuid not null, primary key
13+
# mapping_type :integer not null
14+
# settings :jsonb not null
15+
# type :string not null
16+
# created_at :datetime not null
17+
# updated_at :datetime not null
18+
# billing_entity_id :uuid
19+
# integration_id :uuid not null
20+
# organization_id :uuid not null
2021
#
2122
# Indexes
2223
#
23-
# index_int_collection_mappings_on_mapping_type_and_int_id (mapping_type,integration_id) UNIQUE
24-
# index_integration_collection_mappings_on_integration_id (integration_id)
25-
# index_integration_collection_mappings_on_organization_id (organization_id)
24+
# index_int_collection_mappings_unique_billing_entity_is_not_null (mapping_type,integration_id,billing_entity_id) UNIQUE WHERE (billing_entity_id IS NOT NULL)
25+
# index_int_collection_mappings_unique_billing_entity_is_null (mapping_type,integration_id,organization_id) UNIQUE WHERE (billing_entity_id IS NULL)
26+
# index_integration_collection_mappings_on_billing_entity_id (billing_entity_id)
27+
# index_integration_collection_mappings_on_integration_id (integration_id)
28+
# index_integration_collection_mappings_on_organization_id (organization_id)
2629
#
2730
# Foreign Keys
2831
#
32+
# fk_rails_... (billing_entity_id => billing_entities.id) ON DELETE => cascade
2933
# fk_rails_... (integration_id => integrations.id)
3034
# fk_rails_... (organization_id => organizations.id)
3135
#

app/services/integration_collection_mappings/create_service.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,16 @@ def call
1515

1616
return result.not_found_failure!(resource: "integration") unless integration
1717

18+
if params[:billing_entity_id]
19+
billing_entity = integration.organization.billing_entities.find_by(id: params[:billing_entity_id])
20+
return result.not_found_failure!(resource: "billing_entity") unless billing_entity
21+
end
22+
1823
integration_collection_mapping = IntegrationCollectionMappings::Factory.new_instance(integration:).new(
1924
organization_id: params[:organization_id],
2025
integration_id: params[:integration_id],
21-
mapping_type: params[:mapping_type]
26+
mapping_type: params[:mapping_type],
27+
billing_entity_id: params[:billing_entity_id]
2228
)
2329

2430
integration_collection_mapping.organization = integration.organization
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# frozen_string_literal: true
2+
3+
class AddBillingEntityToIntegrationCollectionMappings < ActiveRecord::Migration[8.0]
4+
disable_ddl_transaction!
5+
6+
def change
7+
add_reference :integration_collection_mappings,
8+
:billing_entity,
9+
type: :uuid,
10+
null: true,
11+
index: {algorithm: :concurrently}
12+
13+
add_foreign_key :integration_collection_mappings, :billing_entities, on_delete: :cascade, validate: false
14+
add_index :integration_collection_mappings,
15+
[:mapping_type, :integration_id, :billing_entity_id],
16+
where: "billing_entity_id IS NOT NULL",
17+
unique: true,
18+
algorithm: :concurrently,
19+
name: "index_int_collection_mappings_unique_billing_entity_is_not_null"
20+
add_index :integration_collection_mappings,
21+
[:mapping_type, :integration_id, :organization_id],
22+
where: "billing_entity_id IS NULL",
23+
unique: true,
24+
algorithm: :concurrently,
25+
name: "index_int_collection_mappings_unique_billing_entity_is_null"
26+
remove_index :integration_collection_mappings, [:mapping_type, :integration_id], name: "index_int_collection_mappings_on_mapping_type_and_int_id"
27+
end
28+
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# frozen_string_literal: true
2+
3+
class ValidateBillingEntityForeignKeyOnIntegrationCollectionMappings < ActiveRecord::Migration[8.0]
4+
def change
5+
validate_foreign_key :integration_collection_mappings, :billing_entities
6+
end
7+
end

0 commit comments

Comments
 (0)