From dede44bb33cd6957802847c9fec9a748df79ee40 Mon Sep 17 00:00:00 2001 From: Vincent Pochet Date: Thu, 17 Aug 2023 10:19:33 +0200 Subject: [PATCH] feat(charge): GrapgQL types for graduated percentage --- .../charges/graduated_percentage_range.rb | 14 ++ .../graduated_percentage_range_input.rb | 14 ++ app/graphql/types/charges/properties.rb | 3 + app/graphql/types/charges/properties_input.rb | 3 + schema.graphql | 18 ++ schema.json | 228 ++++++++++++++++++ spec/graphql/mutations/plans/create_spec.rb | 33 ++- 7 files changed, 311 insertions(+), 2 deletions(-) create mode 100644 app/graphql/types/charges/graduated_percentage_range.rb create mode 100644 app/graphql/types/charges/graduated_percentage_range_input.rb diff --git a/app/graphql/types/charges/graduated_percentage_range.rb b/app/graphql/types/charges/graduated_percentage_range.rb new file mode 100644 index 00000000000..65d14727f02 --- /dev/null +++ b/app/graphql/types/charges/graduated_percentage_range.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Types + module Charges + class GraduatedPercentageRange < Types::BaseObject + field :from_value, GraphQL::Types::BigInt, null: false + field :to_value, GraphQL::Types::BigInt, null: true + + field :fixed_amount, String, null: false + field :flat_amount, String, null: false + field :rate, String, null: false + end + end +end diff --git a/app/graphql/types/charges/graduated_percentage_range_input.rb b/app/graphql/types/charges/graduated_percentage_range_input.rb new file mode 100644 index 00000000000..20fb05207ba --- /dev/null +++ b/app/graphql/types/charges/graduated_percentage_range_input.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Types + module Charges + class GraduatedPercentageRangeInput < Types::BaseInputObject + argument :from_value, GraphQL::Types::BigInt, required: true + argument :to_value, GraphQL::Types::BigInt, required: false + + argument :fixed_amount, String, required: true + argument :flat_amount, String, required: true + argument :rate, String, required: true + end + end +end diff --git a/app/graphql/types/charges/properties.rb b/app/graphql/types/charges/properties.rb index 133186e2d45..e4135ff86ba 100644 --- a/app/graphql/types/charges/properties.rb +++ b/app/graphql/types/charges/properties.rb @@ -9,6 +9,9 @@ class Properties < Types::BaseObject # NOTE: Graduated charge model field :graduated_ranges, [Types::Charges::GraduatedRange], null: true, hash_key: :graduated_ranges + # NOTE: Graduated percentage modle + field :graduated_percentage_ranges, [Types::Charges::GraduatedPercentageRange], null: true + # NOTE: Package charge model field :free_units, GraphQL::Types::BigInt, null: true, hash_key: :free_units field :package_size, GraphQL::Types::BigInt, null: true, hash_key: :package_size diff --git a/app/graphql/types/charges/properties_input.rb b/app/graphql/types/charges/properties_input.rb index df544c5e092..023cdb31afa 100644 --- a/app/graphql/types/charges/properties_input.rb +++ b/app/graphql/types/charges/properties_input.rb @@ -9,6 +9,9 @@ class PropertiesInput < Types::BaseInputObject # NOTE: Graduated charge model argument :graduated_ranges, [Types::Charges::GraduatedRangeInput], required: false + # NOTE: Graduated percentage charge model + argument :graduated_percentage_ranges, [Types::Charges::GraduatedPercentageRangeInput], required: false + # NOTE: Package charge model argument :free_units, GraphQL::Types::BigInt, required: false argument :package_size, GraphQL::Types::BigInt, required: false diff --git a/schema.graphql b/schema.graphql index 070008f8600..4b70f27e666 100644 --- a/schema.graphql +++ b/schema.graphql @@ -3028,6 +3028,22 @@ type GocardlessProvider { webhookSecret: String } +type GraduatedPercentageRange { + fixedAmount: String! + flatAmount: String! + fromValue: BigInt! + rate: String! + toValue: BigInt +} + +input GraduatedPercentageRangeInput { + fixedAmount: String! + flatAmount: String! + fromValue: BigInt! + rate: String! + toValue: BigInt +} + type GraduatedRange { flatAmount: String! fromValue: BigInt! @@ -3983,6 +3999,7 @@ type Properties { freeUnits: BigInt freeUnitsPerEvents: BigInt freeUnitsPerTotalAggregation: String + graduatedPercentageRanges: [GraduatedPercentageRange!] graduatedRanges: [GraduatedRange!] packageSize: BigInt rate: String @@ -3995,6 +4012,7 @@ input PropertiesInput { freeUnits: BigInt freeUnitsPerEvents: BigInt freeUnitsPerTotalAggregation: String + graduatedPercentageRanges: [GraduatedPercentageRangeInput!] graduatedRanges: [GraduatedRangeInput!] packageSize: BigInt rate: String diff --git a/schema.json b/schema.json index 8632b31a42c..996316188c7 100644 --- a/schema.json +++ b/schema.json @@ -11180,6 +11180,192 @@ "inputFields": null, "enumValues": null }, + { + "kind": "OBJECT", + "name": "GraduatedPercentageRange", + "description": null, + "interfaces": [ + + ], + "possibleTypes": null, + "fields": [ + { + "name": "fixedAmount", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null, + "args": [ + + ] + }, + { + "name": "flatAmount", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null, + "args": [ + + ] + }, + { + "name": "fromValue", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null, + "args": [ + + ] + }, + { + "name": "rate", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null, + "args": [ + + ] + }, + { + "name": "toValue", + "description": null, + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null, + "args": [ + + ] + } + ], + "inputFields": null, + "enumValues": null + }, + { + "kind": "INPUT_OBJECT", + "name": "GraduatedPercentageRangeInput", + "description": null, + "interfaces": null, + "possibleTypes": null, + "fields": null, + "inputFields": [ + { + "name": "fromValue", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "toValue", + "description": null, + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "fixedAmount", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "flatAmount", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "rate", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "enumValues": null + }, { "kind": "OBJECT", "name": "GraduatedRange", @@ -16696,6 +16882,28 @@ ] }, + { + "name": "graduatedPercentageRanges", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "GraduatedPercentageRange", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null, + "args": [ + + ] + }, { "name": "graduatedRanges", "description": null, @@ -16812,6 +17020,26 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "graduatedPercentageRanges", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "GraduatedPercentageRangeInput", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "freeUnits", "description": null, diff --git a/spec/graphql/mutations/plans/create_spec.rb b/spec/graphql/mutations/plans/create_spec.rb index 4a7a5c9feba..cf98b27ea8e 100644 --- a/spec/graphql/mutations/plans/create_spec.rb +++ b/spec/graphql/mutations/plans/create_spec.rb @@ -35,6 +35,7 @@ freeUnitsPerTotalAggregation, graduatedRanges { fromValue, toValue } volumeRanges { fromValue, toValue } + graduatedPercentageRanges { fromValue toValue } } groupProperties { groupId, @@ -57,13 +58,15 @@ end let(:billable_metrics) do - create_list(:billable_metric, 5, organization:) + create_list(:billable_metric, 6, organization:) end let(:first_group) { create(:group, billable_metric: billable_metrics[1]) } let(:second_group) { create(:group, billable_metric: billable_metrics[2]) } let(:tax) { create(:tax, organization:) } + around { |test| lago_premium!(&test) } + it 'creates a plan' do result = execute_graphql( current_user: membership.user, @@ -154,6 +157,28 @@ ], }, }, + { + billableMetricId: billable_metrics[5].id, + chargeModel: 'graduated_percentage', + properties: { + graduatedPercentageRanges: [ + { + fromValue: 0, + toValue: 10, + fixedAmount: '2.00', + flatAmount: '0', + rate: '2', + }, + { + fromValue: 11, + toValue: nil, + fixedAmount: '3.00', + flatAmount: '3.00', + rate: '3', + }, + ], + }, + }, ], }, }, @@ -169,7 +194,7 @@ expect(result_data['payInAdvance']).to eq(false) expect(result_data['amountCents']).to eq('200') expect(result_data['taxes'][0]['code']).to eq(plan_tax.code) - expect(result_data['charges'].count).to eq(5) + expect(result_data['charges'].count).to eq(6) standard_charge = result_data['charges'][0] expect(standard_charge['properties']['amount']).to eq('100.00') @@ -199,6 +224,10 @@ volume_charge = result_data['charges'][4] expect(volume_charge['chargeModel']).to eq('volume') expect(volume_charge['properties']['volumeRanges'].count).to eq(2) + + graduated_percentage_charge = result_data['charges'][5] + expect(graduated_percentage_charge['chargeModel']).to eq('graduated_percentage') + expect(graduated_percentage_charge['properties']['graduatedPercentageRanges'].count).to eq(2) end end